【问题标题】:Android: Handling Internationalization/multi-language during runtimeAndroid:在运行时处理国际化/多语言
【发布时间】:2016-02-01 11:16:12
【问题描述】:

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

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

但我的要求是这样的:

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

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

上面的事情如何才能高效完成?

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

还有其他方法可以做到这一点吗? 如果xml布局文件具有android:text="",我该如何更改文本?

请分享您对此的看法。

【问题讨论】:

    标签: android internationalization


    【解决方案1】:

    看看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 代码,该代码将映射到字符串,并在构造时分配给 TextView。您也可以使用字符串作为代码,但请记住 HashMap 会更慢。

    您也可以使用SparseArray 来存储字符串表而不是HashMap,它可能会更快。

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

    【讨论】:

    • 您好,由于某些指定的约束,我需要一种不包含资源文件的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 2021-03-28
    相关资源
    最近更新 更多