【问题标题】:Xamarin.mac Resources localization doesn't change by current cultureXamarin.mac 资源本地化不会因当前文化而改变
【发布时间】: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 文件,然后重命名了它。

【问题讨论】:

    标签: c# localization resx culture xamarin.mac


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      相关资源
      最近更新 更多