Не повторяйте себя против интернационализации

В то время как я читал статью W3C в разделе "" Повторное использование строк в скриптовом контенте", в котором содержатся полезные советы по интернационализации, но который поражает меня, как противоречит принципу DRY (Do not Repeat Yourself), устраняющему повторяющийся код.

Чтобы взять их пример, у нас может быть такой код, как этот...

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 должен уравновешивать это, упрощая реализацию функциональности по мере необходимости, а не сложнее, чем здесь.

Ответ 1

Я попытаюсь сохранить полные предложения в языковом ресурсе. Как вы сказали, вам могут понадобиться разные слова в разных контекстах. Но большая проблема заключается в том, что порядок предложений может отличаться на разных языках. Поэтому создание строк из слов может вызвать проблемы.

Просто сохраните

The printer is on
The printer is off
The stapler is on
The stapler is off

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

Ответ 2

100% согласны с Mendelt.

Это не только проблема обслуживания, но также может быть лингвистической. На всех латинских языках пол, число и случай субъекта влияют на другие элементы. Пример для румынского

  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

Ответ 3

Я согласен с Mendelt Siebenga, когда он говорит, что вы должны хранить целые предложения или фразы в ваших файлах языковых ресурсов. Различия в грамматике всегда будут препятствовать выполнению замены одного слова на разных языках. Это все равно приведет к менее повторяемому коду, чем ваш первый пример, потому что вам нужно только проверить тип объекта и его состояние, а затем распечатать соответствующее сообщение из языкового ресурса.

Ответ 4

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

Локаль. команда фактически предпочитает отдельные, но почти дублированные сообщения. Однако они будут принимать параметризованные сообщения.

Например, "% (устройство)%% (on_or_off)%."

Параметры могут разрушаться, но, по крайней мере, это более очевидно для команды loc, когда она будет работать, и когда она не будет.

Ответ 5

Я полагаю, это зависит от уровня качества языка, к которому вы стремитесь достичь.

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

Вам нужно будет решить, какой из них более подходит для конкретной проблемы; Код, который повторяется, или код, который пытается стать "Джеком всех профессий" и вмещает множество бесчисленных правил языка (без сомнения, кошмар для поддержания).

Конечно, вы можете нанести удар по середине земли и свести к минимуму повторение кода, но отказаться от удовлетворительного грамматического красноречия. Возьмем пример Ultima Online - когда он был локализован, строка, которая ранее читала "Куча 329 золотых монет", стала чем-то вроде "Куча золотых монет: 329". Не великое, но довольно разумное решение, легко поддающееся локализации.

Ответ 6

Я бы предложил использовать CMS вместо жесткого кодирования в ваших текстовых значениях, чтобы покрыть локализацию.