Локализация по сравнению с интернационализацией
Существует несколько определений, которым отдаётся предпочтение. Здесь мы в общем опишем, как мы используем данные термины на сайте W3C Internationalization.
Локализация
Локализация относится к адаптации содержания продукта, программы или документа к языковым соответствиям, культурным и другим требованиям определённого целевого рынка («locale»).
Иногда локализация пишется как «l10n», где 10 — это число букв между буквами ‘l’ and ‘n’ в английском варианте слова «localization».
Часто подразумеваемый как синоним переводу пользовательского интерфейса и документации, термин локализация является значительно большим понятием. Данное понятие может включать адаптацию следующих аспектов:
- Цифровые форматы, форматы датировки и временные форматы
- Использование денежных единиц
- Использование клавиатуры
- Комплектование и отбор
- Символы, знаки и цвета
- Текст и графические изображения, относящиеся в своём содержании к объектам, действиям или идеям, которые в данной культурной среде
могут быть неправильно истолкованы или восприняты безразлично.
- Различные правовые требования
- и многое другое.
Локализация может вызвать необходимость глубокого переобдумывания логики, дизайна или представления, если образ ведения бизнеса (например, бухгалтерии) или принятая модель обучения (например, концентрирование на личности по сравнению с концентрированием на группе) в данной локали значительно отличается от первичной культуры.
Интернационализация
Определения интернационализации различны. Ниже представлено руководящее определение, используемое для материалов W3C Internationalization Activity. Некоторые используют другие термины, как, например, «глобализация», ссылаясь при этом на ту же идею.
Интернационализация — это создание и развитие содержания продукта, программы или документации, позволяющее производить лёгкую локализацию для целевых рынков, различающихся по культуре, региону или языку.
Интернационализация часто пишется как «i18n», где 18 — это число букв между ‘i’ и ‘n’ в английском варианте слова «internationalization».
- Проектирование и разработку таким образом, чтобы не было преград при локализации и международном применении. Это включает следующее — создание возможности применения Unicode, или обеспечение соответствующего подхода к кодировке символов (если требуется), обеспечение последовательности строк, избежание зависимости кода от значений строк пользовательского интерфейса.
- Обеспечение основы для элементов, которые невозможно использовать до процесса локализации. Например, добавление к языку разметки в DTD основы для двустороннего текста или для определения языка. Или добавление к CSS основы для вертикального текста или нелатинских типографических свойств.
- Возможность кодовой поддержки местных, региональных, языковых или относящихся к культуре предпочтений. Обычно это включает внесение предопределённых локализированных данных или черт, взятых из существующих программ памяти или предпочтений пользователя. К примерам относятся: форматы датировки и времени, местные календари, числовые форматы и числовые системы, отбор и представление списков, обращение с личными именами и форм обращения.
- Выделение локализированных элементов из начального кода или содержания, таким образом, чтобы локализированные варианты можно было загрузить позже или выбрать, основываясь на предпочтениях пользователя.
Заметьте, что данный перечень не обязательно включает локализацию содержания, программы или продукта на другой язык; это технологии создания и развития, которые создают возможность для лёгкого перехода к локализации в будущем, хотя и могут быть значительно полезны, если локализация не будет произведена.
Значимость интернационализации
Интернационализация значительно облегчает локализацию продукта. Настройка лигвистически- и культурно-направленного объекта для глобального рынка безусловно является более сложным и продолжительным процессом, чем создание объекта с целью его глобального представления.
Поэтому теоретически интернационализация является основным шагом в процессе создания и развития, нежели дополнением, которое может часто стать причиной неловких и дорогих технологического изменений.
В чем отличие локализации от интернационализации
Более пяти лет выделенная команда a1qa обеспечивает качество приложения для коммуникации и взаимодействия между различными медицинскими приборами. Данное приложение и медицинское оборудование, на которое оно устанавливается, используется по всему миру.
На сегодняшний день приложение поддерживает 18 локалей, включая два китайских письма (упрощённое и традиционное) и корейский язык. Соответственно, в план по разработке приложения были включены как процессы интернационализации, так и локализации.
В сегодняшней статье мы обозначим разницу между двумя процессами и укажем, на что должен обращать внимание QA-инженер в рамках тестирования локализации и интернационализации.
Глобализация — основа международного использования продукта
Ни для кого не секрет, что успех приложений на мировом рынке сегодня во многом зависит от того, насколько удачно приложение адаптировано для работы по всему миру. Стратегия по подготовке приложения к интернациональному использованию называется глобализацией.
Если компанией-разработчиком продукта взят курс на глобализацию, то необходимо запланировать интернационализацию, локализацию продукта, а также перевод контента ПО на целевые языки.
Интернационализация (I18n) — процесс создания и разработки продукта, который в последующем обеспечит безбарьерную локализацию ПО. Например, разработчик должен заложить в CSS основу для вертикального текста, если в будущем планируется локализовать продукт на язык с вертикальным письмом.
Локализация (L10n) – адаптация продукта и его документации к языковым соответствиям, культурным и другим требованиям целевого рынка или рынков (локалей).
Переходя непосредственно к задачам I18n и L10n, выделим следующие пункты, на которые должен обратить внимание специалист по тестированию:
Теперь поясним. В процессе интернационализации важно, чтобы разработчик использовал кодировки UNICODE. Это сделает возможной поддержку практически всех письменных языков. Также важно обеспечить поддержку приложением различных форматов календарей, дат, систем мер, единиц измерения.
Следует отметить, что при интернационализации важна возможность изменить направление текста и расположение элементов интерфейса (например, справа налево для арабских стран, либо расположение иероглифов сверху вниз для азиатского региона).
Кроме того, при разработке международного продукта следует избегать жёстко закодированных элементов, которые в последующем должны изменяться при смене языков.
Локализация: мысли глобально – действуй локально
Если же мы говорим о локализации, то тут уже решаются задачи местного характера: перевод текстовых элементов пользовательского интерфейса, подписей к картинкам, сообщений пользователям, элементов управления на все языки, которые поддерживаются в программном продукте.
При локализации обязательно учитываются правовые требования, которые поддерживаются в различных регионах. К примеру, в России совершеннолетие наступает в 18 лет. В США в зависимости от штата этот возраст варьируется от 18 до 21 года, а в Японии молодые люди считаются совершеннолетними с 20 лет. Поэтому при разработке и тестировании, например, интернет-магазина с возрастными ограничениями, необходимо обязательно их учитывать.
Также стоит обращать внимание на поддержку валюты и операций с ней для каждой страны.
Любой программный продукт сегодня имеет собственное цветовое оформление. Специфические цвета и символы, которые могут иметь разный смысл в зависимости от региона, также должны учитываться при тестировании локализации.
Например, красный цвет для жителей Китая – символ выносливости и веры, а в Индии он символизирует чистоту. Европа же, наоборот, видит в этом цвете грех и жертвенность. Для жителей Южно-Африканской Республики – это цвет скорби, а для австралийских аборигенов – цвет земли.
Кроме того, обязательно следует обращать внимание на поддержку региональных раскладок клавиатур и работу горячих клавиш.
В том случае, если в приложении используются интеграции со сторонними ресурсами (например, облачные хранилища), необходимо учитывать их доступность для регионов. К примеру, в Китае запрещено использование сервисов Google, DropBox, YouTube, Facebook. И если мы делаем китайскую локализацию, то обязательно стоит помнить, что интеграция с этими ресурсами недопустима.
Подытоживая все вышеизложенное, хочется еще раз отметить, что разделение по задачам и по типам дефектов будет базироваться как раз на понимании того, что I18n – это общемировое использование, а L10n – это региональное. На основе тех задач, которые ставятся перед каждым из процессов, формируются и типы дефектов, которые мы наиболее часто встречаем в приложениях. О них мы расскажем в следующий раз.
Получите бесплатную консультацию по тестированию вашего ПО, просто заполнив форму.
Поделиться статьей:
Rusrails: API интернационализации Rails (I18n)
В Ruby гем I18n (краткое наименование для internationalization), поставляемый с Ruby on Rails (начиная с Rails 2.2), представляет простой и расширяемый фреймворк для перевода вашего приложения на отдельный другой язык, иной чем английский, или для предоставления поддержки многоязычности в вашем приложении.
Процесс «интернационализация» обычно означает извлечение всех строк и других специфичных для локали частей (таких как форматы даты и валюты) за рамки вашего приложения. Процесс «локализация» означает предоставление переводов и локализованных форматов для этих частей.
Таким образом, в процессе интернационализации своего приложения на Rails вы должны:
- Убедиться, что есть поддержка i18n.
- Сказать Rails где найти словари локали.
- Сказать Rails как устанавливать, сохранять и переключать локали.
В процессе локализации своего приложения вы, скорее всего, захотите сделать три вещи:
- Заменить или дополнить локаль Rails по умолчанию — т.е. форматы даты и времени, названия месяцев, имена модели Active Record и т.д.
- Извлечь строки в вашем приложении в словари ключей — т.е. сообщения flash, статичные тексты в ваших вью и т.д.
- Где-нибудь хранить получившиеся словари.
Это руководство проведет вас через I18n API, оно содержит консультации как интернационализировать приложения на Rails с самого начала.
После прочтения этого руководства вы узнаете:
- Как I18n работает в Ruby on Rails
- Как правильно использовать I18n в RESTful приложении различными способами
- Как использовать I18n для перевода ошибок Active Record или тем писем Action Mailer
- О некоторых инструментах для расширения процесса перевода вашего приложения
Фреймворк Ruby I18n предоставляет все необходимые средства для интернационализации/локализации приложения на Rails. Можно также использовать другие различные гемы, добавляющие дополнительные функциональность или особенности. Для получения более подробной информации смотрите гем rails-i18n.
Интернационализация — это сложная проблема. Естественные языки отличаются во многих отношениях (например, в правилах образования множественного числа), поэтому трудно представить инструменты, решающие сразу все проблемы. По этой причине Rails I18n API сфокусировано на:
- предоставлении полной поддержки для английского и подобных ему языков
- легкой настраиваемости и полном расширении для других языков
Как часть этого решения, каждая статичная строка в фреймворке Rails — например, валидационные сообщения Active Record, форматы времени и даты — стали интернационализированными. Локализация приложения на Rails означает определение переведенных значений этих строк на желаемые языки.
Для локализации хранилища и обновления content в приложении (например, перевода сообщений в блоге), смотрите раздел Перевод контента модели.
Таким образом, Ruby гем I18n разделен на две части:
- Публичный API фреймворка i18n — модуль Ruby с публичными методами, определяющими как работает библиотека
- Бэкенд по умолчанию (который специально называется простым бэкендом), реализующий эти методы
Как у пользователя, у вас всегда будет доступ только к публичным методам модуля I18n, но полезно знать о возможностях бэкенда.
Возможно поменять встроенный простой бэкенд на более мощный, который будет хранить данные перевода в реляционной базе данных, словаре GetText или в чем-то похожем. Смотрите раздел Использование различных бэкендов.
Наиболее важными методами I18n API являются:
translate # Ищет перевод текстов localize # Локализует объекты даты и времени в форматы локали
Имеются псевдонимы #t и #l, их можно использовать следующим образом:
I18n.t 'store.title' I18n.l Time.now
Также имеются методы чтения и записи для следующих атрибутов:
load_path # Анонсировать ваши пользовательские файлы с переводом locale # Получить и установить текущую локаль default_locale # Получить и установить локаль по умолчанию available_locales # Разрешенные локали, доступные приложению enforce_available_locales # Принуждение к разрешенным локалям (true или false) exception_handler # Использовать иной exception_handler backend # Использовать иной бэкенд
Итак, давайте интернационализируем простое приложение на Rails с самого начала, в следующих главах!
Несколько шагов отделяют вас от получения и запуска поддержки I18n в вашем приложении.
Следуя философии соглашений над конфигурацией, Rails предоставляет приемлемые строки переводов по умолчанию. При необходимости иных строк переводов, они могут быть переопределены.
Rails автоматически добавляет все файлы .rb
и .yml
из директории config/locales
к пути загрузки переводов.
Локаль по умолчанию en.yml
в этой директории содержит образец строки перевода:
Это означает, что в локали :en
, ключ hello связан со строкой «Hello world». Каждая строка в Rails интернационализируется подобным образом, смотрите, к примеру, валидационные сообщения Active Model в файле activemodel/lib/active_model/locale/en.yml
или форматы времени и даты в файле activesupport/lib/active_support/locale/en.yml
. Для хранения переводов в бэкенде по умолчанию (простом) можете использовать YAML или стандартные хэши Ruby.
Библиотека I18n будет использовать английский как локаль по умолчанию, т. е., если другая локаль не установлена, при поиске переводов будет использоваться :en
.
В библиотеке i18n принят прагматичный подход к ключам локали (после некоторых обсуждений), включающий только часть локаль («язык»), наподобие :en
, :pl
, но не часть регион, подобно :en-US
или :en-GB
, как традиционно используется для разделения «языков» и «региональных настроек», или «диалектов». Многие международные приложения используют только элемент «язык» локали, такой как :cs
, :th
или :es
(для Чехии, Таиланда и Испании). Однако, также имеются региональные различия внутри языковой группы, которые могут быть важными. Например, в локали :en-US
как символ валюты будет $, а в :en-GB
будет £. Ничто не остановит вас от разделения региональных и других настроек следующим образом: предоставляете полную локаль «English — United Kingdom» в словаре :en-GB
.
Путь загрузки переводов (I18n.load_path
) — это массив путей к файлам, которые будут загружены автоматически. Настройка этого пути позволяет настроить структуру директорий переводов и схему именования файлов.
Бэкенд лениво загружает эти переводы, когда ищет перевод в первый раз. Этот бэкенд может быть переключен на что-то иное даже после того, как переводы были объявлены.
Можно изменить локаль по умолчанию, так же как и настроить пути загрузки переводов, в config/application.rb
следующим образом:
config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')] config.i18n.default_locale = :de
Путь загрузки должен быть указан до того, как будет произведен поиск любых переводов. Чтобы изменить локаль по умолчанию в инициализаторе вместо config/application.rb
:
# config/initializers/locale.rb # где библиотека I18n должна искать наши переводы I18n.load_path += Dir[Rails. root.join('lib', 'locale', '*.{rb,yml}')] # Разрешенные локали, доступные приложению I18n.available_locales = [:en, :pt] # устанавливаем локаль по умолчанию на что-либо другое, чем :en I18n.default_locale = :pt
Отметьте, что добавление напрямую в I18n.load_paths
, вместо конфигурации i18n приложения, не перезапишет переводы из внешних гемов.
Локализованному приложению, вероятно, понадобится поддерживать несколько локалей. Для этого локаль должна быть установлена в начале каждого запроса, чтобы все строки были переведены, используя нужную локаль.
Локаль по умолчанию используется для всех переводов за исключением случаев, когда установлены I18n.locale=
или I18n.with_locale
.
I18n.locale
может вытечь в последующие запросы, обслуживаемые тем же тредом/процессом, если она не устанавливается последовательно в каждом контроллере. Например, выполнение I18n.locale = :es
в одном из запросов POST будет влиять на все последующие запросы в контроллерах, не устанавливающих локаль, но только в этом конкретном треде/процессе. Поэтому вместо I18n.locale =
можно использовать I18n.with_locale
, не имеющий этой проблемы утечки.
Локаль может быть установлена в around_action
в ApplicationController
:
around_action :switch_locale def switch_locale(&action) locale = params[:locale] || I18n.default_locale I18n.with_locale(locale, &action) end
Этот пример показывает использование параметра запроса URL для установки локали (т.е. http://example.com/books?locale=pt
). Таким образом, http://localhost:3000?locale=pt
загрузит португальскую локализацию, в то время как http://localhost:3000?locale=de
загрузит немецкую локализацию.
Локаль может быть установлена, используя один из множества других способов.
Одним из вариантов, которым можно установить локаль, является доменное имя, на котором запущено ваше приложение. Например, мы хотим, чтобы www.example.com
загружал английскую локаль (по умолчанию), а www. example.es
загружал испанскую локаль. Таким образом, доменное имя верхнего уровня используется для установки локали. В этом есть несколько преимуществ:
- Локаль является явной частью URL.
- Люди интуитивно понимают, на каком языке будет отражено содержимое.
- Это очень просто реализовать в Rails.
- Поисковые движки любят, когда содержимое на различных языках живет на отдельных, взаимосвязанных доменах.
Это осуществляется так в ApplicationController
:
around_action :switch_locale def switch_locale(&action) locale = extract_locale_from_tld || I18n.default_locale I18n.with_locale(locale, &action) end # Получаем локаль из домена верхнего уровня или возвращаем +nil+, если такая локаль недоступна # Вам следует поместить что-то наподобие этого: # 127.0.0.1 application.com # 127.0.0.1 application.it # 127.0.0.1 application.pl # в ваш файл /etc/hosts, чтобы попробовать это локально def extract_locale_from_tld parsed_locale = request. host.split('.').last I18n.available_locales.map(&:to_s).include?(parsed_locale) ? parsed_locale : nil end
Также можно назначить локаль из поддомена похожим образом:
# Получаем код локали из поддомена запроса (подобно http://it.application.local:3000) # Следует поместить что-то вроде: # 127.0.0.1 gr.application.local # в ваш файл /etc/hosts, чтобы попробовать это локально def extract_locale_from_subdomain parsed_locale = request.subdomains.first I18n.available_locales.map(&:to_s).include?(parsed_locale) ? parsed_locale : nil end
Если ваше приложение включает меню переключения локали, вам следует иметь что-то вроде этого в нем:
link_to("Deutsch", "#{APP_CONFIG[:deutsch_website_url]}#{request.env['PATH_INFO']}")
предполагая, что вы установили APP_CONFIG[:deutsch_website_url]
в некоторое значение, наподобие http://www.application.de
.
У этого решения есть вышеупомянутые преимущества, однако возможно, что вам нельзя или вы не хотите предоставлять разные локализации («языковые версии») на разных доменах. Наиболее очевидным решением является включить код локали в параметры URL (или пути запроса).
Наиболее обычным способом назначения (и передачи) локали будет включение ее в параметры URL, как мы делали в I18n.with_locale(params[:locale], &action)
в around_action в первом примере. В этом случае нам нужны URL, такие как www.example.com/books?locale=ja
или www.example.com/ja/books
.
В этом подходе есть почти тот же набор преимуществ, как и в назначении локали из имени домена, а именно то, что это RESTful и соответствует остальной части Всемирной паутины. Хотя внедрение этого потребует немного больше работы.
Получение локали из params
и соответствующее назначение ее не сложно: включаете ее в каждый URL, и таким образом передаете ее через запросы. Конечно, включение явной опции в каждый URL (т.е. link_to(books_url(locale: I18n.locale))
) было бы утомительно и, вероятно, невозможно.
Rails содержит инфраструктуру для «централизации динамических решений об URL» в его ApplicationController#default_url_options
, что полезно в этом сценарии: он позволяет нам назначить «defaults» для url_for
и методов хелпера, основанных на нем (с помощью применения/переопределения метода default_url_options
).
Затем мы можем включить что-то наподобие этого в наш ApplicationController
:
# app/controllers/application_controller.rb def default_url_options { locale: I18n.locale } end
Каждый метод хелпера, зависимый от url_for
(т.е. хелперы для именованных маршрутов, такие как root_path
или root_url
, ресурсные маршруты, такие как books_path
или books_url
и т.д.) теперь будут автоматически включать локаль в строку запроса, как тут: http://localhost:3001/?locale=ja
.
Это может быть достаточным. Хотя и влияет на читаемость URL, когда локаль «висит» в конце каждого URL вашего приложения. Более того, с точки зрения архитектуры, локаль иерархически выше остальных частей домена приложения, и URL должен отражать это.
Вы, возможно, захотите, чтобы URL выглядел так: http://www.example.com/en/books
(который загружает английскую локаль) и http://www. example.com/nl/books
(который загружает голландскую локаль). Это достижимо с помощью такой же стратегии, как и с default_url_options
выше: нужно настроить свои маршруты с помощью scope
:
# config/routes.rb scope "/:locale" do resources :books end
Теперь, когда вы вызовете метод books_path
, то получите "/en/books"
(для локали по умолчанию). URL подобный http://localhost:3001/nl/books
загрузит голландскую локаль, и затем, последующий вызов books_path
возвратит "/nl/books"
(поскольку локаль изменилась).
Поскольку возвращаемое значение default_url_options
кэшируется для каждого запроса, URL адреса в переключателе локали не могут быть сгенерированы при вызове хелперов в цикле, которые устанавливают соответствующие I18n.locale
в каждой итерации.
Вместо этого, не трогайте I18n.locale
и передайте явно опцию :locale
в хелпер или измените request. original_fullpath
.
Если не хотите принудительно использовать локаль в своих маршрутах, можете использовать опциональную область пути (заключенную в скобки), как здесь:
# config/routes.rb scope "(:locale)", locale: /en|nl/ do resources :books end
С таким подходом вы не получите Routing Error
при доступе к своим ресурсам как http://localhost:3001/books
без локали. Это полезно, когда хочется использовать локаль по умолчанию, если она не определена.
Конечно, нужно специально позаботиться о корневом URL (это обычно «домашняя страница» или «лицевая панель») вашего приложения. URL, такой как http://localhost:3001/nl
не заработает автоматически, так как объявление root to: "books#index"
в вашем routes.rb
не принимает локаль во внимание. (И правильно делает: может быть только один «корневой» URL.)
Вам, вероятно, потребуется связать URL так:
# config/routes.rb get '/:locale' => 'dashboard#index'
Особенно побеспокойтесь относительно порядка ваших маршрутов, чтобы одно объявление маршрутов не «съело» другое. (Вы, возможно, захотите добавить его непосредственно перед объявлением root :to
.)
В приложении с аутентифицированными пользователями можно позволять пользователям устанавливать предпочитаемую локаль через интерфейс приложения. В таком случае, выбранная пользователем установка локали является персистентной в базе данных и используется для установки локали в запросах этого пользователя.
around_action :switch_locale def switch_locale(&action) locale = current_user.try(:locale) || I18n.default_locale I18n.with_locale(locale, &action) end
Когда локаль не была установлена явно для запроса (например, с помощью одного из представленных выше методов), приложение должно попытаться определить требуемую локаль.
HTTP-заголовок Accept-Language
указывает предпочтительный язык для отклика запроса. Браузеры устанавливают это значение заголовка на основании языковых настроек пользователя, что делает его хорошим выбором при определении локали. [a-z]{2}/).first
end
На практике, чтобы сделать это нужен более надежный код. Библиотека Iain Hecker’s http_accept_language или промежуточное приложение Rack от Ryan Tomayko’s locale предоставляют решения этой проблемы.
IP-адрес клиента, выполняющего запрос, может использоваться для определения региона и его локали. Сервисы, такие как GeoIP Lite Country, или гемы, такие как geocoder могут быть использованы для реализации этого подхода.
В целом, этот подход является менее надежным, чем при использовании языка заголовка и не рекомендуется для большинства веб-приложений.
Вы можете поддаться искушению хранить выбранную локаль в сессии или куки. Однако, не делайте этого. Локаль должна быть понятной и быть частью URL. В таком случае, вы не сломаете базовые представления людей о вебе: если вы отправляете URL друзьям, то они должны увидеть ту же самую страницу и то же содержимое. Причудливое слово для этого будет то, что вы будете спокойны — RESTful. Читайте более подробно о RESTful подходе в статье Stefan Tilkov. Иногда бывают исключения из этого правила, они описаны ниже.
Хорошо! Вы уже инициализировали поддержку I18n в своем приложении на Ruby on Rails, и сообщили ему, какую локаль использовать, и как ее сохранять между запросами.
Дальше нам нужно интернационализировать наше приложение, абстрагируя каждую специфичную к локали часть. Напоследок, нам нужно локализовать приложение, предоставляя необходимые переводы для этих абстракций.
У нас есть следующий пример:
# config/routes.rb Rails.application.routes.draw do root to: "home#index" end
# app/controllers/application_controller.rb class ApplicationController < ActionController::Base around_action :switch_locale def switch_locale(&action) locale = params[:locale] || I18n.default_locale I18n.with_locale(locale, &action) end end
# app/controllers/home_controller.rb class HomeController < ApplicationController def index flash[:notice] = "Hello Flash" end end
# app/views/home/index. html.erb <h2>Hello World</h2> <p><%= flash[:notice] %></p>
У нас есть две строки в нашем коде, которые на английском и которые будут рендериться пользователям в нашем отклике («Hello Flash» и «Hello World»). Чтобы интернационализировать этот код, эти строки нужно заменить вызовами хелпера Rails #t
с соответствующими ключами для каждой строки:
# app/controllers/home_controller.rb class HomeController < ApplicationController def index flash[:notice] = t(:hello_flash) end end
# app/views/home/index.html.erb <h2><%= t :hello_world %></h2> <p><%= flash[:notice] %></p>
Теперь при рендеринге вью будет показано сообщение об ошибке, сообщающее, что отсутствуют переводы для ключей :hello_world
и :hello_flash
.
Rails добавляет метод хелпера t
(translate
) во вью, так что вам не нужно набирать I18n. t
каждый раз. Дополнительно этот хелпер ловит отсутствующие переводы и оборачивает результирующее сообщение об ошибке в <span>
.
Добавим отсутствующие переводы в файлы словарей:
# config/locales/en.yml en: hello_world: Hello world! hello_flash: Hello flash! # config/locales/pirate.yml pirate: hello_world: Ahoy World hello_flash: Ahoy Flash
Так как default_locale
не изменялась, переводы будут использовать :en
локаль, и в отклике будут рендериться английские строки.
Если локаль будет установлена через URL на пиратскую локаль (http://localhost:3000?locale=pirate
), то в отклике будут рендериться пиратские строки:
Нужно перезагрузить сервер после того, как вы добавили новые файлы локали.
Для хранения переводов в SimpleStore можно использовать файлы YAML (.yml
) или чистого Ruby (.rb
). YAML является наиболее предпочитаемым вариантом среди разработчиков Rails. Однако у него есть один большой недостаток. YAML очень чувствителен к пробелам и спецсимволам, поэтому приложение может неправильно загрузить ваш словарь. Файлы Ruby уронят ваше приложение при первом же обращении, поэтому вам будет просто найти, что в них неправильно. (Если возникают «странности» со словарями YAML, попробуйте поместить соответствующие части словаря в файл Ruby.)
Если переводы хранятся в файлах YAML, определенные ключи должны быть экранированы. Вот они:
- true, on, yes
- false, off, no
Примеры:
# config/locales/en.yml en: success: 'true': 'True!' 'on': 'On!' 'false': 'False!' failure: true: 'True!' off: 'Off!' false: 'False!'
I18n.t 'success.true' # => 'True!' I18n.t 'success.on' # => 'On!' I18n.t 'success.false' # => 'False!' I18n.t 'failure.false' # => Translation Missing I18n.t 'failure.off' # => Translation Missing I18n.t 'failure.true' # => Translation Missing
Один из ключевых факторов успешной интернационализации приложения — избегать неправильные предположения о грамматических правилах при абстракции локализованного кода. Грамматические правила, кажущиеся принципиальными в одной локали, могут быть неверными в другой.
Неправильная абстракция показана в следующем примере, где делается предположение о порядке в разных частях перевода. Обратите внимание, что Rails предоставляет хелпер number_to_currency
для обработки следующего случая.
# app/views/products/show.html.erb <%= "#{t('currency')}#{@product.price}" %>
# config/locales/en.yml en: currency: "$" # config/locales/es.yml es: currency: "€"
Если цена продукта 10, тогда соответствующий перевод для испанского — «10 €», вместо «€10», но абстракция не может дать этого.
Для создания правильной абстракции, в геме i18n есть возможность, называемая интерполяцией переменных, которая позволяет вам использовать переменные в переводе определений и передавать значения этих переменных в метод перевода.
Правильная абстракция показана в следующем примере:
# app/views/products/show. html.erb <%= t('product_price', price: @product.price) %>
# config/locales/en.yml en: product_price: "$%{price}" # config/locales/es.yml es: product_price: "%{price} €"
Все грамматические и пунктуационные решения принимаются в самом определении, таким образом абстракция может дать верный перевод.
Опции default
и scope
зарезервированы и не могут быть использованы как переменные. Если перевод использует :default
или :scope
как интерполяционную переменную, будет вызвано исключение I18n::ReservedInterpolationKey
.
Если перевод ожидает интерполяционную переменную, но она не была передана в #translate
, вызовется исключение I18n::MissingInterpolationArgument
.
Хорошо! Теперь давайте добавим временную метку во вью, чтобы продемонстрировать особенности локализации даты/времени. Чтобы локализовать формат даты, нужно передать объект Time в I18n. l
, или (лучше) использовать хелпер Rails #l
. Формат можно выбрать передав опцию :format
— по умолчанию используется формат :default
.
# app/views/home/index.html.erb <h2><%= t :hello_world %></h2> <p><%= flash[:notice] %></p> <p><%= l Time.now, format: :short %></p>
И в нашем файле переводов на пиратский давайте добавим формат времени (в Rails уже есть формат по умолчанию для английского):
# config/locales/pirate.yml pirate: time: formats: short: "arrrround %H'ish"
Что даст вам:
Сейчас вам, возможно, захочется добавить больше форматов для того, чтобы бэкенд I18n работал как нужно (как минимум для локали «pirate»). Конечно, есть большая вероятность, что кто-то еще выполнил всю работу по переводу значений по умолчанию Rails для вашей локали. Смотрите в репозитории rails-i18n на Github архив с различными файлами локали. Когда вы поместите такой файл(ы) в директорию config/locales/
, они автоматически станут готовыми для использования.
Rails позволяет определить правила словообразования (такие как единственное и множественное число) для локалей, отличных от английской. В config/initializers/inflections.rb
можно определить эти правила для нескольких локалей. Инициализатор содержит пример по умолчанию для определения дополнительных правил для английского, следуйте этому формату для других локалей.
Скажем, у вас в приложении есть BooksController. Экшн index рендерит содержимое в шаблоне app/views/books/index.html.erb
. Когда вы помещаете локализованный вариант этого шаблона: index.es.html.erb
в ту же директорию, Rails будет рендерить содержимое в этот шаблон, когда локаль будет установлена как :es
. Когда будет установлена локаль по умолчанию, будет использована обычная вью index.html. erb
. (Будущие версии Rails, возможно, перенесут эту возможность автоматической локализации ассетов в public
, и т.д.)
Можете использовать эту особенность, например, при работе с большим количеством статичного содержимого, который было бы неудобно вложить в словари YAML или Ruby. Хотя имейте в виду, что любое изменение, которое вы в дальнейшем сделаете в шаблоне, должно быть распространено на все локали.
При использовании дефолтного SimpleStore вместе с библиотекой i18n, словари хранятся в текстовых файлах на диске. Помещение переводов ко всем частям приложения в один файл на локаль будет трудным для управления. Можно хранить эти файлы в иерархии, которая будет для вас понятной.
К примеру, ваша директория config/locales
может выглядеть так:
|-defaults |---es.rb |---en.rb |-models |---book |-----es.rb |-----en.rb |-views |---defaults |-----es.rb |-----en.rb |---books |-----es.rb |-----en.rb |---users |-----es.rb |-----en. rb |---navigation |-----es.rb |-----en.rb
Таким образом можно разделить модель и имена атрибутов модели от текста внутри вью, и все это от «defaults» (т.е. форматов даты и времени). Другие хранилища для библиотеки i18n могут предоставить другие средства подобного разделения.
Механизм загрузки локали по умолчанию в Rails не загружает файлы локали во вложенных словарях, как тут. Поэтому, чтобы это заработало, нужно явно указать Rails смотреть глубже:
# config/application.rb config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
Теперь у вас есть хорошее понимание об использовании библиотеки i18n и знание, как интернационализировать простое приложения на Rails. В следующих частях мы раскроем особенности более детально.
Эти главы покажут примеры использования как метода I18n.translate
, так и метода хелпера вью translate
(отметив дополнительные функции, предоставленными методом хелпера вью).
Раскроем особенности такие, как:
- поиск переводов
- интерполяция данных в переводы
- множественное число у переводов
- использование HTML-безопасных переводов (только метод хелпера вью)
- локализация дат, номеров, валют и т.п.
Переводы ищутся по ключам, которые могут быть как символами, так и строками, поэтому следующие вызовы эквивалентны:
I18n.t :message I18n.t 'message'
Метод translate
также принимает опцию :scope
, которая содержит один или более дополнительных ключей, которые будут использованы для определения «пространства» или области имен для ключа перевода:
I18n.t :record_invalid, scope: [:activerecord, :errors, :messages]
Тут будет искаться сообщение :record_invalid
в сообщениях об ошибке Active Record.
Кроме того, и ключ, и область имен могут быть определены как ключи с точкой в качестве разделителя, как в:
I18n.translate "activerecord. errors.messages.record_invalid"
Таким образом, следующие вызовы эквивалентны:
I18n.t 'activerecord.errors.messages.record_invalid' I18n.t 'errors.messages.record_invalid', scope: :activerecord I18n.t :record_invalid, scope: 'activerecord.errors.messages' I18n.t :record_invalid, scope: [:activerecord, :errors, :messages]
Когда задана опция :default
, будет возвращено ее значение в случае, если отсутствует перевод:
I18n.t :missing, default: 'Not here' # => 'Not here'
Если значение :default
является символом, оно будет использовано как ключ и будет переведено. Может быть представлено несколько значений по умолчанию. Будет возвращено первое, которое даст результат.
Т.е., следующее попытается перевести ключ :missing
, затем ключ :also_missing
. Если они оба не дадут результат, будет возвращена строка «Not here»:
I18n.t :missing, default: [:also_missing, 'Not here'] # => 'Not here'
Чтобы найти несколько переводов за раз, может быть передан массив ключей:
I18n. t [:odd, :even], scope: 'errors.messages' # => ["must be odd", "must be even"]
Также ключ может перевести хэш (потенциально вложенный) сгруппированных переводов. Т.е. следующее получит все сообщения об ошибке Active Record как хэш:
I18n.t 'activerecord.errors.messages' # => {:inclusion=>"is not included in the list", :exclusion=> ... }
Если хотите выполнить интерполяцию на вложенном хэше переводов, необходимо передать параметром deep_interpolation: true
. Когда у вас есть следующий словарь:
en: welcome: title: "Welcome!" content: "Welcome to the %{app_name}"
тогда вложенные интерполяции будут проигнорированы без этой настройки:
I18n.t 'welcome', app_name: 'book store' # => {:title=>"Welcome!", :content=>"Welcome to the %{app_name}"} I18n.t 'welcome', deep_interpolation: true, app_name: 'book store' # => {:title=>"Welcome!", :content=>"Welcome to the book store"}
Rails реализует удобный способ поиска локали внутри вью. Когда имеется следующий словарь:
es: books: index: title: "Título"
можно найти значение books.index.title
в шаблоне app/views/books/index.html.erb
таким образом (обратите внимание на точку):
Автоматический скоупинг перевода доступен только из метода хелпера вью translate
.
«Ленивый» поиск также может быть использован в контроллерах:
en: books: create: success: Book created!
Это может быть полезным для установки флеш сообщений:
class BooksController < ApplicationController def create # ... redirect_to books_url, notice: t('.success') end end
Во многих языках — включая английский — есть только две формы, единственного числа и множественного числа, для заданной строки, т.е. «1 message» и «2 messages». В других языках: (русском, арабском, японском и многих других) имеются различные правила грамматики, имеющие дополнительные или отсутствующие формы множественного числа. Таким образом, API I18n предоставляет гибкую возможность для форм множественного числа.
У переменной интерполяции :count
есть специальная роль в том, что она интерполируется для перевода, и используется для подбора множественного числа для перевода в соответствии с правилами множественного числа, определенными в бэкенде множественного числа. По умолчанию применяются правила множественного числа только для английского языка.
I18n.backend.store_translations :en, inbox: { zero: 'no messages', # опционально one: 'one message', other: '%{count} messages' } I18n.translate :inbox, count: 2 # => '2 messages' I18n.translate :inbox, count: 1 # => 'one message' I18n.translate :inbox, count: 0 # => 'no messages'
Алгоритм для образования множественного числа в :en
прост:
lookup_key = :zero if count == 0 && entry.has_key?(:zero) lookup_key ||= count == 1 ? :one : :other entry[lookup_key]
Перевод помеченный как :one
, рассматривается как единственное число, все другое как множественное. Если количество нулевое, и существует запись :zero
, тогда будет использоваться она вместо :other
.
Если поиск по ключу не возвратит хэш, подходящий для образования множественного числа, вызовется исключение I18n::InvalidPluralizationData
.
Гем I18n предоставляет бэкенд множественного числа, который может использоваться для включения правил локализации. Добавьте это в простой бэкенд, затем добавьте алгоритмы для локализации множественного числа в хранилище переводов, как i18n.plural.rule
.
I18n::Backend::Simple.include(I18n::Backend::Pluralization) I18n.backend.store_translations :pt, i18n: { plural: { rule: lambda { |n| [0, 1].include?(n) ? :one : :other } } } I18n.backend.store_translations :pt, apples: { one: 'one or none', other: 'more than one' } I18n.t :apples, count: 0, locale: :pt # => 'one or none'
В качестве альтернативы, отдельный гем rails-i18n может быть использован для обеспечения более полного набора локализованных правил множественного числа.
Локаль может быть либо установленной псевдо-глобально в I18n.locale
(когда используется Thread.current
, например Time.zone
), либо быть переданной опцией в #translate
и #localize
.
Если локаль не была передана, используется I18n.locale
:
I18n.locale = :de I18n.t :foo I18n.l Time.now
Явно переданная локаль:
I18n.t :foo, locale: :de I18n.l Time.now, locale: :de
Умолчанием для I18n.locale
является I18n.default_locale
, для которой по умолчанию установлено :en
. Локаль по умолчанию может быть установлена так:
I18n.default_locale = :de
Ключи с суффиксом _html
и ключами с именем html
помечаются как HTML-безопасные. При их использовании во вью, HTML не будет экранирован.
# config/locales/en.yml en: welcome: <b>welcome!</b> hello_html: <b>hello!</b> title: html: <b>title!</b>
# app/views/home/index. html.erb <div><%= t('welcome') %></div> <div><%= raw t('welcome') %></div> <div><%= t('hello_html') %></div> <div><%= t('title.html') %></div>
Интерполяция экранируется по мере необходимости. Например, учитывая:
en: welcome_html: "<b>Welcome %{username}!</b>"
вы можете спокойно передать имя пользователя, установленное пользователем:
<%# This is safe, it is going to be escaped if needed. %> <%= t('welcome_html', username: @current_user.username) %>
С другой стороны, безопасные строки интерполируются дословно.
Автоматическое преобразование в HTML-безопасный текст перевода доступен только для метода хелпера вью translate
.
Можете использовать методы Model.model_name.human
и Model.human_attribute_name(attribute)
для прозрачного поиска переводов для ваших моделей и имен атрибутов.
Например, когда добавляем следующие переводы:
en: activerecord: models: user: Customer attributes: user: login: "Handle" # переводит атрибут "login" у User как "Handle"
Тогда User. model_name.human
возвратит «Customer», а User.human_attribute_name("login")
возвратит «Handle».
Для имен модели также можно установить множественное число, добавив следующее:
en: activerecord: models: user: one: Customer other: Customers
Тогда User.model_name.human(count: 2)
возвратит «Customers». С count: 1
или без параметров возвратит «Customer».
В случае необходимости получить доступ к вложенным атрибутам модели, следует показать эту вложенность в виде model/attribute
на уровне модели в файле переводов:
en: activerecord: attributes: user/role: admin: "Admin" contributor: "Contributor"
Тогда User.human_attribute_name("role.admin")
возвратит «Admin».
Если используется класс, включающий ActiveModel
, но не наследованный от ActiveRecord::Base
, замените activerecord
на activemodel
в вышеприведенных путях ключей.
Сообщение об ошибке валидации Active Record также может быть легко переведено. Active Record предоставляет ряд пространств имен, куда можно поместить ваши переводы для передачи различных сообщений и переводы для определенных моделей, атрибутов и/или валидаций. Также учитывается одиночное наследование таблицы (single table inheritance).
Это дает довольно мощное средство для гибкой настройки ваших сообщений в соответствии с потребностями приложения.
Рассмотрим модель User с валидацией validates_presence_of
для атрибута name, подобную следующей:
class User < ApplicationRecord validates :name, presence: true end
Ключом для сообщения об ошибке в этом случае будет :blank
. Active Record будет искать этот ключ в пространствах имен:
activerecord.errors.models.[model_name].attributes.[attribute_name] activerecord.errors.models.[model_name] activerecord.errors.messages errors.attributes.[attribute_name] errors.messages
Таким образом, в нашем примере он будет перебирать следующие ключи в указанном порядке и возвратит первый полученный результат:
activerecord. errors.models.user.attributes.name.blank activerecord.errors.models.user.blank activerecord.errors.messages.blank errors.attributes.name.blank errors.messages.blank
Когда ваши модели дополнительно используют наследование, тогда сообщения ищутся в цепочке наследования.
Например, у вас может быть модель Admin, унаследованная от User:
class Admin < User validates :name, presence: true end
Тогда Active Record будет искать сообщения в этом порядке:
activerecord.errors.models.admin.attributes.name.blank activerecord.errors.models.admin.blank activerecord.errors.models.user.attributes.name.blank activerecord.errors.models.user.blank activerecord.errors.messages.blank errors.attributes.name.blank errors.messages.blank
Таким образом можно предоставить специальные переводы для различных сообщений об ошибке в различных местах цепочки наследования моделей и в атрибутах, моделях и пространствах имен по умолчанию.
Переведенное имя модели, переведенное имя атрибута и значение всегда доступны для интерполяции как model
, attribute
и value
соответственно.
Так, к примеру, вместо сообщения об ошибке по умолчанию "cannot be blank"
можете использовать имя атрибута как тут: "Please fill in your %{attribute}"
.
- Где это возможно,
count
может быть использован для множественного числа, если оно существует:
валидация | с опцией | сообщение | интерполяция |
---|---|---|---|
confirmation | — | :confirmation | attribute |
acceptance | — | :accepted | — |
presence | — | :blank | — |
absence | — | :present | — |
length | :within, :in | :too_short | count |
length | :within, :in | :too_long | count |
length | :is | :wrong_length | count |
length | :minimum | :too_short | count |
length | :maximum | :too_long | count |
uniqueness | — | :taken | — |
format | — | :invalid | — |
inclusion | — | :inclusion | — |
exclusion | — | :exclusion | — |
associated | — | :invalid | — |
non-optional association | — | :required | — |
numericality | — | :not_a_number | — |
numericality | :greater_than | :greater_than | count |
numericality | :greater_than_or_equal_to | :greater_than_or_equal_to | count |
numericality | :equal_to | :equal_to | count |
numericality | :less_than | :less_than | count |
numericality | :less_than_or_equal_to | :less_than_or_equal_to | count |
numericality | :other_than | :other_than | count |
numericality | :only_integer | :not_an_integer | — |
numericality | :odd | :odd | — |
numericality | :even | :even | — |
Если не передать subject в метод mail
, Action Mailer попытается найти ее в ваших переводах. Выполняемый поиск будет использовать паттерн <mailer_scope>.<action_name>.subject
для создания ключа.
# user_mailer.rb class UserMailer < ActionMailer::Base def welcome(user) #... end end
en: user_mailer: welcome: subject: "Welcome to Rails Guides!"
Чтобы отослать параметры в интерполяцию, используйте в рассыльщике метод default_i18n_subject
.
# user_mailer.rb class UserMailer < ActionMailer::Base def welcome(user) mail(to: user.email, subject: default_i18n_subject(user: user.name)) end end
en: user_mailer: welcome: subject: "%{user}, welcome to Rails Guides!"
Rails использует фиксированные строки и другие локализации, такие как формат строки и другая информация о формате, в ряде хелперов. Вот краткий обзор.
distance_of_time_in_words
переводит и образует множественное число своего результата и интерполирует число секунд, минут, часов и т. д. Смотрите переводы datetime.distance_in_words.datetime_select
иselect_month
используют переведенные имена месяцев для заполнения результирующего тега select. Смотрите переводы в date.month_names.datetime_select
также ищет опцию order из date.order (если вы передали эту опцию явно). Все хелперы выбора даты переводят prompt, используя переводы в пространстве имен datetime.prompts, если применимы.- Хелперы
number_to_currency
,number_with_precision
,number_to_percentage
,number_with_delimiter
иnumber_to_human_size
используют настройки формата чисел в пространстве имен number.
human_name
иhuman_attribute_name
используют переводы для имен модели и имен атрибутов, если они доступны в пространстве имен activerecord.models. Они также предоставляют переводы для имен унаследованного класса (т.е. для использования вместе с STI), как уже объяснялось выше в «Области сообщения об ошибке».ActiveModel::Errors#generate_message
(который используется валидациями Active Model, но также может быть использован вручную) используетhuman_name
иhuman_attribute_name
(смотрите выше). Он также переводит сообщение об ошибке и поддерживает переводы для имен унаследованного класса, как уже объяснялось выше в «Пространства имен сообщений об ошибке».ActiveModel::Errors#full_messages
добавляет имя атрибута к сообщению об ошибке, используя разделитель, который берется из errors.format (и по умолчанию равен"%{attribute} %{message}"
).
Array#to_sentence
использует настройки формата, которые заданы в пространстве имен support.array.
Простой бэкенд, поставляющийся вместе с Active Support, позволяет хранить переводы как в формате чистого Ruby, так и в YAML.
Например, представляющий перевод хэш Ruby выглядит так:
{ pt: { foo: { bar: "baz" } } }
Эквивалентный файл YAML выглядит так:
Как видите, в обоих случаях ключ верхнего уровня является локалью. :foo
— это ключ пространства имен, а :bar
— это ключ для перевода «baz».
Вот «реальный» пример из YAML файла перевода Active Support en.yml
:
en: date: formats: default: "%Y-%m-%d" short: "%b %d" long: "%B %d, %Y"
Таким образом, все из нижеследующих эквивалентов возвратит краткий (:short
) формат даты "%b %d"
:
I18n.t 'date.formats.short' I18n.t 'formats.short', scope: :date I18n.t :short, scope: 'date.formats' I18n.t :short, scope: [:date, :formats]
Как правило, мы рекомендуем использовать YAML как формат хранения переводов. Хотя имеются случаи, когда хочется хранить лямбда-функции Ruby как часть данных локали, например, для специальных форматов дат.
По некоторым причинам простой бэкенд, поставляющийся с Active Support, осуществляет только «простейшие вещи, в которых возможна работа» Ruby on Rails (или, цитируя Википедию, Интернационализация это процесс разработки программного обеспечения таким образом, что оно может быть адаптировано к различным языкам и регионам без существенных инженерных изменений. Локализация это процесс адаптации программы для отдельного региона или языка с помощью добавления специфичных для локали компонентов и перевод текстов), что означает то, что гарантируется работа для английского и, как побочный эффект, для схожих с английским языков. Также простой бэкенд способен только читать переводы, а не динамически хранить их в каком-либо формате.
Впрочем, это не означает, что вы связаны этими ограничениями. Гем Ruby I18n позволяет с легкостью заменить простой бэкенд на что-то иное, более предпочтительное для ваших нужд, передавая экземпляр бэкенда в сеттер I18n.backend=
:
Например, можно заменить простой бэкенд на бэкенд Chain для связывания нескольких бэкендов вместе. Это полезно, когда используются стандартные переводы с помощью простого бэкенда, а хранятся собственные переводы приложения в базе данных или других бэкендах.
С помощью бэкенда Chain можно использовать бэкенд Active Record и вернуться к простому бэкенду (по умолчанию):
I18n. backend = I18n::Backend::Chain.new(I18n::Backend::ActiveRecord.new, I18n.backend)
API I18n определяет следующие исключения, вызываемые бэкендами, когда происходят соответствующие неожидаемые условия:
MissingTranslationData # не обнаружен перевод для запрашиваемого ключа InvalidLocale # локаль, установленная I18n.locale, невалидна (например, nil) InvalidPluralizationData # была передана опция count, но данные для перевода не могут быть возведены во множественное число MissingInterpolationArgument # перевод ожидает интерполяционный аргумент, который не был передан ReservedInterpolationKey # перевод содержит зарезервированное имя интерполяционной переменной (т.е. scope, default) UnknownFileType # бэкенд не знает, как обработать тип файла, добавленного в I18n.load_path
API I18n поймает все эти исключения, когда они были вызваны в бэкенде, и передаст их в метод default_exception_handler. Этот метод вызовет заново все исключения, кроме исключений MissingTranslationData
. Когда было вызвано исключение MissingTranslationData
, он возвратит строку сообщения об ошибке исключения, содержащую отсутствующие ключ/пространство имен.
Причиной для этого является то, что при разработке вам обычно хочется, чтобы вью рендерились несмотря на отсутствующие переводы.
Впрочем, в иных ситуациях, возможно, захочется изменить это поведение. Например, обработка исключений по умолчанию не позволяет просто ловить отсутствующие переводы во время автоматических тестов. Для этой цели может быть определен иной обработчик исключений. Определенный обработчик исключений должен быть методом в модуле I18n или классом с методом #call
:
module I18n class JustRaiseExceptionHandler < ExceptionHandler def call(exception, locale, key, options) if exception.is_a?(MissingTranslationData) raise exception.to_exception else super end end end end I18n.exception_handler = I18n::JustRaiseExceptionHandler.new
Это вызовет только исключение MissingTranslationData
, передав все другие значения в обработчик исключений по умолчанию.
Однако, если вы используете I18n::Backend::Pluralization
, этот обработчик также вызывает исключение I18n::MissingTranslationData: translation missing: en.i18n.plural.rule
, которое обычно должно быть проигнорировано для отката к правилу плюрализации по умолчанию в английской локали. Чтобы этого избежать, можно добавить дополнительную проверку ключа перевода:
if exception.is_a?(MissingTranslationData) && key.to_s != 'i18n.plural.rule' raise exception.to_exception else super end
Другим примером, когда поведение по умолчанию является менее желательным, является Rails TranslationHelper, который предоставляет метод #t
(то же самое, что #translate
). Когда в этом контексте происходит исключение MissingTranslationData
хелпер оборачивает сообщение в span с классом CSS translation_missing
.
Чтобы это осуществить, хелпер заставляет I18n#translate
вызвать исключения, независимо от того, какой обработчик исключений установлен, определяя опцию :raise
:
I18n.t :foo, raise: true # всегда перевызывает исключения из бэкенда
API I18n, описанный в этом руководстве, в первую очередь предназначен для перевода строк интерфейса. Если необходимо перевести контент модели (например, сообщений в блоге), может понадобится другое решение, помогающее в этом.
Несколько гемов, которые могут помочь:
- Globalize: Хранит переводы в отдельных таблицах перевода, по одному для каждой переведенной модели
- Mobility: Предоставляет поддержку для хранения переводов во многих форматах, включая таблицы перевода, столбцы json (PostgreSQL) и т.д.
- Traco: Переводимые столбцы для Rails 3 и 4, хранимые в самой таблице моделей
С этого момента у вас должно быть хорошее понимание, как работает поддержка I18n в Ruby on Rails, и вы должны быть готовы начать переводить свой проект.
Поддержка I18n в Ruby on Rails была представлена в релизе 2.2 и до сих пор развивается. Проект следует хорошим традициям разработки Ruby on Rails в виде первоначального развития в виде отдельных гемов и реальных приложений, и только затем извлечения наилучших широко используемых особенностей для включения в ядро.
Поэтому каждый поощряется экспериментировать с новыми идеями и особенностями в гемах или других библиотеках и делать их доступными сообществу. (Не забудьте анонсировать свою работу в рассылке!)
Если вы обнаружите, что ваша локаль (язык) отсутствует в данных примеров переводов репозитория Ruby on Rails, сделайте fork репозитория, добавьте ваши данные и пошлите pull request.
- Группа Google: rails-i18n — Рассылка проекта.
- GitHub: rails-i18n — Репозиторий кода и трекер проблем для проекта rails-i18n. Много важного можно найти в примере переводов для Rails, в большинстве случаев это будет работать и в вашем приложении.
- GitHub: i18n — Репозиторий кода и трекер проблем для гема i18n.
Локализация на основе компонентов | Vue I18n
В основном данные для локализации (например, locale
,messages
, и т.д.) задаются опциями конструктора экземпляра VueI18n
и устанавливаются через свойство i18n
в корневой экземпляр Vue.
Поэтому можно глобально выполнять переводы, используя методы $t
или $tc
в корневом экземпляре Vue и любом из компонентов в нём. Но также возможно указывать данные для локализации в каждом компоненте в отдельности, что может быть удобнее благодаря компонентно-ориентированному дизайну.
Пример локализации на основе компонентов:
Шаблон:
Результат:
Если компонент не имеет собственного сообщения для локализации, то в качестве запасного выхода он обратится к глобальным данным для локализации. Компонент использует локаль, установленную в корневом экземпляре (в примере выше установлена: locale: 'ru'
).
Обратите внимание, по умолчанию при обращении к данным корневой локализации будут генерироваться предупреждения в консоли:
Чтобы скрыть эти предупреждения (оставив те, что предупреждают о полном отсутствии перевода для данного ключа) установите опцию silentFallbackWarn: true
при инициализации экземпляра VueI18n
.
Если необходимо осуществлять перевод, основываясь на локали компонента, то это можно сделать с помощью опции sync: false
и locale
в настройках i18n
.
Общие сообщения локализации для компонентов
Иногда может потребоваться импортировать сообщения локализации в определённых компонентах, чтобы не обращаться к глобальным сообщениям локализации (например, общие сообщения для определённых функций компонентов).
Для этого можно использовать опцию sharedMessages
в свойстве i18n
компонента.
Пример использования общих сообщений локализации:
Компонент:
Если указаны опции sharedMessages
и messages
, то их сообщения будут объединены в сообщения локализации в экземпляре VueI18n этого компонента.
Локализация в функциональных компонентах
При использовании функционального компонента все данные (включая props
, children
, slots
, parent
, и т.д.) передаются через context
, в котором содержатся все эти атрибуты. Кроме того отсутствует возможность использовать this
, поэтому при использовании vue-i18n с функциональными компонентами следует обращаться к $t
как к parent.$t
, например так:
8. Интернационализация и переводы — документация developers-reference 11.0.18
Debian поддерживает постоянно увеличивающееся число языков. Даже если вашим родным языком является английский, и вы не говорите ни на одном другом языке, как сопровождающий вы должны знать о процессе интернационализации (сокращённо i18n, так как в слове internationalization между ‘i’ и ‘n’ 18 букв). Следовательно, даже если вам вполне подходят программы с интерфейсом на английском языке, вам следует прочесть большую часть этой главы.
According to Introduction to i18n from Tomohiro KUBOTA, I18N (internationalization) means modification of software or related technologies so that software can potentially handle multiple languages, customs, and other differences, while L10N (localization) means implementation of a specific language for already-internationalized software.
l10n и i18n взаимосвязаны, но трудности, касающиеся каждого из этих процессов, весьма различны. Вообще-то не сложно сделать так, чтобы программа изменяла язык, на котором отображается текст, на основе пользовательских настроек, но перевести все эти сообщения весьма затратно по времени. С другой стороны, установить кодировку символов весьма легко, но изменить код так, чтобы можно было использовать несколько кодировок, довольно трудно.
Если оставить проблемы i18n, по поводу которых нет общего руководства, в стороне, можно видеть, что для l10n в Debian нет какой-либо центральной инфраструктуре, которая бы была сравнима с механизмом buildd для переноса на другие архитектуры. Поэтому большая часть работы выполняется вручную.
8.1. Как переводы обрабатываются в Debian
Обработка переводов текстов, содержащихся в пакете, всё ещё является задачей, которую приходится решать вручную, сам же этот процесс зависит от того, к какому виду относится текст, который вы желаете перевести.
For program messages, the gettext infrastructure is used most of the time. Most of the time, the translation is handled upstream within projects like the Free Translation Project, the GNOME Translation Project or the KDE Localization project. The only centralized resources within Debian are the Central Debian translation statistics, where you can find some statistics about the translation files found in the actual packages, but no real infrastructure to ease the translation process.
Package descriptions have translations since many years and Maintainers don’t need to do anything special to support translated package descriptions; translators should use the Debian Description Translation Project (DDTP).
Для шаблонов debconf
, сопровождающим следует использовать пакет po-debconf
для облегчения работы переводчиков, которые могут использовать DDTP для выполнения своей работы (но французская и бразильская команды не используют DDTP). Некоторая статистика может быть найдена и на сайте DDTP (о том, что фактически переведено), и на сайте центральной статистики переводов Debian (о том, что интегрировано в пакеты).
Для веб-страницы у каждой команды l10n имеется доступ к релевантной системе управления версиями, статистика доступна на сайте центральной статистики переводов Debian.
Для общей документации относительно Debian процесс перевода более или менее совпадает с процессом перевода веб-страниц (переводчики имеют доступ к системе управления версиями), но страницы со статистикой отсутствуют.
Для документации по пакетам (страницы man, документы info, другие форматы), необходимо сделать почти всё.
8.2. ЧаВО по I18N и L10N для сопровождающих
Это список проблем i18n и l10n, с которыми могут столкнуться сопровождающие. Читая данный документ, помните, что в настоящее время никакого действительного согласия по этим вопросам в Debian нет, и что в документе содержатся только советы. Если у вас имеются более подходящие идеи для некоторой данной проблемы, либо если вы не согласны с чем-то, не стесняйтесь сообщить об этом, это поспособствует улучшению данного документа.
8.2.1. Как перевести некоторый данный текст
To translate package descriptions or debconf
templates, you have
nothing to do; the DDTP infrastructure will dispatch the material to
translate to volunteers with no need for interaction on your part.
Касательно всех остальных материалов (файлы gettext, страницы руководства man и другая документация) лучшим решением будет поместить ваш текст где-нибудь в сети Интернет и попросить в списке рассылки debian-i18n перевести его на различные языки. Некоторые члены команд переводчиков подписаны на этот список рассылки, они позаботятся о переводе и проверке. Когда они закончат с этим, в вашем почтовом ящике вы найдёте ваш переведённый документ.
8.2.2. Как проверить перевод
Время от времени кто-то переводит различные тексты из ваших пакетов, эти люди будут просить вас включить их перевод в пакет. Это может быть проблемой, если вы не владеете данным языком. Лучше всего выслать данный документ в соответствующий список рассылки l10n и попросить о проверке. Когда это будет сделано, вы будете более уверены в качестве перевода, тогда уже можете спокойно добавлять его в ваш пакет.
8.2.3. Как обновить перевод
Если у вас имеются переводы какого-то текста, то всякий раз, когда вы обновляете оригинал, вам следует попросить предыдущего переводчика обновить его перевод для включения новых изменений. Помните, что эта задача требует некоторого времени; по меньшей мере, нужна одна неделя, чтобы обновить и проверить весь перевод.
Если переводчик не отвечает, вы можете попросить о помощи в соответствующем списке рассылки l10n. Если ничего не получилось, не забудьте добавить предупреждение в переведённый документ о том, что данный перевод устарел, и что читателю по возможности следует обратиться к оригинальному документу.
Избегайте полного удаления перевода даже в случае, если он сильно устарел. Для тех, что не говорит на английском устаревшая документация зачастую лучше, чем её полное отсутствие.
8.2.4. Как работать с отчётом об ошибке, касающемся перевода
Лучшим решением может состоять в следующем: отметьте сообщение об ошибке как пересланное в основную ветку разработки, затем перешлите её предыдущему переводчику и соответствующей команде локализации (используя соответствующий список рассылки debian-l10n-XXX).
8.3. ЧаВО по I18N и L10N для переводчиков
Читая данный документ, помните, что в Debian отсутствует какая-либо общая процедура, определяющая работу над переводами, в любом случае вам следует взаимодействовать с вашей командой и сопровождающим пакета.
8.3.1. Как помочь с переводом
Выберите, что бы вы хотели перевести, убедитесь, что никто не работает над переводом этого документа (используя ваш список рассылки debian-l10n-XXX), переведите, получите отзывы от других носителей языка в вашем списке рассылки l10n, предоставьте перевод сопровождающему пакета (см. следующий пункт).
8.3.2. Как предоставить перевод для добавления его в пакет
Убедитесь, что перевод верен (попросив проверить его в вашем списке рассылки l10n) до отправки его для включения в пакет. Это сохранит всем время и позволит избежать хаоса, когда в сообщениях об ошибках имеются несколько версий одного и того же документа.
The best solution is to file a regular bug containing the translation
against the package. Make sure to use both the patch
and l10n
tags, and to not use a severity higher than ‘wishlist’, since the lack
of translation never prevented a program from running.
8.4. Лучшие текущие практики, касающиеся локализации
Как сопровождающему вам никогда не следует редактировать переводы (даже для изменения форматирования), не спросив об этом в соответствующем списке рассылки l10n. Вы рискуете, например, испортить кодировку файлов. Более того, то, что вы считаете ошибкой, может оказаться правильным (или даже необходимым) для данного языка.
Как переводчику, если вы находите ошибку в оригинальном тексте, вам следует сообщить об этом. Переводчики часто являются более внимательными читателями некоторого данного текста, и если они не сообщают о найденных ошибках, то о них не сообщит никто.
В любом случае помните, что главная проблема l10n состоит в том, что для локализации требуется взаимодействие нескольких людей, и что из-за непонимания очень и очень легко начать войну по поводу небольших проблем. Поэтому если у вас возникли проблемы с вашим собеседником, попросите о помощи в соответствующем списке рассылки l10n, в списке рассылки debian-i18n или даже в debian-devel (но остерегайтесь, обсуждения l10n в этом списке рассылки часто переходят в настоящие войны 🙂
В любом случае взаимодействие может быть достигнут только благодаря взаимному уважению.
Что такое I18N.exe? Это безопасно или вирус? Как удалить или исправить это
Что такое I18N.exe?
I18N.exe это исполняемый файл, который является частью Говори и смотри Программа, разработанная Nuance Communications Inc., Программное обеспечение обычно о по размеру.
Расширение .exe имени файла отображает исполняемый файл. В некоторых случаях исполняемые файлы могут повредить ваш компьютер. Пожалуйста, прочитайте следующее, чтобы решить для себя, является ли I18N.exe Файл на вашем компьютере — это вирус или троянский конь, который вы должны удалить, или это действительный файл операционной системы Windows или надежное приложение.
Рекомендуется: Выявление ошибок, связанных с I18N.exe.
(опциональное предложение для Reimage — Cайт | Лицензионное соглашение | Политика Конфиденциальности | Удалить)
I18N.exe безопасно, или это вирус или вредоносная программа?
Первое, что поможет вам определить, является ли тот или иной файл законным процессом Windows или вирусом, это местоположение самого исполняемого файла. Например, такой процесс, как I18N.exe, должен запускаться из, а не из другого места
Для подтверждения откройте диспетчер задач, выберите «Просмотр» -> «Выбрать столбцы» и выберите «Имя пути к изображению», чтобы добавить столбец местоположения в диспетчер задач. Если вы обнаружите здесь подозрительный каталог, возможно, стоит дополнительно изучить этот процесс.
Еще один инструмент, который иногда может помочь вам обнаружить плохие процессы, — это Microsoft Process Explorer. Запустите программу (не требует установки) и активируйте «Проверить легенды» в разделе «Параметры». Теперь перейдите в View -> Select Columns и добавьте «Verified Signer» в качестве одного из столбцов.
Если статус процесса «Проверенная подписывающая сторона» указан как «Невозможно проверить», вам следует взглянуть на процесс. Не все хорошие процессы Windows имеют метку проверенной подписи, но ни один из плохих.
Наиболее важные факты о I18N.exe:
- Находится в C: \ Program Files \ Nuance \ Говори и Смотри \ вложенная;
- Издатель: Nuance Communications Inc.
- Полный путь:
- Файл справки:
- URL издателя:
- Известно, что до по размеру на большинстве окон;
Если у вас возникли какие-либо трудности с этим исполняемым файлом, вам следует определить, заслуживает ли он доверия, прежде чем удалять I18N.exe. Для этого найдите этот процесс в диспетчере задач.
Найдите его местоположение (оно должно быть в C: \ Program Files \ Nuance \ Speak and See \) и сравните размер и т. Д. С приведенными выше фактами.
Если вы подозреваете, что можете быть заражены вирусом, вы должны немедленно попытаться это исправить. Чтобы удалить вирус I18N.exe, необходимо Загрузите и установите приложение полной безопасности, например Malwarebytes., Обратите внимание, что не все инструменты могут обнаружить все типы вредоносных программ, поэтому вам может потребоваться попробовать несколько вариантов, прежде чем вы добьетесь успеха.
Кроме того, функциональность вируса может сама влиять на удаление I18N.exe. В этом случае вы должны включить Безопасный режим с поддержкой сети — безопасная среда, которая отключает большинство процессов и загружает только самые необходимые службы и драйверы. Когда вы можете запустить программу безопасности и полный анализ системы.
Могу ли я удалить или удалить I18N.exe?
Не следует удалять безопасный исполняемый файл без уважительной причины, так как это может повлиять на производительность любых связанных программ, использующих этот файл. Не забывайте регулярно обновлять программное обеспечение и программы, чтобы избежать будущих проблем, вызванных поврежденными файлами. Что касается проблем с функциональностью программного обеспечения, проверяйте обновления драйверов и программного обеспечения чаще, чтобы избежать или вообще не возникало таких проблем.
Согласно различным источникам онлайн, 5% людей удаляют этот файл, поэтому он может быть безвредным, но рекомендуется проверить надежность этого исполняемого файла самостоятельно, чтобы определить, является ли он безопасным или вирусом. Лучшая диагностика для этих подозрительных файлов — полный системный анализ с Reimage, Если файл классифицирован как вредоносный, эти приложения также удалят I18N.exe и избавятся от связанных вредоносных программ.
Однако, если это не вирус, и вам нужно удалить I18N.exe, вы можете удалить программу Speak and See со своего компьютера с помощью программы удаления, которая должна находиться по адресу: MsiExec.exe / I {4AA64DA8-10A0-4945-9803 -FE5FCD3637E9}. Если вы не можете найти его деинсталлятор, вам может потребоваться удалить программу Speak and See, чтобы полностью удалить I18N.exe. Вы можете использовать функцию «Установка и удаление программ» на панели управления Windows.
- 1. в Меню Пуск (для Windows 8 щелкните правой кнопкой мыши в нижнем левом углу экрана), нажмите Панель управления, а затем под Программы:
o Windows Vista / 7 / 8.1 / 10: нажмите Удаление программы.
o Windows XP: нажмите Установка и удаление программ.
- 2. Когда вы найдете программу Говори и смотрищелкните по нему, а затем:
o Windows Vista / 7 / 8.1 / 10: нажмите Удалить.
o Windows XP: нажмите Удалить or Изменить / Удалить вкладка (справа от программы).
- 3. Следуйте инструкциям по удалению Говори и смотри.
Распространенные сообщения об ошибках в I18N.exe
Наиболее распространенные ошибки I18N.exe, которые могут возникнуть:
• «Ошибка приложения I18N.exe.»
• «Ошибка I18N.exe».
• «Возникла ошибка в приложении I18N.exe. Приложение будет закрыто. Приносим извинения за неудобства».
• «I18N.exe не является допустимым приложением Win32».
• «I18N.exe не запущен».
• «I18N.exe не найден».
• «Не удается найти I18N.exe».
• «Ошибка запуска программы: I18N.exe.»
• «Неверный путь к приложению: I18N.exe.»
Эти сообщения об ошибках .exe могут появляться во время установки программы, во время выполнения соответствующей программы, Speak and See, при запуске или завершении работы Windows, или даже во время установки операционной системы Windows. Отслеживание момента появления ошибки I18N.exe является важной информацией, когда дело доходит до устранения неполадок.
Как исправить I18N.exe
Аккуратный и опрятный компьютер — это один из лучших способов избежать проблем с Speak and See. Это означает выполнение сканирования на наличие вредоносных программ, очистку жесткого диска cleanmgr и ПФС / SCANNOWудаление ненужных программ, мониторинг любых автозапускаемых программ (с помощью msconfig) и включение автоматических обновлений Windows. Не забывайте всегда делать регулярные резервные копии или хотя бы определять точки восстановления.
Если у вас возникла более серьезная проблема, постарайтесь запомнить последнее, что вы сделали, или последнее, что вы установили перед проблемой. Использовать resmon Команда для определения процессов, вызывающих вашу проблему. Даже в случае серьезных проблем вместо переустановки Windows вы должны попытаться восстановить вашу установку или, в случае Windows 8, выполнив команду DISM.exe / Online / Очистка-изображение / Восстановить здоровье, Это позволяет восстановить операционную систему без потери данных.
Чтобы помочь вам проанализировать процесс I18N.exe на вашем компьютере, вам могут пригодиться следующие программы: Менеджер задач безопасности отображает все запущенные задачи Windows, включая встроенные скрытые процессы, такие как мониторинг клавиатуры и браузера или записи автозапуска. Единый рейтинг риска безопасности указывает на вероятность того, что это шпионское ПО, вредоносное ПО или потенциальный троянский конь. Это антивирус обнаруживает и удаляет со своего жесткого диска шпионское и рекламное ПО, трояны, кейлоггеры, вредоносное ПО и трекеры.
Обновлено февраль 2021:
Мы рекомендуем вам попробовать этот новый инструмент. Он исправляет множество компьютерных ошибок, а также защищает от таких вещей, как потеря файлов, вредоносное ПО, сбои оборудования и оптимизирует ваш компьютер для максимальной производительности. Это исправило наш компьютер быстрее, чем делать это вручную:
- Шаг 1: Скачать PC Repair & Optimizer Tool (Windows 10, 8, 7, XP, Vista — Microsoft Gold Certified).
- Шаг 2: Нажмите «Начать сканирование”, Чтобы найти проблемы реестра Windows, которые могут вызывать проблемы с ПК.
- Шаг 3: Нажмите «Починить все», Чтобы исправить все проблемы.
(опциональное предложение для Reimage — Cайт | Лицензионное соглашение | Политика Конфиденциальности | Удалить)
Загрузите или переустановите I18N.exe
это не рекомендуется загружать заменяемые exe-файлы с любых сайтов загрузки, так как они могут содержать вирусы и т. д. Если вам нужно скачать или переустановить I18N.exe, мы рекомендуем переустановить основное приложение, связанное с ним. Говори и смотри.
Информация об операционной системе
Ошибки I18N.exe могут появляться в любых из нижеперечисленных операционных систем Microsoft Windows:
- Окна 10
- Окна 8.1
- Окна 7
- Windows Vista
- Windows XP
- Windows ME
- Окна 2000
РЕКОМЕНДУЕМЫЕ: Нажмите здесь, чтобы устранить ошибки Windows и оптимизировать производительность системы
atom-i18n
Пользователи также искали:
tomsrtbt, atomsbt, kursk, murmansk, атомэнергосбыт, pu murmansk atomsbt ru, voprostko murmansk atomsbt ru, lkul kursk atomsbt ru, secretary kursk atomsbt ru, мобильное приложение атомэнергосбыт, смоленск, https, https lkfl atomsbt ru, lkfl, личный, кабинет, тверь, lkul, secretary, мобильное, приложение, voprostko, wwwatomsbtru, Tomsrtbt, atomsbt смоленск, atoh2, ATOH, atomkraft, Atomkraft, atoll,
…
Простое определение интернационализации — The Phrase Blog — Эксперты по локализации программного обеспечения
Акио Морита, соучредитель Sony (1921–1999), однажды сказал: «Мыслите глобально, действуйте локально». Местные культуры — это гораздо больше, чем просто язык. Подобно тому, как разные группы в Соединенных Штатах имеют свои собственные шутки, диалекты, идиомы и обычаи, в разных странах есть свои собственные представления о том, как что-то должно быть сделано и как это должно быть представлено. Вот почему программное обеспечение, веб-сайты и приложения необходимо разрабатывать с учетом интернационализации (i18n).Итак, что такое I18n?
Что такое интернационализация (I18n)?
Интернационализация, часто обозначаемая аббревиатурой i18n, — это процесс, с помощью которого продукты могут быть подготовлены для отправки в другие страны. Это не означает просто возможность менять язык. Вместо этого это означает возможность принимать разные формы данных, разные настройки в соответствии с местными обычаями и разными строками данных и правильно их обрабатывать.
W3C Group определяет интернационализацию как «проектирование и разработку продукта, приложения или контента документа, который обеспечивает легкую локализацию для целевых аудиторий, которые различаются по культуре, региону или языку.”По данным Группы, интернационализация (i18n) обычно включает:
- «Проектирование и разработка таким образом, чтобы устранить препятствия для локализации или международного развертывания. Это включает в себя такие вещи, как включение использования Unicode или обеспечение надлежащей обработки устаревших кодировок символов, где это необходимо, забота о конкатенации строк, избежание зависимости в коде строковых значений пользовательского интерфейса и т. Д. »
- «Обеспечение поддержки функций, которые нельзя использовать до локализации.Например, добавление разметки в DTD для поддержки двунаправленного текста или для определения языка. Или добавление поддержки CSS для вертикального текста или других нелатинских типографских функций ».
- «Код активации для поддержки местных, региональных, языковых или культурных предпочтений. Обычно это включает в себя включение предопределенных данных локализации и функций, полученных из существующих библиотек или пользовательских настроек. Примеры включают форматы даты и времени, локальные календари, числовые форматы и системы счисления, сортировку и представление списков, обработку личных имен и форм адреса и т. Д.”
- «Отделение локализуемых элементов от исходного кода или контента, чтобы при необходимости можно было загружать или выбирать локализованные альтернативы на основе международных предпочтений пользователя».
Что такое локализация (L10n)?
Локализация (l10n) — это просто процесс изменения программного обеспечения для соответствия другому языку. Во многих отношениях интернационализацию можно рассматривать как построение структуры части программного обеспечения, чтобы ее можно было адаптировать для разных рынков, а локализацию — это процесс фактического выполнения этого для конкретного рынка.Группа W3.org относится к локализации следующим образом:
«Локализация — это адаптация продукта, приложения или содержимого документа для удовлетворения языковых, культурных и других требований конкретного целевого рынка (региона). Иногда локализацию обозначают как l10n, где 10 — количество букв между l и n. Локализация, которую часто воспринимают только как синоним перевода пользовательского интерфейса и документации, зачастую представляет собой значительно более сложную проблему.”Это может повлечь за собой настройку, связанную с:
- Числовые форматы, форматы даты и времени
- Использование валюты
- Использование клавиатуры
- Сопоставление и сортировка
- Символы, значки и цвета
- Текст и графика, содержащие ссылки на объекты, действия или идеи, которые в данной культуре могут быть неправильно истолкованы или рассматриваться как нечувствительные.
- Различные законодательные требования и многое другое…
Локализация может даже потребовать всестороннего переосмысления логики, визуального дизайна или представления, если способ ведения бизнеса (например,, бухгалтерский учет) или принятая парадигма обучения (например, сосредоточение внимания на отдельном человеке или группе) в данном регионе существенно отличается от исходной культуры ».
Почему I18n важен?
В ряде азиатских стран сначала дается фамилия, а потом — имя. Ваше программное обеспечение должно уметь понимать разницу и предоставлять потребителю правильную информацию, чтобы этот человек правильно вводил данные. Все это выполняется менеджером i18n.
Точно так же не все используют почтовый индекс. В большинстве стран есть почтовые индексы, и даже в этом случае формат может существенно отличаться. В Канаде, например, почтовый индекс принимает форму X0X 0X0, где X — буква, а 0 — число. Однако в Соединенном Королевстве почтовый индекс может иметь вид X00 0XX, XX00 0XX, XX0, 0XX или X0 0XX. В Бразилии почтовые индексы имеют вид 00000-000. Соответствующая интернационализация создает программное обеспечение, способное обрабатывать несколько входных данных. Еще лучше, когда программное обеспечение может автоматически проверять эти входные данные, чтобы гарантировать, что правильный формат используется для правильной страны.
Все это важные аспекты разработки программного обеспечения, которые потребители могут понять и использовать надлежащим образом. Бизнес, который не может принимать заказы через свое программное обеспечение, потому что это программное обеспечение не может правильно отображать почтовые индексы, не продержится на международном рынке очень долго. Даже программное обеспечение, в котором смешиваются имена и фамилии, создает дистанцию между программным обеспечением и его пользовательской базой. Это означает, что код должен быть интернационализирован на протяжении всего процесса разработки, а не второстепенно.
В качестве краткого примера, Baidu — поисковая система номер один в Китае. Он достиг этой позиции, потому что он может эффективно находить отклик у людей в Китае, потому что он предназначен специально для них. Хотя это пример локализации, а не интернационализации, он может работать лучше, чем Google, из-за этого нацеливания и понимания местных культур, ограничений и, что, возможно, наиболее важно, государственных требований, таких как доступ к пользовательской информации и, как сообщается, цензура. .Однако, поскольку Baidu не особенно хорошо интернационализирован, ему не удалось выйти на какие-либо рынки за пределами Китая. Хотя это вряд ли станет проблемой для страны с более чем 1 миллиардом потенциальных пользователей, это ограничивает потенциальный рост в будущем.
Google, с другой стороны, вышел на большинство рынков благодаря своему интернационализированному программному обеспечению. Поскольку он легко адаптируется к широкому спектру регионов, он может предоставлять интересную информацию, которая отвечает требованиям пользователя, выполняющего поиск, независимо от того, находится ли этот человек в Южной Африке, США или России.Аналогичным образом, его операционная система Android, браузер Google Chrome и многие другие продукты эффективно интернационализированы, поэтому их можно легко преобразовать в соответствии с культурными и личными требованиями пользователя.
Как I18n влияет на разработчиков?
Если углубиться в код еще немного, становится ясно, что есть несколько хороших практик, которые помогают обеспечить надежную и заслуживающую доверия интернационализацию. Например, около трети всех загрузок WordPress приходятся на локализованные неанглийские версии.Другими словами, разработчики различных подключаемых модулей должны учитывать локализацию при их создании и обеспечивать полную интернационализацию их версий. Это означает, например, что они не должны использовать переменные PHP внутри строк функции перевода, потому что программное обеспечение для перевода обычно сканирует все строки и извлекает части, которые необходимо перевести, обозначенные __ (). Если у вас есть переменная PHP внутри него, он пытается вытащить эту переменную для перевода, потому что он ничего не знает, а случайное удаление переводчиком может сделать всю строку кода бесполезной, и это ошибка, которая может будет сложно отследить.
Кроме того, важно переводить фразы, а не отдельные слова. Простым примером может служить разница между расположением прилагательных французского и английского языков. По-английски вы бы сказали: «Он оранжевый человек». По-французски вы бы сказали: «Il est un homme d’orange» (буквально «он оранжевый человек»). Однако если вы переводите отдельные слова, английская структура не будет звучать правильно для носителя французского языка. В других языках существуют разные правила множественного числа для разных чисел, особенно в польском.Это серьезно усложняет перевод, потому что система должна иметь возможность возвращать разные слова для разных чисел. Даже в английском языке вы часто используете другое слово после одного объекта, чем для пары объектов (один картофель, два картофеля).
Хуже того, некоторые слова просто невозможно перевести, поэтому переводчик должен создать приближение, которое точно передает смысл. Устранение неоднозначности также важно, особенно для омонимов. Омоним — это слово, имеющее несколько значений, а это, к сожалению, большинство английских слов.Контекст говорит нам о многом, но когда вам нужно перевести несколько строк, может быть неочевидно, что это за контекст.
Возьмите слово «комментарий». Это комментарий на сайте, или вас просят оставить комментарий? Различия в других языках могут иметь значение для успеха вашего программного обеспечения. При использовании PHP используйте _x () для создания комментария, определяющего значение этого слова. Другие языки, такие как Java, относительно легко интернационализировать, но даже тогда интернационализация Java — сложная тема для тех, кто не привык к этому процессу.
Вот почему лучше всего начать процесс с самого начала и использовать инструменты, разработанные специально для интернационализации. Все это также упрощает переводчикам понимание и изменение вашего текста, не влияя на работу веб-сайта, программного обеспечения или приложения.
Интернационализация (i18n) пошла не так
Плохая интернационализация (i18n) обычно означает плохую локализацию. Классический пример — когда на сайте электронной коммерции локализованы только цены, а описания продуктов, веса и меры остаются на исходном языке.Поскольку большое количество веб-сайтов находится в Соединенных Штатах, это часто означает, что европейским, азиатским и африканским клиентам предоставляются только количества и описания продуктов на чужом языке.
Для многих фунты, футы, дюймы и унции нелегко преобразовать, поэтому это отвлекает клиентов от посещения веб-сайта, поскольку они не понимают, что им предлагают. Для розничных продавцов одежды одно и то же число может означать совершенно разные размеры в разных странах. Размер 10 в Соединенном Королевстве будет иметь размер 38 в Европе.Однако размер 38 в США был бы совершенно другим — европейский размер 38 на самом деле является размером 6.
Хорошее кодирование позволит автоматически преобразовывать данные так, чтобы они отображались на целевом языке и в культурном контексте — по крайней мере, для основных рынков веб-сайта — и хорошее кодирование должно начинаться в начале процесса разработки.
Кроме того, в разных частях света используются разные формы даты. В Соединенных Штатах 2 января будет написано 1/2. В Великобритании это будет 1 февраля.Это может иметь большое значение для сроков доставки и может быть важным фактором в отношении того, хочет ли ваш клиент покупать у вас.
Частичные переводы также часто являются результатом плохой интернационализации. В некоторых случаях меню могут быть непереведенными или, возможно, основная контактная информация может быть только на английском языке. Точно так же веб-сайт может вообще переводить определенные части, что особенно часто бывает, когда вместо текста используются непереводимые файлы JPEG или PNG. Это довольно часто бывает с рекламой.
Для разных культур также требуются разные макеты. Обычно минималистский макет подходит для многих стран, но в некоторых странах, например в Японии, более распространен более плотный макет. Хорошая интернационализация означает, что вы можете представлять разные продукты, макеты и даже цвета для разной аудитории, тогда как плохая интернационализация означает, что вы должны использовать один и тот же макет для всех. Плохой перевод часто является примером плохой локализации, а не интернационализации, но все же важно знать, что эти два предмета тесно взаимосвязаны.
Что означает хорошая интернационализация (I18n)
В конечном итоге, хорошая интернационализация гарантирует, что ваше программное обеспечение, приложение или веб-сайт будут работать в разных культурах и на целевых рынках. Это означает, что каждый фрагмент текста должен быть переводимым и что не должно быть никакого кода, который полагается на ввод текста на определенном языке или алфавите. Он должен иметь возможность отображать цены в подходящем формате, даты в понятном для читателя виде и переменные, чтобы они имели смысл.
Самое главное, хорошая интернационализация, которая достигается с помощью правильного программного обеспечения, означает, что вы можете передать свою программу своим переводчикам, зная, что они могут просто перевести и вернуть ее вам без каких-либо изменений кода. Это значительно упрощает разработку, упрощает устранение ошибок и упрощает обновление — если вам нужно обновить только код, а не перевод, это сэкономит значительную сумму денег в долгосрочной перспективе.
Что такое i18n, что такое l10n
Термины i18n и l10n часто путают и неправильно используют.Они связаны, но не имеют одинакового значения; они относятся к разным уровням реализации и опыта, поэтому правильное понимание важно, чтобы увидеть, в чем именно заключается проблема или потребность в разработке.
Что означают эти сокращения
Что же на самом деле означают эти странные сокращения? Фактически, это аббревиатуры, состоящие из первой и последней буквы слова, а между ними — количество букв.
- i18n = I nternationalizatio n : i , затем 18 букв, затем n
- l10n = L ocalizatio n : l , затем 10 букв, затем n
Разве это не то же самое?
Итак, вы можете спросить, разве интернационализация и локализация не одно и то же? Вообще-то, нет.
Тут много путаницы; отчасти потому, что концепции относительно новые; отчасти также по историческим причинам. Исторически сложилось так, что поддержка компьютеров помимо английского языка осуществлялась, по крайней мере, вначале, в виде нескольких специальных решений, которые соответствовали только одному языку. Итак, эта ОС была локализована, скажем, на французский язык, а другая версия — на испанский; и они вполне могут быть несовместимы, даже если оба языка могут иметь общий набор символов (и довольно простой).
Иначе говоря, исторически l10n делалось до того, как думать о i18n.
Но концептуально i18n должен быть первым; поскольку интернационализация — это процесс обеспечения того, чтобы часть программного обеспечения была действительно достаточно гибкой и готовой в первую очередь поддерживать несколько потенциальных локалей. В процессе i18n не задействован реальный язык; приложение вполне может никогда не быть переведено, но если оно правильно интернационализировано, то перевод будет довольно простым (и, что более важно, не требует никаких навыков работы с компьютером, только знание целевого языка).Таким образом, интернационализация делает программное обеспечение удобным для локали .
С другой стороны, локализация — это (в основном, см. Ниже) перевод на заданный, реальный язык. Локализация, как таковая, не требует выполнения интернационализации , однако, если приложение не было сначала интернационализировано, то это означает, что процесс локализации потребует довольно низкоуровневых модификаций в исходном коде приложения; то есть навыки развития. В старые времена (старые добрые времена, о которых большинство из вас не знает; вам повезло) локализация иногда выполнялась путем «простого» редактирования исходного кода и изменения текстовых строк в исходном коде.Это приводит к двум (или более) различным двоичным файлам ; то есть два (или более) разных продукта для поддержки, с разным управлением версиями, отслеживанием ошибок и т. д. Иногда даже несовместимы друг с другом. И, если вы хотели перенести приложение на другой язык, это приходилось делать заново (и решать, от какой версии отклоняться). Кроме того, никогда не было должного обобщающего обзора проблемы; если была запрошена локализация на новый язык с некоторыми конкретными потребностями, это могло сломать все, потому что это не было запланировано.
Итак, l10n без i18n плохо, очень плохо. Надеюсь, в наши дни, особенно в мире свободного программного обеспечения, это редкость. В нашем мире бесплатного программного обеспечения у нас есть очень хорошие рамки интернационализации, встроенные в ядро общих наборов инструментов (набор инструментов — это набор инструментов и кирпичиков, из которых разработчики создают приложения). Эти рамки достаточно универсальны, чтобы поддерживать и охватывать все используемые в настоящее время системы письма человека.
Две концепции i18n и l10n представляют собой два разных уровня.Они взаимосвязаны, но находятся на разных уровнях, то есть в них участвуют разные люди, с разными навыками. Это важно знать, поскольку сообщение о проблеме на неправильном уровне не поможет ее решить.
И18Н
Интернационализация — это процесс (или концепция процесса), при котором приложение становится «международным»; то есть сделать его способным поддерживать практически любой язык или местную среду на Земле.
Это всегда включает изменения в исходном коде , то есть включает разработчиков (которые также должны быть осведомлены о проблемах i18n).У i18n есть различные аспекты, некоторые из которых сложнее других:
- возможность отображения / печати текста
- поддержка любого сложного шрифта
- поддержка нормализации символов
- поддерживает подстановку и рендеринг глифов (нет эквивалентности между символом и глифом; вместо этого некоторые последовательности символов (могут быть последовательностью только одного в простом случае) создают некоторые последовательности глифов (может быть последовательностью одного в простом случае). чехол)
- поддержка переупорядочения глифов (отображение не всегда в том же порядке, что и логически произнесенные / записанные)
- поддержка двунаправленного рендеринга (слева направо и справа налево)
- возможность манипулировать текстом
- Поддержка манипуляций с текстовыми строками в программах Поддержка
- для выделения мышью, вырезания и вставки и т. Д. (Обратите внимание, что вы выбираете глифов на экране, но буфер выбирает текст (символы) => задействована сложная подстановка) Утилиты преобразования набора символов
- (потому что мы должны справиться с наследием до юникода)
- поиск текста (grep и т. Д.)
- сортировка текста по сложным правилам
- возможность ввода текста
- поддержка определения раскладок клавиатуры
- поддержка подключения к приложениям ввода для сложных случаев, когда сопоставления клавиатуры недостаточно)
- возможность манипулировать / отображать дату / время
- формат отображения / ввода
- определение первого дня недели
- определение часовых поясов
- определение негрегорианских календарей
- функций для преобразования между различными форматами / календарями
- возможность определять и обрабатывать локальные настройки
- различных единиц (км / миль ° C / ° F и т. Д.), денежные и др.
- различных способов форматирования / отображения чисел
L10N
Локализация — это процесс (или концепция процесса), позволяющий сделать приложение «локализованным»; то есть работать для данного локального и конкретного контекста, адаптированного к пользователю.
Это не связано с изменением исходного кода; разработчики не участвуют (ну, совсем немного, просто чтобы добавить первую ловушку; когда язык доступен, разработчик должен поместить его в список, предоставить доступ команде l10n и т. д.).
L10n предоставляет контент для заполнения контейнеров, созданных процессом i18n.
Различные аспекты:
- перевод переводимых текстовых данных (самый известный)
- предоставляет уникальные локализованные текстовые данные (не перевод существующего, а независимый), если необходимо
- средства проверки правописания (см. Ниже)
- раскладки клавиатуры
- методы ввода (см. Ниже)
- правила сортировки
Как я уже сказал, они не связаны с разработчиками.Ну, в некоторых случаях может быть связано с некоторыми разработками; это для некоторых очень специфических вещей, таких как создание новой проверки орфографии, уникальной для языка или семейства языков, или программы метода ввода (но также существуют универсальные средства проверки орфографии и методы ввода, где вам нужно только предоставить l10n данные).
Вкратце
- l10n: l10n проблемы касаются только переводчиков данного языка; никто другой не заботится и ничего не может с этим поделать; только переводчики для этого конкретного языка могут исправить это.
- i18n: проблемы с i18n — это проблема инфраструктуры i18n; это потенциально может повлиять на многие языки (даже если, возможно, только один действительно обнаруживает симптомы), но переводчики не могут ничего сделать, чтобы решить эту проблему, только разработчики.
Что такое i18n, что такое l10n
Термины i18n и l10n часто путают и неправильно используют. Они связаны, но не имеют одинакового значения; они относятся к разным уровням реализации и опыта, поэтому правильное понимание важно, чтобы увидеть, в чем именно заключается проблема или потребность в разработке.
Что означают эти сокращения
Что же на самом деле означают эти странные сокращения? Фактически, это аббревиатуры, состоящие из первой и последней буквы слова, а между ними — количество букв.
- i18n = I nternationalizatio n : i , затем 18 букв, затем n
- l10n = L ocalizatio n : l , затем 10 букв, затем n
Разве это не то же самое?
Итак, вы можете спросить, разве интернационализация и локализация не одно и то же? Вообще-то, нет.
Тут много путаницы; отчасти потому, что концепции относительно новые; отчасти также по историческим причинам. Исторически сложилось так, что поддержка компьютеров помимо английского языка осуществлялась, по крайней мере, вначале, в виде нескольких специальных решений, которые соответствовали только одному языку. Итак, эта ОС была локализована, скажем, на французский язык, а другая версия — на испанский; и они вполне могут быть несовместимы, даже если оба языка могут иметь общий набор символов (и довольно простой).
Иначе говоря, исторически l10n делалось до того, как думать о i18n.
Но концептуально i18n должен быть первым; поскольку интернационализация — это процесс обеспечения того, чтобы часть программного обеспечения была действительно достаточно гибкой и готовой в первую очередь поддерживать несколько потенциальных локалей. В процессе i18n не задействован реальный язык; приложение вполне может никогда не быть переведено, но если оно правильно интернационализировано, то перевод будет довольно простым (и, что более важно, не требует никаких навыков работы с компьютером, только знание целевого языка).Таким образом, интернационализация делает программное обеспечение удобным для локали .
С другой стороны, локализация — это (в основном, см. Ниже) перевод на заданный, реальный язык. Локализация, как таковая, не требует выполнения интернационализации , однако, если приложение не было сначала интернационализировано, то это означает, что процесс локализации потребует довольно низкоуровневых модификаций в исходном коде приложения; то есть навыки развития. В старые времена (старые добрые времена, о которых большинство из вас не знает; вам повезло) локализация иногда выполнялась путем «простого» редактирования исходного кода и изменения текстовых строк в исходном коде.Это приводит к двум (или более) различным двоичным файлам ; то есть два (или более) разных продукта для поддержки, с разным управлением версиями, отслеживанием ошибок и т. д. Иногда даже несовместимы друг с другом. И, если вы хотели перенести приложение на другой язык, это приходилось делать заново (и решать, от какой версии отклоняться). Кроме того, никогда не было должного обобщающего обзора проблемы; если была запрошена локализация на новый язык с некоторыми конкретными потребностями, это могло сломать все, потому что это не было запланировано.
Итак, l10n без i18n плохо, очень плохо. Надеюсь, в наши дни, особенно в мире свободного программного обеспечения, это редкость. В нашем мире бесплатного программного обеспечения у нас есть очень хорошие рамки интернационализации, встроенные в ядро общих наборов инструментов (набор инструментов — это набор инструментов и кирпичиков, из которых разработчики создают приложения). Эти рамки достаточно универсальны, чтобы поддерживать и охватывать все используемые в настоящее время системы письма человека.
Две концепции i18n и l10n представляют собой два разных уровня.Они взаимосвязаны, но находятся на разных уровнях, то есть в них участвуют разные люди, с разными навыками. Это важно знать, поскольку сообщение о проблеме на неправильном уровне не поможет ее решить.
И18Н
Интернационализация — это процесс (или концепция процесса), при котором приложение становится «международным»; то есть сделать его способным поддерживать практически любой язык или местную среду на Земле.
Это всегда включает изменения в исходном коде , то есть включает разработчиков (которые также должны быть осведомлены о проблемах i18n).У i18n есть различные аспекты, некоторые из которых сложнее других:
- возможность отображения / печати текста
- поддержка любого сложного шрифта
- поддержка нормализации символов
- поддерживает подстановку и рендеринг глифов (нет эквивалентности между символом и глифом; вместо этого некоторые последовательности символов (могут быть последовательностью только одного в простом случае) создают некоторые последовательности глифов (может быть последовательностью одного в простом случае). чехол)
- поддержка переупорядочения глифов (отображение не всегда в том же порядке, что и логически произнесенные / записанные)
- поддержка двунаправленного рендеринга (слева направо и справа налево)
- возможность манипулировать текстом
- Поддержка манипуляций с текстовыми строками в программах Поддержка
- для выделения мышью, вырезания и вставки и т. Д. (Обратите внимание, что вы выбираете глифов на экране, но буфер выбирает текст (символы) => задействована сложная подстановка) Утилиты преобразования набора символов
- (потому что мы должны справиться с наследием до юникода)
- поиск текста (grep и т. Д.)
- сортировка текста по сложным правилам
- возможность ввода текста
- поддержка определения раскладок клавиатуры
- поддержка подключения к приложениям ввода для сложных случаев, когда сопоставления клавиатуры недостаточно)
- возможность манипулировать / отображать дату / время
- формат отображения / ввода
- определение первого дня недели
- определение часовых поясов
- определение негрегорианских календарей
- функций для преобразования между различными форматами / календарями
- возможность определять и обрабатывать локальные настройки
- различных единиц (км / миль ° C / ° F и т. Д.), денежные и др.
- различных способов форматирования / отображения чисел
L10N
Локализация — это процесс (или концепция процесса), позволяющий сделать приложение «локализованным»; то есть работать для данного локального и конкретного контекста, адаптированного к пользователю.
Это не связано с изменением исходного кода; разработчики не участвуют (ну, совсем немного, просто чтобы добавить первую ловушку; когда язык доступен, разработчик должен поместить его в список, предоставить доступ команде l10n и т. д.).
L10n предоставляет контент для заполнения контейнеров, созданных процессом i18n.
Различные аспекты:
- перевод переводимых текстовых данных (самый известный)
- предоставляет уникальные локализованные текстовые данные (не перевод существующего, а независимый), если необходимо
- средства проверки правописания (см. Ниже)
- раскладки клавиатуры
- методы ввода (см. Ниже)
- правила сортировки
Как я уже сказал, они не связаны с разработчиками.Ну, в некоторых случаях может быть связано с некоторыми разработками; это для некоторых очень специфических вещей, таких как создание новой проверки орфографии, уникальной для языка или семейства языков, или программы метода ввода (но также существуют универсальные средства проверки орфографии и методы ввода, где вам нужно только предоставить l10n данные).
Вкратце
- l10n: l10n проблемы касаются только переводчиков данного языка; никто другой не заботится и ничего не может с этим поделать; только переводчики для этого конкретного языка могут исправить это.
- i18n: проблемы с i18n — это проблема инфраструктуры i18n; это потенциально может повлиять на многие языки (даже если, возможно, только один действительно обнаруживает симптомы), но переводчики не могут ничего сделать, чтобы решить эту проблему, только разработчики.
Сравнение локализации и интернационализации
У каждого есть свои предпочтительные определения этих терминов. Здесь мы приводим несколько общих высокоуровневых описаний того, как мы склонны использовать эти условия на сайте W3C Internationalization.
Локализация
Локализация относится к адаптации продукта, приложения или содержания документа для соответствия языку, культуре и другие требования конкретного целевого рынка (региона).
Localization иногда записывается на английском языке как l10n, где 10 — это количество букв в английском слове между l и n.
Локализация, которую часто воспринимают только как синоним перевода пользовательского интерфейса и документации, зачастую представляет собой значительно более сложную проблему.Это может повлечь за собой настройку, связанную с:
- Числовые форматы, форматы даты и времени
- Использование валюты
- Использование клавиатуры
- Сопоставление и сортировка
- Символы, значки и цвета
- Текст и графика, содержащие ссылки на объекты, действия или идеи, которые в данной культуре могут быть неправильно истолкованы или рассматриваться как нечувствительные.
- Различные законодательные требования
- и многое другое.
Локализация может даже потребовать всестороннего переосмысления логики, визуального дизайна или представления, если способ ведения бизнеса (например., бухгалтерский учет) или принятая парадигма обучения (например, сосредоточение внимания на индивидуальном или групповом) в данном регионе существенно отличается от зарождающаяся культура.
Интернационализация
Определения интернационализации различаются. Это рабочее определение высокого уровня для использования с W3C Internationalization Activity. материал. Некоторые люди используют другие термины, такие как глобализация, для обозначения той же концепции.
Интернационализация — это проектирование и разработка продукта, приложения или содержимого документа, которое позволяет . easy локализация для целевой аудитории, различающейся по культуре, региону или языку.
Интернационализация часто записывается на английском языке как i18n, где 18 — это количество букв между i и n в английском слове.
Интернационализация обычно включает:
- Проектирование и разработка таким образом, чтобы устранить препятствия на пути локализации или международного развертывания. Сюда входят такие вещи, как включение Unicode или обеспечение надлежащей обработки устаревших кодировок символов, где это необходимо, забота о конкатенации строки, избегая зависимости в коде строковых значений пользовательского интерфейса и т. д.
- Обеспечение поддержки функций, которые нельзя использовать до локализации. Например, добавление разметки в DTD для поддержки двунаправленный текст или для определения языка. Или добавление поддержки CSS для вертикального текста или других нелатинских типографских функций.
- Код активации для поддержки местных, региональных, языковых или культурных предпочтений. Обычно это включает в себя включение предопределенные данные локализации и функции, полученные из существующих библиотек или пользовательских настроек.Примеры включают форматы даты и времени, местные календари, числовые форматы и системы счисления, сортировка и представление списков, обработка личных имен и форм обращения и т. д.
- Отделение локализуемых элементов от исходного кода или контента, так что локализованные альтернативы могут быть загружены или выбраны на основе международные предпочтения пользователя по мере необходимости.
Обратите внимание, что эти элементы не обязательно включают локализацию содержимого, приложения или продукта на другой язык; они представляют собой методы проектирования и разработки, которые позволяют легко осуществить такую миграцию в будущем, но которые могут иметь значительную пользу даже если никакая локализация не состоится.
Значение интернационализации
Интернационализация существенно влияет на простоту локализации продукта. Модернизация лингвистического и ориентированный на культуру продукт для глобального рынка, очевидно, намного сложнее и требует много времени, чем разработка продукта с намерением представить его в глобальном масштабе. (Вспомните усилия 2000 года и попытку «отменить» двухсимвольные поля года, которые были построены на предположении «19хх»).
Таким образом, в идеале интернационализация является фундаментальным шагом в процессе проектирования и разработки, а не второстепенным. это часто может включать неудобную и дорогостоящую модернизацию.
i18n vs l10n — в чем разница?
Интернационализация (i18n).
Локализация (l10n).
Глобализация (g11n).
Локализуемость (l12y).
Что все это значит? В этом бизнесе так много буквенно-цифровых аббревиатур, что может быть очень сложно соединить их все вместе.Так где же граница между некоторыми из них, например, i18n и l10n?
Я считаю, что W3C сказал это лучше всего, когда они написали следующее:
“ Интернационализация — это дизайн и разработка продукта, приложения или содержимого документа, которое обеспечивает легкую локализацию для целевых аудиторий, которые различаются по культуре, региону или языку.
Локализация означает адаптацию продукта, приложения или содержимого документа для удовлетворения языковых, культурных и других требований конкретного целевого рынка (региона).”
Другими словами, i18n позволяет приложениям поддерживать и удовлетворять потребности нескольких локалей, таким образом «активируя» l10n. Именно благодаря i18n мы можем локализовать весь проект Mozilla в его пантеоне приложений и открыть Интернет для всего мира!
Вы не поверите, но проект Mozilla имеет долгую историю использования i18n в качестве основы для L10n своих продуктов. Покопавшись в архивах документов Mozilla, я нашел этот драгоценный камень, в котором кратко обсуждается роль i18n и l10n в Mozilla с момента ее создания.Довольно круто, правда?
Теперь предположим, что вы хотели принять более непосредственное участие в Mozilla i18n. Что ты мог сделать? Поскольку большая часть работы по i18n уже заложена, бывает сложно найти, где можно внести свой вклад в эту область. Однако после некоторого внимательного рассмотрения вот несколько идей:
- Изучите инфраструктуру Mozilla i18n (или возможности локализации) и напишите об этом в MDN.
- Проверьте свои локализации на наличие ошибок, связанных с i18n, таких как проблемы с персонажами (например,g., ввод символов, направление, отображение, пользовательский интерфейс и т. д.).
- Если вы обнаружите проблемы с i18n, сообщите об этих ошибках!
- Поговорите с l10n-драйверами о том, где может быть необходимость.
Хотите узнать больше или иметь что-нибудь о i18n? Прокомментируйте, пожалуйста!
Ресурсы
W3C International. Консорциум World Wide Web. Проверено 13 декабря 2011.
Что такое интернационализация или I18n?
Что такое интернационализация или I18n?
15 октября ’20, автор: Габриэль Фэйрман
Термин «интернационализация» означает разные вещи для разных людей.Поэтому единого единого определения этого термина не существует. Разработчик, например, определил бы это как относящееся к процессу локализации. С другой стороны, руководитель высшего звена, вероятно, расскажет о его влиянии на бизнес-стратегию и доходы. Итак, задавая вопрос «что такое интернационализация?» вам, вероятно, следует быть готовым к разнообразным ответам.
Как правило, интернационализация — это основа новой рыночной стратегии, а локализация — компонент этой стратегии.Поскольку он охватывает такой широкий спектр глобализации — от дизайна продукта до миграции всей экосистемы контента — большинство организаций определяют этот термин по-своему. Однако у всех определений есть одно общее: локализация всегда будет важнейшим компонентом стратегии интернационализации.
Что такое интернационализация и как в нее вписывается локализация?
Говоря языком индустрии, интернационализация часто обозначается как «i18n», а локализация — «l10n.«18» в i18n относится к 18 буквам между первым «i» и последним «n» в термине интернационализация. Аналогично, «10» в l10n относится к 10 буквам между первым «l» и последним «n» в термине локализация.
Подводя итог, i18n фокусируется на стратегии дизайна для выхода на новый рынок — на подготовке продукта к адаптации для многоязычной аудитории. Вот несколько примеров стратегий, подпадающих под интернационализацию:
- Выбор времени выхода на новые рынки: Будете ли вы начинать с английского и добавлять по одному языку за раз, или вы намереваетесь выходить на несколько зарубежных рынков одновременно?
- Создание адаптируемого дизайна: С точки зрения пользовательского опыта, разработаны ли ваши текстовые поля так, чтобы они были гибкими, чтобы их можно было расширять для языков, требующих большего объема ресурсов?
- Анализ голоса бренда: Будет ли сообщение вашего бренда находить отклик у всех аудиторий или его потребуется обновить?
- Оценочный тон: Способен ли ваш письменный контент адаптироваться к новым языкам, или он содержит сленг и идиомы, которые нелегко перевести?
- Завершение аудита кода: Включен ли ваш код для поддержки региональных предпочтений с самого начала, или он потребует обновлений?
Все это проактивные стратегии, которые часто начинаются еще до того, как вы даже выбираете, на какой новый рынок войти; они сосредоточены на подготовке к процессу локализации.С другой стороны, l10n включает в себя шаги, которые вы предпримете, чтобы адаптировать этот продукт к выбранному вами рынку, например, перевод строк, создание обзоров на рынке и выполнение исследований.
Компании часто сначала обращаются к l10n, не осознавая, что им нужна более широкая стратегия. Это часто приводит к борьбе за эффективное управление задачей, а также к недостатку ожидаемой отдачи. Любой хороший план l10n начинается с хорошо зарекомендовавшей себя инфраструктуры i18n.
Подготовка к интернационализации
I18n часто используется как синоним глобализации, потому что обе стратегии разделяют общую философию — простоту.Например, начните с анализа исходной английской версии вашего контента. Избегание использования идиом, сленга или лаконичных тонов может значительно упростить перевод, тем самым устраняя многие потенциальные проблемы, которые могут возникнуть при локализации.
Еще одним важным фактором, который следует учитывать, является простота кода. Создайте код, который легко адаптируется и включает правильные переменные для фраз, которые должны будут меняться в зависимости от рынка, например, обозначение валюты или формат даты.Поскольку переводчики часто видят только строки, а не сам продукт, контекст имеет решающее значение. Разработчики могут восполнить пробел, добавив комментарии, объясняющие, к чему относятся строки. Этот метод устраняет неопределенность на уровне кода, чтобы ограничить непонимание при переводе.
Прямые тесты с использованием машинно-переведенного контента также могут помочь в тех случаях, когда разработчики хотят протестировать свой код, чтобы убедиться, что он удобен для локализации. Они могут быстро запустить свое приложение или продукт на иностранном языке, чтобы проверить такие вещи, как интервалы или необходимость расширения текстовых полей.Это отличный способ заблаговременно устранять проблемы.
Организовать всю эту подготовку может быть непросто, поскольку она требует тесного сотрудничества между лингвистами, разработчиками, менеджерами проектов и другими членами команды. Если вы предсказываете, что столкнетесь с этим препятствием, вы также можете упростить свой проект, используя надежную платформу управления локализацией, которая поможет вам контролировать рабочий процесс разрозненных отделов. Первоклассная программа позволит лингвистам и кодировщикам просматривать проекты по мере их выполнения и свободно общаться в едином пространстве.Это также позволит людям предварительно просмотреть текст, чтобы понять основной контекст, который им понадобится для принятия правильных решений о переводе. I18n включает в себя несколько движущихся частей, поэтому наличие централизованного местоположения, обеспечивающего сквозное управление, неоценимо.
«Что такое интернационализация?» — это вопрос, на который есть много ответов, но самый простой — это ваш исходный фундамент для обеспечения того, чтобы дизайн вашего продукта выдерживал весь процесс перевода. Этот тип упреждающего планирования поможет вам ускорить выход на новые рынки и максимизировать рентабельность инвестиций (ROI) вашего проекта.
Bureau Works предлагает платформу, которая позволяет вам управлять стратегией интернационализации и улучшать результаты вашей локализации. Чтобы получить более подробную информацию о наших решениях или о том, что такое интернационализация, свяжитесь с нашей командой .
Разница между локализацией и интернационализацией
Эта часть является подстраницей нашей статьи Ultimate Guide to Localization, ознакомьтесь с ней, чтобы узнать о более всестороннем подходе к L10N и о том, что он включает.__________________________________________________
Термины локализация и интернационализация используются в одном контексте, но не означают одно и то же. Итак, что именно означают термины и почему их часто путают? Каковы основные различия между ними и какую ценность они предлагают?
В этой статье мы проведем четкое различие между локализацией и интернационализацией. Мы также проведем вас через шаги, связанные с обоими.
Связанное сообщение: Перевод и локализация: в чем разница между ними?
Что такое локализация?
Локализация — это процесс адаптации продукта для соответствия лингвистическим, культурным, правовым требованиям, формату даты и другим подобным требованиям конкретного региона или региона. Локализация поможет вам продавать свой продукт в новом регионе мира с желаемым «внешним видом».”
Процесс включает извлечение всех видимых для пользователя компонентов продукта и добавление компонентов, зависящих от локали, а также перевод текста. Успешная локализация поможет вам вывести продукт на мировой рынок без ущерба для качества.
Что такое интернационализация?
Термин интернационализация относится к методологиям и передовым практикам, которым необходимо следовать при проектировании или разработке продукта, чтобы облегчить локализацию. Интернационализированный продукт можно легко и более эффективно локализовать.
Не относитесь к интернационализации как к отдельному этапу в процессе проектирования или разработки, но рассматривайте это как фундаментальную мысль на каждом этапе. Он включает в себя следующие методы проектирования и разработки, которые подготовят ваш продукт к локализации.
Локализация против интернационализации
Интернационализация относится к методам проектирования и разработки, которые должны соответствовать для простой адаптации продукта к нескольким регионам. Это означает «подготовку» вашего продукта к локализации.Локализация относится к фактическому процессу адаптации продукта для конкретной локали .
После интернационализации продукта вы можете выполнить локализацию несколько раз для разных языков. Интернационализированный продукт можно легко локализовать без ошибок и с минимальными накладными расходами.
Глобализация — общая цель интернационализации и локализации
Локализация и интернационализация имеют общую цель — глобализация .Глобализация — это процесс разработки и маркетинга многоязычных продуктов людям со всего мира.
Если вы разрабатываете программное приложение, веб-сайт или мобильное приложение и собираетесь сделать его доступным в нескольких регионах (или регионах), вы пытаетесь «глобализировать» свой продукт. Интернационализация и локализация помогут вам достичь этой цели — глобализация .
Требования к многоязычию, мультикультурности и форматированиюВаша многоязычная аудитория также по своей природе мультикультурна.Разнообразие не ограничивается только языками и культурными особенностями. В разных частях света используются разные форматы даты и времени, десятичных разделителей, валюты, календарных месяцев и т. Д. Рассмотрим следующие примеры:
В Германии в качестве десятичных разделителей используют «,» и «.» как разделители тысяч. Например, число 23,240 означает «Двадцать три тысячи двести сорок».
Связанное сообщение: Добавьте теги Hreflang для локализации вашего сайта
Григорианские месяцы — не единственные официальные календарные месяцы во всем мире.Есть несколько стран, которые следуют разным официальным календарям. Например, календарь хиджры является официальным календарем в Саудовской Аравии.
Изображения и значки, используемые в вашем продукте, также должны учитывать вашу многонациональную аудиторию. Драконы могут иметь отрицательную коннотацию на Западе, но на Востоке они имеют положительную коннотацию.
«Глобализация — непростая задача! Однако это не обязательно, если вы понимаете и следуете лучшим практикам интернационализации, а затем внедряете локализацию.”
Нумеронимы для глобализации, локализации и интернационализации
Термины глобализация, интернационализация и локализация часто сокращаются до их соответствующих числовых имен: g11n для глобализации, i18n для интернационализации и l10n для локализации. Цифры (11, 18 и 10) обозначают количество букв между первой и последней буквой в каждом слове.
Как прошла интернационализация?
Если вы разрабатываете программное обеспечение, веб-сайт или мобильное приложение, i18n означает создание пользовательского интерфейса, который легко локализовать.Он включает абстрагирование всех локализуемых компонентов из исходного кода в файлы, которые вы можете легко передать для локализации.
Поддержка Application Framework
Если ваша платформа приложения поддерживает интернационализацию, вам следует использовать эти функции для проектирования и разработки продукта. Некоторые из функций интернационализации, которые следует искать в структуре вашего приложения:
- Файлы ресурсов
- Набор ресурсов
- Поддержка Unicode
- Динамический интерфейс
- API (для работы с несколькими языками)
Разработка локализуемого пользовательского интерфейса
Большинство ошибок пользовательского интерфейса при переводе связаны с текстом.Переведенный текст может занимать меньше или больше места, из-за чего ваш дизайн будет выглядеть переполненным или растянутым.
Оставьте место для расширения или сжатия при создании пользовательского интерфейса. Вы также должны принять во внимание языки RTL, такие как арабский (текст справа налево).
Было бы идеально программировать динамическое расширение пользовательского интерфейса с использованием функций, поддерживаемых вашей структурой. Например, iOS предлагает функцию «Auto Layout», с помощью которой ваши представления перестраиваются в соответствии с требованиями любого языкового стандарта. Точно так же для приложений Android вы можете использовать «Фрагменты» для создания динамического пользовательского интерфейса.
Экстернализация всех данных переменных локали
Одним из основных методов интернационализации является перенос всех видимых для пользователя строк в файл, обычно называемый файлом внешнего ресурса. Во время локализации вы получите несколько версий этих файлов внешних ресурсов, по одной для каждой локали.
Например, если вы разрабатываете приложение для iOS, такие файлы, содержащие локализуемые строки, называются файлом Strings . Вы должны организовать их в каталогах, зависящих от локали, с одним Localizable.strings для каждого поддерживаемого вами языка.
en.project / Localizable.strings | de.project / Localizable.strings |
«имя» = «Ваше имя»; «приветствие» = «Добро пожаловать»; | «name» = «Dein Name»; «приветствие» = «herzlich willkommen»; |
Как прошла локализация?
Ваш «интернационализированный» продукт можно легко «локализовать».«Придерживаясь лучших практик интернационализации при разработке продукта, вы должны иметь ваши файлы ресурсов (с данными, зависящими от локали), легко доступными во внешних файлах и соответствующих папках.
Извлеките файлы ресурсов, переведите их (в каждую локаль, на которую вы хотите настроить таргетинг), объедините с вашим кодом и, наконец, протестируйте локализованный продукт. Теперь вы готовы продавать продукт во всех этих регионах.
Связанное сообщение: Как правильно локализовать ваш сайт
Экспорт файлов ресурсов для перевода
В зависимости от того, кого вы выберете в качестве партнера по локализации, вам, возможно, придется экспортировать файлы ресурсов в определенный формат для перевода.
Некоторые компании поддерживают множество форматов, и вы можете напрямую загружать файлы. Другие компании могут запросить стандартные файлы XLIFF (XML Localization Interchange File Format) или аналогичные форматы, подходящие для перевода. В таких случаях вы можете использовать инструменты для экспорта файлов ресурсов в формат, поддерживаемый для локализации.
Перевести все данные, относящиеся к региону
Важно, чтобы вы работали с профессиональным переводчиком, который является носителем языка, знаком с местным сленгом и современным языком использования.
Вы можете работать с переводческими компаниями, которые специализируются на локализации, и могут помочь вам выполнить локализацию без проблем и без проблем.
Проверяйте все переводы на предмет лингвистической точности, качества и других подобных требований. При разработке продукта вам следует придерживаться практики интернационализации, которая требует добавления комментариев для всех строк. Такая практика сделает переводы точными и позволит избежать ошибок.
Объединить локализованные данные с кодом и тестом
Импортируйте переведенные файлы ресурсов в свое приложение и затем объедините их со своим кодом.Теперь ваше приложение готово с новыми переводами для всех целевых языков.
Наконец, протестируйте свой продукт, чтобы убедиться в его функциональной и лингвистической приемлемости для всех локализованных версий. Вам следует обратить внимание на проблемы с макетом, ошибки форматирования, отображение, настройки для конкретного региона и т. Д.
Каждый раз, когда вы добавляете или изменяете текст в исходных файлах, вы должны продвигать их через те же шаги локализации.
Заключение
Подводя итог, можно сказать, что интернационализация и локализация — это два отдельных термина, первый из которых относится к методологиям и практикам, которые позволяют второму.