Entity-ի API-ի թարգմանությունը
Drupal 8-ում դաշտերի լեզուն այլևս չի տրամադրվում հանրային API-ում, փոխարենը դաշտերը միացվում են լեզվի աջակցությամբ օբյեկտներին, որոնցից նրանք «ժառանգում» են իրենց լեզուն։
Հիմնական առավելություններն այստեղ են՝
- Մենք այլևս չենք անհանգստանում դաշտերի տեղափոխելիության մասին, քանի որ դա հոգում է էնտիթի օբյեկտը ներսում։
// Ընտրեք $active_langcode որևէ ձևով։
$translation = $entity->getTranslation($active_langcode);
$value = $translation->field_foo->value;
- Մենք այլևս չենք ստիպված փոխանցել ակտիվ լեզուն, фактически կարող ենք պարզապես փոխանցել այն թարգմանության օբյեկտը, որը իրականացնում է EntityInterface և որը փաստացի գերդաստիանում է սկզբնական օբյեկտի կրկնօրինակը՝ տարբեր ներքին լեզվով։ Դա նշանակում է, որ շատ դեպքերում ստացված կոդը չի գիտակցում լեզուն (առանց հատուկ առնչության լեզվին)։
// Ստեղծեք համապատասխան թարգմանության օբյեկտը մեկ անգամ և փոխանցեք այն այնտեղ, որտեղ անհրաժեշտ է։ Սա սովորաբար հոգում է կորի հիմնական ենթահամակարգերը և շատ դեպքերում թարգմանության օբյեկտի բացահայտ ստացում անհրաժեշտ չէ։
$langcode = Drupal::languageManager()->getLanguage(Language::TYPE_CONTENT);
$translation = $entity->getTranslation($langcode);
entity_do_stuff($translation);
function entity_do_stuff(EntityInterface $entity) {
$value = $entity->field_foo->value;
// կատարեք գործողություններ
}
- Հիմա մենք ունենք վերամշակելի API լեզվի համաձայնեցման համար, որը կարող է օգտագործվել որոշելու էնտիթի թարգմանությունը՝ համապատասխան կոնտեքստին առավել հարմար։
// Հարմարեցված կոդ էնտիթի համար renderable զանգված ստեղծելու։
function viewEntity(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) {
// EntityManagerInterface::getTranslationFromContext() մեթոդը կիրառում է էնտիթի լեզվի համաձայնեցման լոգիկան ամբողջ էնտիթի օբյեկտի վրա և վերադարձնում է համապատասխան թարգմանության օբյեկտը տվյալ կոնտեքստի համար։
// $langcode պարամետրը ընտրովի է և ցույց է տալիս ընթացիկ կոնտեքստի լեզուն։ Եթե այն չի տրամադրվում, օգտագործվում է ընթացիկ կոնտենտի լեզուն, ինչը ցանկալի է ցուցադրման փուլում։
// Նշենք, որ դաշտի արժեքները չեն փոխվում, այնպես որ դատարկ արժեքները պարզապես չեն ցուցադրվի։
$langcode = NULL;
$translation = $this->entityManager->getTranslationFromContext($entity, $langcode);
$build = entity_do_stuff($translation, 'full');
return $build;
}
Մեզ նաև կարելի է տրամադրել ընտրովի $context պարամետր, որը օգտագործվում է թարգմանության օբյեկտի կիրառման կոնտեքստը նկարագրելու համար։
// Հեշտացրած կոդ token-ների փոխարինման համար։
function node_tokens($type, $tokens, array $data = array(), array $options = array()) {
$replacements = array();
// Եթե կոնտեքստի համար լեզու չի նշվում, օգտագործվում է լռելյայն էնտիթի լեզուն։
if (!isset($options['langcode'])) {
$langcode = Language::LANGCODE_DEFAULT;
}
// Մենք փոխանցում ենք $context պարամետր, որը նկարագրում է կատարվող գործողությունը։ Լռելյայն գործողությունը 'entity_view'-ն է։
$context = array('operation' => 'node_tokens');
$translation = \Drupal::service('entity.repository')->getTranslationFromContext($data['node'], $langcode, $context);
$items = $translation->get('body');
// կատարեք գործողություններ
return $replacements;
}
Թարգմանության օբյեկտի ընտրության լոգիկան կարող է փոփոխվել մոդուլներով։ Տեսեք LanguageManager::getFallbackCandidates() լրացուցիչ տեղեկությունների համար։
Դաշտի իրական տվյալները բաշխվում են բոլոր թարգմանության օբյեկտների միջև, և չթարգմանվող դաշտի արժեքի փոփոխությունը ավտոմատ փոփոխվում է բոլոր թարգմանության օբյեկտների համար։
$entity->langcode->value = 'en';
$translation = $entity->getTranslation('it');
$en_value = $entity->field_foo->value; // $en_value-ը 'bar' է
$it_value = $translation->field_foo->value; // $it_value-ը 'bella' է
$entity->field_untranslatable->value = 'baz';
$translation->field_untranslatable->value = 'zio';
$value = $entity->field_untranslatable->value; // $value-ը 'zio' է
Բոլոր ժամանակներում կարելի է ստեղծել թարգմանության օբյեկտի օրինակ սկզբնական օբյեկտից կամ մեկ այլ թարգմանության օբյեկտից՝ օգտագործելով EntityInterface::getTranslation() մեթոդը։ Եթե ակտիվ լեզուն բացահայտ անհրաժեշտ է, այն կարելի է ստանալ EntityInterface::language() մեթոդով։ Սկզբնական էնտիթին կարելի է ստանալ EntityInterface::getUntranslated() մեթոդով։
$entity->langcode->value = 'en';
$translation = $entity->getTranslation('it');
$langcode = $translation->language()->id; // $langcode-ը 'it' է
$untranslated_entity = $translation->getUntranslated();
$langcode = $untranslated_entity->language()->id; // $langcode-ը 'en' է
$identical = $entity === $untranslated_entity; // $identical-ը TRUE է
$entity_langcode = $translation->getUntranslated()->language()->id; // $entity_langcode-ը 'en' է
EntityInterface-ը այժմ ունի մի քանի մեթոդներ, որոնք հեշտացնում են էնտիթի թարգմանությունների հետ աշխատանքը։ Եթե կոդի հատվածը պետք է գործի բոլոր մատչելի թարգմանությունների վրա, այն կարող է օգտագործել EntityInterface::getTranslationLanguages() մեթոդը․
foreach ($entity->getTranslationLanguages() as $langcode => $language) {
$translation = $entity->getTranslation($langcode);
entity_do_stuff($translation);
}
Կան նաև մեթոդներ թարգմանություն ավելացնելու, ջնջելու կամ ստուգելու համար՝
if (!$entity->hasTranslation('fr')) {
$translation = $entity->addTranslation('fr', array('field_foo' => 'bag'));
}
// Սա համարժեք է հետևյալ կոդին, թեև եթե սխալ լեզվի կոդ է նշվում, հանվում է բացառություն։
$translation = $entity->getTranslation('fr');
$translation->field_foo->value = 'bag';
// Թարգմանության օբյեկտի ջնջված դաշտին մուտք գործելը հանում է InvalidArgumentException բացառություն։
$translation = $entity->getTranslation('it');
$entity->removeTranslation('it');
$value = $translation->field_foo->value; // գցում է InvalidArgumentException
Երբ էնտիթի թարգմանությունները ավելացվում կամ ջնջվում են պահեստից, համապատասխանաբար կանչվում են հետևյալ hook-երը՝
- hook_entity_translation_insert()
- hook_entity_translation_delete()
Դաշտի լեզուն դեռ կարող է ստացվել, կանչելով համապատասխան մեթոդ դաշտի օբյեկտի վրա՝
$langcode = $translation->field_foo->getLangcode();