Не повторяйтесь против интернационализации
-
09-06-2019 - |
Вопрос
Некоторое время назад я читал статью W3C на тему «Повторное использование строк в скриптовом контенте', который содержит несколько полезных советов по интернационализации, но который мне кажется противоречащим принципу DRY (Не повторяйся) по устранению повторяющегося кода.
Если взять их пример, у нас может быть такой код...
print "The printer is ";
if (printer.working) {
print "on.\n";
} else {
print "off.\n";
}
print "The stapler is ";
if (stapler.working) {
print "on.\n";
} else {
print "off.\n";
}
Моим инстинктом было бы исключить повторение примерно следующим образом...
report-state(printer, "printer");
report-state(stapler, "stapler");
function report-state(name, object) {
print "The "+name+" is ";
if (object.working) {
print "on\n";
} else {
print "off\n";
}
}
...но это вызовет трудности в коде, если нам понадобится локализовать его на испанский язык, потому что слово «on», очевидно, в этих двух случаях разное.
Итак, я думаю, мой вопрос в том, как другие разработчики подошли к балансированию принципа DRY с интернационализацией своего кода?
Часть меня хочет утверждать, что интернационализация — это одно из тех экстремальных программ».тебе это не понадобитсяситуации.С другой стороны, рефакторинг с учетом принципа DRY должен сбалансировать это, упрощая реализацию необходимой функциональности, а не усложняя, как здесь.
Решение
Я бы постарался сохранить полные предложения в языковом ресурсе.Как вы сказали, вам могут понадобиться разные слова в разных контекстах.Но более серьезная проблема заключается в том, что порядок предложений в разных языках может быть разным.Поэтому создание строк из слов может вызвать проблемы.
Просто храните
The printer is on
The printer is off
The stapler is on
The stapler is off
в языковом ресурсе для каждого языка.Повторение здесь представляет собой меньшую головную боль при обслуживании, чем попытка выяснить, где в вашем приложении будут появляться все отдельные слова.
Другие советы
На 100% согласен с Мендельтом.
Это не только проблема обслуживания, но также может быть лингвистической.Во всех латинских языках род, число и падеж подлежащего влияют на другие элементы.Пример для румынского языка
The printer is on: Imprimanta este pornită // feminine
The printer is off: Imprimanta este oprită
The stapler is on: Perforatorul este pornit // masculine
The stapler is off: Perforatorul este oprit
Также см http://www.mihai-nita.net/article.php?artID=20060430a
Я согласен с Мендельтом Зибенгой, когда он говорит, что в файлах языковых ресурсов следует хранить целые предложения или фразы.Различия в грамматике всегда будут мешать вам выполнять замену отдельных слов в разных языках.Это по-прежнему приведет к меньшему повторению кода, чем в первом примере, поскольку вам нужно только проверить тип объекта и его состояние, а затем напечатать соответствующее сообщение из языкового ресурса.
Мы стараемся не создавать строки сообщений с помощью программных манипуляций, потому что файл loc.команда не может их видеть.
Лок.команда на самом деле предпочитает отдельные, но почти повторяющиеся сообщения.Однако они будут принимать параметризованные сообщения.
Например, «%(appliance)% — это %(on_or_off)%».
Параметры могут нарушаться, но, по крайней мере, для местной команды более очевидно, когда это будет работать, а когда нет.
Я полагаю, это зависит от уровня качества языка, которого вы стремитесь достичь.
Пытаясь свести к минимуму повторение кода, работающего с этими реальными языковыми строками, вы просто подвергаете себя воздействию совершенно другого уровня логики в синтаксисе и структурах разных языков.Потребуется огромный объем работы для создания кода, который по-прежнему сохранит исходную структуру языка и сведет к минимуму повторение.
Вам придется решить, какой подход является более подходящим для конкретной проблемы;Код, который повторяется, или код, который пытается быть мастером на все руки и учитывает бесчисленные правила языка (без сомнения, кошмар обслуживания).
Конечно, вы можете найти золотую середину и минимизировать повторение кода, но отказаться от удовлетворительного грамматического красноречия.Возьмем, к примеру, Ultima Online: когда она была локализована, строка, которая раньше читалась как «Куча 329 золотых монет», стала чем-то вроде «Куча золотых монет:329".Не самое лучшее, но вполне разумное решение, которое легко поддается локализации.
Я бы предложил использовать CMS, а не жестко запрограммировать текстовые значения, чтобы обеспечить локализацию.