在Android应用中创建语言选择器是否推荐?

3
在Android应用中,是否建议创建语言选择器,还是只需为语言创建必要的资源文件(绘图/字符串)?如果某人在手机上将语言设置为英语,但希望在德语中使用该应用程序,则可以通过选择器更改语言。
我尝试实现了这个答案中的选择器,但当我关闭应用程序时,语言会重置为默认设置。我没有找到任何解决方案,因此也许建立语言选择器不是一个好主意。有任何建议吗?
谢谢!

3
是否建议在Android应用程序中创建语言选择器?- 在这个问题上,你应该去问问UX Stack Exchange http://ux.stackexchange.com/。 - ug_
你可以使用SharedPreferences来记住用户的语言选择。 - Salih Erikci
3个回答

2
更简单的做法是使用依赖于应用外部设置的区域设置的标准方法。但是,有很多好的理由希望在应用程序内切换语言环境,比如编写可能被多个人使用的展示器应用。
您仍可以通过覆盖当前配置的语言环境来利用内置的资源选择。但正如您所发现的那样,语言环境会不断地重置为设备默认值。我发现如果启动另一个活动,则它继承了启动它的活动的语言环境。但是,如果该活动稍后被重新创建,例如在方向更改时,它将使用设备的默认语言环境重新创建。要保持所需的语言环境,请在每个活动的onCreate(...)中在调用setContentView(...)之前执行此操作:
    Resources res = getBaseContext().getResources();
    Configuration config = res.getConfiguration();
    Locale locale = new Locale("es", "US"); // get preferred locale from shared preferences or something
    config.locale = locale; // config.setLocale(...) requires API 17
    res.updateConfiguration(config, res.getDisplayMetrics());

值得一提的是,很多用户可能不想使用他们手机所报告的语言环境。一个完美的例子就是中文(繁体、简体、拼音)! - Jake Lee

1

1
设置默认语言环境不会“固定”。每当应用程序的一个活动被销毁或重新创建(例如方向更改)时,它都会被更改回系统默认语言环境。Locale.setDefault(...)的文档说:“这不会影响系统配置,并且试图覆盖系统提供的默认语言环境可能会被实际更改系统配置的操作所覆盖。调用此方法的代码通常是不正确的,并且应通过将适当的语言环境传递给每个调用的区域敏感方法来修复。” - Kevin Krumwiede
哦,真的吗?我以为它是那样工作的。谢谢,我已经纠正了。 - Bene

1
如果您使用此处推荐的本地化语法:

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

你不会遇到这个问题。如果有人在他们的手机上使用德语作为语言,而你已经正确设置了本地化,则当你的应用程序加载时,你将拥有德语作为正确的语言。这也适用于任何语言,并为你提供所需的多样性。

MyProject/
    res/
       values/
           strings.xml
       values-es/ <---Spanish
           strings.xml
       values-fr/ <---- French
           strings.xml

你需要确保在创建 values 文件夹时使用 iso-630-1 语言代码。
如果你想让用户能够在你的应用中更改语言偏好设置,你可以使用 SharedPreferences 记录他们的选择,并在应用加载/启动时设置语言。

我明白了这一部分,但如果有人在手机上使用英语,但他只想使用德语的应用程序,那么我该怎么办?如果他选择了德语作为语言,那么该应用的默认语言会在下次启动时保持为德语吗?此外,这样做是否被推荐? - daniel.keresztes
@KERiii,是的,如果您使用“SharedPreferences”,您将能够持久化数据。本质上,您将能够仅在应用程序中获取语言,而不是整个手机。您还可以使用数据库,但这有点过度。基本上,您的问题是在关闭应用程序时未持久化数据。SharedPreferences将允许您执行此操作。 - BlackHatSamurai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接