Як Гутенберг обробляє переклади в React?


11

Я переглядав вихідний код Гутенберга, наприклад, це не могло зрозуміти, як вони обробляють переклади ...

Вони імпортують це, import { __ } from '@wordpress/i18n'а потім у вихідному коді вони цим користуються speak( __( 'Block settings closed' ) );.

Чи може хто-небудь сказати мені, як вони управляють, щоб ці переклади в ReactJS збиралися у звичайний .po файл?

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

Відповіді:


6

У сховищі GitHub Гутенберга ви можете побачити джерело i18n пакета, який використовується. У цьому джерелі ви побачите, що Jed імпортується (рядок 4 gutenberg / пакети / i18n / src / index.js), а потім використовується для більшості завдань з перекладу під кришкою.

Jed представляє "Gettext Style i18n для сучасних програм JavaScript" (або, принаймні, так написано на їхньому сайті).

Ваше питання стосується файлів .po. Джед пояснює на своєму сайті:

Існує досить багато доступних перетворювачів .po в .json там. Файли Gettext .po - це стандартний вихід від більшості гідних компаній-перекладачів, оскільки це старий стандарт.

Зараз я використовую: po2json

Однак я хотів би додати цю функціональність до окремого модуля Jed в майбутній версії.

Однак, схоже, це тут не стосується.

Подальше копання, виявляється, setLocaleData( data: Object, domain: string )використовується для передачі перекладів таким чином :

$locale_data = gutenberg_get_jed_locale_data( 'gutenberg' );
wp_add_inline_script(
    'wp-i18n',
    'wp.i18n.setLocaleData( ' . json_encode( $locale_data ) . ' );'
);

( gutenberg_get_jed_locale_data( $domain )є більш-менш обгорткою для get_translations_for_domain( $domain ))

Тож здається, що WordPress отримує дані перекладу через PHP, а потім передає їх Jed. Сам Джед, здається, не завантажує жодного файлу перекладу.

Readme пакета також пояснює, як правильно генерувати файл .pot, що містить локалізовані рядки.

У пакет також входить pot-to-phpсценарій, який використовується для створення файлів php, що містять повідомлення, перелічені у файлі .pot. Це корисно для обману відкриття рядків перекладу WordPress.org, оскільки на даний момент WordPress.org не здатний аналізувати рядки безпосередньо з файлів JavaScript.

npx pot-to-php languages/myplugin.pot languages/myplugin-translations.php text-domain

Чи означає це, що Гутенберг зберігає переклади в певній windowвласності як JSON, завантажений через wp_add_inline_scriptPHP, а потім отримує його на стороні React і передає його в Джед? ... а Джед робить подальшу магію?
Бологер

@Bologer Не обов'язково windowвластивість, але так. PHP отримує значення та передає їх JS черезwp_add_inline_script
kero

2
вам слід розширити свою відповідь інформацією, яку ви додали в коментарі до моєї. Цей коментар насправді більше відповідає тому, що шукає ОП
Марк Каплун

2

Принаймні поки що, поки немає кращого автоматизованого процесу, я б запропонував взагалі не створювати .pot файли з JS.

Як пояснює @kero у своїй відповіді, зараз переклади ГБ передаються як своєрідний масив blob з .mo файлу в JS. Цей робочий процес порушить усі плагіни, що підробляють локалізацію, які залежать від фільтрації результатів __та асоційованих користувачів. Кращим робочим процесом буде явне породження масиву blob з рядків, що перекладаються з __дзвінками, аналогічно тому, як ви робили JS-трансляцію в не ГБ контексті. Це також вирішить проблему створення файлів .pot.

Чого тут не вистачає, це якийсь автоматизований процес, який буде працювати над файлами JS і створювати йому відповідний PHP-код, який, в свою чергу, може бути проаналізований за допомогою інструментів типу poedit.



1
приємна відправна точка, лише частина зліва полягає в автоматичному генеруванні виклику на wp_add_inline_script, так як зараз він, ймовірно, просто генерує php лише на користь генерації горщиків, але насправді не використовую його (я здогадуюсь)
Марк Каплун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.