Як зробити рядки з шаблонів, що перекладаються на всі сторінки, на яких вони з'являються?


14

У мене є деякі дзвінки до t()файлів * .tpl.php. Для прикладу, скажімо, я говорю про продукти та файл product.tpl.php.

Рядки в шаблонах не розпізнаються до першого разу, коли вони фактично використовуються. На Drupal.org про це була нитка , і я виявив, що вона є точною. На жаль, якщо я перейду до, скажімо, http://example.com/pl/product/200 , то ця рядок буде збережена в {locales_source}таблиці з locationполем, встановленим на /pl/product/200.

Мені потрібні мої користувачі, щоб мати можливість перекладати за допомогою інструмента перекладу на місці модуля Локалізація клієнта , щоб вони могли реально бачити, що вони перекладають, маючи це у відповідному контексті. Якщо встановлено розташування джерела /pl/product/200, продукт з ідентифікатором 200 є єдиним, на якому показано переклад рядка. І що ще гірше, якщо мені, можливо, вдасться змусити користувачів перекладати цей конкретний продукт, мені також потрібно, щоб вони змогли перекласти на російську мову, і немає продукту з місцем розташування /ru/product/PID.

Чи є спосіб переформатувати рядок розташування в базі даних, щоб усі рядки були видимими на всіх продуктах і всіх мовах в інструменті l10n_client?

Я спробував встановити його на:

  • ; sites/default/themes/mytheme/product.tpl.php,
  • sites/default/themes/mytheme/product.tpl.php,
  • sites/default/modules/mymodule/mymodule.module (модуль, який генерує тематичні дані)

Але це лише зробило їх непомітними для інструменту перекладу.

Я впевнений, що це не помилка в клієнті локалізації , він показує рядок, де йому сказано, що ця строка відбулася. І, схоже, це "так, як це працює" для системи перекладу Drupal 7 - теж обговорювалося та повідомлялося, і нічого не змінювалося. Тож це не звіт про помилки, я просто запитую, як працювати з тим, з чим нам працювати.


Я говорю про тексти, які не мають нічого спільного з модулем даних, на якому працює. Я не хочу перекладати продукти, а лише рядки шаблонів, які не мають нічого спільного з самим продуктом, як-от Попереднє - Наступне в шаблоні галереї зображень продукту.

Наприклад, модуль повертає 15 мініатюр, і завдання теми - показувати 5 разів. І попередні / наступні посилання потреби altта titleатрибути. Перекладено. Але мій модуль цього не знає. І ніколи не потрібно.


Я не впевнений, чи достатньо я зрозумів, чого ви хочете, але чи достатньо сканування сайту всіма мовами? Ви можете використовувати напр. xmlsitemap для створення посилань на декількох мовах, а потім використання wgetабо будь-якого іншого. Хакіш, але ти сказав, що це було дозволено (:
Енді

@Andy Localization Client дозволяє користувачам відкривати панель у нижній частині сторінки та перекладати тексти, що з’являються на цій сторінці безпосередньо, коли вони їх бачать. Я можу експортувати всі тексти в порядку, але це не зовсім суть.
Молот

1
Я пам’ятаю з drupal_set_message () та dpm (), що ці повідомлення будуть поставлені в чергу для наступного запиту, якщо його зателефонують, наприклад, із сторінки.tpl.php. Це пояснюється тим, що шаблони зазвичай обробляються досить пізно в запиті, після обробки повідомлень. Щось подібне може бути у випадку з t () та клієнтом локалізації.
donquixote

Приємне запитання. Приємна проблема.
любительська бариста

Лише пропозиція ... якщо ви бажаєте, щоб ваші користувачі могли будь-коли перекладати ваші рядки tpl t () будь-якою мовою, ви можете витягнути ці рядки за допомогою екстрактора шаблонів перекладу ( drupal.org/project/potx ) і надати їм оригінал .po, що вони могли перекласти за допомогою такого інструменту, як Poedit? ( poedit.net ). Коли ви представляєте ці рядки як кілька статичних, цю роботу кожен раз зробив би кожен перекладач ...
Kojo

Відповіді:


5

Ваша вимога:
для того, щоб мій сайт працював на кількох мовах
як аутентифікований користувач
мені потрібно мати можливість перекладати одразу будь-які та всі дзвінки перекладу, знайдені в кодовій базі мого сайту, які були виконані за допомогою функції t ().

Чи опис цієї вимоги навіть близький до того, що ви просите?


Гусениці

Як хтось сказав, - сканер теоретично міг пройти весь сайт, щоб змусити реєстрацію всіх t () дзвінків. Але 1) сканер не знає, які сторінки сканувати; 2) ми не прагнемо підтримувати список сторінок для сканування, тому; 3) ми не хочемо використовувати сканер, період. Eww. Просто, eww. Правильно?


