我正在尝试在我的应用程序(英语和希伯来语)中实现多语言。
我创建了2个字符串文件,并实现了应支持多语言功能的所有方法。
但是,当我运行该应用程序并在对话框中选择“希伯来语”时,布局从左到右更改为从右到左(因为它应该在希伯来语中),但是语言没有改变。谁能帮我解决这个问题?
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private Button btn_chooseBoard;
private Button btn_store;
private Button btn_language;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loadLocale();
setContentView(R.layout.lay_main);
Constants instance = Constants.getInstance();
instance.getAllPlayers();
instance.getAllBoards();
btn_chooseBoard = (Button) findViewById(R.id.btn_startGame);
btn_store = (Button) findViewById(R.id.btn_popup_store);
btn_language = (Button) findViewById(R.id.btn_language);
btn_chooseBoard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, ChooseBoard.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(20);
}
});
btn_store.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, Store.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(20);
}
});
btn_language.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showChangeLanguageDialog();
}
});
}
/**
* Reset game on resume main activity
*/
@Override
public void onResume() {
super.onResume();
GameLogic.getGameLogic().resetGame();
}
private void showChangeLanguageDialog() {
// Array of language to display in alert dialog
final String[] listItems = {"English", "עברית"};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Choose Language...");
builder.setSingleChoiceItems(listItems, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (i == 0) {
// English
setLocale("en");
recreate();
} else if (i == 1) {
// Hebrew
setLocale("iw");
recreate();
}
// Dismiss alert dialog when language stored
dialogInterface.dismiss();
}
});
AlertDialog alertDialog = builder.create();
// Show alert dialog
alertDialog.show();
}
private void setLocale(String lang) {
Locale locale = new Locale(lang);
Locale.setDefault(locale);
Configuration configuration = new Configuration();
configuration.locale = locale;
getBaseContext().getResources().updateConfiguration(configuration, getBaseContext().getResources().getDisplayMetrics());
// Save data to shared preference
SharedPreferences.Editor editor = getSharedPreferences("Settings", MODE_PRIVATE).edit();
editor.putString("language", lang);
editor.apply();
}
// Load language saved in shared preference
public void loadLocale() {
SharedPreferences pref = getSharedPreferences("Settings", Activity.MODE_PRIVATE);
String language = pref.getString("language", "");
setLocale(language);
}
}
最佳答案
Android有自己的API来处理不同的语言环境。
用户在Android系统设置中设置其语言环境。
您无需询问用户的语言环境。
只需将英语字符串放入res / values / strings.xml,将希伯来语字符串放入res / values-iw / strings.xml。
也可以通过使用开始/结束而不是左/右来处理布局xml中的ltr / rtl。
编辑:
我不知道是否可以像在setLocale()中一样更改应用程序的语言环境。
您应该关闭应用程序并将其从应用程序堆栈中删除。
然后在Android设置中将语言更改为希伯来语,然后重新打开您的应用。
如果您现在拥有在布局.xml中定义的rtl布局,但没有希伯来字符串,那么strings.xml可能存在问题。
您的strings.xml可能没有正确的路径(res / values-iw / strings.xml)。
否则strings.xml的内容可能是错误的。字符串ID可能与您的英语strings.xml中的ID不同。
您还可以打印出您当前的语言环境,以查看是否将其设置为“ iw”,如此处所述:
14389349