Интернационализация в ваших проектах

Как вы реализовали интернационализацию (i18n) в реальных проектах, над которыми вы работали?

Я проявил интерес к тому, чтобы сделать программное обеспечение кросс-культурным после того, как я прочитал знаменитый пост Джоэла, Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборы символов (без отговорок!). Тем не менее, я еще не смог воспользоваться этим в реальном проекте, кроме того, чтобы убедиться, что я использовал строки Unicode, где это возможно. Но, делая все ваши строки Unicode и гарантируя, что вы понимаете, в какой кодировке все, с чем вы работаете, находится только в верхушке айсберга i18n.

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

Ответ 1

Прошло некоторое время, поэтому это не является исчерпывающим.

Наборы символов

Unicode отлично, но вы не можете уйти с игнорированием других наборов символов. Набор символов по умолчанию для Windows XP (английский) - Cp1252. В Интернете вы не знаете, что браузер отправит вам (хотя, надеюсь, ваш контейнер будет обрабатывать большую часть этого). И не удивляйтесь, когда есть ошибки в любой реализации, которую вы используете. Наборы символов могут иметь интересные взаимодействия с именами файлов, когда они перемещаются между машинами.

Перевод строк

Переводчики, вообще говоря, не кодеры. Если вы отправите исходный файл переводчику, он сломает его. Строки должны быть извлечены в файлы ресурсов (например, файлы свойств в Java или библиотеки ресурсов в Visual С++). Переводчикам должны быть предоставлены файлы, которые трудно сломать, и инструменты, которые не позволяют им их нарушать.

Переводчики не знают, откуда взялись строки из продукта. Трудно перевести строку без контекста. Если вы не дадите указания, качество перевода будет страдать.

В контексте контекста вы можете увидеть одну и ту же строку "foo" в несколько раз и подумать, что было бы более эффективно иметь все экземпляры в пользовательском интерфейсе для одного и того же ресурса. Это плохая идея. Слова могут быть очень контекстно-зависимыми на некоторых языках.

Перевод строк стоит денег. Если вы выпускаете новую версию продукта, имеет смысл восстановить старые версии. У вас есть инструменты для восстановления строк из старых файлов ресурсов.

Конкатенация строк и ручная манипуляция строками должны быть сведены к минимуму. Используйте функции формата, если это применимо.

Переводчики должны иметь возможность изменять горячие клавиши. Ctrl + P печатается на английском языке; немцы используют Ctrl + D.

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

Даты, времена, календари, валюта, числовые форматы, часовые пояса

Все они могут варьироваться в зависимости от страны. Для обозначения десятичных знаков можно использовать запятую. Время может быть в течение 24 часов. Не каждый использует григорианский календарь. Вы тоже должны быть однозначными. Если вы позаботите показать даты в формате MM/DD/YYYY для США и DD/MM/YYYY для Великобритании на своем веб-сайте, даты будут неоднозначными, если пользователь не знает, что вы это сделали.

Особенно в валюте

Функции Locale, предоставляемые в библиотеках классов, дадут вам символ местной валюты, но вы не можете просто придерживаться фунта (стерлингов) или символа евро перед значением, которое дает цену в долларах.

Пользовательские интерфейсы

Макет должен быть динамическим. Мало того, что строки могут удвоиться по длине при переводе, весь интерфейс может потребоваться перевернуть (иврит, арабский), чтобы элементы управления выполнялись справа налево. И это до того, как мы доберемся до Азии.

Тестирование до перевода

  • Используйте статический анализ кода для поиска проблем. На минимальном уровне используйте инструменты, встроенные в вашу среду IDE. (Пользователи Eclipse могут перейти в Window > Preferences > Java > Compiler > Errors/Warnings и проверить нестерзализованные строки.)
  • Smoke test путем моделирования перевода. Нетрудно разобрать файл ресурсов и заменить строки с помощью псевдопереводимой версии, которая удваивает длину и вставляет фанки-символы. Вам не нужно говорить на языке, чтобы использовать внешнюю операционную систему. Современные системы должны позволить вам войти в систему как иностранный пользователь с переведенными строками и иностранным языком. Если вы знакомы с вашей ОС, вы можете понять, что делает, не зная ни одного слова этого языка.
  • Ссылки на клавиатуру и ссылки на набор символов очень полезны.
  • Виртуализация была бы очень полезной здесь.

Нетехнические проблемы

Иногда вы должны быть чувствительны к культурным различиям (может произойти преступление или непонимание). Ошибка, которую вы часто видите, - это использование флагов в качестве визуальной подсказки, определяющей язык сайта или географию. Если вы не хотите, чтобы ваше программное обеспечение объявляло стороны в глобальной политике, это плохая идея. Если вы были французами и предложили вариант для английского языка с флагом Святого Георгия (флаг Англии - красный крест на белом поле), это может привести к путанице для многих говорящих на английском языке - предполагают, что подобные проблемы будут возникать с иностранными языками и странами, Значки должны быть проверены на предмет культурной значимости. Что означает палец или зеленый тик? Язык должен быть относительно нейтральным - обращение к пользователям определенным образом может быть приемлемым в одном регионе, но считается грубым в другом.

Ресурсы

Программисты С++ и Java могут найти полезный сайт ICU: http://www.icu-project.org/

Ответ 2

