我的国家(西班牙)有多种语言(es-ES,ca-ES,gl-ES,eu-ES)。我们暂时不会添加所有语言,因此我们希望在西班牙使用主要语言,即西班牙语。当用户选择了该国家/地区的其他语言时,我们希望显示/values-es/strings.xml
。我们怎么能这样做?
哦,我们希望使用英语作为默认语言(/values/strings.xml
)。
像/values-ES/strings.xml
这样的东西会很棒,但我想这是不可能的,因为第一个代码应该是语言代码。
现在我们正在将/values-es/strings.xml
文件复制到其他文件夹(values-ca
,values-gl
和values-eu
),但我们希望避免这种情况。
答案 0 :(得分:1)
我认为你应该只有2个文件夹,每个文件夹只有1个 strings.xml :
当您的应用安装在使用意大利语语言配置的设备上时,它将使用案例1中的文件资源。
当您的应用安装在配置了西班牙语语言的设备上时(并且有很多西班牙语语言),请考虑南美国国家),它将使用案例2中的文件资源。
您可以使用Android Studio轻松完成:
答案 1 :(得分:0)
我会说你想做这样的事情。
if (Locale.getDefault().getISO3Country().equals("ESP"))
{
Locale[] locales = Locale.getAvailableLocales();
for (Locale loc : locales)
if (loc.getISO3Language().equals("SPA"))
{
Locale.setDefault(loc);
break;
}
}
注意:我不确定我是否正确使用ISO3语言和国家/地区代码。而且你还必须为es-ES语言环境不可用的(罕见?)情况做点什么。
答案 2 :(得分:0)
如果您尝试使用西班牙语覆盖加泰罗尼亚语,您可能应该在values-ca/strings.xml
文件中使用。
您要求的方法是在相应的移动国家/地区代码资源文件夹中提供资源,该文件夹优先于语言区域资源。
假设您遇到以下情况:
应用程序代码需要R.string.text_a
有两个相关的资源文件:
res/values-mcc404/strings.xml
,其中包含应用程序默认语言中的 text_a ,在本例中为英语。
res/values-hi/strings.xml
,其中包含印地语中的 text_a 。
应用程序在具有以下配置的设备上运行:
SIM卡连接到印度的移动网络(MCC 404)。
语言设置为印地语(hi)。
即使设备配置为印地语,Android也会从res/values-mcc404/strings.xml
(英文)加载 text_a 。这是因为在资源选择过程中,Android会更喜欢MCC匹配语言匹配。
西班牙的MCC是214。
(见Localization)
答案 3 :(得分:0)
我找到了另一个棘手的解决方案:硬链接。虽然它并没有完全消除整个问题,但它至少可以保护您免受在多个目录中复制文件或在所有现有文件中进行相同更改的日常任务,并有可能遗漏错误。
但我必须承认有一些警告:
1)某些IDE默认情况下不支持使用硬链接。 Intellij IDEA 和 Android Studio 会破坏您的硬链接,如果您不禁用"安全写入"设置中的选项。
2)默认情况下,大多数版本控制系统也不支持硬链接。我们以 git 为例。在恢复或合并更改后,它将破坏现有的硬链接。
目前,我使用批处理文件在git中断后恢复硬链接。
答案 4 :(得分:0)
在一般术语中,在包含相关数据的values文件夹下应该只有一个strings.xml
文件。
如果我们明确指定不同的值文件夹,如值-ca,values-es,只要android设备中有设置更改,它将查找特定文件夹并获取相应的字符串值。
如果要求保持统一文本意味着更好地仅使用值 - > strings.xml
文件与所需数据。
但是使用这种方法多语言apk
是不可能的,即对于其他国家不同的语言是预期的,会再次出现变化。因此,无论我们需要统一语言,只需单独使用单个文件夹,无论多语言是首选,我们都可以拥有多个值-es,values-ca文件夹。
希望有所帮助
答案 5 :(得分:0)
如何尝试在java中设置它,而不是使用strings.xml。 在编程时这样做可以在运行时为您提供更大的灵活性。
Configuration config = new Configuration(getResources().getConfiguration());
Locale locale = Locale.getDefault();
String country = locale.getCountry();
String language = locale.getLanguage();
if (country.equalsIgnoreCase("ES") && (language.equalsIgnoreCase("ca") || language.equalsIgnoreCase("gl") || language.equalsIgnoreCase("eu"))) {
locale = new Locale("es");
}
config.setLocale(locale);
然后,您只需为所有ES国家/地区语言设置一个 /values-es/strings.xml 。
答案 6 :(得分:-1)
您可以点击这些链接。
http://www.androidhive.info/2014/07/android-building-multi-language-supported-app/
https://www.tutorialspoint.com/android/android_localization.htm
https://www.icanlocalize.com/site/tutorials/android-application-localization-tutorial/
例如,如果代码加载一个名为“R.string.title”的字符串,Android将通过从匹配的“res / values”目录中加载相应的strings.xml文件,在运行时为该字符串选择正确的值。
要拥有多语言Android应用,您需要向Android提供本地化资源文件。
如果区域设置为“en-US”,Android将通过以下方式查找“R.string.title”值: 当它设法在资源文件中找到字符串时,它使用该值并停止搜索。这意味着默认语言充当后备选项,当存在转换时,则使用它。这也意味着你应该本地化所有内容或者什么也不做,因为看到一半翻译的应用程序通常比完全没有翻译的应用程序更糟糕。