2017-04-19 55 views
0

我正在做很多使用Delphi Seattle的Android應用程序,但對我來說最大的問題是本地化。我試過了DKLang包,但我更喜歡避開第三方組件。我需要能夠用英文,意大利文和法文翻譯我的申請。Delphi android strings文件本地化

在機器人工作室的IDE(它使用Java和XML),我能夠帶後綴表示該國將文件夾添加:

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

在Delphi我已經使用了部署管理添加3上面的文件夾,我也有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中加載值太複雜了(但這是可能的),並不是真正的delphi方式。在Delphi中你可以做的反而是用我用單位的樣本下面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; 然後它可以與標籤兼容,但你必須超載他們的加載過程(見alcinoe控制執行,他們做到了)

我避免Tlang,因爲它對我來說很麻煩,也許最近不是這樣delphi版本

+0

所以這適用於Android和iOS的權利? –

+0

是的,它的工作在ios/android/windows/macos上 – loki