根据用户选择更改应用程序语言配置

时间:2017-05-02 16:22:41

标签: xamarin localization xamarin.forms

我试图让我的Xamarin Forms应用程序支持多种语言,如英语和阿拉伯语,这种语言基于用户选择,而不是基于手机语言。 以下代码显示了我如何将语言更改为阿拉伯语或英语。

以下代码是Xamarin Forms Samples

中TranslateExtension的一部分
public object ProvideValue(IServiceProvider serviceProvider)
{
    if (Text == null)
        return "";
    ResourceManager resmgr = new ResourceManager(ResourceId, typeof(TranslateExtension).GetTypeInfo().Assembly);

    var translation = resmgr.GetString(Text, ci);
    if (translation == null)
    {
#if DEBUG
        throw new ArgumentException(
        String.Format("Key '{0}' was not found in resources '{1}' for culture '{2}'.", Text, ResourceId, ci.Name),"Text");
#else
        translation = Text; // HACK: returns the key, which GETS DISPLAYED TO THE USER
#endif
    }
    return translation;
}

任何人都可以帮助我并告诉我如何根据用户选择而不是基于设备语言来完成这项工作。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

显然,您粘贴的代码来自this example。基于该示例,您可以看到有一个变量ci,其中包含扩展程序所在的CultureInfo。

因此,问题的解决方案是正确设置ci变量。如果用户选择了区域设置,您可能会将其保存在某处。在TranslateExtension构造函数中,您可以从保存它的位置检索该区域设置。

类似的东西:

public TranslateExtension() {
    var userlocaleSvc = DependencyService.Get<IUserLocale>();
    if (userlocaleSvc.CustomCultureInfoSet()) // this method is made up
    {
        ci = userlocaleSvc.GetCultureInfo(); // this method is made up
    } else {
        ci = DependencyService.Get<ILocalize>().GetCurrentCultureInfo(); // fallback
    }
}

您还可以在资源上设置CultureInfo,因此不使用TranslateExtension的资源也会被正确翻译(AppResources是您提供资源文件的名称,您可以使用任何您想要的名称):

AppResources.Culture = new CultureInfo ("<shortcode of selected locale>");

请参阅Xamarin documentation on localization here