Можно ли использовать переменную hook для языковой строки?

Я использую это, чтобы локализовать строки в моей теме

__('Background image', 'themename'); 

существует множество строк, которые локализованы, но чтобы быть уверенным, что файлы lang темы и строки локализации могут быть быстро изменены, я хотел бы использовать что-то вроде этого

 $theme_name = 'themename';// this would be global var or var from a theme class __('Background image', $theme_name); // or $myClass->themename 

и чем использовать эту переменную везде, где это необходимо. Таким образом, владелец темы может быстро изменить название темы и не должен проходить через все локализации.

Вы видите проблему с этим?

Да, это проблематично, поскольку инструменты i18n, которые анализируют вашу тему для создания * .pot-файла для перевода, не могут понять это, поскольку они не запускают PHP-код, а просто выполняют поиск кода в виде текста.

Вот блог, в котором подробно описывается, почему это может вызвать проблемы :

Итог: во всех функциях перевода в строки не допускаются никакие переменные PHP по какой-либо причине. Только одиночные кавычки.

Но тем не менее тот факт, что вы думаете о DRY , здорово! Фактически, поскольку я уже говорил о инструментах i18n, они могут помочь вам с автоматическим добавлением текстового домена. Там даже есть плагин Grunt для автоматизации этого, а также возможность замены / переименования текстовых областей, которые могли бы решить вашу актуальную проблему. Просто прокомментируйте, если вам нужна дополнительная помощь.

Подобная техника имеет одно действительно большое преимущество, и один действительно большой недостаток.

преимущество

Хорошо, как вы уже упоминали, владелец может динамически изменять название темы, а также источник, из которого извлекаются переводы. Если у вас есть специальный вариант использования, например, разные версии переводов, это может быть действительно полезно.

У меня есть один проект, в котором я использую первую строку как переменную. С помощью этого метода я могу динамически преобразовывать строки, возвращаемые из разных функций, в моем случае из API. В деталях я получаю такие ошибки, как AdError.INVALID_INPUT , и могу выводить описание ошибок для каждого языка.

проблема

Однако большой недостаток заключается в том, что вы не можете найти все строки в своей теме / плагине. Многие программы перевода (или плагины, такие как WPML) обрабатывают ваши файлы и выполняют поиск функций __() и _e() (а также всех других функций перевода) и анализируют строки для создания ссылок для перевода.

Если вы используете переменные в ваших вызовах, ни строку для текстового домена, ни строку для строки перевода нельзя найти, так как они являются динамическими, а не жестко закодированы в файл.

Если вы решите пройти этот путь, вам понадобится дополнительный файл где-нибудь, где определены все ваши переводы:

 __( 'Your new String', 'yourtheme' ); __( 'Your new String2', 'yourtheme' ); 

Если вы используете .mo файлы, это становится немного проще, так как вам просто нужно изменить файл, но как только вы добавите еще одну строку, все файлы перевода также должны быть обновлены.

Вывод

В общем, я бы отговорил вас от использования этого подхода для текстовых областей. Было бы намного проще просто искать / заменять все ваши файлы темы (большинство редакторов могут сделать это за несколько кликов).

Если вам нужны переводы для строк, которые вы не знаете или динамически генерируются, это может быть большим упрощением. Просто не забудьте добавить фильтр к вашим функциям gettext , чтобы узнать, были ли необходимые переводы уже распознаны в вашей системе перевода / mo / po-файлах.

Что-то вроде этого должно сделать трюк (непроверенный):

 add_filter( 'gettext', 'f711_check_for_translations', 10, 3 ); function f711_check_for_translations( $translated, $text, $domain ) { if ( $text == $translated ) { AddNewStringToTranslationStrings( $text ); // Function to add the string to your translation strings, however you are going to do that. } return $translated; }