Android:在运行时处理国际化/多语言

时间:2016-02-01 11:16:12

标签: android internationalization

我正在为我的应用程序实现国际化。国际化的主要部分是支持多语言。

支持多语言的一种方法是,在values目录下创建多个res/目录,并为相应的语言提供strings.xml。示例here

但我的要求是这样的:

用户输入其凭据以登录该应用程序。根据在此应用程序上创建帐户时选择的语言,用户可以选择一种语言。

因此,在成功登录后,我将调用将返回应用程序中所有字符串的服务。动态地,我必须将这些字符串与应用程序中的标签相关联。

如何有效地完成上述事情?

我想到的一种方法是,在成功登录时调用服务并将所有信息存储在共享首选项中。然后使用它。

还有其他办法吗? 如果xml布局文件具有android:text=""

,我如何更改文本

请分享您对此的看法。

1 个答案:

答案 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,它可能会更快。

但同样,我不会走这条路。