2017-04-19 7 views
0

私はDelphi Seattleを使用してたくさんのAndroidアプリをやっていますが、私の最大の問題はローカリゼーションです。私はDKLangパッケージを試しましたが、私は第三者コンポーネントを避ける方が好きです。私は、英語、イタリア語、フランス語で私のアプリケーションを翻訳することができる必要があります。Delphi androidの文字列ファイルのローカライゼーション

アンドロイドスタジオのIDE(それはJavaやXMLを使用しています)私は国を表す接尾辞でフォルダを追加することができる午前の下で

:私は3を追加し展開マネージャを使用しているDelphiで

res/ 
    values-en/ 
     strings.xml 
    values-it/ 
     strings.xml 
    values-fr/ 
     strings.xml 

上記のフォルダと私もstrings.xmlファイルがあります。それぞれに私が必要とする翻訳があります。


TLabelにstrings.xmlの値を読み込む方法を理解できません。これには特別なクラスがありますか?実行時にそれを行う必要がありますか?

のstrings.xmlファイルは、このように構成されています。

//values-en/strings.xml 
<?xml version="1.0" encoding="utf-8"?> 
<resources>  
    <string name="title">Congruences</string>  
</resources> 

//values-it/strings.xml 
<?xml version="1.0" encoding="utf-8"?> 
<resources>  
    <string name="title">Congruenze</string>  
</resources> 

基本的には名前は識別子であり、その後、タグ内の単語が翻訳したものです。私はこれを使用できることを見てきました: //ファイルxml、ファイルタイプ TAndroidHelper.GetResourceID( 'strings'、 'string');

実行時に情報をどのように読み込むことができないかについてはわかりません。何か案が?

答えて

1

strings.xmlの中に値をロードするのはあまりにも複雑です(しかし可能です)。それは本当にデルファイの方法ではありません。デルファイでは、代わりに何ができるかTLang私はあなたが文字列を必要とするとき、あなたのコード内の

unit loki_Translation; 

interface 

uses system.classes, 
    Fmx.controls, 
    AlStringList, 
    Win_definition; 

function loki_translate(const AText: string): string; 
function loki_SetLang(aLanguage: Twin_language): TALNVStringListU; 

var 
    vloki_CurrLang: TALNVStringListU; 

implementation 

uses FMX.Types, 
    FMX.consts, 
    system.SysUtils, 
    alCommon, 
    alString, 
    WinDT_definition, 
    loki_main; 

{*****************************************************} 
function loki_translate(const AText: string): string; 
var idx: integer; 
begin 
    Idx := vloki_CurrLang.IndexOfName(AText); 
    if Idx >= 0 then 
    Result := vloki_CurrLang.ValueFromIndex[Idx] 
    else 
    Result := AText; 
end; 

{******************************************************************} 
function loki_SetLang(aLanguage: Twin_language): TALNVStringListU; 

    {$REGION 'ENU'} 
    procedure _initENU; 
    begin 

    vloki_CurrLang.Add('_loki=loki'); 
    vloki_CurrLang.Add('_Exit_Application=Exit Application'); 
    vloki_CurrLang.Add('_AreYouSure=Are you sure?'); 
    vloki_CurrLang.Add('_Cancel=Cancel'); 
    vloki_CurrLang.Add('_OK=OK'); 
    vloki_CurrLang.Add('_Yes=Yes'); 
    vloki_CurrLang.Add('_speakx=Speak %s'); 
    vloki_CurrLang.Add('_and=and'); 

    end; 
    {$ENDREGION} 

{$IFDEF MSWINDOWS} 
var i: integer; 
{$ENDIF} 

begin 

    //init vloki_CurrLang 
    ALfreeandnil(vloki_CurrLang); 
    vloki_CurrLang := TALNVStringListU.Create; 
    if aLanguage = ENU then _initENU; 
    vloki_CurrLang.Duplicates := TDuplicates.Duperror; 
    vloki_CurrLang.Sorted := True; 
    result := vloki_CurrLang; 

    //translate the TrayIconMenu 
    {$IFDEF MSWINDOWS} 
    for i := 0 to loki_mainForm.TrayIconMenu.ItemsCount - 1 do 
    loki_mainForm.TrayIconMenu.Items[i].Text := loki_translate(loki_mainForm.TrayIconMenu.Items[i].TagString); 
    {$ENDIF} 

end; 


{*****************************************} 
procedure loki_TranslationInitialization; 
begin 
    vloki_CurrLang := TALNVStringListU.Create; 
    CustomTranslateProc := loki_translate; 
end; 

{***************************************} 
procedure loki_Translationfinalization; 
begin 
    ALfreeandnil(vloki_CurrLang); 
end; 

initialization 
    Win_UpdateGlobalInitializationList(loki_TranslationInitialization, 65); 
    Win_UpdateGlobalFinalizationList(loki_Translationfinalization, 65); 

end. 

、どこでもを翻訳するために使用するユニットのサンプル下記

を使用することで、あなたは単に

を行います
StrINeed := loki_translate('theStrName'); 

注意事項同様にCustomTranslateProc:= loki_translate; それはラベルと互換性がありますが、ロードされたプロシージャをオーバーロードする必要があります(アルシノコントロールの実装を参照してください)

私は非常にバグがありますデルファイのバージョン

+0

これはアンドロイドとiOSで正しく動作しますか? –

+0

はいそれはios/android/windows/macosでの作業です – loki

関連する問題