Internationalization and translation
The principle of internationalization is that it should be possible to make a Drupal site in any language (or a multi-lingual site), where only content in the desired language is displayed for any particular page request. In order to make this happen, developers of modules, themes, and installation profiles need to make sure that all of the displayable content and user interface (UI) text that their project deals with is internationalized properly, so that it can be translated using the standard Drupal translation mechanisms.
Different types of information in Drupal have different methods for internationalization, and different portions of the UI also have different methods for internationalization. Here is a list of the different mechanisms for internationalization, and some notes:
translatable = TRUE,
in their annotation. The use of entities to store user-editable content to be displayed in the site is highly recommended over creating your own method for storing, retrieving, displaying, and internationalizing content.
Once your data and user interface are internationalized, the following Core modules are used to translate it into different languages (machine names of modules in parentheses):
The Interface Translation module deserves special mention, because besides providing a UI for translating UI text, it also imports community translations from the Drupal translation server. If UI text and provided configuration in Drupal Core and contributed modules, themes, and installation profiles is properly internationalized (as described above), the text is automatically added to the translation server for community members to translate, via *.po files that are generated by scanning the project files.
By default, translated strings are only translated once, no matter where they are being used. For instance, there are many forms with Save buttons on them, and they all would have t('Save') in their code. The translation system will only store this string once in the translation database, so that if the translation is updated, all forms using that text will get the updated translation.
Because the source of translation strings is English, and some words in English have multiple meanings or uses, this centralized, shared translation string storage can sometimes lead to ambiguous translations that are not correct for every place the string is used. As an example, the English word "May", in a string by itself, could be part of a list of full month names or part of a list of 3-letter abbreviated month names. So, in languages where the month name for May is longer than 3 letters, you'd need to translate May differently depending on how it's being used. To address this problem, the translation system includes the concept of the "context" of a translated string, which can be used to disambiguate text for translators, and obtain the correct translation for each usage of the string.
Here are some examples of how to provide translation context with strings, so that this information can be included in *.po files, displayed on the localization server for translators, and used to obtain the correct translation in the user interface:
// PHP code t('May', array(), array('context' => 'Long month name'); \Drupal::translation()->formatPlural($count, '1 something', '@count somethings', array(), array('context' => 'My context')); // JavaScript code Drupal.t('May', {}, {'context': 'Long month name'}); Drupal.formatPlural(count, '1 something', '@count somethings', {}, {'context': 'My context'}); // *.links.yml file title: 'May' title_context: 'Long month name' // *.routing.yml file my.route.name: pattern: '/something' defaults: _title: 'May' _title_context: 'Long month name' // Config schema to say that a certain piece of configuration should be // translatable using the Config Translation API. Note that the schema label // is also translatable, but it cannot have context. date_format: type: string label: 'PHP date format' translatable: true translation context: 'PHP date format' // Twig template {% trans with {'context': 'Long month name'} %} May {% endtrans %}
t()
Name | Location | Description |
---|---|---|
DateFormatter | core/lib/Drupal/Core/Datetime/DateFormatter.php | Provides a service to handle various date related functionality. |
Name | Location | Description |
---|---|---|
TranslationInterface | core/lib/Drupal/Core/StringTranslation/TranslationInterface.php | Interface for the translation.manager translation service. |
Name | Location | Description |
---|---|---|
StringTranslationTrait | core/lib/Drupal/Core/StringTranslation/StringTranslationTrait.php | Wrapper methods for \Drupal\Core\StringTranslation\TranslationInterface. |
© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/core!lib!Drupal!Core!Language!language.api.php/group/i18n/8.1.x