View
TTに追加し、不足している詳細を
CPAN
インストールする方法に既に精通していると思います。
手芸とプログラムを区別する最も重要な要素の1つは、そのローカライズだと思います。 このため、イデオロギーを研究した後、新しいプラットフォームの研究を開始し、ローカライズのメカニズムを見つけました。
Perlは
gettext
意味しますが、それほど単純ではありません。 練習に移りましょう。
プロジェクトの準備
まず、新しいプロジェクトを作成するか、
MyApp
既存のプロジェクトを開き
MyApp
。 MojoMojoプロジェクトからupdate_po.shスクリプトを取得して、プロジェクトの
./script
ます。 このスクリプトが適切になるには、次の操作を行う必要があります。著者が誰もそれに反対しないことを願っています。
ファイル全体で
MOJOMOJO_DIR
を
PROJECT_DIR
に置き換えます。
# Default setting PERL_DEFAULT=`which perl` PROJECT_DIR="." PROJECT_NAME="MyApp"
ローカル変数
PROJECT_NAME
をプロジェクトの名前で追加し、
MojoMojo
ファイル全体で
$PROJECT_NAME
MojoMojo
ます。
このスクリプトを機能させるには、別のpo2json.plプログラムが必要
./script
。これを
./script
保存し
./script
。 両方のファイルを実行可能にします。
UPD
スクリプトは
モジュールの一部です
po2json
スクリプトは
Locale::Simple
モジュールの一部です
コード
update_po.sh
を見ると、ローカライズ用の行のコレクションが次のファイルとディレクトリで発生していることが
update_po.sh
ます。
- ./lib/[MyApp]-プロジェクトソースのあるディレクトリ
- ./lib/[MyAppapter.pm
- ./root/forms-CRUDテンプレート
- ./root/base-TTテンプレート、別のディレクトリを選択する方が正しい
- ./root/static/js-JavaScriptスクリプト
必要に応じて、プロジェクトに合わせてスクリプトを調整できます。
./lib/MyApp/I18N
ディレクトリを作成すると、
.po
ファイルがそこに配置されます。 JavaScriptを使用する場合、。
./root/static/json
ディレクトリを作成する必要があります。
コードと設定
ビューの追加:: TT、HTMLクラスを呼び出しましょう。 独自のビューを持つ既存のプロジェクトがある場合は、この点をスキップできます。
$ ./script/myapp_create.pl view HTML TT
このコマンドは、。
./lib/MyApp/View/HTML.pm
ファイルを作成します。 彼の構成セクションで、テンプレートが配置される場所を示すパスを追加します。
__PACKAGE__->config( TEMPLATE_EXTENSION => '.tt', INCLUDE_PATH => [ MyApp->path_to('root', 'base'), ], render_die => 1, );
プレゼンテーションを簡単にするために、.
./lib/MyApp.pm
/
./lib/MyApp.pm
次のデフォルトビューを実行します。
__PACKAGE__->config( name => 'MyApp', default_view => 'HTML', 'View::HTML' => { ENCODING => 'UTF-8', }, ...
そしてプラグイン宣言で
I18N
と
Unicode
を追加し
Unicode
:
use Catalyst qw/ -Debug ConfigLoader Static::Simple I18N Unicode ...
I18N
プラグインは、
loc()
または
localize()
関数をプロジェクトに追加します。 その他の機能については、 Catalyst :: Plugin :: I18Nをご覧ください。
最初のローカライズされたページのデザインに進みます。 2つの呼び出しオプションを同時に試してみましょう。 最初に、
stash
を使用してコントローラーからテンプレートに行を転送し、ページヘッダーに表示します。 2番目は、テンプレートエンジンで関数を呼び出すことにより、ページの本文の行を反映しています。
./lib/MyApp/Controller/Root.pm
ルートページを担当する関数を変更します。
sub index :Path :Args(0) { my ( $self, $c ) = @_; $c->stash->{title} = $c->loc("Home Page"); }
インデックスページのテンプレートを作成します
./root/base/index.tt
<!doctype html> <html> <head> <meta charset="utf-8" /> <title>[% title %]</title> </head> <body> [% c.loc("Hello World!") %] </body> <html>
起動して確認します。 エラーがある場合:CPANでモジュールを修正/ロードします。
次に、ページの翻訳に進みます。 ロシア語用に空のファイルを作成し、ドイツ語のローカライズを言う:
$ touch ./lib/MyApp/I18N/ru.po ./lib/MyApp/I18N/de.po
記事の冒頭で説明したスクリプトでそれらを埋めます。
エラーがある場合、不足しているモジュールをCPANでロードします。$ ./script/update_po.sh ru de
次に、「ネイティブ」の例を使用してこれらのファイルを編集します。
"Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" #: root/base/index.tt:8 msgid "Hello World!" msgstr " !" #: lib/MyApp/Controller/Root.pm:32 msgid "Home Page" msgstr " "
保存してサーバーを再起動し、ページに移動します。 ブラウザでロシア語が優先される場合、第一級からおなじみの文字があなたの目を愛shouldするはずです。
プロジェクトのソースコードを変更し、
update_po.sh
言語で
update_po.sh
を再起動すると、
.po
ファイルの古いデータが保存されます。
データベース
ビューでローカライズされた情報を正しく保存および使用するには、ベースに接続するときに、情報がutf8に転送されることをドライバーが通知する必要があります。 これを行うには、接続構成で、SQLデータベースごとに異なる1に等しいパラメーターを指定します:sqlite_unicode、mysql_enable_utf8、pg_enable_utf8、odbc_utf8_onなど。
<Model::DB> <connect_info> dsn dbi:mysql:database user username password password mysql_enable_utf8 1 </connect_info> </Model::DB>
詳細については、DBIドライバーのドキュメントを参照してください。
松葉杖
データベースやテキストファイルなど、すでにローカライズされた情報をTTを介して出力すると、krakozyabryが表示される可能性が非常に高くなります。 この関数は私たちがそれを治すのに役立ちます:
sub enc { my ( $self, $str ) = @_; utf8::decode($str); return $str; }
それを
./lib/MyApp.pm
に挿入します。
./lib/MyApp.pm
、
perl
からこの関数を呼び出すことができます。
$c->stash->{field} = $c->enc($data);
TTの場合 :
[% c.enc(list.field) %]
TTがフィルターを作成する別の方法があります。 これを行うには、ビュー構成
./lib/MyApp/View/HTML.pm
FILTERS
を定義します
__PACKAGE__->config( TEMPLATE_EXTENSION => '.tt', INCLUDE_PATH => [ MyApp->path_to('root', 'base'), ], render_die => 1, FILTERS => { enc => sub { utf8::decode($_[0]); $_[0]; }, } );
フィルターは次の方法で呼び出されます。
[% list.field | enc %]
ただし、データとdbiを使用する場合は、BAGが使用されます。
Javascript
まず第一に、できればロード可能なファイルの形式でラッパー関数を追加する必要があります。
function loc(str) { if ( (typeof(locale) === 'undefined') || (typeof locale[str] === 'undefined') ) return str; return locale[str] }
翻訳されたローカリゼーションデータの読み込みをページタイトルに追加します
... <script src="[% c.uri_for_static('json/') _ c.language _ '.po.json' %]" type="text/javascript"></script> </head>
ローカライズファイルの編集は2段階で行われます
./lib/MyApp/I18N
、。/
./lib/MyApp/I18N
/
./lib/MyApp/I18N
/
./lib/MyApp/I18N
ローカライズファイルを編集します。
update_po.sh
再度呼び出して、。
./root/static/json/[lang].po.json
ファイルを更新します。
PS:
この記事では、Catalystでのプロジェクトローカリゼーションの問題のごく一部を取り上げますが、始めるには十分です。