【问题标题】:Delphi android strings file localizationDelphi android 字符串文件本地化
【发布时间】:2017-04-19 17:33:49
【问题描述】:

我正在使用 Delphi Seattle 做很多 Android 应用程序,但对我来说最大的问题是本地化。我已经尝试过DKLang 包,但我更喜欢避免使用第 3 方组件。我需要能够将我的申请翻译成英语、意大利语和法语。

在 android studio 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');

我不知道如何在运行时加载信息。有什么想法吗?

【问题讨论】:

    标签: delphi firemonkey


    【解决方案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 版本中不再是这种情况了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多