私はたいていYii(2)、Zend、Laravelのようなフレームワークを使ってページを構築していますが、今回はWordpressを使うことを強いられました。
私はテンプレートエンジンとしてSymfony/Twigを統合しましたが、今ではローカライズ/翻訳に問題があります。何をしても私の文字列は翻訳されずWordpressでも見つけられないでしょう。
Laravelのように、メッセージを翻訳するためにTwigエクステンションを作成しました
class TranslateExtension extends \Twig_Extension {
public function getFunctions(){
return array(
'__' => new \Twig_SimpleFunction('__', array($this, 'translate'))
);
}
public function getName(){
return 'TranslateExtension';
}
public function translate($string, $handle){
return __($string, $handle);
}
}
だから私は私のテンプレート{{ __('Some strings here', 'plugin-handle') }}
でこれを行うことができますが、これらは翻訳されていないか、あるいは Loco translate によってさえ見つけられ、カスタムエントリを.po
ファイルに作成して.mo
ファイルにコンパイルすることもできません。
これがどのように機能するかを誰かに教えてください。ほとんどすべての回答/チュートリアルはPOeditを使用してそこに翻訳を挿入することについてですが、 "新しい翻訳を追加"ボタンがなく、.po
ファイルに手動で文字列を含めてコンパイルするときWPそれら。
WPメソッドを使用する方法がない場合は、Wordpressなしで文字列を翻訳するためのカスタム関数を含めます。
編集
私がもう少し情報を提供したときに、誰かが私のミスを見つけることができるかもしれませんこれは私のpoファイルが/languages/cardio-de_DE.po
でどのように見えるかです。
"Project-Id-Version: Cardio Plugin\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-11-30 16:19+0000\n"
"PO-Revision-Date: 2017-12-07 12:07+0100\n"
"Last-Translator: ******"
"Language-Team: German\n"
"Language: de_DE\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.5\n"
msgid "test"
msgstr "Fooo"
Poedit
でファイルを保存して.mo
フォーマットに変換してからpo
ファイルと同じディレクトリにアップロードします
私のテンプレートでは、phpから基本的に{{ __("test", 'cardio') }}
を返す__("test", "cardio")
を実行していますが、出力は期待どおりのtest
ではなく単なるFoo
です。
私はプラグインとしてWordPressで私自身の小枝の実装を持っています、そして私の翻訳は働いています。あなたは私のコードをチェックすることができます。
コードをテストするときは、次の点に注意してください。
locale
をセットしていることを確認してくださいmo
ファイルが最新バージョンのpo
ファイルからコンパイルされていることを確認してください。mo
ファイルが存在し、load_plugin_textdomain
関数によってロードされていることを確認してください。下記のスクリプトを使用して、WordPressがどの翻訳ファイルをロードしているかをデバッグできます。
function wpse_287988_debug_mofiles( $mofile, $domain ) {
var_dump($mofile);
return $mofile;
}
add_filter( 'load_textdomain_mofile', 'wpse_287988_debug_mofiles', 10, 2);
function wpse_287988_terminate() {
die();
}
add_filter( 'wp_loaded', 'wpse_287988_terminate' );
実用的な小枝の実装:
/**
* Load composer autloader
*/
require_once dirname(__FILE__) . '/vendor/autoload.php';
// Main class
class WPSE_287988_Twig {
/**
* Templates path
*/
private $templates_path;
/**
* Templates path
*/
private $options;
/**
* Twig instance
*/
private $twig;
/**
* Twig class constructor
*/
public function __construct() {
$this->templates_path = array();
$this->options = array();
$this->initialize_twig_options();
$this->initialize_twig();
$this->initialize_twig_functions();
$this->define_hooks();
}
/**
* Render method
*/
public function render( $template, $variables = array() ) {
return $this->twig->render( $template, $variables );
}
/**
* Initialize twig options
*/
private function initialize_twig_options() {
/**
* Resolve twig templates path
*/
$plugins_dir = plugin_dir_path( __FILE__ );
$this->templates_path[] = $plugins_dir;
$this->templates_path[] = $plugins_dir . 'templates';
foreach ($this->templates_path as $path) {
if ( ! file_exists($path) ) {
mkdir($path);
}
}
/**
* Resolve twig env options, disable cache
*/
$this->options['cache'] = false;
}
/**
* Initialize twig
*/
private function initialize_twig() {
$loader = new Twig_Loader_Filesystem( $this->templates_path );
$this->twig = new Twig_Environment($loader, $this->options );
}
/**
* Initialize additional twig funcitons
*/
public function initialize_twig_functions() {
/**
* Add gettext __ functions to twig functions.
*/
$function = new Twig_Function('__', '__');
$this->twig->addFunction($function);
}
/**
* Load the plugin translations
*/
public function load_plugins_textdomain() {
$textdomain = 'wpse_287988';
load_plugin_textdomain( $textdomain, false, basename( dirname( __FILE__ ) ) . '/languages' );
}
/**
* Define hooks required by twig class
*/
private function define_hooks() {
add_action( 'plugins_loaded', array( $this, 'load_plugins_textdomain' ) );
}
}
// End of main class
// Initialize class
function wpse_287988_twig() {
static $plugin;
if ( isset( $plugin ) && $plugin instanceof WPSE_287988_Twig ) {
return $plugin;
}
$plugin = new WPSE_287988_Twig();
return $plugin;
}
wpse_287988_twig();
// End of class initialization
// Testing code
function wpse_287988_test_render() {
$twig = wpse_287988_twig();
echo $twig->render('template.html.twig');
die();
}
add_action('init', 'wpse_287988_test_render');
// End of testing code
私のtemplate.html.twig
ファイル:
{% set text = "Foo" %}
{{ __(text, 'wpse_287988') }}
私は自分の翻訳を自分のプラグインのメインディレクトリのlanguagesディレクトリに保存します。私の翻訳ファイルはtextdomainとlocale:wpse_287988-pl_PL.po
とwpse_287988-pl_PL.mo
から作られています。