【问题标题】:How to change locale to use Latin Serbian (instead of Cyrillic Serbian)如何更改语言环境以使用拉丁塞尔维亚语(而不是西里尔塞尔维亚语)
【发布时间】:2016-06-22 23:14:57
【问题描述】:

塞尔维亚语有拉丁字母和西里尔字母。在 Android 的日期和时间选择器小部件中,塞尔维亚语地区显示的字母似乎是西里尔字母,如此处所示。

我想更改语言环境,以便 android 小部件使用拉丁塞尔维亚字母表。

当前的语言/国家代码(产生西里尔字母)分别为 srRS。因此,我的 setLocale 函数被称为

setLocale("sr", "RS");

这是我不确定的部分——根据localeplanet.com,拉丁塞尔维亚语的本地代码是sr_Latn_RS。不过,我都试过了

setLocale("sr_Latn", "RS");
//and
setLocale("sr_Latn_RS", "RS");

两者都不起作用(没有变化,默认为英文)。根据 Android 文档,看起来 setLocale 需要两个字母代码。

语言代码是两个字母的小写 ISO 语言代码(例如 为“en”),如 ISO 639-1 所定义。国家代码是两个字母 ISO 3166-1 定义的大写 ISO 国家/地区代码(例如“US”)。 变体代码未指定。

那么如何指定拉丁塞尔维亚语语言环境代码?还是不存在?

【问题讨论】:

    标签: android locale country-codes


    【解决方案1】:

    如果您仅支持 Lollipop 或更高版本,则上一个答案效果很好。但是,如果您使用塞尔维亚语进行编码,那么您的很多用户群可能不会拥有它。这是一个适用于新旧版本的解决方案。

    private static Locale serbianLatinLocale(){
    
        Locale locale = null;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            for (Locale checkLocale : Locale.getAvailableLocales()) {
                if (checkLocale.getISO3Language().equals("srp") && checkLocale.getCountry().equals("LATN") && checkLocale.getVariant().equals("")) {
                    locale = checkLocale;
                }
            }
        } else {
            locale = new Locale.Builder().setLanguage("sr").setRegion("RS").setScript("Latn").build();
        }
    
        return locale;
    }
    

    【讨论】:

      【解决方案2】:

      为了获得拉丁语言环境,我首先使用了下面的代码。

      new Locale.Builder().setLanguage("sr").setRegion("RS").setScript("Latn").build();
      

      但是这个解决方案在我的 Android 5.1.1 设备上不起作用(它仍然是西里尔文)。所以我删除了这样的区域设置:

      new Locale.Builder().setLanguage("sr").setScript("Latn").build();
      

      你必须把你的塞尔维亚资源字符串放在 b+sr+Latn 文件夹中。

      【讨论】:

        【解决方案3】:

        请在发布问题之前搜索您的查询。可以用其他相关的形式来回答。

            Locale newLocale = new Locale("sr","RS");
            Configuration config = new Configuration();
            config.setLocale(newLocale);
            // using this to reference my Activity
            this.getBaseContext().getResources().updateConfiguration(config, this.getBaseContext().getResources().getDisplayMetrics());
        

        我发现这两个答案适合您的查询 android custom date-picker SOlocale from english to french

        编辑

            Locale[] locales = Locale.getAvailableLocales();
            for(Locale locale : locales){
                if(locale.getCountry().equalsIgnoreCase("RS")
                        && locale.getScript().equalsIgnoreCase("Latn"))
                {
                    Configuration config = new Configuration();
                    config.setLocale(locale);
                    // using this to reference my Activity
                    this.getBaseContext().getResources().updateConfiguration(config, this.getBaseContext().getResources().getDisplayMetrics());
                    break;
                }
            }
        

        我知道会有一种有效的方法来做到这一点,但是你可能会得到你需要的方向来获取可用语言环境的列表并获得你想要的语言环境。希望对你有帮助

        EDIT-2(最终版)

        您可以使用以下方法构建语言环境:

        Locale locale = new Locale.Builder().setLanguage("sr").setRegion("RS").setScript("Latn").build();
        setLocale(locale);
        

        【讨论】:

        • 哈哈,好吧,标题有点误导,但我正在研究以帮助您找到答案
        • 完成埃里克,你可以使用最后的编辑。抱歉修改了这么多
        • 需要 API >= 21 的最后和平代码,但我需要它用于 API 19...任何解决方法?
        • @cizola 我刚刚添加了一个解决方案。如果您经常拉取语言环境,您可能想要缓存它,但您只需设置一次或其他什么不应该成为问题。
        【解决方案4】:

        你能用下面的吗?

        public class MyApplication extends Application {
            @Override
            public void onCreate() {
                super.onCreate();
        
                Resources res = this.getResources();
                Configuration conf = res.getConfiguration();
                boolean isLatinAlphabet = PreferenceManager.getDefaultSharedPreferences(this);
        
                if(conf.locale.getLanguage().equals("sr") && isLatinAlphabet) {
                    conf.locale = new Locale("sr", "YourContryCode");
                    res.updateConfiguration(conf, res.getDisplayMetrics());
                }
            }
        }
        

        注意:conf.locale = new Locale("sr", "YourContryCode"); 行中替换您的YourContryCode

        Manifest.xml

        <application
                android:name=".MyApplication"
                android:icon="@drawable/ic_launcher"
                android:label="@string/application_name"
                android:theme="@style/AppTheme">
        
           ...
        
        </application>
        

        希望这会对你有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多