【问题标题】:Get language translation in xml from external json file从外部 json 文件中获取 xml 中的语言翻译
【发布时间】:2015-01-02 16:47:33
【问题描述】:

作为我正在开发的应用程序的一部分,要求它必须下载包含需要在应用程序中使用的语言翻译的 JSON 文件,而不是常用的 strings.xml 文件,因为这样任何翻译可以通过在某些门户网站上更新外部 JSON 文件来更改应用程序,并且每次您想要更改语言翻译时都无需重新构建。

我已经这样做了,一切正常,如下所示: 例如,如果我在活动开始后在 xml 中有按钮,我可以引用该按钮并设置它的文本来自我在启动时下载的 JSON。

btnLogin = (Button) v.findViewById(R.id.btnLogin);

// reads translation from json that is stored in external application directory
btnLogin.setText(ResourceManager.getString("btnLogin"));

但是我的问题是有什么方法可以避免始终从活动中设置此文本,我可以从定义此按钮的 XML 文件中以某种方式进行吗?

<Button
        android:id="@+id/btnLogin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="{ResourceManager.getString("btnLogin")}"/>

有没有可能让我从 xml 调用一些函数并将其结果绑定到文本属性,或者是否有任何其他方法可以避免从活动中引用所有按钮/文本视图和其他控件并从那里设置文本?

【问题讨论】:

    标签: android json translation


    【解决方案1】:

    您是否尝试过在您的应用程序类中覆盖 getResources(),然后 返回资源的扩展版本。

    好的,我试过了,它似乎适用于我的 xml 文件中的大部分资源。 您可能需要在多个地方覆盖它。我只是在我的 Application 类中覆盖了它。

    private MyResources resources;
    
    @Override
    public Resources getResources() {
        if (resources == null) {
            resources = new MyResources(super.getResources());
        }
        return resources;
    }
    
    class MyResources extends Resources {
    
    
        public MyResources(Resources resource) {
            super(resource.getAssets(), resource.getDisplayMetrics(), resource.getConfiguration());
        }
    
        public String getString(int resId) {
            return "Bob";  // Use your ResourceManger here
        }
    }
    

    这对我有用..

    【讨论】:

    • ResourceManager 类是我创建的用于从 JSON 文件中解析和获取语言翻译的类,它与 android 资源无关。我想知道是否有一种方法可以从 xml atrribute (android:text="executeFunction("translationKey")") 调用一些函数调用,这将返回一些值并将其设置为文本,这样我就可以避免额外的代码我必须引用每个控件并设置它的翻译的每个活动。
    • 可以,但是xml是通过Resources类解析的。因此,如果您扩展该类并且可以让系统使用您的扩展版本,那么您可以覆盖资源中的方法并改为调用您的类函数?
    • 没关系,看起来 getString 在 Resources 类上是最终的。
    • 将此更改为工作代码示例。我在一个应用程序上尝试过,它似乎用“Bob”替换了应用程序中的大部分字符串。我假设您有某种方法可以从 resId 获取 JSON 值。
    • 我如何从 xml 调用这个 getString 调用,它只有 int resId 参数,我没有使用,因为我的 JSON 文件中有一些其他字符串键用于语言翻译值?跨度>
    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2012-05-21
    • 2011-07-12
    相关资源
    最近更新 更多