Это Краткое введение в руководство 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
Мы используем английскую строку в качестве идентификатора.
, Если это приводит взгляд к сбою от международного объекта ресурса (загруженный из установленного 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). Если машина не будет поддерживать упрощенный китайский затем, то это вряд ли будет поддерживать полных китайцев.
Я не знаю много о том, как это обычно делается в Windows, но способе, которым локализованные строки обрабатываются в платформе Какао Apple работы вполне прилично. У них есть очень простой файл текстового формата, который можно отправить в переводчика и некоторые макросы препроцессора для получения значений из файлов.
В Вашем коде, Вы будете видеть строки на своем родном языке, а не как непрозрачные идентификаторы.
Ваше решение весьма схоже с Unix/Linux" gettext
" решение. На самом деле Вы не должны были бы писать стандартные программы извлечения.
я не уверен, почему Вы хотите, чтобы _RESTRING макрос обработал несколько аргументов. Мой код (использующий поддержку wxWidget gettext) похож на это: MyString.Format(_("Some string with variable %ls"), _("variable"));
. То есть Строка:: Формат (...) получает два индивидуально переведенных аргумента. В ретроспективе, Повышение:: Формат был бы лучше, но он также позволит boost::format(_("Some string with variable %1")) % _("variable");
(Мы используем _()
макрос для краткости)
На одном проекте я локализовал в 10 + языки, я поместил все, что должно было быть локализовано в единственный dll только для ресурса. Во время установки пользователь выбрал, какой dll был установлен с их приложением.
я только должен был поставить английский dll команде локализации. Они возвратили локализованный dll мне для каждого языка, который я включал в сборку.
я знаю, что это не прекрасно, но это работало.
Простой путь состоит в том, чтобы только использовать идентификаторы строки в Вашем коде - никакие литеральные строки. Можно затем произвести различные версии the.rc файла для каждого языка и или создать ресурс только DLLs или просто различные сборки языка.
существует несколько условно-бесплатных программных обеспечений utilstohelp локализация емкостно-резистивного файла, которые обрабатывают изменяющие размер диалоговые элементы для языков с более длительными словами и предупреждением о недостающих переводах.
А более сложной проблемой является порядок слов, если у Вас есть несколько чисел в printf, который должен быть в другом порядке на грамматику другого языка. Существуют, некоторые расширили printf классы на codeproject, которые позволяют Вам указать вещи как printf ("Word %1s и %2s", var1, var2), таким образом, можно переключить %1s и %2s при необходимости.
Так как это открыто для мнений, вот то, как я делаю это.
Мой локализованный текстовый файл является простым файлом разделенного текста вкладки, который может быть загружен в Excel и отредактирован. Первый столбец для определения, и каждый столбец направо является последующим языком, например:
ID ENGLISH FRENCH GERMAN
STRING_YES YES OUI YA
STRING_NO NO NON NEIN
Затем в моем make-файле шаг сборки cusom, который генерирует strings.h файл и strings.dat. В моем случае это создает перечислимый список для идентификаторов строки и затем двоичного файла со смещениями для текста. С тех пор в моем приложении пользователь может изменить язык в любое время, у меня есть они все в памяти кроме Вас, мог легко сделать, чтобы Ваш предварительный переработчик генерировал другой выходной файл для каждого языка при необходимости.
вещь, что мне нравится приблизительно этот дизайн, состоит в том, что, если бы какие-либо строки отсутствуют затем, я получил бы ошибку компиляции, тогда как, если строки искались во времени выполнения затем, Вы не могли бы знать об отсутствующей строке в редко используемой части кода до позже.
Вы хотите усовершенствованную утилиту, которую я всегда хотел записать, но никогда не имел время к. Если Вы не находите такой инструмент, можно хотеть к нейтрализации на моем CMsg () и CFMsg () классы обертки, которые позволяют очень, легко дергают за ниточки от таблицы ресурса. (CFMsg даже обеспечивают обертку остроты FormatMessage. И да, в отсутствие того инструмента Вы ищете, сохранение копии строки в комментарии является хорошим решением. Относительно десинхронизации комментария помните, что строковые литералы очень редко изменяются.
http://www.codeproject.com/KB/string/stringtable.aspx
BTW, собственные программы Win32 и программы.NET имеют полностью другое управление хранением ресурса. Вам будет нелегко находить общее решение для обоих.