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();
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.