Catalyst MVCフレームワークを使用して記述されたプロジェクトのローカライズ

Catalyst Webフレームワーク 他のWeb開発ツールよりもPerlの利点を研究し、証明している絶望的な同志がまだいるとします。 それらの中でさらにまれなのは、ロシア語で文書が不足することを恐れずにCatalystフレームワークを評価した人たちです。 この投稿に興味のある人は、新しいプロジェクトを作成し、 View TTに追加し、不足している詳細をCPANインストールする方法に既に精通していると思います。

手芸とプログラムを区別する最も重要な要素の1つは、そのローカライズだと思います。 このため、イデオロギーを研究した後、新しいプラットフォームの研究を開始し、ローカライズのメカニズムを見つけました。

Perlはgettext意味しますが、それほど単純ではありません。 練習に移りましょう。

プロジェクトの準備


まず、新しいプロジェクトを作成するか、 MyApp既存のプロジェクトを開きMyApp 。 MojoMojoプロジェクトからupdate_po.shスクリプトを取得して、プロジェクトの./scriptます。 このスクリプトが適切になるには、次の操作を行う必要があります。著者が誰もそれに反対しないことを願っています。

ファイル全体でMOJOMOJO_DIRPROJECT_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/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', }, ... 

そしてプラグイン宣言でI18NUnicodeを追加し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 

記事の冒頭で説明したスクリプトでそれらを埋めます。
  $ ./script/update_po.sh ru de 
エラーがある場合、不足しているモジュールをCPANでロードします。

次に、「ネイティブ」の例を使用してこれらのファイルを編集します。
 "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.pmperlからこの関数を呼び出すことができます。
  $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でのプロジェクトローカリゼーションの問題のごく一部を取り上げますが、始めるには十分です。

Source: https://habr.com/ru/post/J146893/


All Articles