Игорь Бровченко Киев, 16 мая 2009 Интернационализация и локализация в Symfony

Содержание

Слайд 2

Что такое I18n и L10n?

Интернационализа́ция (англ. internationalization) — процесс адаптации продукта, такого

Что такое I18n и L10n? Интернационализа́ция (англ. internationalization) — процесс адаптации продукта,
как программное или аппаратное обеспечение, к языковым и культурным особенностям региона (регионов), отличного от того, в котором разрабатывался продукт. В английском языке для слова «internationalization» принято сокращение «i18n». При этом число 18 означает количество пропущенных между «i» и «n» букв.
Локализа́ция (англ. localization) — перевод и адаптация элементов интерфейса, вспомогательных файлов и документации. В английском языке для слова «localization» иногда применяется сокращение «l10n». При этом число 10 означает количество пропущенных между «l» и «n» букв.
Источник: ВикипедиЯ

Слайд 3

Предоставление региональных данных для всех языков
Перевод текстов (интерфейс, данные БД)

Предоставление региональных данных для всех языков Перевод текстов (интерфейс, данные БД) Стандарты
Стандарты форматирования дат и чисел в зависимости от региональных настроек

Поддержка I18n и L10n в Symfony?

Слайд 4

Все данные для интернационализации (I18n) получены из Common Locale Data Repository (CLDR).

Все данные для интернационализации (I18n) получены из Common Locale Data Repository (CLDR).

Слайд 5

Указываем Culture по умолчанию

# frontend/config/settings.yml
all:
.settings:
default_culture: ru

Указываем Culture по умолчанию # frontend/config/settings.yml all: .settings: default_culture: ru

Слайд 6

Использование Culture в Action

// Установить Culture
$this->getUser()->setCulture('ru');
// Получить Culture
$culture =

Использование Culture в Action // Установить Culture $this->getUser()->setCulture('ru'); // Получить Culture $culture
$this->getUser()->getCulture();
// => ru

Слайд 7

Использование Culture в Template


getCulture() ?>

Использование Culture в Template getCulture() ?>

Слайд 8

Создание многоязычного сайта

# frontend/config/routing.yml
news_list:
url: /:sf_culture/news
param: { module: news,

Создание многоязычного сайта # frontend/config/routing.yml news_list: url: /:sf_culture/news param: { module: news,
action: index }
requirements: { sf_culture: (?:uk|ru|en) }

Слайд 9

Демонстрация возможностей I18n (код)

$sf_user->setCulture('en_US');
echo $sf_user->getCulture();
echo format_number(12000.10);
echo

Демонстрация возможностей I18n (код) $sf_user->setCulture('en_US'); echo $sf_user->getCulture(); echo format_number(12000.10); echo format_date(time()); echo
format_date(time());
echo format_datetime(time());
echo format_currency(1350, 'USD');
?>

Слайд 10

en_US 12,000.1 5/15/09 May 15, 2009 9:20:02 PM EEST $1,350.00
en_GB 12,000.1

en_US 12,000.1 5/15/09 May 15, 2009 9:20:02 PM EEST $1,350.00 en_GB 12,000.1
15/05/2009 15 May 2009 21:20:02 EEST US$1,350.00
ru 12,000.1 15.05.09 15 мая 2009 г. 21:20:02 EEST US$ 1,350.00
uk 12 000,1 15.05.09 15 травня 2009 21:20:02 EEST $ 1 350,00

Результат для различных Culture

Слайд 11

sfWidgetFormI18nDate
sfWidgetFormI18nTime
sfWidgetFormI18nDateTime
sfWidgetFormI18nSelectCountry
sfWidgetFormI18nSelectLanguage
sfWidgetFormI18nSelectCurrency

Widgets с поддержкой I18n

sfWidgetFormI18nDate sfWidgetFormI18nTime sfWidgetFormI18nDateTime sfWidgetFormI18nSelectCountry sfWidgetFormI18nSelectLanguage sfWidgetFormI18nSelectCurrency Widgets с поддержкой I18n

Слайд 12

Локализация данных в БД

