Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从外部json文件获取xml语言翻译_Android_Json_Translation - Fatal编程技术网

Android 从外部json文件获取xml语言翻译

Android 从外部json文件获取xml语言翻译,android,json,translation,Android,Json,Translation,作为我正在开发的应用程序的一部分,有人要求它必须下载JSON文件,该文件包含应用程序中需要使用的语言翻译,而不是通常使用的strings.xml文件,因为这样,应用程序中的任何翻译都可以通过更新某个web门户上的外部JSON文件来更改,从而避免了创建新的JSON文件的需要每次要更改语言翻译时都要生成 我已经完成了这项工作,并且在以下方面一切正常: 例如,如果活动启动后我有xml中的按钮,我可以引用该按钮,并从启动时下载的JSON中设置该按钮的文本 btnLogin = (Button) v.fi

作为我正在开发的应用程序的一部分,有人要求它必须下载JSON文件,该文件包含应用程序中需要使用的语言翻译,而不是通常使用的strings.xml文件,因为这样,应用程序中的任何翻译都可以通过更新某个web门户上的外部JSON文件来更改,从而避免了创建新的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调用某个函数并将其结果绑定到文本属性,或者有没有其他方法可以避免引用活动中的所有按钮/文本视图和其他控件并从中设置文本?

您是否尝试过重写应用程序类中的getResources,然后 返回资源的扩展版本

好的,我试过了,它似乎适用于xml文件中的大多数资源。 您可能需要在多个位置覆盖此选项。我只是在我的应用程序类中超越了它

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属性android:text=executeFunctiontranslationKey调用函数,它将返回一些值并将其设置为文本,这样我就可以避免从每个活动中调用额外的代码,因为我必须引用每个控件并设置其转换。是的,但是xml是通过Resources类解析的。因此,如果您扩展了该类,并且可以让系统使用您的扩展版本,那么您就可以重写参考资料中的方法并调用您的类函数了?没关系,看起来getString是resources类的最终版本。将此更改为工作代码示例。我在一个应用程序上尝试了它,它似乎用Bob替换了应用程序中的大部分字符串。我假设您有某种方法从resId获取JSON值。我如何从xml调用getString,它只有int resId参数,我没有使用,因为我在JSON文件中有一些其他字符串键用于语言转换值?