2013-12-13 14 views
6

Xamarin iOS/Androidプロジェクト用の移植可能なクラスライブラリで.NETローカリゼーションを使用しようとしています。私は時の手順に従ってきました:.NETを使用したXamarin iOSのローカライゼーション

How to use localization in C#

し、次のようなコードがあります。私も試した

string sText = strings.enter_movie_name; 
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr"); 
sText = strings.enter_movie_name; 
lblEnterMovieName.Text = sText; 

を:

ResourceManager resman = new ResourceManager(typeof(MyApplication.strings)); 
string sText = resman.GetString("enter_movie_name", new CultureInfo("fr")); 

を、私は、文字列を作成しました"Enter movie name:"と等しいenter_movie_nameを持つ.resxと "Entre la movie name:"と等しいstrings.fr.resx

ただし、sTextは常に「ムービー名を入力:」として終了します。私は "Entre la映画の名前:"バージョンを取得するように見えることはできません。

私もCross-platform Localizationに投稿を見ましたが、うまくいかなかったのです。 Localization on Xamarin.iOSでiOS固有のバージョンを使用したくないので、プラットフォームに依存しないライブラリから自分の文字列を取得したいと思っています。

誰かが間違っていると指摘できますか?

+2

私は実際に似たような質問を投稿しました:http://stackoverflow.com/questions/20608106/how-do-i-get-resx-files-to-work-with-xamarin-ios-for-localization 言語固有のresxファイル(strings.fr.resx)がアプリケーションに埋め込まれないfr \ MyApplication.resources.dllに「コンパイル」されていることを確認します。したがって、常にデフォルトを選択します。 – BoKDamgaard

答えて

7

私は醜い解決策のビットを作成しましたが、それは動作します。私がやったことは、私のポータブルクラスライブラリ(PCL)の「文字列」というフォルダを作って、その内部で呼び出さファイルを作成されます。

  • strings.resx
  • strings_fr.resx
  • strings_ja_JP.resx

すべてを埋め込みリソースとして、カスタムツールをResXFileCodeGeneratorとして設定しました。つまり、言語ごとに個別のリソースDLLがあることを意味します。

iOS版では、私はそれから呼び出すことで、ロケールを取得することができます:

string sLocale = NSLocale.CurrentLocale.LocaleIdentifier; 

私はLocaleを使用してAndroidの同等があります推測するが、私はそれが何であるかを知りません。

これは、 "ja_JP"や "fr_FR"や "en_GB"のような文字列を返します(太字ではなく下線です)。私は適切なリソースマネージャを取得し、そこから文字列を取得するために作成した次の静的クラスでこれを使用します。

与えられたロケールaa_BBは、まずstrings_aa_BBを探し、次にstrings_aaを探し、次に文字列を探します。

public static class Localise 
{ 
    private const string STRINGS_ROOT = "MyPCL.strings.strings"; 

    public static string GetString(string sID, string sLocale) 
    { 
     string sResource = STRINGS_ROOT + "_" + sLocale; 
     Type type = Type.GetType(sResource); 
     if (type == null) 
     { 
      if (sLocale.Length > 2) { 
       sResource = STRINGS_ROOT + "_" + sLocale.Substring(0, 2); // Use first two letters of region code 
       type = Type.GetType(sResource); 
      } 
     } 
     if (type == null) { 
      sResource = STRINGS_ROOT; 
      type = Type.GetType(sResource); 
      if (type == null) 
      { 
       System.Diagnostics.Debug.WriteLine("No strings resource file when looking for " + sID + " in " + sLocale); 
       return null; // This shouldn't ever happen in theory 
      } 
     } 
     ResourceManager resman = new ResourceManager(type); 
     return resman.GetString(sID); 
    } 
} 

これが使用される方法の一例(上記のコードを参照)は次のようになります。これの

string sText = Localise.GetString("enter_movie_name", sLocale); 
lblEnterMovieName.Text = sText; 

大きな欠点は、すべてのビューが自分のテキストは、プログラムで設定されている必要がありますということです、翻訳は一度やり直してから、多くのプラットフォームで再利用できるというメリットがあります。また、独自のDLLのメインコードとは別の場所にあるため、必要に応じて個別に再コンパイルできます。

3

受け入れられた回答と同様の解決策を作成しましたが、ResxとNugetの代わりにtxtファイルを使用して、https://github.com/xleon/I18N-Portableを作成しました。ブログ投稿here

その他の改良点は以下のとおりです。現在のカルチャ

    • "anyKey".Translate(); // from anywhere
    • 自動検出がサポートされた翻訳のリストを取得します:データはMVVMフレームワーク/ Xamarin.Formsに結合するためのList<PortableLanguage> languages = I18N.Current.Languages;
    • サポートを
    • など
  • 関連する問題