使用strings.xml 在数据库上存储多语言值的最佳方法?

Posted

技术标签:

【中文标题】使用strings.xml 在数据库上存储多语言值的最佳方法?【英文标题】:Best way to store multilanguage values on a database using strings.xml? 【发布时间】:2013-07-30 10:35:01 【问题描述】:

这是我的第一个问题:)

我正在开发一个将动物物种存储在数据库中的应用程序。该应用程序必须是多语言的,所以我坚持使用 strings.xml 资源文件。

这个想法是将物种的英文名称存储在数据库中,例如“cat”、“dog”等,然后根据这样的 xml(意大利语)向用户显示实际翻译:

<string name="dog">Cane</string>
<string name="cat">Gatto</string>

问题是 R.string 包含名称 dog 和 cat,但它们实际上是 int,所以我正在寻找一种使用“dog”字符串来比较 R.string.dog 翻译值的方法.

我几乎可以肯定我的设计非常错误,但不知道做这种工作的正确方法是什么,因为该应用程序现在处于非常早期的开发阶段。

谢谢

用例子编辑

这个例子说明了这个问题:

数据库数据:

row1: id="1", value="dog"

row2: id="2", value="cat"

字符串文件strings.xml:

<string name="dog">Dog</string>
<string name="cat">Cat</string>

字符串文件strings-it.xml:

<string name="dog">Cane</string>
<string name="cat">Gatto</string>

我的问题是:用户想用他的母语插入一个物种(例如“甘蔗”),我想在插入之前在数据库中搜索它的存在。

我应该对数据库上的每一行进行循环(其中值以英文存储),获取每一行的翻译(例如:我找到 cat,然后我翻译为“Gatto”)并与用户输入进行比较。

有可能吗?

【问题讨论】:

【参考方案1】:

如果你有想要使用的字符串名称,可以使用getIdentifier() 获取字符串id。以查找R.string.cat为例:

Resources res = getResources();
int stringId = res.getIdentifier("cat", "string", packageName);

在上面的例子中,如果没有找到 R.string.cat,它会简单地返回 0。这是一个简单的测试,看看一个字符串是否存在。

或者,您可以使用以下方法在 R.java 中获取 all 字符串 id 的数组:

Field[] fields = R.string.class.getFields();
int[] ids = new int[fields.length];
for(int i=0;i<field.length;i++)
    ids[i] = field[i].getInt(null);

当然,这也会查找您并不真正打算作为翻译的任何字符串,例如对话框/窗口标题、标签/按钮标题等。在一般情况下,我不建议这样做。如果我不得不这样做,我会在“翻译”字符串前面加上一些东西,这样我就可以很容易地分辨出什么是什么,比如"entry_cat"

请注意,我们正在使用反射,如果您有 很多 字符串,它可能会减慢您的速度。如果您循环 R.java,我建议只在启动时进行,并将值保存在某种数组/列表中。

【讨论】:

谢谢!这正是我正在寻找的!与此同时,我找到了另一种设计数据库的方法,类似于***.com/questions/929410/…。此帮助可能对我的应用程序中的其他功能有用。抱歉,我是新手,无法投票。 一般来说,这可能是一个更好的数据库设计,是的。不过,getIdentifier 在其他领域确实派上用场。至少对我来说是这样,所以记住这不是一件坏事。【参考方案2】:

首先阅读此内容。

http://developer.android.com/training/basics/supporting-devices/languages.html

您可以使用多种语言创建 value 文件夹,例如 janapee、dutch 等

您可以在项目的 res 文件夹中找到 value 文件夹。并创建新的值文件夹。

res/
       values/
           strings.xml
       values-es/
           strings.xml
       values-fr/
           strings.xml

只需通过谷歌翻译器将您的文字翻译成任何语言并放入 STRING.XML 文件中。

【讨论】:

正如我在另一个回答中所说,我知道如何静态使用资源文件,问题是如何动态地做到这一点:我已经用一个例子更新了这个问题 这些是已知的事实,因此对原始问题无用。【参考方案3】:

好吧,首先,开始阅读这个here:

假设您的应用程序的默认语言是英语。认为 您还希望将应用程序中的所有文本本地化为 法语,以及应用程序中的大部分文本(除 应用程序的标题)到日语。在这种情况下,您可以创建 三个可选的 strings.xml 文件,每个文件都存储在特定于语言环境的文件中 资源目录:

res/values/strings.xml 包含所有字符串的英文文本 应用程序使用,包括名为标题的字符串的文本。 res/values-fr/strings.xml 包含所有字符串的法语文本, 包括标题。 res/values-ja/strings.xml 包含日语文本 除了标题之外的所有字符串。如果您的 Java 代码指的是 R.string.title,这是运行时会发生的事情:

如果设备设置为法语以外的任何语言,Android 将 从 res/values/strings.xml 文件加载标题。如果设备已设置 对于法语,Android 将从 res/values-fr/strings.xml 加载标题 文件。请注意,如果设备设置为日语,Android 将看起来 res/values-ja/strings.xml 文件中的标题。但因为没有这样 字符串包含在该文件中,Android 将回退到 默认,并且会从 res/values/strings.xml 文件。

【讨论】:

感谢您的回复。我知道如何使用本地化,因为我的小部件(按钮和标签)已经正确翻译。当我搜索现有物种时出现我的问题,例如我想在我的数据库中搜索“cane”(英语中的狗),其中所有值都以英语存储。我如何进行这种动态翻译并将存储的值与 R.string 进行比较。价值? 问题是您必须在res 文件夹中创建单独的文件夹,例如values-frvalues-es,以便相应地使用它们。 我再说一遍:我知道如何使用翻译。先生的问题是这样写一个查询: select * from species where $inputSpecieInItalian = $dbspecieInEnglish 好的,那为什么不把&lt;string name="cane"&gt;Dog&lt;/string&gt;放在资源中,这样你就知道在搜索“cane”时你会得到具有该名称的资源并可视化它后面的字符串值。

以上是关于使用strings.xml 在数据库上存储多语言值的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 strings.xml 中存储十六进制颜色值

Hibernate:OneToMany 映射不基于 PK?

使用strings.xml和翻译

是否可以使用 SQLite 来存储翻译而不是像 strings.xml 这样的 XML 资源

Android Studio 多语言插件

Android 产品研发-->实现国际化(多语言)