Переопределить локаль в приложении Android - PullRequest
2 голосов
/ 19 января 2012

Я знаю, что по этой теме уже есть несколько вопросов, но я просто не могу заставить ее работать.

Чего я хочу добиться, так это:

Телефон Android работает независимо от того, на каком языке он используется. С этого момента локаль перезаписывается на «en». Когда пользователь закрывает приложение, языковой стандарт снова устанавливается по умолчанию.

Я создал самое простое приложение с простым отладочным тостом. Мой телефон на другом языке, кроме "en", но после запуска приложения я по-прежнему получаю значение по умолчанию, а НЕ значение "en".

Что я делаю не так?

Код:

package com.locale.test;

import java.util.Locale;

import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.widget.Toast;

public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    protected void onResume() {
        super.onResume();

        Locale locale = null;
        Configuration config =null;
        config = getBaseContext().getResources().getConfiguration();
        locale = Locale.ENGLISH;
        Locale.setDefault(locale);
        config.locale = locale;
                    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
    }

    /***********************************************************************************************
     * Debug
     **********************************************************************************************/

    @Override
    public boolean onSearchRequested() {
        String density;
        String orientation;

        DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);

        if(metrics.densityDpi == DisplayMetrics.DENSITY_HIGH){ density = "HDPI"; } else
        if(metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM){ density = "MDPI"; } else
        if(metrics.densityDpi == DisplayMetrics.DENSITY_LOW){ density = "LDPI"; } else
        { density = "DEFAULT"; };

        if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
            orientation = "Portrait";
        } else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
            orientation = "Landscape";
        } else if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_SQUARE){
            orientation = "Square";
        } else {
            orientation = "Undefined";
        }

        Toast.makeText(this, "Density = " + density + "\n" +
                             "Orientation = " + orientation + "\n" +
                             "Width = " + metrics.widthPixels + "\n" +
                             "Height = " + metrics.heightPixels + "\n" +
                             "Locale = " + Locale.getDefault(), Toast.LENGTH_LONG).show();      
        return super.onSearchRequested();
    }
}

Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.locale.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="4" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:configChanges="locale">
        <activity
            android:name=".Main"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Обновление от 19 января 2012 года:

Добавлено:

getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

Изменен язык:

 locale = Locale.ENGLISH;

Ответы [ 2 ]

1 голос
/ 15 марта 2013

Я думаю, вам не следует пытаться делать это в методе onResume.Я только что проверил его в методе onCreate (перед установкой макета setContentView (int)), и он работает хорошо.Кроме того, он должен работать просто отлично с изменением ориентации экрана.Код выглядит следующим образом:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Configuration configuration = new Configuration();
    configuration.locale = Locale.FRANCE;
    getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics());

    setContentView(R.layout.main);
}

Я добавил android: configChanges = "locale" для в файле AndroidManifest.xml и создал папку values-fr в res.

1 голос
/ 19 января 2012

Я думаю, вы забыли позвонить updateConfiguration() на объект Resources.

Также я не думаю, что это имеет значение, но я бы использовал константу Locale.ENGLISH.

...