1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/base/l10n/l10n_util_android.h" 6 7 #include "base/android/jni_android.h" 8 #include "base/android/jni_string.h" 9 #include "base/android/scoped_java_ref.h" 10 #include "base/i18n/rtl.h" 11 #include "base/logging.h" 12 #include "base/strings/string_util.h" 13 #include "jni/LocalizationUtils_jni.h" 14 #include "third_party/icu/source/common/unicode/uloc.h" 15 16 namespace l10n_util { 17 18 jboolean IsRTL(JNIEnv* env, jclass clazz) { 19 return base::i18n::IsRTL(); 20 } 21 22 jint GetFirstStrongCharacterDirection(JNIEnv* env, jclass clazz, 23 jstring string) { 24 return base::i18n::GetFirstStrongCharacterDirection( 25 base::android::ConvertJavaStringToUTF16(env, string)); 26 } 27 28 std::string GetDefaultLocale() { 29 JNIEnv* env = base::android::AttachCurrentThread(); 30 ScopedJavaLocalRef<jstring> locale = Java_LocalizationUtils_getDefaultLocale( 31 env); 32 return ConvertJavaStringToUTF8(locale); 33 } 34 35 namespace { 36 37 // Common prototype of ICU uloc_getXXX() functions. 38 typedef int32_t (*UlocGetComponentFunc)(const char*, char*, int32_t, 39 UErrorCode*); 40 41 std::string GetLocaleComponent(const std::string& locale, 42 UlocGetComponentFunc uloc_func, 43 int32_t max_capacity) { 44 std::string result; 45 UErrorCode error = U_ZERO_ERROR; 46 int32_t actual_length = uloc_func(locale.c_str(), 47 WriteInto(&result, max_capacity), 48 max_capacity, 49 &error); 50 DCHECK(U_SUCCESS(error)); 51 DCHECK(actual_length < max_capacity); 52 result.resize(actual_length); 53 return result; 54 } 55 56 ScopedJavaLocalRef<jobject> NewJavaLocale( 57 JNIEnv* env, 58 const std::string& locale) { 59 // TODO(wangxianzhu): Use new Locale API once Android supports scripts. 60 std::string language = GetLocaleComponent( 61 locale, uloc_getLanguage, ULOC_LANG_CAPACITY); 62 std::string country = GetLocaleComponent( 63 locale, uloc_getCountry, ULOC_COUNTRY_CAPACITY); 64 std::string variant = GetLocaleComponent( 65 locale, uloc_getVariant, ULOC_FULLNAME_CAPACITY); 66 return Java_LocalizationUtils_getJavaLocale(env, 67 base::android::ConvertUTF8ToJavaString(env, language).obj(), 68 base::android::ConvertUTF8ToJavaString(env, country).obj(), 69 base::android::ConvertUTF8ToJavaString(env, variant).obj()); 70 } 71 72 } // namespace 73 74 string16 GetDisplayNameForLocale(const std::string& locale, 75 const std::string& display_locale) { 76 JNIEnv* env = base::android::AttachCurrentThread(); 77 ScopedJavaLocalRef<jobject> java_locale = 78 NewJavaLocale(env, locale); 79 ScopedJavaLocalRef<jobject> java_display_locale = 80 NewJavaLocale(env, display_locale); 81 82 ScopedJavaLocalRef<jstring> java_result( 83 Java_LocalizationUtils_getDisplayNameForLocale( 84 env, 85 java_locale.obj(), 86 java_display_locale.obj())); 87 return ConvertJavaStringToUTF16(java_result); 88 } 89 90 bool RegisterLocalizationUtil(JNIEnv* env) { 91 return RegisterNativesImpl(env); 92 } 93 94 } // namespace l10n_util 95