2008-09-11 5 views
10

Некоторое время назад я читал статью W3C на 'Re-using Strings in Scripted Content', в которой содержатся полезные советы по интернационализации, но которая поражает меня как в противоречии с принципом 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 с интернационализацией их кода?

Часть меня хочет утверждать, что интернационализация является одним из тех экстремальных программ «you arent gonna need it». Однако, с другой стороны, рефакторинг с принципом DRY должен сбалансировать это, упрощая реализацию функциональности по мере необходимости, но не сложнее, чем здесь.

ответ

16

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

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

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

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

+0

с помощью [i18next] (http://i18next.com/pages/doc_features.html#nesting) 's вложенности функциональность я попытаться повторно использовать глоссарий, например: `$ t (принтер) включен. У меня есть термин принтер в одном месте. – jamuhl 2012-10-22 11:29:25

0

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

2

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

1

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

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

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

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

2

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

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

Например, «% (прибор)%% (on_or_off)%».

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

6

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 Также см

Смежные вопросы