【问题标题】:How can I translate the Firemonkey's Resource Strings?如何翻译 Firemonkey 的资源字符串?
【发布时间】:2012-04-17 17:35:13
【问题描述】:

我是 иrazilian,我需要我的语言中的 Firemonkey 资源字符串,例如当我使用对话框时。我找不到翻译它的方法。有人知道怎么做吗?

【问题讨论】:

  • 对话框有些特殊,因为通常使用操作系统对话框,可能以当前操作系统语言显示。
  • 在“fmx”源文件夹中搜索“resourcestring”只会产生一个文件:“FMX.Consts.pas”,一个非常小的文件...
  • @Uwe 我猜 FMX 不使用系统对话框
  • @David,确实如此!在 Windows 中,他们使用 GetOpenFileNameW,而对于 Mac,他们使用一些 Cocoa 的东西。查看 FMX.Platform.Win 和 FMX.Platform.Mac 并搜索 TPlatform 后代和 DialogOpenFiles。
  • @Uwe 这是一个对话。你试过ShowMessage 了吗?我敢打赌,它不使用系统对话框。至于文件对话框,我敢打赌,当你使用一些时髦的 FMX 风格时,它们看起来很可怕,突然你又回到了原生平台对话框!

标签: delphi delphi-xe2 firemonkey


【解决方案1】:

您需要像this 这样的东西,但对于 FMX。在快速搜索中,我在help for Delphi XE2 中找到的唯一文件是FMX.Consts。您获取该文件,翻译它,然后将翻译后的文件放入您的项目中。

Delphi 有更新时请小心。原始文件可以更改,您需要更新翻译。此外,您可能希望更改任何其他具有Resource Strings 并由您的项目使用的文件。

最后,我不是这方面的专家,但如果您打算使用多语言,这可能不是更好的方法。

【讨论】:

  • 如果您可以使用Delphi 的内部ITE 确实很好,因为它会为您提取翻译所需的所有字符串,并且您知道要翻译什么。它甚至可以识别您自己的字符串常量,如果它们被声明为resourcestring 常量。但是,当您有 5 个 cmets 要求澄清问题,因为它不清楚,您应该尽量不要回答,直到它被发布者编辑。回答它意味着他们没有理由改进它,如果它真的不清楚,它对未来的读者在这里搜索毫无用处。 :) 而resourcestring 使用资源表,
  • (续),因此即使您不能使用 ITE,您也可以提取资源并根据另一种语言 ID 设置第二个资源。
  • @KenWhite 感谢您的建议。对不起。我已经回答了作为葡萄牙语使用者和 Delphi 用户的原因,我可以理解他在寻找什么。事实上,声称 OP 不清楚的 cmets 之一是我的。不管怎样,下次我会听取你的建议。
  • 对不起,我很清楚你。但是@EMBarbosa 得到了我的问题,也许是因为他需要在另一个 Delphi 版本中使用它。我翻译了 FMX.Consts 文件,但我的项目中的任何内容都发生了变化。按钮和对话框标题没有改变:(
  • @JuninhoDG 你做错了。这样做: 1. 在项目文件树的某处制作 FMX.Consts.pas 的副本。 2. 将该副本添加到您的项目中。 3. 翻译那个文件。
【解决方案2】:

使用TLang 组件完成 FMX 表单的翻译,尽管这不适用于大多数对话框。

【讨论】:

    【解决方案3】:

    您可以使用 FMX.Consts.pas 更改对话框,但它会在编译期间修复语言。 如果您想在运行时查看宿主操作系统的语言版本,您应该更正 FMX.Platform.Android.pas 或 FMX.Platform.iOS.pas。

    对于 Android,在 FMX.Platform.Android.pas 中,在过程 TPlatformAndroid.MessageDialog... 中找到 ButtonCaptions 并用您自己的函数包围它,例如:ZSTranslate(ButtonCaptions[B])。 按以下方式声明 ZSTranslate:

    function ZSTranslate(txt: String):String;
    var
      LocaleSvc: IFMXLocaleService;
    begin
      LocaleSvc :=  TPlatformServices.Current.GetPlatformService(IFMXLocaleService) as IFMXLocaleService;
     result:=txt;
     if LocaleSvc.GetCurrentLangID ='your_language_two_letter_id' then
     begin
       if txt= 'Yes' then
        result := 'yes in your language'
        else
         if txt= 'No' then
          result := 'no in your language'
        else
         if txt= 'Confirm' then
          result := 'confirm in your language'
            else
         if txt= 'Cancel' then
          result := 'cancel in your language';
     end
    end;
    

    在 FMX.Platform.Android.pas 的副本中将 ZSTranslate 放置在 TPlatformAndroid.MessageDialog 上方的某个位置,并将此更正版本的 FMX.Platform.Android.pas 添加到您的项目中。

    请注意,上面的示例非常简单,据我记得 Embarcadero 质量体系中有未解决的案例,建议在这里使用 translate 方法(所以 TLang 应该可以正常工作)。我没有尝试翻译,我的版本完成了这项工作(因为对话框中只有几个按钮标签,我只想要两种不同的语言)。

    对于 iOS,您应该在 FMX.Platform.iOS.pas 中查找函数 TPlatformCocoaTouch.MessageDialog。请注意,有两个重载版本。 iOS 中还有 MsgTitles 和 ButtonCaptions,作为 iOS 中的对话框显示标题。

    PS。对于波兰语,我还必须更正 GetCurrentLangID 方法,因为它总是返回“en” - 请仔细检查您的语言的结果。 对我有用的版本: 在 FMX.Platform.iOS.pas 中:

    function TPlatformCocoaTouch.GetCurrentLangID: string;
    var
      lngs : NSArray;
      CurrentLocale: NSLocale;
      LanguageISO: NSString;
    begin
      lngs := TNSLocale.OCClass.preferredLanguages;
      LanguageISO:= TNSString.Wrap(lngs.objectAtIndex(0));
      //CurrentLocale := TNSLocale.Wrap(TNSLocale.OCClass.currentLocale);
      //LanguageISO := TNSString.Wrap(CurrentLocale.objectForKey((NSLocaleLanguageCode as ILocalObject).GetObjectID));
      Result := UTF8ToString(LanguageISO.UTF8String);
      if Length(Result) > 2 then
        Delete(Result, 3, MaxInt);
    end;
    

    在 FMX.Platform.Android.pas 中:

    function TPlatformAndroid.GetCurrentLangID: string;
    var
      Locale: JLocale;
    begin
      Locale := TJLocale.JavaClass.getDefault;
      Result := JStringToString(Locale.getLanguage);//getISO3Language); //zs
      if Length(Result) > 2 then
        Delete(Result, 3, MaxInt);
    end;
    

    【讨论】:

      猜你喜欢
      • 2013-07-02
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 2015-08-25
      相关资源
      最近更新 更多