Мы используем
У нас есть несколько идей:
Развертывание с каждой версией продукта не только PDF, но и оригинального полного документа DocBook ( так как мы частично пишем документ и частично генерируем их). Сохранение полного документа DocBook делает их независимыми для изменений в настройках системы в будущем. Это означает, что если система изменится, из которой контент был извлечен (или заменен другими системами), мы больше не сможем генерировать точный контент. Что может вызвать проблему, если нам потребуется переиздать (с другой таблицей стилей) весь набор руководств по продукту. Так же, как с банками; эти скомпилированные Java-классы также размещаются в Nexus (вы не хотите хранить их в своем SCM); это мы также сделаем с сгенерированным документом DocBook.
Обновление:
Fresh создала подключаемый модуль Maven HTML Cleaner , который позволяет добавлять содержимое DocBook на сайт проекта Maven (доступна бета-версия). Обратная связь приветствуется через форум открытого обсуждения .
Вам нужен инструмент, который заменяет каждое выражение, включающее конкатенацию строк, вызовом библиотеки, с очевидным частным случаем выражений, включающих только одну буквальную строку.
Система преобразования программ в в котором вы можете выразить свои желаемые шаблоны, это можно сделать. Такая система принимает правила в форме:
lhs_pattern -> rhs_pattern if condition ;
где шаблоны - это фрагменты кода с ограничениями категорий синтаксиса для переменных шаблона. Это заставляет инструмент искать синтаксис, соответствующий lhs_pattern, и, если он найден, заменять на rhs_pattern, где сопоставление с образцом осуществляется по языковой структуре, а не по тексту. Таким образом, он работает независимо от форматирования кода, отступов, комментариев и т. Д.
Набросок нескольких правил (и чрезмерное упрощение, чтобы сделать это коротким) following the style of your example:
domain Java;
nationalize_literal(s1:literal_string):
" \s1 " -> "Language.getString1(\s1 )";
nationalize_single_concatenation(s1:literal_string,s2:term):
" \s1 + \s2 " -> "Language.getString1(\s1) + \s2";
nationalize_double_concatenation(s1:literal_string,s2:term,s3:literal_string):
" \s1 + \s2 + \s3 " ->
"Language.getString3(\generate_template1\(\s1 + "{1}" +\s3\, s2);"
if IsNotLiteral(s2);
The patterns are themselves enclosed in "..."; these aren't Java string literals, but rather a way of saying to the multi-computer-lingual pattern matching engine that the suff inside the "..." is (domain) Java code. Meta-stuff are marked with \, например, метапеременные \ s1, \ s2, \ s3 и встроенный шаблон вызывает \ сгенерировать с помощью (и) для обозначения его списка мета-параметров: -}
Обратите внимание на использование ограничений категории синтаксиса для метапеременных s1 и s3 для обеспечить соответствие только строковых литералов. То, что мета-переменные совпадают в шаблоне с левой стороны, подставляется в правую сторону.
Подшаблон generate_template - это процедура, которая во время преобразования (например, при срабатывании правила) оценивает свое известное значение. -константный первый аргумент в строку шаблона, которую вы предложили и вставляет в вашу библиотеку, и возвращает индекс строки библиотеки. Обратите внимание, что первый аргумент для создания шаблона состоит в том, что этот пример полностью состоит из конкатенированных буквальных строк.
Очевидно, кому-то придется вручную обработать шаблонные строки, которые попадают в библиотеку, для создания эквивалентов на иностранном языке.
You're right in that this may over templatize the code because some strings shouldn't be placed in the nationalized string library. To the extent that you can write programmatic checks for those cases, they can be included as conditions in the rules to prevent them from triggering. (With a little bit of effort, you could place the untransformed text into a comment, making individual transformations easier to undo later).
Realistically, I'd guess you have to code ~~100 rules like this to cover the combinatorics and special cases of interests. The payoff is that the your code gets automatically enhanced. If done right, you could apply this transformation to your code repeatedly as your code goes through multiple releases; it would leave previously nationalized expressions alone and just revise the new ones inserted by the happy-go-lucky programmers.
A system which can do this is the DMS Software Reengineering Toolkit. DMS can parse/pattern match/transform/prettyprint many langauges, include Java and C#.
Я думаю, что у eclipse есть опция для экстернализации всех строк в файл свойств.
Eclipse будет экстернализировать каждую отдельную строку и не строить автоматически подстановку, как вы ищете. Если у вас есть очень последовательное соглашение о том, как вы строите свои строки, вы можете написать сценарий perl, чтобы сделать некоторую интеллектуальную замену в файлах .java. Но этот сценарий станет довольно сложным, если вы захотите обработать
Я думаю, что есть несколько платных инструментов, которые могут с этим помочь. Я помню, как оценивал один, но не помню его названия. Я также не помню, может ли он обрабатывать подстановку переменных во внешних строках. Я попытаюсь найти информацию и отредактировать этот пост с подробностями.
РЕДАКТИРОВАТЬ: Инструмент был Globalyzer от Lingport. На веб-сайте говорится, что он поддерживает экстернализацию строк, но не конкретно, как это сделать. Не уверен, поддерживает ли он замену переменных. Существует бесплатная пробная версия, поэтому вы можете попробовать и убедиться в этом.
Так же, как экстернализатор строк Eclipse , который генерирует файлы свойств, Eclipse имеет предупреждение для неинтернационализированных строк, что полезно для поиска файлов, которые вы не интернационализировали .
String msg = "Hello " + name;
выдает предупреждение «Невынесенный строковый литерал; за ним должен следовать // $ NON-NLS- $». Для строк, которые действительно входят в код, вы можете добавить аннотацию ( @SuppressWarnings ("nls")
) или добавить комментарий:
String msg = "Hello " + name; //$NON-NLS-1$
Это очень полезно для преобразования проекта в правильную интернационализацию .
Вы можете использовать метод «Externalize String» из eclipse. Откройте файл Java в редакторе, а затем щелкните «Внешняя строка» в главном меню «Источник». ИТ-отдел сгенерирует для вас файл свойств со всеми параметрами, которые вы отметили в выборе.
Надеюсь, это поможет.
, поскольку все взвешивают в среде IDE думаю, мне лучше встать на защиту Netbeans :)
Инструменты -> Интернационализация -> Мастер интернационализации
очень удобен ..
Globalyzer обладает обширными возможностями по обнаружению, управлению и экстернализации строк, а также значительно ускоряет работу по сравнению с просмотром строк и их извлечением одна за другой. Вы можете фильтровать строки, а также видеть их в контексте, а затем выводить их в экстернали по одной или группами. Он работает с широким спектром языков программирования и типов ресурсов, включая, конечно, Java. Плюс Globalyzer найдет для ваших проектов интернационализации гораздо больше, чем просто встроенные строки. Вы можете прочитать больше на http://lingoport.com/globalyzer и там есть ссылки для регистрации демо-счета. Globalyzer сначала создавался для выполнения крупных сервисных проектов по интернационализации, а затем с годами превратился в полномасштабный корпоративный инструмент, обеспечивающий интернационализацию разработки и ее сохранение.