Delphi Translating Strings - PullRequest
       0

Delphi Translating Strings

2 голосов
/ 20 декабря 2010

Я использую Delphi 2007, и мне интересно, как можно решить следующую проблему:

Мне нужно, например, перевести AComp.Caption, но string, который я хочу присвоить заголовку,часто зависит от некоторых данных (например, от даты или числа, которое получает Formatted).Поэтому я должен сохранять данные и строку в новой переменной для каждого перевода, что действительно раздражает.

Я хочу сделать что-то вроде этого:

// will add the string and data to an internal list of Translator
// and will then return a DynamicString, which represents the translated value
AComp.Caption := T.NewTranslatedString("Hello %s, do you like cheese?", User)

(Примечаниечто AComp.Caption («Hello% s ..») можно изменить разными методами)

При переключении на другой язык вы бы вызвали T.TranslateAgain(), и значение всех строк будет переведено, и, еслиданные предоставлены, снова отформатированы.

Возможно ли это или вы знаете другой способ решения данной проблемы?

Заранее спасибо

Дополнительный вопрос: Являются ли строки нормальными объектами, которые я могу разделить на подклассы и добавить динамическое поведение, которое изменяет саму строку в особых случаях?

Ответы [ 4 ]

3 голосов
/ 20 декабря 2010

Вы можете использовать собственный инструмент переводчика Delphi. Он способен извлекать строки и строки ресурсов из вашего исходного кода и формировать файлы DFM, а также предоставляет графический интерфейс пользователя для перевода их на любой язык. Затем он создает библиотеку ресурсов для каждого языка. DLL, содержащая переведенные строки и данные DFM. Вы должны развернуть эту библиотеку перевода с вашим проектом на целевой машине.

В вашем случае ваши строки делятся на две группы; фиксированные строки, которые не требуют дальнейшей обработки, и параметризованные строки, которые нуждаются в дополнительных данных для правильного форматирования. Для фиксированных строк вы можете просто ввести перевод в инструмент переводчика. Для параметризованных строк сохраните каждую из них как строку ресурсов и используйте строку ресурсов для их форматирования. Например:

resourcestring
  strDoYouLikeCheese = 'Hello %s, do you like cheese?';

...

AComp.Caption := Format(strDoYouLikeCheese,[User]);

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

3 голосов
/ 20 декабря 2010

Строки Delphi не являются объектами, к ним нельзя добавить поведение.Вам необходимо разработать свой собственный класс.

Способ локализации приложений в Windows заключается в получении преимуществ от ресурсов, которые можно изменять (и перенаправлять загрузку) без изменений в коде (не нужно вызывать специальные функции илидобавить новые компоненты), и без вызовов во время выполнения, но для загрузки ресурса.Единственный недостаток ресурсов - они не могут быть легко изменены конечным пользователем.Стандартные инструменты локализации Delphi 2007 используют этот подход.

В любом случае есть некоторые библиотеки, такие как dxGetText (который является портом библиотеки gettext GNU) или TsiLang, например, которые используют более «навязчивый» подход, требующий измененийв ваш код или добавление компонентов.Взамен они могут упростить локализацию для конечного пользователя.

Прежде чем разрабатывать собственную библиотеку локализации, я бы проверил, подходит ли вам одна из существующих.

Примечание :Имейте в виду, что у инструмента локализации Delphi есть существенные проблемы, которые не были исправлены до XE (который я еще не тестировал).Смотрите, например, QC # 79449.К сожалению, исправление никогда не было перенесено в более ранние выпуски.

2 голосов
/ 20 декабря 2010

То, что вы хотите сделать, это локализовать ваше приложение. Delphi поддерживает это, основываясь на ключевом слове resourcestring. Однако я никогда не занимался локализацией самостоятельно, поэтому я рекомендую вам сделать поиск по этой теме или, возможно, подождать, пока другие эксперты предоставят более подробную помощь!

1 голос
/ 20 декабря 2010

Вы можете использовать словарь для отслеживания отображений строк, что-то вроде этого

TTranslator = class
private
  FMappings : TDictionary <String, String>;
public
  function  Translate (const SrcStr : String) : String;
  procedure SetMapping (const SrcStr, DestStr : String);
end;

function TTranslator.Translate (const SrcStr : String) : String;
begin
  if not FMappings.TryGetValue (SrcStr, Result) then
    Result := SrcStr;
end;

procedure TTranslator.SetMapping (const SrcStr, DestStr : String);
begin
  FMappings.AddOrSetValue (SrcStr, DestStr);
end;

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

РЕДАКТИРОВАТЬ: Только что увидел, что вы используете Delphi 2007, поэтому у вас нет TDictionary доступны. Идея должна оставаться в силе, просто используйте любую словарную реализацию или подход на основе списка.

И чтобы ответить на другую часть вашего вопроса: нет, строки не являются обычным объектом (на самом деле они вообще не являются объектами). Они отличаются друг от друга по-разному (управление памятью, поведение при копировании при записи), и их невозможно разделить на подклассы. Но это не то, что вам нужно, если я правильно понял вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...