SlideShare a Scribd company logo
Data Localization and Translation
Data Localization
and
Translation
Yevhen Shyshkin
yshyshkin@orocrm.com
https://github.com/yshyshkin
Data Localization and Translation
Language localisation is the process of
adapting a product that has been previously
translated into different languages to a
specific country or region.
What is language localization?
Data Localization and Translation
Where localization is applied?
- Name formatting
- Address formatting
- Datetime formatting
- Number formatting
- Decimal
- Integer
- Percent
- Currency
Data Localization and Translation
Localization configuration
System > Configuration > Localization
Data Localization and Translation
Localization configuration
$this->get('oro_locale.settings')->getLocale();
$this->get('oro_locale.settings')->getCurrency();
https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Model/LocaleSettings.php
https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Resources/public/js/locale-
settings.js
Result: en
USD
PHP:
JS: require(['orolocale/js/locale-settings'],
function(localeSettings) {
localeSettings.getLocale();
localeSettings.getCurrency();
});
Twig: {{ oro_locale() }}
{{ oro_currency() }}
Data Localization and Translation
Name formatting
- Names are formatted based on locale
- Name format configuration can be defined in any
bundle’s YAML file
Resources/config/oro/name_format.yml
- Format may contain placeholders for name
prefix, name suffix, first name,
last name and middle name
- Entity must include OroBundle
LocaleBundleModelFullNameInterface
https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Model/FullNameInterface.php
Data Localization and Translation
Name formatting
en: %prefix% %first_name% %middle_name% %last_name% %suffix%
en_US: %prefix% %first_name% %middle_name% %last_name% %suffix%
ru: %last_name% %first_name% %middle_name%
ru_RU: %last_name% %first_name% %middle_name%
Configuration example
https://github.com/orocrm/platform/blob/1.6.0
/src/Oro/Bundle/LocaleBundle/Resources/config/oro/name_format.yml
Data Localization and Translation
Name formatting
$user = new User(); // implements FullNameInterface
$user->setNamePrefix('Mr.')
->setFirstName('John')
->setMiddleName('S.')
->setLastName('Doe')
->setNameSuffix('Jr.');
$this->get('oro_locale.formatter.name')->format($user);
$this->get('oro_locale.formatter.name')->format($user, 'ru');
PHP:
Twig: {{ entity|oro_format_name }}
{{ entity|oro_format_name('ru') }}
https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Formatter/NameFormatter.php
Data Localization and Translation
Name formatting
require(['orolocale/js/formatter/name'],
function(nameFormatter) {
var user = {
'prefix': 'Mr.',
'first_name': 'John',
'middle_name': 'S.',
'last_name': 'Doe',
'suffix': 'Jr'
};
nameFormatter.format(user);
nameFormatter.format(user, 'ru');
});
JS:
Result: Mr. John S. Doe Jr.
Doe John S.
https://github.com/orocrm/platform/blob/1.6.0
/src/Oro/Bundle/LocaleBundle/Resources/public/js/formatter/name.js
Data Localization and Translation
Address formatting
- Addresses are formatted based on primary
location or country address
- Address format configuration can be defined in
any bundle’s YAML file
Resources/config/oro/address_format.yml
- Format may contain placeholders for name,
organization, street, city, region, region code,
country, country code and postal code
- Entity must include OroBundle
LocaleBundleModelAddressInterface
https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Model/AddressInterface.php
Data Localization and Translation
Address formatting
US:
format: '%name%n%organization%n%street%n%CITY% %REGION_CODE% %
COUNTRY_ISO2% %postal_code%'
require: [street, city, region, postal_code]
zip_name_type: zip
region_name_type: region
RU:
format: '%postal_code% %COUNTRY% %CITY%n%STREET%n%organization%
n%name%'
require: [street, city, postal_code]
Configuration example
https://github.com/orocrm/platform/blob/1.6.0
/src/Oro/Bundle/LocaleBundle/Resources/config/oro/address_format.yml
Data Localization and Translation
Address formatting
$country = new Country('US');
$country->setName('United States of America')
->setIso3Code('USA');
$region = new Region('US-CA');
$region->setCode('CA')
->setName('California');
$address = new Address(); // implements AddressInterface
$address->setNamePrefix('Mr.')
->setFirstName('John')
->setMiddleName('S.')
->setLastName('Doe')
->setNameSuffix('Jr.');
$address->setStreet('Random str., 3, 14')
->setCity('Los Angeles')
->setRegion($region)
->setCountry($country)
->setPostalCode('12345')
->setOrganization('Oro Inc.');
$this->get('oro_locale.formatter.address')->format($address);
PHP:
Data Localization and Translation
Address formatting
Twig: {{ address|oro_format_address|nl2br }}
require(['orolocale/js/formatter/address'],
function(addressFormatter) {
var address = {
'prefix': 'Mr.',
'first_name': 'John',
'middle_name': 'S.',
'last_name': 'Doe',
'suffix': 'Jr',
'organization': 'Oro Inc.',
'street': 'Random str., 3, 14',
'city': 'Los Angeles',
'region_code': 'CA',
'country_iso2': 'US',
'postal_code': '12345'
};
addressFormatter.format(address);
});
JS:
Data Localization and Translation
Address formatting
Result: Mr. John S. Doe Jr.
Oro Inc.
Random str., 3, 14
LOS ANGELES CA US 12345
https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Formatter/AddressFormatter.php
https://github.com/orocrm/platform/blob/1.6.0
/src/Oro/Bundle/LocaleBundle/Resources/public/js/formatter/address.js
Data Localization and Translation
Datetime formatting
- Datetime values are formatted based on locale,
timezone and type (none, short, medium, long,
full)
- Datetime format configuration extracted from
libicu via PHP INTL extension
- Datetime formatter accepts DateTime object,
string and timestamp values
Data Localization and Translation
Datetime formatting
PHP: $dateTime = new DateTime(
'2011-12-13 14:15:16',
new DateTimeZone('UTC')
);
$formatter = $this->get('oro_locale.formatter.date_time');
$formatter->format($dateTime);
$formatter->formatDate($dateTime->format('Y-m-d'));
$formatter->formatTime($dateTime->getTimestamp());
Result: Dec 13, 2011 4:15 PM
Dec 13, 2011
4:15 PM
https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Formatter/DateTimeFormatter.php
Data Localization and Translation
Datetime formatting
JS: require(['orolocale/js/formatter/datetime'],
function(datetimeFormatter) {
datetimeFormatter.formatDateTime('2011-12-13T14:15:16+0000');
datetimeFormatter.formatDate('2011-12-13');
datetimeFormatter.formatTime('14:15:16');
});
Twig: {{ '2011-12-13 14:15:16'|oro_format_datetime }}
{{ '2011-12-13'|oro_format_date }}
{{ '14:15:16'|oro_format_time }}
https://github.com/orocrm/platform/blob/1.6.0
/src/Oro/Bundle/LocaleBundle/Resources/public/js/formatter/datetime.js
Result: Dec 13, 2011 4:15 PM
Dec 13, 2011
2:15 PM
Data Localization and Translation
Datetime format handling
- Different libraries use different datetime formats
- Oro Platform provides format converters for
libicu, moment.js and jquery.ui
- New formatters can be registered using DI tag
oro_locale.format_converter.date_time
Data Localization and Translation
Datetime timezone handling
- To simplify timezone handling all DateTime
object in the backend should be in UTC
timezone
- DateTime objects saved to the DB and
extracted from the DB are automatically
converted to UTC timezone
- Formatting of DateTime objects should be
performed using DateTimeConverter via
service oro_locale.formatter.date_time
Data Localization and Translation
Number formatting
- Numbers are formatted based on locale
- Formatter works with decimal, percent, currency,
spellout, duration and ordinal values
- Number format configuration extracted from
libicu via PHP INTL extension
- Currency use symbols from YAML files
Resources/config/oro/currency_data.yml
Data Localization and Translation
Number formatting
$formatter = $this->get('oro_locale.formatter.number');
$formatter->formatDecimal(12345.6789);
$formatter->formatDecimal(12345);
$formatter->formatPercent(1.2345);
$formatter->formatCurrency(12345.6789);
$formatter->formatCurrency(12345.6789, 'EUR');
PHP:
Twig: {{ 12345.6789|oro_format_decimal }}
{{ 12345|oro_format_decimal }}
{{ 1.2345|oro_format_percent }}
{{ 12345.6789|oro_format_currency }}
{{ 12345.6789|oro_format_currency({'currency':'EUR'}) }}
https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Formatter/NumberFormatter.php
Data Localization and Translation
Number formatting
require(['orolocale/js/formatter/number'],
function(numberFormatter) {
numberFormatter.formatDecimal(12345.6789);
numberFormatter.formatInteger(12345);
numberFormatter.formatPercent(1.2345);
numberFormatter.formatCurrency(12345.6789);
numberFormatter.formatCurrency(12345.6789, 'EUR');
});
JS:
Result: 12,345.679
12,345
123.45%
$12,345.68
€12,345.68
https://github.com/orocrm/platform/blob/1.6.0
/src/Oro/Bundle/LocaleBundle/Resources/public/js/formatter/number.js
Data Localization and Translation
Localization CLI commands
oro:localization:dump - dump localization
configuration from YAML files to web/js/oro.
locale_data.js
Data Localization and Translation
Translation is the communication of the
meaning of a source-language text by
means of an equivalent target-language text.
What is translation?
Data Localization and Translation
Oro Platform use standard Symfony2 mechanism to
perform frontend translation in PHP, in Twig
templates, and translator.js library from
BazingaJsTranslationBundle
Translations are stored in YAML files in any bundle
and in the application database.
How translations used in
Oro Platform?
Data Localization and Translation
- messages - common messages used both for
system and custom purposes
- validators - validation messages
- jsmessages - messages translated on frontend
side
- tooltips - messages for and form field tooltips
- entity - data for entities translated with Gedmo
translatable extension
Translation domains
Data Localization and Translation
Recommended
translation message format
<application>.<bundle>.<section>.<key>
oro.user.form.choose_gender
oro.dataaudit.change_history.title
oro.entity_config.menu.entities_list.label
Format:
Examples:
Data Localization and Translation
Translation extractors
- PhpCodeExtractor - extracts formatted
strings from PHP code
- NavigationTranslationExtractor -
extracts title translations from navigation.
yml files
https://github.com/orocrm/platform/blob/1.6.0
/src/Oro/Bundle/TranslationBundle/Extractor/PhpCodeExtractor.php
https://github.com/orocrm/platform/blob/1.6.0
/src/Oro/Bundle/NavigationBundle/Title/TranslationExtractor.php
Data Localization and Translation
Translation on backend
$this->get('translator')->trans('oro.dashboard.title.main');
$this->get('translator')->trans('oro.entity.item', ['%id%' => 42]);
PHP:
Twig: {{ 'oro.dashboard.title.main'|trans }}
{{ 'oro.entity.item'|trans({'%id%': 42}) }}
Result: Dashboard
Item #42
# messages.en.yml
oro.dashboard.title.main: "Dashboard"
oro.entity.item: "Item #%id%"
YAML:
Data Localization and Translation
Translation on frontend
require(['orotranslation/js/translator'],
function(__) {
__('oro.note.add_note_title');
__('oro.datagrid.pagination.totalRecords', {totalRecords: 42});
});
JS:
Result: Add note
Total of 42 records
# jsmessages.en.yml
oro.note.add_note_title: "Add note"
oro.datagrid.pagination:
totalRecords: "Total of {{ totalRecords }} records"
YAML:
Data Localization and Translation
Translation in the database
- table oro_translation
- entity OroTranslationBundle:Translation
- scopes SYSTEM and UI
# id
# key
# value
# locale
# domain
# scope
Translation
Data Localization and Translation
Translation in database
- OrmTranslationLoader - loads
translations from database
- DatabasePersister - persists translations
to database
https://github.com/orocrm/platform/blob/1.6.0
/src/Oro/Bundle/TranslationBundle/Translation/OrmTranslationLoader.php
https://github.com/orocrm/platform/blob/1.6.0
/src/Oro/Bundle/TranslationBundle/Translation/DatabasePersister.php
Data Localization and Translation
Translation configuration
System > Configuration > Language settings
Data Localization and Translation
Interaction with Crowdin
- Dump translations from translation extractors
and YAML files
- Download translations from Crowdin
- Merge them with existing translations
- Upload updated translations to Crowdin
Oro Platform Crowdin
1. dump 2. download
3. merge
4. upload
Data Localization and Translation
Debug translator
- Wraps translated strings in square brackets -
[<string>]
- Wraps not translated strings into exclamation
marks - !!!---string---!!!
- Add JS prefix for frontend translations
- can be enabled in app/config/config.yml
oro_translation:
debug_translator: true
https://github.com/orocrm/platform/blob/1.6.0
/src/Oro/Bundle/TranslationBundle/Translation/DebugTranslator.php
Data Localization and Translation
Debug translator
Data Localization and Translation
Translation CLI commands
oro:translation:dump - dumps frontend
translations into web/js/translation/<locale>.js
oro:translation:pack - extracts translation files
for each bundle in specified vendor namespace
and creates language pack
Data Localization and Translation
Questions
and
Answers

