在 android 应用程序中更改区域设置(到印地语)

Change locale in android app (onto Hindi)

为应用程序创建多语言支持,可以在应用程序设置中更改语言。

至于现在,英语、西班牙语、法语、俄语一切正常, 但不适用于印地语和中文。

1) 我用原语言指定语言名称 但在应用程序中我可以看到 "Hindi".

而不是 हिन्दी

\res\values-hi\arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string-array name="languages">
        <item name="english">English</item>
        <item name="russian">Русский</item>
        <item name="spanish">Espagnol</item>
        <item name="russian">Français</item>
        <item name="chineese">中国</item>
        <item name="hindi">हिन्दी</item>
    </string-array>
    <string-array name="languagesValues">
         <item name="english">en</item>
        <item name="russian">ru</item>
        <item name="spanish">es</item>
        <item name="russian">fr</item>
        <item name="chineese">zh-CN</item>
        <item name="hindi">hi</item>
    </string-array>

</resources>

2) 选择后结束"Hindi" - 实际上选择的是默认(英文)。
\res\values-hi\strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">लकी बीनने</string>
    <string name="score">0000</string>
    <string name="settings">सेटिंग</string>
    <string name="start_button">प्रारंभ</string>
    <string name="about_button">के बारे में</string>
    <string name="about">लियोनिद द्वारा बनाया गया</string>
    <string name="feedback">प्रतिक्रिया भेजें </string>
    <string name="high_score">उच्च स्कोर के</string>
    <string name="score_set">स्कोर निर्धारित किया गया है \r\nमें:</string>
    <string name="game_over">खेल खत्म</string>

.....

在首选项中保存语言环境。

public class Settings extends PreferenceActivity {

    Locale myLocale;
    static boolean localeChanged;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);


        // language changing
        Preference langPreference = getPreferenceScreen().findPreference(
                "language");
        langPreference.setOnPreferenceChangeListener(languageChangeListener);
    }

    Preference.OnPreferenceChangeListener languageChangeListener = new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {

            switch (newValue.toString()) {
            case "en":
                setLocale("en");
                break;

            case "ru":
                setLocale("ru");
                break;

            case "fr":
                setLocale("fr");
                break;

            case "es":
                setLocale("es");
                break;

            case "zh-CN":
                setLocale("zh-CN");
                break;

            case "hi":
                setLocale("hi");
                break;

            }

            localeChanged = true;
            return true;
        }
    };

    // * manually changing locale/
    public void setLocale(String lang) {
        myLocale = new Locale(lang);
        Resources res = getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
        Intent refresh = new Intent(this, Settings.class);
        startActivity(refresh);
        finish();
    }

怎么了?我的代码或我的设备有问题吗?

这取决于设备。另外,请通过 Settings --> Language & input.

检查您的设备是否支持 HindiChinese 语言

我。第一件事:

您的 post 有很多逻辑和拼写错误。 Lint 将报告此类错误和警告,代码将无法编译。

请看更正:

为应用程序创建多语言支持,可以在应用程序设置中更改语言。

至于现在,英语、西班牙语、French、俄语、 但不适用于印地语和 Chinese.

1) 我用原语言指定语言名称 但在应用程序中我可以看到 "Hindi".

而不是 हिन्दी

\res\values-hi\arrays.xml

<string-array name="languages">
    <item name="english">English</item>
    <item name="russian">Русский</item>
    <item name="spanish">Espagnol</item>
    <item name="french">Français</item>
    <item name="chinese">中国</item>
    <item name="hindi">हिन्दी</item>
</string-array>
<string-array name="languagesValues">
     <item name="english">en</item>
    <item name="russian">ru</item>
    <item name="spanish">es</item>
    <item name="french">fr</item>
    <item name="chinese">zh-CN</item>
    <item name="hindi">hi</item>
</string-array>

[COMMENTS]

  1. Spelling mistakes: in the words chinese, french.

  2. Logical mistake: repetition in the key russian, in both the arrays, where on the second repeat, it should be french.

二. @Chandrakanth 回答的改进:

这取决于设备,您的设备似乎是旧的,但您的代码是正确的。给你原因:

从我的回答开始,我想引用你的问题:

As for now everything works fine for English, Spanish, French, Russian    
languages, but doesn't work for Hindi and Chinese.

当您使用中文和印地语时,您使用的是以下语言环境,来自您的字符串资源:

<item name="chineese">zh-CN</item>
<item name="hindi">hi</item>

请重构为:

<item name="chinese">zh</item>
<item name="hindi">hi</item>

因此您应该将值文件夹用作:

values-zh and values-hi

如果以上内容正确,则您的应用程序无法在某些 设备中接受或识别 values-zhvalues-hi

  1. 请分享您的设备品牌、制造商和型号,以便更多 可以进行调查。

  2. 您的代码没问题,因此您可以在任何其他环境中测试您的应用程序 和更新的设备。

  3. 请调用更改语言环境的方法,就在之前 在 "onCreate" 回调中调用 "setContentView"

  4. 也许你可以检查一下你的设备是否支持印地语和中文 语言 Settings --> Language & input

I have devices that don't have Hindi and Chinese in the device settings, but still the locales hi and zh are recognized within the application, though I have to install corresponding fonts to prevent the fallback.

请注意 HindiChinese 是来自不同时区的语言环境,因此很可能无法在相同的设备设置中找到它们。

请确保您的代码在其他 设备上运行。如果没有,那么您必须按照以下步骤操作。先有一些基本的认识:

首先,如果你在device settings里改了locale,应该不会影响你的application level locale settings。也就是说,如果您的 device locale 设置为 Spanish,并且您的 Application level locale 首选项设置为 Hindi,则 Hindi 应该继续显示在每个 fragment/activity 你的 application 如果这些组件中的每一个都包含字符串 localized。现在,如果您将 localeSpanish 更改为 Chinese,并且您的 application 或设备重新启动,因为 zh 存储在您的首选项中,您的方法会改变在 Application loadChinese 的语言环境,它继续在 Chinese.

中显示文本

其次,如果你的language依赖于font例如:因为你有EnglishHindiChinese 区域设置支持在您的应用程序中,您必须在 asset folder 中包含所有 TTF fonts 并将 Font-face 应用于 TextViewEditTextRadio ButtonsCheck BoxSpinners 等,当您从 application settings 更改语言时。这里 HindiChinese 语言环境都需要 TTF 字体,在 assets 文件夹中并且必须在每个 component's [=67= 中使用] 如上所述。

第三,也是最重要的,更改区域设置的最佳位置就在 setContentView(layout_id) 之前 activityonCreate(Bundle restoreState) 方法中被调用。因此,一旦 locale 发生变化,您必须将控件发送回 dashboard/home 屏幕,以便立即看到效果。

请参阅Android get hosting Activity from a view

您还可以看到How to use font assets using XML resources, in Android

Using styles for your components in Android

快乐编码:-)