Проблема

  1. У нас немає списку всіх рядків перекладу.
  2. Drupal / PHP - це динамічна мова на відміну від C, яка складається. Тому ми не можемо сказати, наприклад: скомпілюйте всю цю кодову базу, потім знайдіть мені всі екземпляри цієї функції t(), потім зареєструйте ці екземпляри в базі даних, а потім перекладіть всі ці зареєстровані екземпляри за t()один раз. Я не думаю, що це варіант, який ми маємо на своєму столі.
  3. Інструмент аналізу статичного коду був би безпорадним з тієї ж причини, коли сканер був би безпорадним. Я знайшов це t()в цьому файлі. Чудово! У якій URL-адресі він використовується? Який контекст?

Намагання на проблему з поточними інструментами (Drupal та деякими модулями contrib) та поточними обмеженнями (спираючись на виклики тем у режимі реального часу -> шаблонні файли -> t()виклики) виглядає як алея без виходу тут. Нам може знадобитися трохи подумати поза коробкою.


Що нам потрібно

  1. Нам потрібне джерело даних, модель, яка підказує мені, які поточні рядки перекладу у нас є, і який їх контекст -
  2. Проактивна модель даних. Поточна модель даних реагує (модель оновлюється щоразу, коли відбувається виклик t()). Нам потрібна проактивна модель даних - така, в якій програма піклується про пошук t()екземплярів, перш ніж їх реально виконати клієнт.
  3. Нам потрібен контекст. t()поодинці це не скорочує, тому що - ми не знаємо, що ми перекладаємо "foo", але мова перекладу, яку ми перекладаємо, залежить від URL-адреси, де t()відбувається. Навіть якби ми могли жорстко кодувати цільову мову під час t()виклику, скажімо, використовуючи обгортковий виклик, це не працює для ваших цілей.

Я визначив деякі інструменти, які - якби ми їх мали - допомогли б нашій проблемі. За допомогою цих інструментів ми могли б увійти в модель даних і сказати: дайте мені всі рядки, вкладені в нихt() які ще не були заповнені. Тепер вставити ці переклади. Дякую.

І наступного разу, коли замовник приходить, переклади є на місці.

Як би ми ... побудували ці інструменти?


Обмеження

  1. Цільова мова не може бути в шаблоні, який визначається URL-адресою. Припускаючи, що рядок повинен підтримувати будь-яку мову.
  2. Перекладена рядок не може бути в шаблоні. Переклад розміщуватиметься в базі даних.

Тепер, коли я більше роздумував над проблемою та виявив деякі проблеми та обмеження, я можу подумати про те, щоб знайти будь-які рішення, наявні там, або зробити будь-які власні рішення.

Рішення мозкового штурму

Мені потрібно щось, що пов’язує "все" разом. А як ... сутність?

  • Суб'єкт господарювання може зберігати продукт, який потрібно перекласти.
  • Суб'єкти можуть забезпечити співвідношення - клей - між продуктом, який потрібно перекласти, та його контекстом.
  • Суб'єкт може вказати, скажімо, у полі місцезнаходження URL-адреси за замовчуванням продукту.
  • Маркери можна використовувати для визначення альтернативних місць (мов?), На яких продукт з’явиться.
  • Організації надають нам проактивну модель даних, яка нам потрібна, і це контекст. Що в свою чергу дозволяє нам робити такі речі, як: зайти в базу даних, захопити всі сукупності продукту, а якщо немає рядка перекладу для полів X, Y і Z, створити ці рядки перекладу.

Коли клієнт потім захопить /pl/product/200, ви відправляєтесь у db, шукаєте продукт 200 та захоплюєте вже існуючий plпереклад. У вас також є поле заголовка та підпису для цього продукту? Переклади повинні бути і там.

