2012-04-17 3 views
2

Я иразильский, и мне нужны строки ресурсов Firemonkey на моем языке, например, когда я использую диалоги. Я не мог найти способ его перевести. Кто-нибудь знает, как это сделать?Как я могу перевести строки ресурсов Firemonkey?

+0

Что именно вам нужно перевести? Что-то вроде кнопки OK на ShowMessage? –

+1

Диалоги несколько особенные, так как обычно используются диалоговые окна ОС, которые, вероятно, отображаются на текущем языке ОС. –

+0

Нет «API Firemonkey». Вы говорите о строках ресурсов (строки для встроенных диалогов и подписи кнопок)? –

ответ

1

Что вам нужно, это this, но для FMX. В результате быстрого поиска единственным файлом, который я нашел в help for Delphi XE2, является FMX.Consts. Вы берете этот файл, переводите его, а затем помещаете переведенный файл в свой проект.

Позаботьтесь, когда Delphi получит обновление. Исходный файл можно изменить, и вам нужно будет обновить ваш перевод. Кроме того, вы, вероятно, захотите изменить любые другие файлы, которые имеют Resource Strings, и используются в вашем проекте.

Наконец, я не эксперт в этом, но если вы планируете использовать многоязычный язык, это может быть не лучшим подходом.

+1

Это действительно хорошо, если вы можете использовать внутренний ITE Delphi, потому что он тянет все строки, необходимые для перевода, и вы знаете, что вам нужно перевести. Он может даже идентифицировать ваши собственные строковые константы, если они объявлены как константы resourcestring. Однако, когда у вас есть 5 комментариев, требующих уточнения вопроса, потому что это не ясно, вы должны стараться не отвечать до тех пор, пока он не будет отредактирован плакатом. Отвечая на это, у них нет причин для его улучшения, и если это действительно неясно, это бесполезно для будущих читателей, ищущих здесь. :) И 'resourcestring' использует resourcetable, –

+1

(продолжение), поэтому даже если вы не можете использовать ITE, вы можете извлечь ресурс и настроить второй на основе другого идентификатора языка. –

+0

@KenWhite Спасибо за предложения. Прости. Я ответил на вопрос, как португальский оратор и пользователь Delphi, я мог понять, что он ищет. В самом деле, один из комментариев, претендующих на ОП, не ясен, мой. В любом случае, я отвечу на ваш совет в следующий раз. – EMBarbosa

1

Перевод форматов FMX осуществляется с помощью компонента TLang, хотя это не будет работать для большинства диалогов.

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 где-то выше TPlatformAndroid.MessageDialog в копию FMX.Platform.Android.pas, и добавить эту исправленную версию FMX.Platform.Android.pas для вашего проекта ,

Обратите внимание, что приведенный выше пример очень прост, и насколько я помню, в системе качества Embarcadero существует нерешенный случай, предлагающий здесь метод перевода (так что 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; 
Смежные вопросы