Date post: | 12-Apr-2017 |
Category: |
Technology |
Upload: | christian-lopez-espinola |
View: | 70 times |
Download: | 1 times |
DRUPALCAMP GHENT 2016
GROW SOME IDEAS
DRUPAL 8'S MULTILINGUAL APIS: BUILDING FOR THE ENTIRE WORLD
Christian López Espínola - Lingotek
DRUPAL 8'S MULTILINGUAL APIS: BUILDING FOR THE ENTIRE
WORLD
DRUPALCAMP GHENT 2016
GROW SOME IDEAS
DRUPAL 8 MULTILINGUAL (setup, tips and tricks)
for a good user experience Tom Robert
Room Calibrate 17:10 - 17:40
penyaskitoChristian López Espínola
Drupal 8 Multilingual Initiative contributor
Drupal 7 MULTILINGUAL
Drupal CORE
Drupal 7 MULTILINGUAL
Drupal CORE
LOCALE
!
Drupal 7 MULTILINGUAL
Drupal CORE
L10n UP
LOCALE
!
m
Drupal 7 MULTILINGUAL
Drupal CORE
L10n UP
CONTENT TRANSLATION
LOCALE
!
Ü
m
Drupal 7 MULTILINGUAL
Drupal CORE
L10n UP
CONTENT TRANSLATION
LOCALE
I18N !
!
Ü
m
Drupal 7 MULTILINGUAL
Drupal CORE
L10n UP
CONTENT TRANSLATION
LOCALE
I18N
VARIABLE
"
!
!
Ü
m
Drupal 7 MULTILINGUAL
Drupal CORE
L10n UP
CONTENT TRANSLATION
LOCALE
I18N
VARIABLE
Entity translation
#
"
!
!
Ü
m
Drupal 7 MULTILINGUAL
Four pillars in Drupal 8
LANGUAGE
Base services for all modules dealing
with data. Not just multilingual.
!
Four pillars in Drupal 8
LANGUAGE
Base services for all modules dealing
with data. Not just multilingual.
INTERFACE
Interface translation has built-in update
feature, improved usability.
! 8
Four pillars in Drupal 8
LANGUAGE
Base services for all modules dealing
with data. Not just multilingual.
INTERFACE
Interface translation has built-in update
feature, improved usability.
CONTENT
Field translation in built-in API for all entities. Content
translation module provides user
interface.
! 8 é
Four pillars in Drupal 8
LANGUAGE
Base services for all modules dealing
with data. Not just multilingual.
INTERFACE
Interface translation has built-in update
feature, improved usability.
CONTENT
Field translation in built-in API for all entities. Content
translation module provides user
interface.
CONFIG
Common configuration
system handles blocks, views, field settings. Unified
translation.
(! 8 é
Four pillars in Drupal 8
LANGUAGE INTERFACE CONTENT CONFIG
(! 8 é
Four pillars in Drupal 8
DEALING WITH LANGUAGE
\Drupal:languageManager()
LanguageManager
ConfigurableLanguageManager
DEALING WITH LANGUAGE
->getLanguages()UND: NOT SPECIFIED
ZXX: NOT APPLICABLE
EN: ENGLISH (DEFAULT)
UND: NOT SPECIFIED
ZXX: NOT APPLICABLE
HU: HUNGARIAN
IT: ITALIAN
DEALING WITH LANGUAGE
->getLanguages()
UND: NOT SPECIFIED
ZXX: NOT APPLICABLE
HU: HUNGARIAN
IT: ITALIAN
language.entity.$langcode.yml
DEALING WITH LANGUAGE
->getLanguages()
UND: NOT SPECIFIED
ZXX: NOT APPLICABLE
HU: HUNGARIAN
IT: ITALIAN
language.entity.$langcode.ymlLocked
DEALING WITH LANGUAGE
->getLanguages()
UND: NOT SPECIFIED
ZXX: NOT APPLICABLE
HU: HUNGARIAN
IT: ITALIAN
language.entity.$langcode.ymlLocked Not locked
DEALING WITH LANGUAGE
->getLanguages()
DEALING WITH LANGUAGE
ConfigurableLanguage::createFromLangcode(‘fr’)->save()
DEALING WITH LANGUAGE
ConfigurableLanguage::load(‘fr’)->delete()
DEALING WITH LANGUAGE
$languageManager->getCurrentLanguage()
LANGUAGE INTERFACE CONTENT CONFIG
(! 8 é
Four pillars in Drupal 8
INTERFACE LANGUAGE
INTERFACE LANGUAGE
t(‘English text’)
INTERFACE LANGUAGE
DEPENDENCY INJECTION
LOGIC
TRANSLATION
CONFIGURATIONUSER
DEPENDENCY INJECTION
LOGIC
TRANSLATION
CONFIGURATIONUSER
INTERFACE LANGUAGE
t(‘English text’)
INTERFACE LANGUAGE
t(‘English text’)$this->t(‘English text’)
INTERFACE LANGUAGE
class Foo { use StringTranslationTrait; …
}
INTERFACE LANGUAGE
INTERFACE LANGUAGE
$this->t(‘English text’)->getOption(‘langcode’);
INTERFACE LANGUAGE
format_plural(…)$this->formatPlural(…)
Javascript api
Drupal.t(…)Drupal.formatPlural()
TWIG TEMPLATES
<input {{ attributes }} placeholder="{{ 'Search'|trans }}" />
INPUT--SEARCH.HTML.TWIG
<div{{ author_attributes }}> {% trans %} Submitted by {{ author_name }} on {{ date }} {% endtrans %} </div>
NODE.HTML.TWIG
LOCALE.links.menu.ymllocale.translate_page: title: 'User interface translation' description: 'Configure the import …’ route_name: locale.translate_page parent: system.admin_config_regional weight: 15 locale.translate_status: title: 'Available translation updates' route_name: locale.translate_status description: 'Get a status report …’ parent: system.admin_reports
LOCALE.links.menu.ymllocale.translate_page: title: 'User interface translation' description: 'Configure the import …’ route_name: locale.translate_page parent: system.admin_config_regional weight: 15 locale.translate_status: title: 'Available translation updates' route_name: locale.translate_status description: 'Get a status report …’ parent: system.admin_reports
LANGUAGE INTERFACE CONTENT CONFIG
(! 8 é
Four pillars in Drupal 8
English to X
Node.php (Snippet)/** * Defines the node entity class. * * @ContentEntityType( * id = "node", * label = @Translation(“Content"), * translatable = TRUE, * entity_keys = { * "id" = "nid", * "label" = "title", * "langcode" = "langcode", * } * )
Node.php (Snippet)function baseFieldDefinitions($entity_type) { // … $fields['title'] = BaseFieldDefinition::create('string') ->setLabel(t('Title')) ->setRequired(TRUE) ->setTranslatable(TRUE);
}
FIELDS THEMSELVES
FIELDS THEMSELVES
AUTOMATED!
MULTICOLUMN FIELD SNIPPET * @FieldType( * id = "image", * column_groups = { * "file" = { * "label" = @Translation("File"), * "columns" = { * "target_id", "width", "height" * }, * }, * "alt" = { * "label" = @Translation("Alt"), * "translatable" = TRUE * }, * }
Entity language API$node = Node::load(42);
$node = $node ->getTranslation(‘hu’);
$node = $entityRepository ->getTranslationFromContext($node);
Entity language API$node->getUntranslated()
$node->language()
$node->getTranslationLanguages()
$node->hasTranslation(‘hu’)
$node->addTranslation(‘hu’)
$node->removeTranslation(‘hu’)
LANGUAGE INTERFACE CONTENT CONFIG
(! 8 é
Four pillars in Drupal 8
English to X X to Y
Intelligent objects
config/install/system.maintenance.yml
message: '@site is currently under maintenance. We should be back shortly. Thank you for your patience.' langcode: en
Core.data_types.schema.yml
config_object: type: mapping mapping: langcode: type: string label: 'Language code' …
text: type: string label: 'Text' translatable: true
config/schema/system.schema.yml
system.maintenance: type: config_object label: 'Maintenance mode' mapping: message: type: text label: 'Message to display…’
LANGCODE
TRANSLATABLE STRING
system.maintenance.yml
message: '@site is currently under maintenance. We should be back shortly. Thank you for your patience.' langcode: en
system.maintenance.yml
message: '@site is currently under maintenance. We should be back shortly. Thank you for your patience.' langcode: en
LANGUAGES/HU/SYSTEM.…YML
system.maintenance.yml
message: '@site is currently under maintenance. We should be back shortly. Thank you for your patience.' langcode: en
LANGUAGES/HU/SYSTEM.…YML
message: '@site karbantartás alatt áll…’
system.maintenance.yml
message: '@site is currently under maintenance. We should be back shortly. Thank you for your patience.' langcode: en
LANGUAGES/HU/SYSTEM.…YML
message: '@site karbantartás alatt áll…’
LANGUAGES/IT/SYSTEM.…YML
system.maintenance.yml
message: '@site is currently under maintenance. We should be back shortly. Thank you for your patience.' langcode: en
LANGUAGES/HU/SYSTEM.…YML
message: '@site karbantartás alatt áll…’
LANGUAGES/IT/SYSTEM.…YML
message: '@site …’
configuration API
$config = \Drupal::config(‘system.maintenance’);
$config->get(‘message’);
configuration API
$config = \Drupal::config(‘system.maintenance’);
$config->get(‘message’);
OVERRIDES APPLY AS
APPROPRIATE
configuration API
$manager = \Drupal::languageManager(); $hu = $manager->getLanguage('hu');
$original = $manager->getConfigOverrideLanguage(); $manager->setConfigOverrideLanguage($hu);
$config = \Drupal::config(‘system.maintenance'); // …
$manager->setConfigOverrideLanguage($original);
configuration API\Drupal::config(‘system.maintenance’);
\Drupal::configFactory()->getEditable(‘system.maintenance’);
\Drupal::languageManager() ->getLanguageConfigOverride ('hu', 'system.maintenance') ->set('message', 'Karbantartás...') ->save();
OVERRIDES APPLY AS
APPROPRIATE
NO OVERRIDES APPLY
THE OVERRIDE
ITSELF
LANGUAGE INTERFACE CONTENT CONFIG
(! 8 é
Four pillars in Drupal 8
English to X X to Y
Intelligent objects
X to Y
Dumb arrays
DRUPAL 8'S MULTILINGUAL APIS: BUILDING FOR THE ENTIRE
WORLD
DRUPALCAMP GHENT 2016
GROW SOME IDEAS