Зауважте, що я тут дуже розпливчастий і загальний щодо того, який модуль перекладу ви використовуєте. Ви могли б дуже добре використати власний модуль перекладу - швидше за все, це так. Усі моделі перекладів, які я бачив в Drupal досі (станом на D7, ще не дивилися на D8), є реактивними, не ініціативними.

Коротко

Теоретично інструменти для побудови того, що вам потрібно, є сутностями, що є ключовим компонентом, який би поєднав все разом: - дані (рядок перекладу), - цільові мови. Не обов'язково бути в самій сутності, бажано лексики таксономії, скажімо, для мов продукту. а може бути, загальна таксономія і для інших суб'єктів. - Контекст. URL-адреса, за якою відображається сутність. URL-адреса міститиме маркер, а маркер у свою чергу посилається на таксономію цільової мови.

За допомогою цих трьох інгредієнтів ви можете сказати: Захопіть усі productсутності, перейдіть у URL aliasполе, отримайте маркер таксономії , пройдіть усі можливі комбінації термінів, подайте всі комбінації поточному користувачеві, використовуючи або дуже велику потворну форму - або, AJAX - і багатоступінчасті форми (щось подібне), і коли поточний користувач перекладає різні мови для продукту 200, збережіть їх десь у базі даних

Десь у базі даних може бути поле Field API в сутності, поле налаштувань, що належить кожному об'єкту (не саме Field Field API, але воно все ще може зберігати дані), або окрема таблиця, яку ви використовуєте для цього. Я думаю, що збереження даних в Entity дозволило б зберегти і код, і дані акуратніше та простіше.


Побудова: можливі рішення

  • D8MI (багатомовна ініціатива Drupal 8)
  • Спеціальний код: "індексувати" переклади, доступні в шаблонах t () шляхом програмного запиту та рендерінгу доступних пакетів та їх пов'язаних реалізацій.

Псевдокод