propel:
my_product:
_attributes: { isI18N: true, i18nTable: my_product_i18n

Локализация данных в БД propel: my_product: _attributes: { isI18N: true, i18nTable: my_product_i18n
}
id: ~
slug: { type: varchar, size: 255 }
price: { type: float }
my_product_i18n:
name: { type: varchar, size: 255 }

Слайд 13

Включение локализации интерфейса

# frontend/config/settings.yml
all:
.settings:
i18n: on
standard_helpers: [Partial, Form, I18N

Включение локализации интерфейса # frontend/config/settings.yml all: .settings: i18n: on standard_helpers: [Partial, Form, I18N ]
]

Слайд 14

Пример использования локализации


Пример использования локализации
__("Today's date is ") ?>

Слайд 15

Словарь в формате XLIFF

# frontend/i18n/messages.fr.xml


Словарь в формате XLIFF # frontend/i18n/messages.fr.xml Welcome to our website. Bienvenue sur
original="global" source-language="en_US" datatype="plaintext">


Welcome to our website.
Bienvenue sur notre site web.


Today's date is
La date d'aujourd'hui est




Слайд 16

Локализация с указанием словаря

Локализация с указанием словаря navigation.fr.xml terms_of_service.fr.xml search.fr.xml
?>

navigation.fr.xml
terms_of_service.fr.xml
search.fr.xml

Слайд 17

Настройка локализации

# frontend/config/factories.yml
i18n:
class: sfI18N
param:
source: XLIFF
debug: off

Настройка локализации # frontend/config/factories.yml i18n: class: sfI18N param: source: XLIFF debug: off
untranslated_prefix: "[T]"
untranslated_suffix: "[/T]"
cache:
class: sfFileCache
param:
automatic_cleaning_factor: 0
cache_dir: %SF_I18N_CACHE_DIR%
lifetime: 31556926
prefix: %SF_APP_DIR%/i18n

Слайд 18

Задачи (tasks) для локализации

> php symfony i18n:extract frontend en
> php symfony i18n:extract

Задачи (tasks) для локализации > php symfony i18n:extract frontend en > php
--auto-save frontend en
> php symfony i18n:extract --auto-save --auto-delete frontend en
Ограничения:
команды работают только с стандартным словарем messages

Слайд 19

Настройка локализации для работы с БД

# frontend/config/factories.yml
i18n:
class: sfI18N
param:

Настройка локализации для работы с БД # frontend/config/factories.yml i18n: class: sfI18N param:
source: MySQL # XLIFF
debug: off
untranslated_prefix: "[T]"
untranslated_suffix: "[/T]"
cache:
class: sfFileCache
param:
automatic_cleaning_factor: 0
cache_dir: %SF_I18N_CACHE_DIR%
lifetime: 31556926
prefix: %SF_APP_DIR%/i18n

Слайд 20

Создание таблиц для локализации в БД
CREATE TABLE `catalogue` ( `cat_id` int(11)

Создание таблиц для локализации в БД CREATE TABLE `catalogue` ( `cat_id` int(11)
NOT NULL auto_increment, `name` varchar(100) NOT NULL default '', `source_lang` varchar(100) NOT NULL default '', `target_lang` varchar(100) NOT NULL default '', `date_created` int(11) NOT NULL default '0', `date_modified` int(11) NOT NULL default '0', `author` varchar(255) NOT NULL default '', PRIMARY KEY (`cat_id`) ) TYPE=InnoDB;
CREATE TABLE `trans_unit` ( `msg_id` int(11) NOT NULL auto_increment, `cat_id` int(11) NOT NULL default '1', `id` varchar(255) NOT NULL default '', `source` text NOT NULL, `target` text NOT NULL, `comments` text NOT NULL, `date_added` int(11) NOT NULL default '0', `date_modified` int(11) NOT NULL default '0', `author` varchar(255) NOT NULL default '', `translated` tinyint(1) NOT NULL default '0', PRIMARY KEY (`msg_id`) ) TYPE=InnoDB;

# symfony-1.2/lib/i18n/sfMessageSource_MySQL.class.php

Слайд 21

Проблемы при использовании БД для локализации

Для работы с локализацией через источник (source)

Проблемы при использовании БД для локализации Для работы с локализацией через источник
MySQL открывается ещё один коннект к БД
При загрузке страницы выполняется несколько дополнительных запросов
Структура таблиц крайне неудобная для работы в Админке

Слайд 22

Образец модуля «Локализация» для Админки

Образец модуля «Локализация» для Админки

Слайд 23

Решение проблемы с БД для локализации

Был написан свой класс источника (source) для

Решение проблемы с БД для локализации Был написан свой класс источника (source)
sfI18N - sfMessageSource_PDO.class.php
Это позволило использовать текущее соединение с БД через PDO
Была переписана структура таблиц, чтобы редактировать данные в Админке стало проще — использовали generate-admin и embedI18n
Были устранены проблемы с лишними запросами к БД
Имя файла: Игорь-Бровченко-Киев,-16-мая-2009-Интернационализация-и-локализация-в-Symfony.pptx
Количество просмотров: 359
Количество скачиваний: 0