正如我们已经知道的那样我们无法在运行时更改res
文件夹值和文件,
我正在开发一个应用程序,我们支持超过25种语言,由于这些字符串文件,APK大小大幅增加,我们非常关注APK大小,所以我们不想将所有这些string.xml
文件保存在项目中(在apk中)。
我们的想法是,我们只会在string.xml
内保留英语res
,并且应该根据需要在应用程序启动时从服务器下载所有其他语言string.xml
。
因此我们计划创建自己的getResource( key, currentLocale)
,然后这将从将从服务器下载的XML(或文本)文件中读取。
请建议任何更好的想法或一些方法,
感谢您的支持
答案 0 :(得分:1)
编译后无法更改不幸的资源。唯一的方法是从服务器下载语言shema(即应用程序启动时)并在sqlite,文件或共享首选项(存储选项:https://developer.android.com/guide/topics/data/data-storage.html#filesInternal)中保存(或更新,如果需要)。
答案 1 :(得分:1)
您知道Android App Bundle吗?这是将您的应用发布到Google Play的一种新方法,您无需重构代码即可使用它,并且从Play商店下载的APK会更小?
来自Google Developers:
新的应用发布格式Android App Bundle更加实用 构建和发布应用的有效方法。 Android应用程式套件 让您更轻松地在较小的应用程序尺寸中提供出色的体验, 允许当今可用的各种Android设备。它的 易于切换。您无需重构代码即可启动 受益于更小的应用程序。
在Android Studio 3.2或更高版本以及Unity 2018.3 beta版本中可用。
因此,如果您的项目有25种语言,并且我的设备已将英语配置为设备语言,那么当我下载您的APP时,它将仅获得strings.xml
文件,其他strings.xml
保留在Google Play中,并且如果您将设备语言更改为葡萄牙语,则Google Play应用将尝试获取新的葡萄牙语strings.xml
并删除带有英文文本的旧文件。
请先尝试以下方法,然后再尝试其他方法,因为这是建议的方法,并且您无需执行其他任何操作,只需将您的应用作为应用捆绑包生成并发送到Play商店,如果您要进行测试,请下载您的应用,然后更改设备语言,您会看到Google Play再次下载该应用的新语言。
希望我仍然可以帮助您。
答案 2 :(得分:0)
此处Sqlite选项更适合您的情况。
以下是数据库表的结构(例如LangTable)
--------- ---------- -------- -------- --------- --- ----
langKey Locale_En Local_hn Local_Fr ....................... n
---------- ---------- --------- -------- ------ ---- --- ---
btnOk ok ..... ...... ..........
btn取消取消......... .... .... .......
现在这里是获取相关本地字符串
的方法public String getResource(String key, String local){
String value = "";
value = Select local from LangTable where langKey = 'key';
return value;
}
答案 3 :(得分:0)
这可以借助Google Play的AppBundle功能来实现。 他的工作之一是允许以后需要时或在您决定时下载其他部件的应用程序(字符串res)。
也有一个不好的方法!您可以完全忽略getString()
并编写一种从其他位置(如下载的文件)中检索字符串的方法
我建议您遵循合理的AppBundle方法,而不必与操作系统抗争。