Эффективные стратегии локализации в .NET [закрыты]

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

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

118 голосов | спросил smartcaveman 10 MaramThu, 10 Mar 2011 02:28:26 +03002011-03-10T02:28:26+03:0002 2011, 02:28:26

12 ответов


74

Вы разрабатываете приложение ASP.Net MVC, не так ли? Другие ответы, похоже, специфичны для настольных приложений. Позвольте мне запечатлеть общие вещи:

Локальное обнаружение

Очень важно, чтобы ваше приложение правильно определяло локаль пользователя. В настольном приложении CultureInfo.CurrentCulture содержит предпочтительный язык форматирования (тот, который должен использоваться для форматирования чисел, дат, валют и т. Д.), Тогда как CultureInfo.CurrentUICulture содержит предпочтительный языковой стандарт пользовательского интерфейса (тот, который должен использоваться для отображения локализованных сообщений) , Для веб-приложений вы должны настроить обе культуры на автоматическую (чтобы автоматически определять локаль из заголовка AcceptLanguage), если вы не хотите реализовать какой-то причудливый рабочий процесс обнаружения локали (т. Е. Хотите поддерживать меняющийся язык по требованию).

Внешние строки

Все строки должны поступать из ресурсов, то есть файлов Resx. В приложении Winforms легко достижимо, установив для свойства Localizable значение true. Вам также потребуется вручную (к сожалению) вытеснить строки, которые поступают из ваших моделей. Это также относительно просто. В Asp.Net вам нужно будет все экстернализировать вручную ...

Макеты

Вам определенно нужно разрешить расширение строки. В мире Winforms это достигается через TableLayoutPanel, который должен использоваться, чтобы убедиться, что макет будет автоматически настраиваться для размещения более длинного текста. В веб-мире вам немного не повезло. Возможно, вам понадобится реализовать механизм локализации CSS - способ изменения (переопределения) определений CSS. Это позволит пользователям Localization изменять требования к стилю по требованию. Убедитесь, что каждый элемент HTML на отображаемой странице имеет уникальный идентификатор - он позволит точно настроить его.

Проблемы, связанные с культурой

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

ToString () и Parse ()

Обязательно всегда передавать CultureInfo при вызове ToString (), если он не поддерживается. Таким образом, вы комментируете свои намерения. Например: если вы используете некоторый номер внутри и по какой-то причине необходимо преобразовать его в использование строки:

int i = 42;
var s = i.ToString(CultureInfo.InvariantCulture);

Для номеров, которые будут отображаться для использования пользователем:

var s = i.ToString(CultureInfo.CurrentCulture); // formatting culture used

То же самое относится к Parse (), TryParse () и даже ParseExact () - можно было бы ввести некоторые неприятные ошибки без правильного использования CultureInfo. Это потому, что какая-то безнадежная душа в Microsoft, полная добрых намерений, решила, что это хорошая идея относиться к CultureInfo.CurrentCulture как по умолчанию (она будет использоваться, если вы ничего не передадите) - ведь когда кто-то использует ToString ( ) он /она хочет отобразить его пользователю, не так ли? Оказалось, что это не всегда так - например, попробуйте сохранить номер версии вашего приложения в базе данных и затем преобразовать его в экземпляр класса версии. Удачи.

Даты и часовые пояса

Обязательно всегда хранить и создавать DateTime в UTC (используйте DateTime.UtcNow вместо DateTime.Now). Преобразуйте его в локальное время в локальном формате при отображении:

DateTime now = DateTime.UtcNow;
var s = now.ToLocalTime().ToString(CultureInfo.CurrentCulture);

Если вам нужно отправить электронные письма с указанием времени в теле, обязательно включите информацию о часовом поясе - включите как смещение UTC, так и список городов:

DateTime someDate; // i.e. from database
var formattedDate = String.Format("{0} {1}", 
             someDate.ToLocaleTime().ToString(CultureInfo.CurrentCulture),
             TimeZoneInfo.Local.DisplayName);

