Home | History | Annotate | Download | only in l10n
      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