Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "app/l10n_util.h" | 5 #include "app/l10n_util.h" |
| 6 | 6 |
| 7 #if defined(TOOLKIT_USES_GTK) | 7 #if defined(TOOLKIT_USES_GTK) |
| 8 #include <glib/gutils.h> | 8 #include <glib/gutils.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 500 } | 500 } |
| 501 | 501 |
| 502 bool IsValidLocaleSyntax(const std::string& locale) { | 502 bool IsValidLocaleSyntax(const std::string& locale) { |
| 503 // Check that the length is plausible. | 503 // Check that the length is plausible. |
| 504 if (locale.size() < 2 || locale.size() >= ULOC_FULLNAME_CAPACITY) | 504 if (locale.size() < 2 || locale.size() >= ULOC_FULLNAME_CAPACITY) |
| 505 return false; | 505 return false; |
| 506 | 506 |
| 507 // Strip off the part after an '@' sign, which might contain keywords, | 507 // Strip off the part after an '@' sign, which might contain keywords, |
| 508 // as in en_IE@currency=IEP or fr@collation=phonebook;calendar=islamic-civil. | 508 // as in en_IE@currency=IEP or fr@collation=phonebook;calendar=islamic-civil. |
| 509 // We don't validate that part much, just check that there's at least one | 509 // We don't validate that part much, just check that there's at least one |
| 510 // equals sign in a plausible place. | 510 // equals sign in a plausible place. Normalize the prefix so that hyphens |
| 511 std::string prefix = locale; | 511 // are changed to underscores. |
| 512 if (locale.find("@") != std::string::npos) { | 512 std::string prefix = NormalizeLocale(locale); |
| 513 size_t split_point = locale.find("@"); | 513 size_t split_point = locale.find("@"); |
| 514 if (split_point != std::string::npos) { | |
| 514 std::string keywords = locale.substr(split_point + 1); | 515 std::string keywords = locale.substr(split_point + 1); |
| 515 prefix = locale.substr(0, split_point); | 516 prefix = locale.substr(0, split_point); |
| 516 | 517 |
| 517 size_t equals_loc = keywords.find("="); | 518 size_t equals_loc = keywords.find("="); |
| 518 if (equals_loc == std::string::npos || | 519 if (equals_loc == std::string::npos || |
| 519 equals_loc < 1 || equals_loc > keywords.size() - 2) | 520 equals_loc < 1 || equals_loc > keywords.size() - 2) |
| 520 return false; | 521 return false; |
| 521 } | 522 } |
| 522 | 523 |
| 523 // Check that all characters before the at-sign are alphanumeric, hyphen, | 524 // Check that all characters before the at-sign are alphanumeric or |
| 524 // or underscore. | 525 // underscore. |
| 525 for (size_t i = 0; i < prefix.size(); i++) { | 526 for (size_t i = 0; i < prefix.size(); i++) { |
| 526 char ch = prefix[i]; | 527 char ch = prefix[i]; |
| 527 if (!IsAsciiAlpha(ch) && !IsAsciiDigit(ch) && ch != '-' && ch != '_') | 528 if (!IsAsciiAlpha(ch) && !IsAsciiDigit(ch) && ch != '_') |
| 528 return false; | 529 return false; |
| 529 } | 530 } |
| 530 | 531 |
| 531 // Check that the initial token (before the first hyphen/underscore) | 532 // Check that the initial token (before the first hyphen/underscore) |
| 532 // is 1 - 3 alphabetical characters (a language tag). | 533 // is 1 - 3 alphabetical characters (a language tag). |
| 533 for (size_t i = 0; i < prefix.size(); i++) { | 534 for (size_t i = 0; i < prefix.size(); i++) { |
| 534 char ch = prefix[i]; | 535 char ch = prefix[i]; |
| 535 if (ch == '-' || ch == '_') { | 536 if (ch == '_') { |
| 536 if (i < 1 || i > 3) | 537 if (i < 1 || i > 3) |
| 537 return false; | 538 return false; |
| 538 break; | 539 break; |
| 539 } | 540 } |
| 540 if (!IsAsciiAlpha(ch)) | 541 if (!IsAsciiAlpha(ch)) |
| 541 return false; | 542 return false; |
| 542 } | 543 } |
| 543 | 544 |
| 544 // Check that the all tokens after the initial token are 1 - 8 characters. | 545 // Check that the all tokens after the initial token are 1 - 8 characters. |
| 545 // (Tokenize/StringTokenizer don't work here, they collapse multiple | 546 // (Tokenize/StringTokenizer don't work here, they collapse multiple |
| 546 // delimiters into one.) | 547 // delimiters into one.) |
| 547 int token_len = 0; | 548 int token_len = 0; |
| 548 int token_index = 0; | 549 int token_index = 0; |
| 549 for (size_t i = 0; i < prefix.size(); i++) { | 550 for (size_t i = 0; i < prefix.size(); i++) { |
| 550 char ch = prefix[i]; | 551 char ch = prefix[i]; |
| 551 if (ch == '-' || ch == '_') { | 552 if (ch == '_') { |
|
Nebojša Ćirić
2010/12/13 19:43:48
You don't use ch anywhere else. Remove it and use
| |
| 552 if (token_index > 0 && (token_len < 1 || token_len > 8)) { | 553 if (token_index > 0 && (token_len < 1 || token_len > 8)) { |
| 553 return false; | 554 return false; |
| 554 } | 555 } |
| 555 token_index++; | 556 token_index++; |
| 556 token_len = 0; | 557 token_len = 0; |
| 557 } else { | 558 } else { |
| 558 token_len++; | 559 token_len++; |
| 559 } | 560 } |
| 560 } | 561 } |
| 561 if (token_index == 0 && (token_len < 1 || token_len > 3)) { | 562 if (token_index == 0 && (token_len < 1 || token_len > 3)) { |
| (...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 959 for (size_t i = 0; i < arraysize(kAcceptLanguageList); ++i) { | 960 for (size_t i = 0; i < arraysize(kAcceptLanguageList); ++i) { |
| 960 if (!IsLocaleNameTranslated(kAcceptLanguageList[i], display_locale)) | 961 if (!IsLocaleNameTranslated(kAcceptLanguageList[i], display_locale)) |
| 961 // TODO(jungshik) : Put them at the of the list with language codes | 962 // TODO(jungshik) : Put them at the of the list with language codes |
| 962 // enclosed by brackets instead of skipping. | 963 // enclosed by brackets instead of skipping. |
| 963 continue; | 964 continue; |
| 964 locale_codes->push_back(kAcceptLanguageList[i]); | 965 locale_codes->push_back(kAcceptLanguageList[i]); |
| 965 } | 966 } |
| 966 } | 967 } |
| 967 | 968 |
| 968 } // namespace l10n_util | 969 } // namespace l10n_util |
| OLD | NEW |