Составные сообщения

Вы уже были предупреждены о том, чтобы не конкатенировать строки. Вместо этого вы, вероятно, будете использовать String.Format (), как показано выше. Однако я должен указать, что вам следует минимизировать использование сложных сообщений. Это связано с тем, что правила грамматики цели довольно разные, поэтому переводчикам может потребоваться не только переопределить предложение (это будет разрешено с помощью заполнителей и String.Format ()), но и перевести все предложение по-разному на основе что будет заменено. Позвольте мне привести несколько примеров:

// Multiple plural forms
English: 4 viruses found.
Polish: Znaleziono 4 wirusy. **OR** Znaleziono 5 wirusów.

// Conjugation
English: Program encountered incorrect character | Application encountered incorrect character.
Polish: Program napotkał nieznaną literę | Aplikacja napotkała nieznaną literę.

Другие проблемы конкатенации

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

Напомните мне еще раз в [текстовое поле с числом] дней.

Это должно быть переработано для чего-то вроде: Напомнить мне еще раз в это количество дней: [текстовое поле].

Кодировка символов и шрифты

Всегда сохранять, передавать, любой текст в Юникоде (т. е. в UTF-8). Не печатать шрифты с жестким кодом. Локализация может потребовать их изменения, и он отключит механизм возврата по умолчанию (в случае Winforms). Не забудьте указать «странные» символы в большинстве полей (например, имя пользователя).

Test

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

ответил Paweł Dyda 2 PMpSat, 02 Apr 2011 22:15:02 +040015Saturday 2011, 22:15:02
74

Некоторые основные вещи, которые вы должны учитывать:

Внешние ресурсы всех строк

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

Разрешить достаточное пространство для расширения строки

Строки на некоторых языках, например, до 30% дольше (например, греческие), поэтому убедитесь, что вы создаете свой пользовательский интерфейс таким образом, чтобы при необходимости строки могли расширяться. Вот довольно экстремальный пример для французского языка:

  

Ok -> Accepter (французский - 400%)

