summaryrefslogtreecommitdiffstats
path: root/chrome/installer/util/l10n_string_util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/installer/util/l10n_string_util.cc')
-rw-r--r--chrome/installer/util/l10n_string_util.cc148
1 files changed, 148 insertions, 0 deletions
diff --git a/chrome/installer/util/l10n_string_util.cc b/chrome/installer/util/l10n_string_util.cc
new file mode 100644
index 0000000..b10e1a4
--- /dev/null
+++ b/chrome/installer/util/l10n_string_util.cc
@@ -0,0 +1,148 @@
+#include <atlbase.h>
+
+#include <map>
+
+#include "base/logging.h"
+#include "base/string_util.h"
+
+#include "setup_strings.h"
+
+namespace {
+
+// Gets the language from the OS. If we're unable to get the system language,
+// defaults to en-us.
+std::wstring GetSystemLanguage() {
+ static std::wstring language;
+ if (!language.empty())
+ return language;
+ // We don't have ICU at this point, so we use win32 apis.
+ LCID id = GetThreadLocale();
+ int length = GetLocaleInfo(id, LOCALE_SISO639LANGNAME, 0, 0);
+ if (0 == length)
+ return false;
+ length = GetLocaleInfo(id, LOCALE_SISO639LANGNAME,
+ WriteInto(&language, length), length);
+ DCHECK(length == language.length() + 1);
+ StringToLowerASCII(&language);
+
+ // Add the country if we need it.
+ std::wstring country;
+ length = GetLocaleInfo(id, LOCALE_SISO3166CTRYNAME, 0, 0);
+ if (0 != length) {
+ length = GetLocaleInfo(id, LOCALE_SISO3166CTRYNAME,
+ WriteInto(&country, length), length);
+ DCHECK(length == country.length() + 1);
+ StringToLowerASCII(&country);
+ if (L"en" == language) {
+ if (L"gb" == country) {
+ language.append(L"-gb");
+ } else {
+ language.append(L"-us");
+ }
+ } else if (L"es" == language && L"es" != country) {
+ language.append(L"-419");
+ } else if (L"pt" == language) {
+ if (L"br" == country) {
+ language.append(L"-br");
+ } else {
+ language.append(L"-pt");
+ }
+ } else if (L"zh" == language) {
+ if (L"tw" == country) {
+ language.append(L"-tw");
+ } else {
+ language.append(L"-cn");
+ }
+ }
+ }
+
+ if (language.empty())
+ language = L"en-us";
+
+ return language;
+}
+
+// This method returns the appropriate language offset given the language as a
+// string. Note: This method is not thread safe because of how we create
+// |offset_map|.
+int GetLanguageOffset(const std::wstring& language) {
+ static std::map<std::wstring, int> offset_map;
+ if (offset_map.empty()) {
+ offset_map[L"ar"] = IDS_L10N_OFFSET_AR;
+ offset_map[L"bg"] = IDS_L10N_OFFSET_BG;
+ offset_map[L"ca"] = IDS_L10N_OFFSET_CA;
+ offset_map[L"cs"] = IDS_L10N_OFFSET_CS;
+ offset_map[L"da"] = IDS_L10N_OFFSET_DA;
+ offset_map[L"de"] = IDS_L10N_OFFSET_DE;
+ offset_map[L"el"] = IDS_L10N_OFFSET_EL;
+ offset_map[L"en-gb"] = IDS_L10N_OFFSET_EN_GB;
+ offset_map[L"en-us"] = IDS_L10N_OFFSET_EN_US;
+ offset_map[L"es"] = IDS_L10N_OFFSET_ES;
+ offset_map[L"es-419"] = IDS_L10N_OFFSET_ES_419;
+ offset_map[L"et"] = IDS_L10N_OFFSET_ET;
+ offset_map[L"fi"] = IDS_L10N_OFFSET_FI;
+ offset_map[L"fil"] = IDS_L10N_OFFSET_FIL;
+ offset_map[L"fr"] = IDS_L10N_OFFSET_FR;
+ offset_map[L"he"] = IDS_L10N_OFFSET_HE;
+ offset_map[L"hi"] = IDS_L10N_OFFSET_HI;
+ offset_map[L"hr"] = IDS_L10N_OFFSET_HR;
+ offset_map[L"hu"] = IDS_L10N_OFFSET_HU;
+ offset_map[L"id"] = IDS_L10N_OFFSET_ID;
+ offset_map[L"it"] = IDS_L10N_OFFSET_IT;
+ offset_map[L"ja"] = IDS_L10N_OFFSET_JA;
+ offset_map[L"ko"] = IDS_L10N_OFFSET_KO;
+ offset_map[L"lt"] = IDS_L10N_OFFSET_LT;
+ offset_map[L"lv"] = IDS_L10N_OFFSET_LV;
+ // Google web properties use no for nb. Handle both just to be safe.
+ offset_map[L"nb"] = IDS_L10N_OFFSET_NO;
+ offset_map[L"nl"] = IDS_L10N_OFFSET_NL;
+ offset_map[L"no"] = IDS_L10N_OFFSET_NO;
+ offset_map[L"pl"] = IDS_L10N_OFFSET_PL;
+ offset_map[L"pt-br"] = IDS_L10N_OFFSET_PT_BR;
+ offset_map[L"pt-pt"] = IDS_L10N_OFFSET_PT_PT;
+ offset_map[L"ro"] = IDS_L10N_OFFSET_RO;
+ offset_map[L"ru"] = IDS_L10N_OFFSET_RU;
+ offset_map[L"sk"] = IDS_L10N_OFFSET_SK;
+ offset_map[L"sl"] = IDS_L10N_OFFSET_SL;
+ offset_map[L"sr"] = IDS_L10N_OFFSET_SR;
+ offset_map[L"sv"] = IDS_L10N_OFFSET_SV;
+ offset_map[L"th"] = IDS_L10N_OFFSET_TH;
+ offset_map[L"tr"] = IDS_L10N_OFFSET_TR;
+ offset_map[L"uk"] = IDS_L10N_OFFSET_UK;
+ offset_map[L"vi"] = IDS_L10N_OFFSET_VI;
+ offset_map[L"zh-cn"] = IDS_L10N_OFFSET_ZH_CN;
+ offset_map[L"zh-tw"] = IDS_L10N_OFFSET_ZH_TW;
+ }
+
+ std::map<std::wstring, int>::iterator it = offset_map.find(
+ StringToLowerASCII(language));
+ if (it != offset_map.end())
+ return it->second;
+
+ NOTREACHED() << "unknown system language-country";
+
+ // Fallback on the en-US offset just in case.
+ return IDS_L10N_OFFSET_EN_US;
+}
+
+} // namespace
+
+namespace installer_util {
+
+std::wstring GetLocalizedString(int base_message_id) {
+ std::wstring language = GetSystemLanguage();
+ std::wstring localized_string;
+
+ int message_id = base_message_id + GetLanguageOffset(language);
+ const ATLSTRINGRESOURCEIMAGE* image = AtlGetStringResourceImage(
+ _AtlBaseModule.GetModuleInstance(), message_id);
+ if (image) {
+ localized_string = std::wstring(image->achString, image->nLength);
+ } else {
+ NOTREACHED() << "Unable to find resource id " << message_id;
+ }
+
+ return localized_string;
+}
+
+} // namespace installer_util