summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authoryusukes@chromium.org <yusukes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-16 07:39:14 +0000
committeryusukes@chromium.org <yusukes@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-16 07:39:14 +0000
commit30248507aa0aac429bdd2b9f68dae9a2a5f08848 (patch)
treeac136e839c5aafb653d28ee1b25fd82441f735b0 /chrome/browser
parent36cef8cece381a98e76e57f50d4201d2f8f2a9b2 (diff)
downloadchromium_src-30248507aa0aac429bdd2b9f68dae9a2a5f08848.zip
chromium_src-30248507aa0aac429bdd2b9f68dae9a2a5f08848.tar.gz
chromium_src-30248507aa0aac429bdd2b9f68dae9a2a5f08848.tar.bz2
Translate a string sent from IBus IME engines.
IBus IME engines send some strings written in English (e.g. IME names and IME property names) to its language bar module (i.e. Chrome). This change adds a function that converts the english string into a Chrome's resource ID, then converts the ID into a localized string, and returns it. BUG=crosbug.com/1699 TEST=run the unittest Review URL: http://codereview.chromium.org/948001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@41693 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/chromeos/status/language_menu_l10n_util.cc109
-rw-r--r--chrome/browser/chromeos/status/language_menu_l10n_util.h35
-rw-r--r--chrome/browser/chromeos/status/language_menu_l10n_util_unittest.cc19
3 files changed, 163 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/status/language_menu_l10n_util.cc b/chrome/browser/chromeos/status/language_menu_l10n_util.cc
new file mode 100644
index 0000000..62c6ca7
--- /dev/null
+++ b/chrome/browser/chromeos/status/language_menu_l10n_util.cc
@@ -0,0 +1,109 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/status/language_menu_l10n_util.h"
+
+#include "base/hash_tables.h"
+#include "base/utf_string_conversions.h"
+#include "chrome/browser/chrome_thread.h"
+#include "grit/generated_resources.h"
+
+namespace {
+
+const struct EnglishToResouceId {
+ const char* english_string_from_ibus;
+ int resource_id;
+} kEnglishToResourceIdArray[] = {
+ // For both ibus-anthy and ibus-google-japanese-input.
+ // - ibus-anthy: third_party/ibus-anthy/files/po/
+ // - ibus-google-japanese-input: TBD
+ {"Hiragana", IDS_STATUSBAR_IME_JAPANESE_IME_STATUS_HIRAGANA},
+ {"Katakana", IDS_STATUSBAR_IME_JAPANESE_IME_STATUS_KATAKANA},
+ {"Half width katakana", // small k is not a typo.
+ IDS_STATUSBAR_IME_JAPANESE_IME_STATUS_HALF_WIDTH_KATAKANA},
+ {"Latin", IDS_STATUSBAR_IME_JAPANESE_IME_STATUS_LATIN},
+ {"Wide Latin", IDS_STATUSBAR_IME_JAPANESE_IME_STATUS_WIDE_LATIN},
+ {"Roman", IDS_STATUSBAR_IME_JAPANESE_IME_INPUT_MODE_ROMAN},
+ {"Kana", IDS_STATUSBAR_IME_JAPANESE_IME_INPUT_MODE_KANA},
+
+ // TODO(yusukes): Support ibus-pinyin, -hangul, -chewing, and -table.
+};
+const size_t kNumEntries = arraysize(kEnglishToResourceIdArray);
+
+bool GetLocalizedString(
+ const std::string& english_string, string16 *out_string) {
+ DCHECK(out_string);
+ typedef base::hash_map<std::string, int> HashType;
+ static HashType* english_to_resource_id = NULL;
+
+ // Initialize the map if needed.
+ if (!english_to_resource_id) {
+ // We don't free this map.
+ english_to_resource_id = new HashType(kNumEntries);
+ for (size_t i = 0; i < kNumEntries; ++i) {
+ const bool result = english_to_resource_id->insert(
+ std::make_pair(kEnglishToResourceIdArray[i].english_string_from_ibus,
+ kEnglishToResourceIdArray[i].resource_id)).second;
+ DCHECK(result) << "Duplicated string is found: "
+ << kEnglishToResourceIdArray[i].english_string_from_ibus;
+ }
+ }
+
+ HashType::const_iterator iter = english_to_resource_id->find(english_string);
+ if (iter == english_to_resource_id->end()) {
+ LOG(ERROR) << "Resouce ID is not found for: " << english_string;
+ return false;
+ }
+
+ *out_string = l10n_util::GetStringUTF16(iter->second);
+ return true;
+};
+
+
+} // namespace
+
+namespace chromeos {
+
+std::wstring LanguageMenuL10nUtil::GetString(
+ const std::string& english_string) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI))
+ << "You should not call this function from non-UI threads";
+ string16 localized_string;
+ if (GetLocalizedString(english_string, &localized_string)) {
+ return UTF16ToWide(localized_string);
+ }
+ return UTF8ToWide(english_string);
+}
+
+std::string LanguageMenuL10nUtil::GetStringUTF8(
+ const std::string& english_string) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI))
+ << "You should not call this function from non-UI threads";
+ string16 localized_string;
+ if (GetLocalizedString(english_string, &localized_string)) {
+ return UTF16ToUTF8(localized_string);
+ }
+ return english_string;
+}
+
+string16 LanguageMenuL10nUtil::GetStringUTF16(
+ const std::string& english_string) {
+ DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI))
+ << "You should not call this function from non-UI threads";
+ string16 localized_string;
+ if (GetLocalizedString(english_string, &localized_string)) {
+ return localized_string;
+ }
+ return UTF8ToUTF16(english_string);
+}
+
+bool LanguageMenuL10nUtil::StringIsSupported(
+ const std::string& english_string) {
+ // Do not check the current thread since the function is supposed to be called
+ // from unit tests.
+ string16 localized_string;
+ return GetLocalizedString(english_string, &localized_string);
+}
+
+} // namespace chromeos
diff --git a/chrome/browser/chromeos/status/language_menu_l10n_util.h b/chrome/browser/chromeos/status/language_menu_l10n_util.h
new file mode 100644
index 0000000..dd3cf4b
--- /dev/null
+++ b/chrome/browser/chromeos/status/language_menu_l10n_util.h
@@ -0,0 +1,35 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_STATUS_LANGUAGE_MENU_L10N_UTIL_H_
+#define CHROME_BROWSER_CHROMEOS_STATUS_LANGUAGE_MENU_L10N_UTIL_H_
+
+#include <string>
+
+#include "app/l10n_util.h"
+#include "base/string16.h"
+
+namespace chromeos {
+
+class LanguageMenuL10nUtil {
+ public:
+ // Converts a string sent from IBus IME engines, which is written in English,
+ // into Chrome's string ID, then pulls internationalized resource string from
+ // the resource bundle and returns it.
+ static std::wstring GetString(const std::string& english_string);
+ static std::string GetStringUTF8(const std::string& english_string);
+ static string16 GetStringUTF16(const std::string& english_string);
+
+ // This method is ONLY for unit testing. Returns true if the given string is
+ // supported (i.e. the string is associated with a resource ID).
+ static bool StringIsSupported(const std::string& english_string);
+
+ private:
+ LanguageMenuL10nUtil();
+ ~LanguageMenuL10nUtil();
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_CHROMEOS_STATUS_LANGUAGE_MENU_L10N_UTIL_H_
diff --git a/chrome/browser/chromeos/status/language_menu_l10n_util_unittest.cc b/chrome/browser/chromeos/status/language_menu_l10n_util_unittest.cc
new file mode 100644
index 0000000..114340d
--- /dev/null
+++ b/chrome/browser/chromeos/status/language_menu_l10n_util_unittest.cc
@@ -0,0 +1,19 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/status/language_menu_l10n_util.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+
+TEST(LanguageMenuL10nUtilTest, FindLocalizedStringTest) {
+ EXPECT_TRUE(LanguageMenuL10nUtil::StringIsSupported("Hiragana"));
+ EXPECT_TRUE(LanguageMenuL10nUtil::StringIsSupported("Latin"));
+ EXPECT_TRUE(LanguageMenuL10nUtil::StringIsSupported("Kana"));
+ EXPECT_FALSE(LanguageMenuL10nUtil::StringIsSupported(
+ "####THIS_STRING_IS_NOT_SUPPORTED####"));
+}
+
+} // namespace chromeos