我想在我的应用程序中动态应用本地化,所以是否有可能在Java文件中定义字符串并将这些字符串提取到我们的布局XML文件中,即像我们替换@string/anystringname一样,将其替换为Java文件中定义的字符串,例如@somestring?
我想在我的应用程序中动态应用本地化,所以是否有可能在Java文件中定义字符串并将这些字符串提取到我们的布局XML文件中,即像我们替换@string/anystringname一样,将其替换为Java文件中定义的字符串,例如@somestring?
{
"hello": "Hello"
}
french.json
{
"hello": "Bonjour"
}
public class StringManager {
private static StringManager sInstance = null;
private static String sDefaultLanguageCode = "en";
private Map<String, JSONObject> mLanguageMap = new ArrayMap<>();
private StringManager() {
}
public static StringManager getInstance() {
if (sInstance == null) {
synchronized (StringManager.class) {
if (sInstance == null)
sInstance = new StringManager();
}
}
return sInstance;
}
public static void setDefaultLanguageCode(String languageCode) {
sDefaultLanguageCode = languageCode;
}
public void addLanguage(String languageCode, JSONObject json) {
mLanguageMap.put(languageCode, json);
}
public String getString(String key) {
return mLanguageMap.get(mDefaultLanguageCode).getString(key);
}
public String getString(String languageCode, String key) {
return mLanguageMap.get(languageCode).getString(key);
}
}
public class SomeActivity extends Activity {
...
public void initStringResources() {
// assume englishJsonObject is created from english.json
StringManager.getInstance().addLanguage("en", englishJsonObject);
StringManager.getInstance().addLanguage("fr", frenchJsonObject);
StringManager.setDefaultLanguageCode("fr");
}
public void useSomeString() {
String helloString = StringManager.getInstance().getString("hello");
// helloString will be "Bonjour"
// and you can get specific language string
String englishHelloString = StringManager.getInstance().getString("en", "hello");
}
// this may be called from Button or other UI component
public void onLanguageChanged(String languageCode) {
StringManager.setDefaultLanguageCode(languageCode);
// and update UI components that display localized strings
}
}
<TextView android:text="@string/hello"/>
那么,当然不会起作用。
相反,你可以通过编程方式设置TextView的文本。
如果你在XML文件中声明了一个TextView,如下所示:
<TextView android:id="@+id/my_textview">
你可以按以下方式使用我的解决方案;
TextView textView = (TextView) findViewById(R.id.my_textview);
textView.setText(StringManager.getInstance().getString("hello")); - nexus5x这是不可能的。但是在运行时更改应用程序的语言是可能的。这允许您在不同语言的strings.xml之间切换。 我用于此的库是Android本地化库 所有活动都必须扩展LocalizationActivity,该类又扩展了AppCompatActivity。您只需调用 setLanguage("en"); 即可更改应用程序的语言,并使用不同的strings.xml
在此线程中,您可以阅读更多可能的解决方案。
<TextView
android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/tv"
/>
<string name="tv">old text</string>//old text
final TextView textView = (TextView) findViewById(R.id.rate);
textView.setText("new text");//new text