То, что вам нужно, - это инструмент, который заменяет каждое выражение, включающее конкатенацию строк, вызовом библиотеки, с очевидным особым случаем выражений, включающим только одну литеральную строку.
Система преобразования программ, в которой вы можете выразить желаемые шаблоны, может сделать это.
Такая система принимает правила в виде:
lhs_pattern -> rhs_pattern if condition ;
где шаблоны - это фрагменты кода с ограничениями синтаксической категории для переменных шаблона. Это заставляет инструмент искать синтаксис, совпадающий с lhs_pattern, и, если он найден, заменить на rhs_pattern, где сопоставление с образцом выполняется по структурам языка, а не по тексту. Так что он работает независимо от форматирования кода, отступов, комментариев и т. Д.
Зарисовка нескольких правил (и упрощение для краткости)
следуя стилю вашего примера:
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);
Шаблоны сами заключены в "..."; это не строковые литералы Java, а скорее способ сказать многоязычному механизму сопоставления с образцом
что суффиксом внутри "..." является (домен) Java-код. Мета-вещи помечены \,
например, мета-переменные \ s1, \ s2, \ s3 и встроенный шаблон вызывают \ generate с помощью (и) для обозначения своего списка мета-параметров: -}
Обратите внимание на использование ограничений категории синтаксиса для мета-переменных s1 и s3 для обеспечения соответствия только строковых литералов. То, что метапеременные совпадают на левой стороне шаблона, подставляется на правой стороне.
Под-шаблон generate_template - это процедура, которая во время преобразования (например, при срабатывании правила) оценивает свой первый известный аргумент как постоянный в строку шаблона, которую вы предложили, вставляет в вашу библиотеку и возвращает библиотеку строковый индекс.
Обратите внимание, что первый аргумент для генерации шаблона в этом примере полностью состоит из конкатенации буквенных строк.
Очевидно, что кому-то придется вручную обрабатывать шаблонные строки, которые попадают в библиотеку, чтобы получить эквиваленты на иностранных языках.
Вы правы в том, что это может привести к чрезмерной шаблонизации кода, потому что некоторые строки не должны помещаться в национализированную библиотеку строк. В той степени, в которой вы можете написать программные проверки для этих случаев, они могут быть включены в правила в качестве условий для предотвращения их запуска. (Приложив немного усилий, вы можете поместить нетрансформированный текст в комментарий, упрощая отдельные преобразования позже).
Реально, я думаю, вам нужно кодировать ~ ~ 100 таких правил, чтобы охватить комбинаторику и особые случаи интересов. Выгода в том, что ваш код автоматически улучшается. Если все сделано правильно, вы можете применить это преобразование к своему коду несколько раз, так как ваш код проходит несколько выпусков; он оставил бы ранее национализированные выражения в одиночестве и просто пересмотрел бы новые, вставленные «счастливчиками».
Системой, которая может сделать это, является DMS Software Reengineering Toolkit . DMS может анализировать / сопоставлять с образцом / преобразовывать / prettyprint многие языки, включая Java и C #.