Не повторяйся против Интернационализации - PullRequest
11 голосов
/ 11 сентября 2008

Некоторое время назад я читал статью W3C на тему « Повторное использование строк в скриптовом контенте », в которой содержится несколько полезных советов по интернационализации, но мне кажется, что шансы на СУШКУ (Дон t Повторите себя) принцип устранения повторяющегося кода.

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

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 к интернационализации своего кода?

Часть меня хочет утверждать, что интернационализация - это одна из тех экстремальных программных ситуаций, " вам не понадобится ". С другой стороны, рефакторинг с учетом принципа СУХОЙ должен сбалансировать это, упрощая реализацию функциональности по мере необходимости, а не сложнее, как здесь.

Ответы [ 6 ]

16 голосов
/ 11 сентября 2008

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

Просто магазин

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

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

7 голосов
/ 19 сентября 2008

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

2 голосов
/ 14 сентября 2008

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

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

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

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

2 голосов
/ 11 сентября 2008

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

1 голос
/ 11 сентября 2008

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

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

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

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

0 голосов
/ 11 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...