2011-07-28 9 views
11

Twig(テンプレートエンジン)の実用的なi18nの例を探しています。Twig:Working internationalization(i18n)の例

言語ファイルに関しては、ドキュメントは少し疎です。彼らはどこに行くべきですか、彼らはどのように見えるべきですか?私は.po/.moファイルで頑張っています。

誰かが正しい方向に私を指すことができれば...

参照:本当にファイル自体を私の言語について多くを教えてくれないthe i18n extension example

注:私はTwigをSymfonyの一部ではなく、単独で使用したいと考えています。ここで

は私のphpファイルです:

<?php 
header('Content-Type: text/html; charset=utf-8'); 

$vars = array(); 
foreach($_POST as $key => $value) { 
    $vars[$key] = json_decode(utf8_encode(urldecode($value))); 
} 

/* Prepare Twig template enginge */ 
require_once './lib/Twig/Autoloader.php'; 
Twig_Autoloader::register(); 

$loader = new Twig_Loader_Filesystem('./templates'); 
$twig = new Twig_Environment($loader, array(
    //'cache' => './cache', 
    'cache' => false 
)); 

/* i18n */ 
$twig->addExtension(new Twig_Extensions_Extension_I18n()); 

$availableLanguages = array(
    'en' => 'en_EN', 
    'de' => 'de_DE', 
    'default' => 'de_DE' 
); 

// Set language 
$locale = array_key_exists($_GET['lang'], $availableLanguages) ? $availableLanguages[$_GET['lang']] : $availableLanguages['default']; 
putenv('LC_ALL='.$locale); 
setlocale(LC_ALL, $locale); 

// Specify the location of the translation tables 
bindtextdomain('kalkulator', 'includes/locale'); 
bind_textdomain_codeset('kalkulator', 'UTF-8'); 

// Choose domain 
textdomain('kalkulator'); 

$template = $twig->loadTemplate('print.tpl'); 

$html = $template->render($vars); 

switch($_GET['action']) { 
    case 'mail': 

    break; 
    default: 
     echo $html; 
    break; 
} 


?> 

そして内部は/ロケールが含まれて私は、次のファイルがあります。

-rw-r--r-- 1 user group 670 Jul 28 10:17 kalkulator-de_DE.mo 
-rw-r--r-- 1 user group 982 Jul 28 10:22 kalkulator-de_DE.po 
-rw-r--r-- 1 user group 688 Jul 28 10:38 kalkulator-en_EN.mo 
-rw-r--r-- 1 user group 1004 Jul 28 10:38 kalkulator-en_EN.po 

そして、私はこれを指定するためのタグを使用していますprint.tplファイル内に翻訳される部分:

{% trans %} 
Text to be translated 
{% endtrans %} 
+0

小枝はテンプレートエンジンです。あなたは国際化のために何を期待していますか?それはフランス語のテンプレートを処理することができますか?そしてキューバのもの?私はできるはずだ;) - あなたが探しているものを共有してください。 – hakre

+0

私の変更された回答を参照してください。 Twigにはgettextで動作するi18n拡張があります。 –

+0

[この拡張子](https://github.com/smmoosavi/twig-php-gettext)を使用することができます。この拡張モジュールは純粋なPHPとシステムのgettextに依存しません。 – seyed

答えて

2

twig i18n拡張子はgettextに基づいています。ですからまず、gettextに関連するすべてが適用されます。あなたはここに文書化されて見つける:Gettext Docs

彼らは[言語ファイル]が

に行く必要があります。

は、だから今、あなたのより具体的な部分はご質問には、しかし、あなたは少なくともgettextを持つ基本的な原則を理解してきたことを確認してください

テキストドメインに登録されているディレクトリに移動します。

どのように見えるのですか。

言語ファイルには、次のように名前を付ける必要があります:myAppPhpと呼ばれるテキストドメインとfr_FRロケールの

テキストドメイン-ロケール.po/mo

例:

myAppPhp-fr_FR.po 
myAppPhp-fr_FR.mo 

私は.po/.moファイルで頑張っています。

.po/.mo多分あなたがそれらまたはあなたを移動する前に、テキスト・ドメインを追加するには忘れてしまったパスをちょうど逃した、私にはいいですね。

+0

hakre、入力いただきありがとうございます。私はすでに行ったことを反映するために質問を編集しました(最初からやっていたはずです)。私はどこが間違っているのか分かりません。追加のautocache.phpファイルを使用してTwig出力をキャッシュします。これにより、生成されたphpファイルに対してxgettextを使用してpo/moファイルを作成することができます。 –

+0

@Joseph:期待しているディレクトリのフルパスであれば、 'bindtextdomain'からの戻り値を確認してください。 – hakre

+0

私はen_ENをロケールとして使っていました。それはうまくいかなかった。私はそれをen_GBに変更し、フォルダの名前を変更しました。今は動作しますが、実際にキャッシュに問題があるのか​​、実際に有効なロケールを提供する必要があるのか​​分かりません。en_ENは有効ではありません。 –

-1

私はスリム3で可能な限り試しましたが、何も動作しませんでしたが、スリムな2つしかないので、私は自分の方法を作りました。基本的に、システムは、ブラウザから言語を検出し、正しい翻訳ファイルをロードし、写真の詳細:

my way to solve