More Related Content

ODP
One Person's Perspective on a Pragmatic REST Interface
abrummett
 
PDF
Simple Ways To Be A Better Programmer (OSCON 2007)
Michael Schwern
 
PDF
First steps in PERL
Brahma Killampalli
 
ODP
Symfony CMF - PHP Conference Brazil 2011
Jacopo Romei
 
PPTX
A Functional Guide to Cat Herding with PHP Generators
Mark Baker
 
KEY
Building and Distributing PostgreSQL Extensions Without Learning C
David Wheeler
 
One Person's Perspective on a Pragmatic REST Interface
abrummett
 
Simple Ways To Be A Better Programmer (OSCON 2007)
Michael Schwern
 
First steps in PERL
Brahma Killampalli
 
Symfony CMF - PHP Conference Brazil 2011
Jacopo Romei
 
A Functional Guide to Cat Herding with PHP Generators
Mark Baker
 
Building and Distributing PostgreSQL Extensions Without Learning C
David Wheeler
 

Viewers also liked (20)

PPT
Php Docs
Pablo Viquez
 
PPTX
Number Series: How To Solve Questions with Short Tricks
Entrance Exam Info
 
PPTX
Number series
Are Lavanya
 
PDF
"Internationalisation with PHP and Intl" source code
Daniel_Rhodes
 
