Лучший способ разработать для локализации строк

Это Краткое введение в руководство log4j немного устарело, но все еще актуально.

Это руководство предоставит вам некоторую информацию о том, как использовать регистраторы и приложения.


Как раз для вас, у вас есть два простых подхода, которые вы можете предпринять.

Сначала нужно просто добавить эту строку к вашему основному методу:

BasicConfigurator.configure();

Второй подход заключается в том, чтобы добавить этот стандартный файл log4j.properties (взятый из вышеупомянутого руководства) в ваш путь к классу:

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n

20
задан Nick 11 October 2008 в 19:59
поделиться

7 ответов

Мы используем английскую строку в качестве идентификатора.

, Если это приводит взгляд к сбою от международного объекта ресурса (загруженный из установленного I18N dll) затем, мы принимаем значение по умолчанию к Строке идентификатора.

Код похож:

doAction(I18N.get("Press OK to continue"));

Как часть процессов сборки у нас есть сценарий жемчуга, который анализирует весь источник для строковых констант. Это создает временный файл всех строк в приложении и затем сравнивает их со строками ресурса в каждом локальном, чтобы видеть, существуют ли они. Любые отсутствующие строки генерируют электронное письмо соответствующей команде перевода.

у Нас может быть несколько dll для каждого локального. Название dll основано на языке [_territory] [.codeset] [@modifier]

RFC 3066
, Мы пытаемся извлечь локаль из машины и быть максимально конкретными при загрузке I18N dll, но нейтрализация к менее определенным локальным изменениям, если более определенная версия не присутствует.

Пример:

В Великобритании: Если локальное было en_GB.UTF-8
(я использую термин dll свободно не в определенном смысле окон).

Первый ищут I18N.en_GB.UTF-8 dll. Если этот dll не существует, отступают к I18N.en_GB. Если этот dll не существует, отступают к I18N.en, Если этот dll не существует осеннее приветствие к I18N.default

, единственное исключение к этому правилу: Упрощенный китайский (zh_CN), где нейтрализация является американским английским языком (en_US). Если машина не будет поддерживать упрощенный китайский затем, то это вряд ли будет поддерживать полных китайцев.

3
ответ дан 30 November 2019 в 01:35
поделиться

Я не знаю много о том, как это обычно делается в Windows, но способе, которым локализованные строки обрабатываются в платформе Какао Apple работы вполне прилично. У них есть очень простой файл текстового формата, который можно отправить в переводчика и некоторые макросы препроцессора для получения значений из файлов.

В Вашем коде, Вы будете видеть строки на своем родном языке, а не как непрозрачные идентификаторы.

1
ответ дан 30 November 2019 в 01:35
поделиться

Ваше решение весьма схоже с Unix/Linux" gettext" решение. На самом деле Вы не должны были бы писать стандартные программы извлечения.

я не уверен, почему Вы хотите, чтобы _RESTRING макрос обработал несколько аргументов. Мой код (использующий поддержку wxWidget gettext) похож на это: MyString.Format(_("Some string with variable %ls"), _("variable"));. То есть Строка:: Формат (...) получает два индивидуально переведенных аргумента. В ретроспективе, Повышение:: Формат был бы лучше, но он также позволит boost::format(_("Some string with variable %1")) % _("variable");

(Мы используем _() макрос для краткости)

1
ответ дан 30 November 2019 в 01:35
поделиться

На одном проекте я локализовал в 10 + языки, я поместил все, что должно было быть локализовано в единственный dll только для ресурса. Во время установки пользователь выбрал, какой dll был установлен с их приложением.

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

я знаю, что это не прекрасно, но это работало.

0
ответ дан 30 November 2019 в 01:35
поделиться

Простой путь состоит в том, чтобы только использовать идентификаторы строки в Вашем коде - никакие литеральные строки. Можно затем произвести различные версии the.rc файла для каждого языка и или создать ресурс только DLLs или просто различные сборки языка.

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

А более сложной проблемой является порядок слов, если у Вас есть несколько чисел в printf, который должен быть в другом порядке на грамматику другого языка. Существуют, некоторые расширили printf классы на codeproject, которые позволяют Вам указать вещи как printf ("Word %1s и %2s", var1, var2), таким образом, можно переключить %1s и %2s при необходимости.

1
ответ дан 30 November 2019 в 01:35
поделиться

Так как это открыто для мнений, вот то, как я делаю это.

Мой локализованный текстовый файл является простым файлом разделенного текста вкладки, который может быть загружен в Excel и отредактирован. Первый столбец для определения, и каждый столбец направо является последующим языком, например:

ID              ENGLISH      FRENCH    GERMAN
STRING_YES      YES          OUI       YA
STRING_NO       NO           NON       NEIN

Затем в моем make-файле шаг сборки cusom, который генерирует strings.h файл и strings.dat. В моем случае это создает перечислимый список для идентификаторов строки и затем двоичного файла со смещениями для текста. С тех пор в моем приложении пользователь может изменить язык в любое время, у меня есть они все в памяти кроме Вас, мог легко сделать, чтобы Ваш предварительный переработчик генерировал другой выходной файл для каждого языка при необходимости.

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

0
ответ дан 30 November 2019 в 01:35
поделиться

Вы хотите усовершенствованную утилиту, которую я всегда хотел записать, но никогда не имел время к. Если Вы не находите такой инструмент, можно хотеть к нейтрализации на моем CMsg () и CFMsg () классы обертки, которые позволяют очень, легко дергают за ниточки от таблицы ресурса. (CFMsg даже обеспечивают обертку остроты FormatMessage. И да, в отсутствие того инструмента Вы ищете, сохранение копии строки в комментарии является хорошим решением. Относительно десинхронизации комментария помните, что строковые литералы очень редко изменяются.

http://www.codeproject.com/KB/string/stringtable.aspx

BTW, собственные программы Win32 и программы.NET имеют полностью другое управление хранением ресурса. Вам будет нелегко находить общее решение для обоих.

0
ответ дан 30 November 2019 в 01:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: