私はブラジル人で、たとえばダイアログを使用する場合などに、自分の言語で Firemonkey のリソース文字列が必要です。翻訳する方法が見つかりませんでした。誰かがそれを行う方法を知っていますか?
3 に答える
必要なのはこのようなものですが、FMX用です。クイック検索で、DelphiXE2のヘルプで見つけた唯一のファイルはですFMX.Consts
。そのファイルを取得して翻訳し、翻訳したファイルをプロジェクトに配置します。
Delphiがアップデートを取得したときに注意してください。元のファイルは変更可能であり、翻訳を更新する必要があります。また、リソース文字列があり、プロジェクトで使用されている他のファイルを変更することもできます。
最後に、私はこれに精通していませんが、多言語の使用を計画している場合、これはより良いアプローチではない可能性があります。
FMX フォームの翻訳はTLangコンポーネントを使用して行われますが、ほとんどのダイアログでは機能しません。
FMX.Consts.pas を使用してダイアログを変更できますが、コンパイル中に言語が修正されます。実行時にホスト OS の言語バージョンを確認する場合は、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 のコピー内の TPlatformAndroid.MessageDialog の上のどこかに ZSTranslate を配置し、修正されたバージョンの FMX.Platform.Android.pas をプロジェクトに追加します。
上記の例は非常に単純であり、私が覚えている限り、Embarcadero 品質システムには未解決のケースがあり、ここで翻訳方法を提案しています (したがって、TLang は問題なく動作するはずです)。私は翻訳を試みませんでしたが、私のバージョンは仕事をしました(ダイアログにはほんの数個のボタンラベルしかなく、2つの異なる言語だけが欲しかったので)。
iOS の場合、FMX.Platform.iOS.pas で関数 TPlatformCocoaTouch.MessageDialog を探す必要があります。2 つのオーバーロードされたバージョンがあることに注意してください。iOS のダイアログにはキャプションが表示されるため、iOS には MsgTitles と ButtonCaptions もあります。
PS。ポーランド語の場合、常に「en」を返すため、GetCurrentLangID メソッドも修正する必要がありました。言語の結果を再確認してください。私のために働いたバージョン: 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;