PPTX
Multi language for php with gettext
Binh Quan Duc
 
ODP
Handling multibyte CSV files in PHP
Daniel_Rhodes
 
PPT
The Big Documentation Extravaganza
Stephan Schmidt
 
PDF
Problem Solving with Algorithms and Data Structures
Yi-Lung Tsai
 
PDF
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Ryan Weaver
 
PDF
People code events flowchart
Satish Ap
 
ODP
Internationalisation with PHP and Intl
Daniel_Rhodes
 
PPTX
Logical reasoning number series
Praveesh Palakeel
 
PDF
Computer Science Engineering : Data structure & algorithm, THE GATE ACADEMY
klirantga
 
PPT
Cmp104 lec 7 algorithm and flowcharts
kapil078
 
PPTX
Data Structure & Algorithms | Computer Science
Transweb Global Inc
 
PPTX
Basics of computer science
Paul Schmidt
 
PPTX
Computer Science & Information Systems
Luis Borges Gouveia
 
DOCX
C Programming
Rumman Ansari
 
PPT
Computer Science Engineering
ITM University, Raipur
 
Php Docs
Pablo Viquez
 
Number Series: How To Solve Questions with Short Tricks
Entrance Exam Info
 
Number series
Are Lavanya
 
"Internationalisation with PHP and Intl" source code
Daniel_Rhodes
 
