我正在为我的应用程序实现国际化。国际化的主要部分是支持多语言。
支持多语言的一种方法是,在values
目录下创建多个res/
目录,并为相应的语言提供strings.xml。示例here。
但我的要求是这样的:
用户输入其凭据以登录该应用程序。根据在此应用程序上创建帐户时选择的语言,用户可以选择一种语言。
因此,在成功登录后,我将调用将返回应用程序中所有字符串的服务。动态地,我必须将这些字符串与应用程序中的标签相关联。
如何有效地完成上述事情?
我想到的一种方法是,在成功登录时调用服务并将所有信息存储在共享首选项中。然后使用它。
还有其他办法吗?
如果xml布局文件具有android:text=""
?
请分享您对此的看法。
答案 0 :(得分:2)
看看Change language programmatically in Android。无论你做什么,你都应该使用Android标准方式(资源)而不是重新发明轮子。
更新: 由于您的奇怪约束,如果您决定重新发明轮子,您可以使用视图的TAG字段创建派生类,如:
public class LocalizableTextView extends TextView {
public LocalizableTextView(Context ctx, AttributeSet attrs) {
super(ctx, attrs);
setText(MyLocalizableStuff.get(this.getTag());
}
}
并创建一个静态助手类MyLocalizableStuff,如下所示:(需要错误检查等,只需输入我的脑袋)
public static class MyLocalizableStuff {
private static HashMap<Integer,String> sStringTable=new HashMap<>();
public static String get(Object code) {
Integer intCode=Integer.valueOf((String)code);
String result=sStringTable.get(intCode);
return result;
}
public static void init(Context ctx) {
// read your strings and store them on the stringtable
// you will call this init from onCreate like
// MyLocalizableStuff.init(context)
}
}
这样,您可以在XML中插入LocalizableTextViews
并分配一个(数字)TAG代码,该代码将映射到String并在构造时间内分配给TextView
。您也可以使用Strings作为代码,但请记住,HashMap会慢一些。
您还可以使用SparseArray
来存储字符串表而不是HashMap
,它可能会更快。
但同样,我不会走这条路。