2016-10-21 5 views
4

私は、スレッドの現在のカルチャを変更Xamarin.macリソースのローカライズは、現在の文化

インサイドAppDelegate xamarin.macにローカライズ用のファイルを.resxファイルを使用しようとしていますによって変更されません。

enter image description here

しかし、文字列は常にデフォルトのリソースファイルから示されています。また、私は私のアプリ内の2つのリソースファイルを持っています。 ..どんな解決策ですか?

は、私はまた、ネイティブ言語の変更を使用し、ここでは全体の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(); 

     } 

、xamarinスタジオ6.1.1(15ビルド)私が持っているなら、私はresource.ru.resxを追加することはできません。私のプロジェクトでresource.ru、ちょっとバグ!

私はresource-ru.resxファイルを作成して名前を変更しました。

答えて

1

OSから取得した後にアプリケーションカルチャを設定する必要があります(警告、これは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(); 
+0

感謝を..しかし、それは私のために動作しません:(ここでもう1つのタスクがあります。私はまた、母国語の変更を使用します。 string [] lang = {"ru"、 "en"}; \t \t \t NSUserDefaults.StandardUserDefaults.SetValueForKey(NSArray.FromObjects(lang)、(Foundation.NSString ) "AppleLanguages"); \t \t \t NSUserDefaults.StandardUserDefaults.Synchronize(); この後、あなたが書いたコードを設定します:Resources.Culture = GetCurrentCultureInfo(); – Nininea

+0

ここにresources.ru.resxファイルを取得する間違っています:( – Nininea

0

あなたが実行している可能性が高い

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

にカスタムMSBuildのステップを使用して、それを回避することができます。 (起因する長さに)ここに示す:

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

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

完全なサンプルがここで見つけることができます:回答@Gusmanため​​3210

関連する問題