2

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

4

3 回答 3

1

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

于 2012-04-17T18:59:03.867 回答
1

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

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

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

于 2012-04-17T18:09:44.130 回答
0

您可以使用 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;

将 ZSTranslate 放置在 FMX.Platform.Android.pas 副本中 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;
于 2016-02-25T20:07:23.480 回答