Multi language for php with gettext
Binh Quan Duc
 
Handling multibyte CSV files in PHP
Daniel_Rhodes
 
The Big Documentation Extravaganza
Stephan Schmidt
 
Problem Solving with Algorithms and Data Structures
Yi-Lung Tsai
 
Grand Rapids PHP Meetup: Behavioral Driven Development with Behat
Ryan Weaver
 
People code events flowchart
Satish Ap
 
Internationalisation with PHP and Intl
Daniel_Rhodes
 
Logical reasoning number series
Praveesh Palakeel
 
Computer Science Engineering : Data structure & algorithm, THE GATE ACADEMY
klirantga
 
Cmp104 lec 7 algorithm and flowcharts
kapil078
 
Data Structure & Algorithms | Computer Science
Transweb Global Inc
 
Basics of computer science
Paul Schmidt
 
Computer Science & Information Systems
Luis Borges Gouveia
 
C Programming
Rumman Ansari
 
Computer Science Engineering
ITM University, Raipur
 
Ad

Data localization and translation

  • 1. Data Localization and Translation Data Localization and Translation Yevhen Shyshkin [email protected] https://github.com/yshyshkin
  • 2. Data Localization and Translation Language localisation is the process of adapting a product that has been previously translated into different languages to a specific country or region. What is language localization?
  • 3. Data Localization and Translation Where localization is applied? - Name formatting - Address formatting - Datetime formatting - Number formatting - Decimal - Integer - Percent - Currency
  • 4. Data Localization and Translation Localization configuration System > Configuration > Localization
  • 5. Data Localization and Translation Localization configuration $this->get('oro_locale.settings')->getLocale(); $this->get('oro_locale.settings')->getCurrency(); https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Model/LocaleSettings.php https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Resources/public/js/locale- settings.js Result: en USD PHP: JS: require(['orolocale/js/locale-settings'], function(localeSettings) { localeSettings.getLocale(); localeSettings.getCurrency(); }); Twig: {{ oro_locale() }} {{ oro_currency() }}
  • 6. Data Localization and Translation Name formatting - Names are formatted based on locale - Name format configuration can be defined in any bundle’s YAML file Resources/config/oro/name_format.yml - Format may contain placeholders for name prefix, name suffix, first name, last name and middle name - Entity must include OroBundle LocaleBundleModelFullNameInterface https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Model/FullNameInterface.php
  • 7. Data Localization and Translation Name formatting en: %prefix% %first_name% %middle_name% %last_name% %suffix% en_US: %prefix% %first_name% %middle_name% %last_name% %suffix% ru: %last_name% %first_name% %middle_name% ru_RU: %last_name% %first_name% %middle_name% Configuration example https://github.com/orocrm/platform/blob/1.6.0 /src/Oro/Bundle/LocaleBundle/Resources/config/oro/name_format.yml
  • 8. Data Localization and Translation Name formatting $user = new User(); // implements FullNameInterface $user->setNamePrefix('Mr.') ->setFirstName('John') ->setMiddleName('S.') ->setLastName('Doe') ->setNameSuffix('Jr.'); $this->get('oro_locale.formatter.name')->format($user); $this->get('oro_locale.formatter.name')->format($user, 'ru'); PHP: Twig: {{ entity|oro_format_name }} {{ entity|oro_format_name('ru') }} https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Formatter/NameFormatter.php
  • 9. Data Localization and Translation Name formatting require(['orolocale/js/formatter/name'], function(nameFormatter) { var user = { 'prefix': 'Mr.', 'first_name': 'John', 'middle_name': 'S.', 'last_name': 'Doe', 'suffix': 'Jr' }; nameFormatter.format(user); nameFormatter.format(user, 'ru'); }); JS: Result: Mr. John S. Doe Jr. Doe John S. https://github.com/orocrm/platform/blob/1.6.0 /src/Oro/Bundle/LocaleBundle/Resources/public/js/formatter/name.js
  • 10. Data Localization and Translation Address formatting - Addresses are formatted based on primary location or country address - Address format configuration can be defined in any bundle’s YAML file Resources/config/oro/address_format.yml - Format may contain placeholders for name, organization, street, city, region, region code, country, country code and postal code - Entity must include OroBundle LocaleBundleModelAddressInterface https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Model/AddressInterface.php
  • 11. Data Localization and Translation Address formatting US: format: '%name%n%organization%n%street%n%CITY% %REGION_CODE% % COUNTRY_ISO2% %postal_code%' require: [street, city, region, postal_code] zip_name_type: zip region_name_type: region RU: format: '%postal_code% %COUNTRY% %CITY%n%STREET%n%organization% n%name%' require: [street, city, postal_code] Configuration example https://github.com/orocrm/platform/blob/1.6.0 /src/Oro/Bundle/LocaleBundle/Resources/config/oro/address_format.yml
  • 12. Data Localization and Translation Address formatting $country = new Country('US'); $country->setName('United States of America') ->setIso3Code('USA'); $region = new Region('US-CA'); $region->setCode('CA') ->setName('California'); $address = new Address(); // implements AddressInterface $address->setNamePrefix('Mr.') ->setFirstName('John') ->setMiddleName('S.') ->setLastName('Doe') ->setNameSuffix('Jr.'); $address->setStreet('Random str., 3, 14') ->setCity('Los Angeles') ->setRegion($region) ->setCountry($country) ->setPostalCode('12345') ->setOrganization('Oro Inc.'); $this->get('oro_locale.formatter.address')->format($address); PHP:
  • 13. Data Localization and Translation Address formatting Twig: {{ address|oro_format_address|nl2br }} require(['orolocale/js/formatter/address'], function(addressFormatter) { var address = { 'prefix': 'Mr.', 'first_name': 'John', 'middle_name': 'S.', 'last_name': 'Doe', 'suffix': 'Jr', 'organization': 'Oro Inc.', 'street': 'Random str., 3, 14', 'city': 'Los Angeles', 'region_code': 'CA', 'country_iso2': 'US', 'postal_code': '12345' }; addressFormatter.format(address); }); JS:
  • 14. Data Localization and Translation Address formatting Result: Mr. John S. Doe Jr. Oro Inc. Random str., 3, 14 LOS ANGELES CA US 12345 https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Formatter/AddressFormatter.php https://github.com/orocrm/platform/blob/1.6.0 /src/Oro/Bundle/LocaleBundle/Resources/public/js/formatter/address.js
  • 15. Data Localization and Translation Datetime formatting - Datetime values are formatted based on locale, timezone and type (none, short, medium, long, full) - Datetime format configuration extracted from libicu via PHP INTL extension - Datetime formatter accepts DateTime object, string and timestamp values
  • 16. Data Localization and Translation Datetime formatting PHP: $dateTime = new DateTime( '2011-12-13 14:15:16', new DateTimeZone('UTC') ); $formatter = $this->get('oro_locale.formatter.date_time'); $formatter->format($dateTime); $formatter->formatDate($dateTime->format('Y-m-d')); $formatter->formatTime($dateTime->getTimestamp()); Result: Dec 13, 2011 4:15 PM Dec 13, 2011 4:15 PM https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Formatter/DateTimeFormatter.php
  • 17. Data Localization and Translation Datetime formatting JS: require(['orolocale/js/formatter/datetime'], function(datetimeFormatter) { datetimeFormatter.formatDateTime('2011-12-13T14:15:16+0000'); datetimeFormatter.formatDate('2011-12-13'); datetimeFormatter.formatTime('14:15:16'); }); Twig: {{ '2011-12-13 14:15:16'|oro_format_datetime }} {{ '2011-12-13'|oro_format_date }} {{ '14:15:16'|oro_format_time }} https://github.com/orocrm/platform/blob/1.6.0 /src/Oro/Bundle/LocaleBundle/Resources/public/js/formatter/datetime.js Result: Dec 13, 2011 4:15 PM Dec 13, 2011 2:15 PM
  • 18. Data Localization and Translation Datetime format handling - Different libraries use different datetime formats - Oro Platform provides format converters for libicu, moment.js and jquery.ui - New formatters can be registered using DI tag oro_locale.format_converter.date_time
  • 19. Data Localization and Translation Datetime timezone handling - To simplify timezone handling all DateTime object in the backend should be in UTC timezone - DateTime objects saved to the DB and extracted from the DB are automatically converted to UTC timezone - Formatting of DateTime objects should be performed using DateTimeConverter via service oro_locale.formatter.date_time
  • 20. Data Localization and Translation Number formatting - Numbers are formatted based on locale - Formatter works with decimal, percent, currency, spellout, duration and ordinal values - Number format configuration extracted from libicu via PHP INTL extension - Currency use symbols from YAML files Resources/config/oro/currency_data.yml
  • 21. Data Localization and Translation Number formatting $formatter = $this->get('oro_locale.formatter.number'); $formatter->formatDecimal(12345.6789); $formatter->formatDecimal(12345); $formatter->formatPercent(1.2345); $formatter->formatCurrency(12345.6789); $formatter->formatCurrency(12345.6789, 'EUR'); PHP: Twig: {{ 12345.6789|oro_format_decimal }} {{ 12345|oro_format_decimal }} {{ 1.2345|oro_format_percent }} {{ 12345.6789|oro_format_currency }} {{ 12345.6789|oro_format_currency({'currency':'EUR'}) }} https://github.com/orocrm/platform/blob/1.6.0/src/Oro/Bundle/LocaleBundle/Formatter/NumberFormatter.php
  • 22. Data Localization and Translation Number formatting require(['orolocale/js/formatter/number'], function(numberFormatter) { numberFormatter.formatDecimal(12345.6789); numberFormatter.formatInteger(12345); numberFormatter.formatPercent(1.2345); numberFormatter.formatCurrency(12345.6789); numberFormatter.formatCurrency(12345.6789, 'EUR'); }); JS: Result: 12,345.679 12,345 123.45% $12,345.68 €12,345.68 https://github.com/orocrm/platform/blob/1.6.0 /src/Oro/Bundle/LocaleBundle/Resources/public/js/formatter/number.js
  • 23. Data Localization and Translation Localization CLI commands oro:localization:dump - dump localization configuration from YAML files to web/js/oro. locale_data.js
  • 24. Data Localization and Translation Translation is the communication of the meaning of a source-language text by means of an equivalent target-language text. What is translation?
  • 25. Data Localization and Translation Oro Platform use standard Symfony2 mechanism to perform frontend translation in PHP, in Twig templates, and translator.js library from BazingaJsTranslationBundle Translations are stored in YAML files in any bundle and in the application database. How translations used in Oro Platform?
  • 26. Data Localization and Translation - messages - common messages used both for system and custom purposes - validators - validation messages - jsmessages - messages translated on frontend side - tooltips - messages for and form field tooltips - entity - data for entities translated with Gedmo translatable extension Translation domains
  • 27. Data Localization and Translation Recommended translation message format <application>.<bundle>.<section>.<key> oro.user.form.choose_gender oro.dataaudit.change_history.title oro.entity_config.menu.entities_list.label Format: Examples:
  • 28. Data Localization and Translation Translation extractors - PhpCodeExtractor - extracts formatted strings from PHP code - NavigationTranslationExtractor - extracts title translations from navigation. yml files https://github.com/orocrm/platform/blob/1.6.0 /src/Oro/Bundle/TranslationBundle/Extractor/PhpCodeExtractor.php https://github.com/orocrm/platform/blob/1.6.0 /src/Oro/Bundle/NavigationBundle/Title/TranslationExtractor.php
  • 29. Data Localization and Translation Translation on backend $this->get('translator')->trans('oro.dashboard.title.main'); $this->get('translator')->trans('oro.entity.item', ['%id%' => 42]); PHP: Twig: {{ 'oro.dashboard.title.main'|trans }} {{ 'oro.entity.item'|trans({'%id%': 42}) }} Result: Dashboard Item #42 # messages.en.yml oro.dashboard.title.main: "Dashboard" oro.entity.item: "Item #%id%" YAML:
  • 30. Data Localization and Translation Translation on frontend require(['orotranslation/js/translator'], function(__) { __('oro.note.add_note_title'); __('oro.datagrid.pagination.totalRecords', {totalRecords: 42}); }); JS: Result: Add note Total of 42 records # jsmessages.en.yml oro.note.add_note_title: "Add note" oro.datagrid.pagination: totalRecords: "Total of {{ totalRecords }} records" YAML:
  • 31. Data Localization and Translation Translation in the database - table oro_translation - entity OroTranslationBundle:Translation - scopes SYSTEM and UI # id # key # value # locale # domain # scope Translation
  • 32. Data Localization and Translation Translation in database - OrmTranslationLoader - loads translations from database - DatabasePersister - persists translations to database https://github.com/orocrm/platform/blob/1.6.0 /src/Oro/Bundle/TranslationBundle/Translation/OrmTranslationLoader.php https://github.com/orocrm/platform/blob/1.6.0 /src/Oro/Bundle/TranslationBundle/Translation/DatabasePersister.php
  • 33. Data Localization and Translation Translation configuration System > Configuration > Language settings
  • 34. Data Localization and Translation Interaction with Crowdin - Dump translations from translation extractors and YAML files - Download translations from Crowdin - Merge them with existing translations - Upload updated translations to Crowdin Oro Platform Crowdin 1. dump 2. download 3. merge 4. upload
  • 35. Data Localization and Translation Debug translator - Wraps translated strings in square brackets - [<string>] - Wraps not translated strings into exclamation marks - !!!---string---!!! - Add JS prefix for frontend translations - can be enabled in app/config/config.yml oro_translation: debug_translator: true https://github.com/orocrm/platform/blob/1.6.0 /src/Oro/Bundle/TranslationBundle/Translation/DebugTranslator.php
  • 36. Data Localization and Translation Debug translator
  • 37. Data Localization and Translation Translation CLI commands oro:translation:dump - dumps frontend translations into web/js/translation/<locale>.js oro:translation:pack - extracts translation files for each bundle in specified vendor namespace and creates language pack
  • 38. Data Localization and Translation Questions and Answers