2017-04-19 60 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