Я бы рекомендовал сделать какой-то псевдо-перевод в качестве отправной точки ( http://en.wikipedia.org/wiki/Pseudolocalization ). Или вы можете перевести свои ресурсы с помощью Google Translate или Bing. Это даст вам хорошее представление о том, как будут выглядеть фактические переводы.

Следите за текстом в изображениях

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

Никогда не перекодируйте любые пути в папки Windows

Очевидно, но я видел это в прошлом. Например, C:\Program Files переводится в некоторых международных версиях Windows, например. это C:\Programme на немецкой ОС.

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

Например, если вы спросите кого-то о своей «средней школе» в форме, это мало имеет значения в Западной Европе.

Избегайте создания строк с помощью конкатенации строк

Например, это выглядит безвредным:

strWelcome = ReadExternalString("Welcome"); 
strMessage = strWelcome + ", " + UserName;

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

Настройки времени /даты

Всегда обеспечивайте получение формата времени /даты в ОС.

ответил Jimmy Collins 10 MarpmThu, 10 Mar 2011 20:52:12 +03002011-03-10T20:52:12+03:0008 2011, 20:52:12
24

Особые соображения для азиатских языков

В дополнение ко всем великим ответам уже здесь, некоторые меры предосторожности для азиатских языков:

Остерегайтесь разной длины текста

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

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

Остерегайтесь базовой компоновки и «раздвинутого» вида

Азиатские символы обычно выкладываются на основе , которые не включают descenders (т.е. нижняя часть y, g, q, j и т. д.). Когда вы форматируете элемент экрана - обычно кнопки - с текстом внутри, и если этот текст - только азиатские языки (то есть не западные алфавиты), тогда текст будет выглядеть так, как будто он сдвинут вверх.

Форматирование чисел и локализованных числовых единиц

Отформатируйте номер форматирования по-разному. Различные азиатские страны имеют разные способы форматирования чисел. То же самое касается валют. Например, в Восточной Азии 10 000 (wan) являются общей единицей. В Индии распространено 100 000 (лакх).

Локальные валюты

Валюта некоторых стран имеет много нулей и десятичную точку (например, Япония, Индонезия, Италия), а другие имеют до двух цифр после десятичной точки.

Остерегайтесь разных порядков слов

Порядок слов не всегда может быть одинаковым. Лучше всего использовать {0}, {1} и т. Д. В форматировании строк вместо строкового кодирования слов, если ваша строка получена из комбинации разных фрагментов данных.

Использовать специфичную для локали сортировку

Сортировка различается для каждого языка и для каждого языкового стандарта - вы всегда должны полагаться на сортировку по локали O /S.

Будьте очень осторожны с символами полной ширины /полуширины

Остерегайтесь различий между символами «полная ширина» и «полуширина». Кронштейны, знаки препинания и т. Д. Могут иметь версии «полной ширины», которые отличаются от стандартных ASCII. Если вы выполняете поиск или разделение строк на основе этих букв, вам необходимо сначала преобразовать все символы полной ширины в эквиваленты полуширины.

Период не является точкой ... запятая не является запятой ...

Остерегайтесь ввода данных gotcha - например, на китайском языке, период не точка ".". Запятая полная, а не «,». Не пытайтесь найти западную пунктуацию, если пользователь, выполняющий ввод данных, может случайно включить азиатский язык IME.

Телефонные номера

Не принимайте ничего в форматировании телефонных номеров. Существует не всегда код области и т. Д., И он может быть отформатирован по-разному. Как правило, есть строка формата для каждой страны.

Не предполагайте, что у людей будет только номер телефона one или номер факса один и т. д. Это не так в Азии.

Адреса - плотнее, чем вы думаете

Для адресов не принимайте ничего . Не всегда может быть почтовый индекс. Почтовые индексы могут не всегда быть числами. Страна может не иметь провинций /штатов. Страна может быть просто большим городом (например, Сингапур). Для некоторых азиатских стран наименьшей единицей дома может быть «Комната X, единица Y, раздел Z, этаж A, блок B, группа C, имущество D». В общем, очень либеральный в количестве полей и количестве символов, разрешенных в адресах.

Приветствия

Приветствия не ограничиваются только г-ном, г-жой и т. д. Хотя вы, вероятно, безопасны в использовании «М» и «F» для секса - мы не , которые еще не были. .

ответил 7 AMpThu, 07 Apr 2011 11:03:19 +040003Thursday 2011, 11:03:19
11

Некоторые основные шаги состоят в том, чтобы убедиться, что любая строка, отображаемая на экране, не является литералом в вашем коде. Если вы делаете Winforms, каждая форма будет иметь ресурс пользовательского интерфейса. Для диалогов, отчетов и т. Д. Убедитесь, что вы используете файлы ресурсов проекта.

Итак, вместо "Загрузка не удалась" в вашем коде у вас может быть что-то вроде Resources.UploadFailed

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

ИЗМЕНИТЬ Я забыл упомянуть, когда вы делаете свой пользовательский интерфейс, убедитесь, что вы не просто впишитесь туда. В зависимости от языков, на которые вы локализуетесь, недвижимость может быть проблемой. Я работал над проектом, в котором на немецком и португальском языках были 2 крупнейших нарушителя роста струн. Если бы мы не были осторожными струнами, которые были бы прекрасны на английском, французский и итальянский взорвут на немецком языке.

ответил taylonr 10 MaramThu, 10 Mar 2011 02:41:58 +03002011-03-10T02:41:58+03:0002 2011, 02:41:58
9

Я предлагаю вам запустить FXCop или Visual Studio Анализ кода (они совершенно одинаковы) на ваших собраниях .

Они хорошо разбираются в .NET-коде, который не использует надлежащие ориентированные на культуру перегрузки, например: CA1305: укажите IFormatProvider .

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

ответил Simon Mourier 29 MaramTue, 29 Mar 2011 11:21:43 +04002011-03-29T11:21:43+04:0011 2011, 11:21:43
7

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

ответил Jeremy 10 MaramThu, 10 Mar 2011 03:13:06 +03002011-03-10T03:13:06+03:0003 2011, 03:13:06
6

В дополнение ко всем другим полезным подсказкам, вот некоторые из них, которые отсутствуют:

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

Если вы зададите пользователю вопрос, ожидающий ответа на одну букву, не ожидайте, что пользователь нажмет клавишу «Y», чтобы сказать «Да».

Будьте в курсе хранимых процедур, что даты в SQL DB находятся в формате США

Размещение текстовых строк в БД позволяет вам позже добавлять дополнительные языки без повторного развертывания.

При отправке письменных текстовых файлов для перевода всегда включайте описание контекста, чтобы переводчик выбирал правильное слово. Например, без контекста вы могли бы перевести «шаг:» во что-то связанное со звуком или местом, в котором вы играете в футбол

Этикетки адресов всегда нуждаются в конвертации. Провинция в Канаде, штат в Америке, графство в Великобритании

ответил Brian Leeming 15 PMpFri, 15 Apr 2011 23:48:17 +040048Friday 2011, 23:48:17
5

Вам нужно учитывать:

  1. Маршрутизация для многоязычного

  2. Переместить всю строку жесткого кода в файл ресурса

Пример для свойства:

Модель:

[Display(Name = <Resource for display name>.<field for this property>)]
[Required(ErrorMessage = <Resource for error message>.<field for this validate message>)]
public string TestProperty { get; set; }

Вид:

@Html.LabelFor(m=>m.TestProperty)
@Html.EditorFor(m => m.TestProperty)
@Html.ValidationMessageFor(m => m.TestProperty)
ответил 2 PMpSat, 02 Apr 2011 21:30:11 +040030Saturday 2011, 21:30:11
5

Вот что-то не упоминается в остальных ответах.

В зависимости от сложности вашего приложения и его локализации я бы настоятельно рекомендовал внедрить альтернативный поставщик ресурсов и поддерживать локализованные ресурсы в базе данных. При использовании схемы локализации ASP.NET по умолчанию все ресурсы хранятся в файлах RESX, которые:

  1. Боль в прикладе для редактирования в Visual Studio
  2. Ограничить распространение и управление локализованными ресурсами после компиляции /отправки /запуска приложения.

В качестве возможного варианта использования рассмотрите возможность предоставления языковых пакетов для вашего приложения и возможность импорта и экспорта языков через пользовательский интерфейс. Файлы RESX здесь не помогли.

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

ответил Slavo 6 J000000Wednesday11 2011, 19:23:14
3

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

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

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

ответил 3 Mayam11 2011, 11:15:06
2

Сводка вещей, которые следует учитывать при интернационализации:

  • Вся информация должна быть интернационализирована. Примите во внимание, что графика может иметь информацию, которую мы хотим интернационализировать.

  • Размер полей или строк в зависимости от языка, потому что это может вызвать у нас проблему.

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

  • Мы должны учитывать, что формат даты будет меняться с одного языка на другой

ответил 21 J0000006Europe/Moscow 2011, 00:48:52
1

Сделайте тест в Турции :

  

Интернационализация программного обеспечения сложна в лучшем случае обстоятельствах , но меня всегда поразило, как часто одна конкретная страна поднималась в обсуждениях проблем интернационализации: Турция ...

     

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

Если ваш сайт /программа хорошо работает с турецким клиентом, вы можете быть уверены, что он будет работать на большинстве других платформ.

ответил Carra 10 AM000000110000005731 2011, 11:33:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132