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

StackOverflow https://stackoverflow.com/questions/56574

  •  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, а не жестко запрограммировать текстовые значения, чтобы обеспечить локализацию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top