Xamarin.mac 资源本地化不会因当前文化而改变

Posted

技术标签:

【中文标题】Xamarin.mac 资源本地化不会因当前文化而改变【英文标题】:Xamarin.mac Resources localization doesn't change by current culture 【发布时间】:2016-10-21 16:35:46 【问题描述】:

我正在尝试使用 .resx 文件在 xamarin.mac 中进行本地化

在 AppDelegate 中,我更改了线程的当前文化:

System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo ("ru");
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo ("ru");

我的应用程序中还有两个资源文件:

但字符串总是从默认资源文件中显示...有什么解决办法吗?

我也使用本地语言更改,这里是整个 AppDelegate 构造函数:

public AppDelegate ()
        

            string [] lang =  "ru", "en" ;
            NSUserDefaults.StandardUserDefaults.SetValueForKey (NSArray.FromObjects (lang), (Foundation.NSString)"AppleLanguages");
            NSUserDefaults.StandardUserDefaults.Synchronize ();

            System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo ("ru");
            System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo ("ru");

            Resources.Culture = GetCurrentCultureInfo ();

        

顺便说一句,如果我的项目中有 resource.ru,xamarin studio 6.1.1(build 15)不允许我添加 resource.ru.resx,有点错误!

我创建了 resource-ru.resx 文件,然后重命名了它。

【问题讨论】:

【参考方案1】:

您需要在从操作系统检索应用程序文化后设置它,类似这样(警告,这是来自 Xamarin ios,但对于文档,它的工作方式相同,如果不建议我,我将删除该帖子) :

    //Add this somewhere
    public System.Globalization.CultureInfo GetCurrentCultureInfo ()
    
        var netLanguage = "en";

        if (NSLocale.PreferredLanguages.Length > 0) 
            var pref = NSLocale.PreferredLanguages [0];
            netLanguage = pref.Replace ("_", "-"); // turns en_US into en-US
        

        try
        
            return new System.Globalization.CultureInfo(netLanguage);
        catch

            try

                return new System.Globalization.CultureInfo(netLanguage.Substring(0, netLanguage.IndexOf("-")));

            
            catch

                return new System.Globalization.CultureInfo("en");

            

        
    

    //And finally add this at the start of the app
    AppResources.Culture = GetCurrentCultureInfo();

【讨论】:

感谢@Gusman 的回答.. 但它对我不起作用:(这里还有一项任务,我还使用母语更改:string [] lang = "ru", "en " ; NSUserDefaults.StandardUserDefaults.SetValueForKey(NSArray.FromObjects(lang), (Foundation.NSString)"AppleLanguages"); NSUserDefaults.StandardUserDefaults.Synchronize(); 之后我设置你写的代码: Resources.Culture = GetCurrentCultureInfo(); 获取 resources.ru.resx 文件有问题:(【参考方案2】:

你可能会遇到

https://bugzilla.xamarin.com/show_bug.cgi?id=45696

您可以使用自定义 msbuild 步骤解决此问题。此处显示(由于长度):

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
	<PropertyGroup>
	    <CreateAppBundleDependsOn>$(CreateAppBundleDependsOn);WorkAroundLocalizationBug-ES;WorkAroundLocalizationBug-FR</CreateAppBundleDependsOn>
	</PropertyGroup>

	<Target Name="WorkAroundLocalizationBug-ES" Inputs="$(OutputPath)es/XMLocalizationSample.resources.dll" Outputs="$(AppBundleDir)/Contents/MonoBundle/es/XMLocalizationSample.resources.dll">
	    <Copy SourceFiles="$(OutputPath)es/XMLocalizationSample.resources.dll" DestinationFiles="$(AppBundleDir)/Contents/MonoBundle/es/XMLocalizationSample.resources.dll" />
	</Target>
	<Target Name="WorkAroundLocalizationBug-FR" Inputs="$(OutputPath)fr/XMLocalizationSample.resources.dll" Outputs="$(AppBundleDir)/Contents/MonoBundle/fr/XMLocalizationSample.resources.dll">
	    <Copy SourceFiles="$(OutputPath)fr/XMLocalizationSample.resources.dll" DestinationFiles="$(AppBundleDir)/Contents/MonoBundle/fr/XMLocalizationSample.resources.dll" />
	</Target>
</Project>

可在此处找到完整示例:https://github.com/xamarin/mac-samples/tree/master/XMLocalizationSample

【讨论】:

以上是关于Xamarin.mac 资源本地化不会因当前文化而改变的主要内容,如果未能解决你的问题,请参考以下文章

在 web.config 中设置的当前文化

使用 ASPNETCore 1.1.1 本地化默认将当前文化设置为浏览器文化

如何为编码的 UI 测试设置文化以从资源文件中获取本地化文本?

调试器不会因错误而停止

处理因方法内部动态分配而导致的内存泄漏,而不会影响信号/插槽机制

在角度翻译中使用自定义加载器的问题