Отримати сутність (типу x),
Знайти всі мови (систематика або основна мова, пов'язана з продуктом),
Візуалізувати сутність,
- щоб виявити це рядки перекладу t ()
- рендер викликів тема (), яка обробляє багатомовний шар презентації продукт, а не сама модель даних про продукт.

Результат:
- Перший виклик для відображення шаблону сутності на кожній мові повертає реалізацію мови за замовчуванням для кожного виклику.
- Параметри t () в шаблоні тепер кешуються в Drupal та готові до перекладу (для кожного мовного екземпляра, а не для кожного екземпляра продукту).
- Користувач з роллю «перекладача» тепер може перейти до інтерфейсу перекладу та перекласти всі доступні параметри t () для кожної мови.
- Власнику сайту не потрібно чекати, коли клієнти відвідують кожну сторінку продукту або відвідують кожну сторінку продукту вручну, оскільки це було зроблено для нього програмно.

Відкриті запитання:
- Що таке контекст? Якщо я здійснюю програмний дзвінок на тему () для кожного пакета об'єктів "продукт", чи записує він місце, з якого було здійснено дзвінок? Чи записує він URL-адресу вузла? Чи можна змінити “контекст”? Де записаний контекст? Що відбувається, коли у вас є "динамічні" шаблони, тобто коли у вас є більше одного шаблону на продукт і як ви збираєтесь виявляти ці варіанти?

Як завжди, теоретизування та псевдокод корисні лише для мозкового штурму. Але в розвитку ми навряд чи дізнаємося проти чого насправді, поки не почнемо розробляти прототипи. Отож, склавши пару обмежень, можливих рішень та можливих проблем чи питань - я зараз можу приступити до впровадження доказу концепції чи діючого прототипу. На деякі відкриті вище питання можна відповісти лише таким чином, і якнайшвидше ми прототипуємо (незалежно від успіху чи невдачі), ми можемо почати відповідати на деякі з цих питань - або взагалі змінити підхід. Слідкуйте за налаштуваннями ~


1
Навіть не читаючи весь пост, така відповідь заслуговує на підсумок
Олег

Справа в тому, що інструмент, який стверджує, що робить саме те, що мені потрібно для Drupal 7, вже існує. Це просто проблема з збереженням цих рядків з поганими метаданими. Але я можу змінити вказані метадані в db, як тільки рядки зібрані, немає проблем. Мені просто потрібно знати, на що їх встановити, щоб інструмент міг це бачити. Або принаймні я вважав, що це те, що мені потрібно. І найголовніше: я не хочу перекладати продукти, а лише рядки шаблонів, що не мають нічого спільного з самим продуктом, як-от Попереднє - Далі на шаблон галереї зображень продукту.
Молот

2

Гаразд, витрачайте ще раз на модуль перекладу клієнта та суб'єкта перетворення, щоб відтворити той самий сценарій. Оскільки ця відповідь абсолютно не відрізняється від попередньої, додаючи як окремий коментар:

  1. Доданий переклад для мови в одному / першому вузлі доступний для всіх вузлів.

    Ось приклад:

    • Якщо я додаю новий продукт того ж типу, як nid 200, і відвідаю переклад pl новий вузол (скажімо, pl / product / 204), я побачив би ту саму рядок перекладу в pl / product / 200.

    • Різниця лише в тому, що він не відображається в клієнті локалізації. Ми можемо попросити цю функцію у черзі випуску модуля, однак це призведе до більше плутанини, оскільки переклад не є специфічним для поточної сторінки та вплине на всі сторінки (тобто як pl / product / 200 & pl / product / 204).

    • Якщо два вузли створені двома різними особами, а пізніший хоче змінити переклад, то їм доведеться використовувати інтерфейсний переклад.

  2. Рядок доступний у клієнті локалізації для першої мови, яку ви відвідуєте для того ж вузла

    Ось приклад:

    • Якщо я додаю новий продукт nid 199 і створять переклад для мови "pl" (nid 200) та переклад для мови "rs" (nid 201), рядок можна побачити лише на сторінці "pl", а не на сторінці "rs". Знову ж таки, це виглядає як обмеження у клієнтському модулі локалізації.

1

Ваш підхід до додавання рядка перекладу на рівні файлу шаблону або модуля може працювати для інтерфейсу інтерфейсу трансляції, але не для клієнта локалізації.

Очевидно, що у вас є російська версія продукту 200, це буде новий вузол, скажімо, наприклад, / ru / product / 201, куди ви можете перекласти за допомогою клієнта Localization.

Подумка: шукайте рядок, який можна перекласти на всі мови в інтерфейсі інтерфейсу перекладу, і попросіть клієнта перевести рівень продукту, коли це дійсно необхідно. Ось приклад:

"Це товарний рядок рядка категорії"

і якщо ми впевнені, що крім "foo" і "bar" може бути звичайним, ми можемо додати

$vars['product_title'] = t('This is product @product of category @category')

в попередній обробці.

і файл .tpl.php буде

<?php t($product_title, array('@product' => t('foo'),  '@category' => t('bar')); ?>

Це більше про titleтексти для стрілок у ротаторі зображень. Мій модуль не хвилює, як тема відображатиме 15 зображень. І тема показує 5 в той час, з «перед» і «Наступний» , що потреби altі title, і потреби їх переклад. Можлива зміна модуля щоразу, коли міняється мій фронт, але, безумовно, це не потрібно. Ці рядки не мають нічого спільного з самим модулем. І останнє, але не менш важливе, я, можливо, просто не знаю, що рядки в темі були змінені. Або недоступні для міграції їх у модуль.
Молот

IMHO, цей випадок слід обробляти в інтерфейсі перекладу інтерфейсу замість Localization client.
vijaycs85

Клієнт локалізації має на меті дозволити "виправляти переклади на вашому сайті, коли ви бачите проблеми". - чому він не повинен застосовуватися до файлів шаблонів? Струни в tpl ще більш чутливі до контексту, в якому вони з'являються, якщо вони є.
Молот

1

AFAIK за допомогою екстрактора шаблонів перекладу ви можете витягти рядок у межах усіх своїх дзвінків до t()функції.

Екстрактор шаблонів перекладу надає веб-інтерфейс та командний рядок інтерфейс екстрактора шаблонів перекладу Gettext для Drupal, а також API для багаторазового використання для пошуку рядків, що перекладаються, та помилок перекладу. Цей інструмент використовується під кришкою на веб-сайті http://localize.drupal.org/ , а також служить машиною для розбору релізів Drupal.org.

Читайте це Як перекласти модуль?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.