Некоторые забавные вещи:

  • Имея приложение PHP и MySQL, которое хорошо работает с немецким и французским, но теперь необходимо поддерживать русский и китайский языки. Я думаю, что я перехожу к .net, так как поддержка PHP Unicode - на мой взгляд - не очень хорошая. Конечно, жонглирование с помощью utf8_de/encode или функции mbstring - это весело. Почти так же весело, как посещение Фредди Крюгера ночью...

  • Понимая, что некоторые языки являются БОЛЬШИМ более подробными, чем другие. Немецкий язык LOT более многословный, чем английский, и видение того, как немецкая версия разрушает пользовательский интерфейс, потому что слишком мало места было выделено, было не весело. Некоторые продукты получили известность за их творческие способы обойти это, с Oblivion "Schw.Tr.d.Le.En.W." будучи незабываемым: -)

  • Играя с форматами даты, woohoo! Да, есть люди в мире, которые используют форматы даты, где день идет посередине. Sooooo очень весело, пытаясь выяснить, что означает 07/02/2008, только потому, что некоторые пользователи могут поверить, что это может быть 2 июля... Но опять же, вы, ребята, над прудом, можете поверить в то же самое о пользователях, которые месяц в середине: -P, особенно потому, что на английском языке 2 июля звучит намного лучше, чем 2 июля, то, что не обязательно применяется к другим языкам (то есть по-немецки, вы никогда не сказали бы Juli 2, но всегда Zweiter Juli). Я использую 2008-02-07, когда это возможно. Ясно, что это означает 7 февраля, и оно сортируется правильно, но dd/mm против mm/dd может быть очень сложной проблемой.

  • Анотерная забавная вещь, Числовые форматы! 10.000,50 против 10 000.50 против 10 000,50 против 10'000,50... Это мой самый большой кошмар прямо сейчас, нужно поддерживать многокультурную среду, но не имея никакого способа достоверно узнать, какой формат номера пользователь будет использовать.

  • Формальный или неформальный. На каком-то языке существует два способа обращаться к людям, формально и более неформально. На английском вы просто говорите "Вы", но на немецком языке вам нужно решить между формальным "Sie" и неофициальным "Du", то же самое для французского Tu/Vous. Обычно это безопасная ставка, чтобы выбрать формальный способ, но это легко упустить.

  • Календари. В Европе первый день недели - понедельник, тогда как в США это воскресенье. Календарь Виджеты приятные. Показывать Календарь с воскресеньем слева и в субботу справа от европейского пользователя не так приятно, это смущает их.

Ответ 3

Я работал над проектом для моего предыдущего работодателя, который использовал .NET, и был встроенный формат .resx, который мы использовали. У нас в основном был файл, который имел все переводы в файле .resx, а затем несколько файлов с разными переводами. Следствием этого является то, что вы должны быть очень осторожны в обеспечении того, чтобы все строки, видимые в приложении, были сохранены в .resx, и в любое время, когда вы изменились, вам необходимо обновить все поддерживаемые вами языки.

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

Еще одно замечание, очень строго избегайте прямого конкатенации видимых строк, например

String message = "The " + item + " is on sale!";

Вместо этого вы должны использовать что-то вроде

String message = String.Format("The {0} is on sale!", item);

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

Ответ 4

Я просто слушал Podcast от Scott Hanselman сегодня, где он говорит о интернационализации, особенно о действительно сложных вещах, таких как турецкий (с ним четыре я) и тайский. Кроме того, у Джеффа Этвуда был post:

Ответ 5

Помимо всех предыдущих советов, помните, что это не просто изменение слов для их эквивалента на других языках, особенно для алфавитов нелатинских языков (корейский, арабский), которые написаны справа налево, поэтому весь пользовательский интерфейс должен будет соответствовать, например

  • item 1
  • item 2
  • item 3

должно быть

арабский текст 1 -

арабский текст 2 -

арабский текст 3 -

(измененный список пулей, похоже, не работает: P)

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

Еще одна сложная задача - проверить разные языки, а не только на правильность слова, но поскольку такие языки, как корейский, обычно имеют больший тип шрифта для своих персонажей, это может привести к ошибкам языка (например, текст "SAVE" на кнопке чем сама кнопка для некоторого языка).

Ответ 6

Одна из самых смелых вещей, которую можно обнаружить: курсив и полужирный текст makrup не работают с персонажами CJK (китайский/японский/корейский). Они просто становятся нечитаемыми. (Хорошо, я тоже не мог их прочитать, но особенно смелый просто создает чернильные пятна)

Ответ 7

Я думаю, что все, кто работает в интернационализации, должны быть знакомы с репозиторием Common Locale Data, который теперь является подпроектом Unicode:

Общий репозиторий данных Locale

Эти люди прилагают все усилия, чтобы установить стандартный ресурс для всех видов вопросов i18n: валюта, географических названий, тонны материала. Любой проект, который поддерживает свои собственные локальные локальные данные, учитывая, что этот проект существует, довольно запутанный, IMHO.

Ответ 8

Я предлагаю использовать что-то вроде 99translations.com для поддержки ваших переводов. В противном случае вы не сможете сказать, какие ваши переводы актуальны на каждом языке.

Ответ 9

Еще одна проблема будет заключаться в том, чтобы принимать входные данные от ваших пользователей. Во многих случаях это облегчается обработкой ввода, предоставляемой операционной системой, такой как IME в Windows, которая прозрачно работает с общими текстовыми виджетами, но это средство не будет доступно для всех возможных нужд.

Ответ 10

Один веб-сайт, который я использую, имеет метод перевода, который владелец называет "wiki + машинный перевод". Это сайт, основанный на сообществах, поэтому он явно отличается от потребностей компаний.

http://blog.bookmooch.com/2007/09/23/how-bookmooch-does-its-translations/

Ответ 11

Одна вещь, о которой никто еще не упоминал, - это строки с некоторой осторожной частью, как в "Единица будет в течение 5 дней" или "В понедельник что-то происходит". где 5 и понедельник будут меняться в зависимости от состояния. Нецелесообразно разбить их на две части и объединить их. Имея только одну разную часть и хорошую документацию, вы можете с ней справиться, с двумя разными частями будет какой-то язык, который предпочитает изменять их порядок.