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



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

Храните видимые для пользователя строки отдельно


Определенно самое важное (и самое игнорируемое) правило подготовки к локализации — отделение всех видимых для пользователя строк от кода, который использует их.

Обычный в этом случае подход — хранить текстовый контент продукта в отдельных файлах ресурсов для каждой платформы или языка. Например, Java-программистам стоит держать свои отображаемые строки в файлах ResourceBundle.

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

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

Учитывайте, что отображаемые строки могут стать длиннее или короче


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

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

Используйте изображения без текста


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

Учитывайте отличия в форматах календаря, времени, телефонных номеров и валютных систем


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

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

Всегда используйте установленные международные стандарты хранения данных. Например, пользуйтесь E.164 для телефонных номеров, ISO-8601 — для временных меток, ISO 639.2 — для языков, ISO 3166 — для стран и tz database — для часовых поясов.

Избегайте ASCII, используйте Unicode


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

Даже при некоторой совместимости Unicode с ASCII лучшим способом избежать проблем с кодировкой строк остается соблюдение этих правил:
  • никогда не допускайте кодирования символов в ASCII;
  • никогда не полагайтесь на то, что один байт равен одному символу;
  • всегда используйте поддерживающие Unicode шрифты и библиотеки.

К счастью, некоторые из самых популярных на сегодняшний день языков программирования, таких как Java, C# и Objective-C, содержат встроенную поддержку Unicode в строковых типах. Их использование превращает решение проблемы международных символов в обычное дело.

Даже если приложение полностью поддерживает Unicode, вероятно, оно хранит данные в базе данных, и плохая логическая структура данных может легко разрушить всю отлично выполненную в коде работу по совместимости с международными кодировками. Например, в базе данных SQL Server отображаемые строки должны храниться в типах nvarchar, а в MySQL лучше всего использовать utf8mb4.

Подробнее о Unicode можно прочесть в хорошей вводной статье Джоэля Спольски.

Учитывайте, что текст не всегда читается слева направо


Самое распространенное различие в отображении текста — написание справа налево, как в арабском языке и иврите.



В веб-приложении основные проблемы, которые возникают при переводе на читающиеся справа налево языки, можно решить простым изменением CSS-свойства direction для всей системы.

Случается также, что текст читается сверху вниз, хотя и гораздо реже.

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


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

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

Тестируйте базовую поддержку многоязычности


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

Например, представим себе веб-приложение для заказа билетов на концерты. Допустим, уже написан тест, чтобы проверить, может ли пользователь с ненастоящим именем «Иван Иванов» забронировать себе место и убедиться, что его имя правильно отображается на билете, который он получит после оплаты. Добавление простого теста, который меняет имя пользователя на «Иван-??? Иванов-???» и отслеживает, чтобы те же символы отобразились на билете после оплаты, позволит удостовериться в том, что поддержка международных символов работает и в приложении, и в базе данных. Этот простой подход (иногда называемый «псевдолокализацией») позволяет разработчикам проверить, поддерживает ли их приложение передачу и хранение строк с международными символами, без необходимости заказывать полный профессиональный перевод продукта или основательных языковых познаний у самих разработчиков.

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

Охватывайте глобальные возможности


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

Мы же в Alconost всегда рады помочь вам с профессиональной локализацией вашего софта — быстро и качественно.

Комментарии (8)


  1. ad1Dima
    02.09.2015 12:33

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


    1. si1v3r
      02.09.2015 22:47

      Вы сейчас переводчику вопрос задали или автору? :)


      1. ad1Dima
        03.09.2015 07:05

        Читателю.


    1. alconost
      02.09.2015 23:57

      Да, об этом можно целую статью написать. В русском языке разделитель дробной части — запятая, в английском — точка. Причем, в английском для разделения разрядов используется запятая (все помнят three comma club?). Так, в русском 1,999 — это почти два, а в английском — почти две тысячи.


      1. ibrin
        26.09.2015 15:19

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


        1. ad1Dima
          28.09.2015 12:13

          И не забывать парсить дробные числа в нужной культуре.


  1. Flex25
    03.09.2015 19:51

    Есть неосвещенная в данной статье проблема: сопряжение правильной формы слова с числом. Видимое пользователю число может меняться и относящееся к нему слово, соответственно, тоже. Например, в русском для одного слова может быть 3 формы: «1 стол», «2 стола», «5 столов». В английском — только 2 формы: «1 table», «2 tables». А как будет, к примеру, в арабском? Я не знаю. На такие вопросы нет унифицированного ответа. Нельзя просто так взять и запихнуть в ресурсный файл слово «стол», «table» и их аналоги на остальных неизвестных вам языках. По-любому придется для каждого языка дополнительно прописать какую-то логику, изучить основы грамматики, словообразования. Так что если копнуть глубже, то не все так просто и однозначно.


    1. michael_vostrikov
      03.09.2015 20:17
      +1

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