JTextを使ってエラー防止と多言語化

JoomlaはWordpressよりも多言語フレンドリーなCMSです。

多言語化のための言語セットや言語間スイッチャーが最初から入っています。メニューアイテム名やカテゴリー名、タグなど普通に使う多言語機能は特に気にしなくても設定できますし、オーバーライド機能を使うと設定されている翻訳を独自のものに差し替えることができます。

Joomlaの多言語ファイル

Joomlaの多言語化はコアの一機能です。

https://forum.joomla.org/viewtopic.php?t=722954

公式フォーラムの記事を見ると、

$lang =& JFactory::getLanguage();
$lang->load('com_flights',JPATH_ROOT);

というコードで呼び出されています。

一行目で、現在の言語が何かを取得し、2行目でその言語に対応したcom_flights用の設定ファイルをJPATH_ROOTのパスから読み込んでいます。

Joomlaの言語翻訳ファイル

この例では言語設定をしていない場合、en-GB.com_flights.sys.iniが読み込まれ、ない場合は次にen-GB.com_flights.sys.iniが読み込まれます。

日本語をja-JPで設定していて日本語で表示している場合と日本語を標準言語にしていて他の言語で設定ファイルがない場合にはja-JP.com_flights.sys.iniが呼ばれます。

最初から入っているテンプレートの設定ファイルを見ると、

; Joomla! Project
; Copyright (C) 2005 - 2017 Open Source Matters. All rights reserved.
; License GNU General Public License version 2 or later; see LICENSE.txt, see LICENSE.php
; Note : All ini files need to be saved as UTF-8

TPL_BEEZ3_POSITION_DEBUG="Debug"
TPL_BEEZ3_POSITION_POSITION-0="Search"
TPL_BEEZ3_POSITION_POSITION-10="Footer middle"
TPL_BEEZ3_POSITION_POSITION-11="Footer bottom"
TPL_BEEZ3_POSITION_POSITION-12="Middle top"
TPL_BEEZ3_POSITION_POSITION-13="Unused"
TPL_BEEZ3_POSITION_POSITION-14="Footer last"
TPL_BEEZ3_POSITION_POSITION-15="Header"
TPL_BEEZ3_POSITION_POSITION-1="Top"
TPL_BEEZ3_POSITION_POSITION-2="Breadcrumbs"
TPL_BEEZ3_POSITION_POSITION-3="Right bottom"
TPL_BEEZ3_POSITION_POSITION-4="Left middle"
TPL_BEEZ3_POSITION_POSITION-5="Left bottom"
TPL_BEEZ3_POSITION_POSITION-6="Right top"
TPL_BEEZ3_POSITION_POSITION-7="Left top"
TPL_BEEZ3_POSITION_POSITION-8="Right middle"
TPL_BEEZ3_POSITION_POSITION-9="Footer top"
TPL_BEEZ3_XML_DESCRIPTION="Accessible site template for Joomla! 3.x. Beez3, the HTML5 version."

PHPなどではなく、普通に羅列されているだけです。

JFactory::JText

この設定ファイルの内容を上記のgetLanguageとloadで呼び出した後に使える機能がJTextです。

インスタンスを使わずに、

JText::_("TPL_BEEZ3_XML_DESCRIPTION")

とJText::__()関数を呼び出すと上の設定ファイルが呼ばれた場合には

Accessible site template for Joomla! 3.x. Beez3, the HTML5 version.

が返り値に入ります。

資料

https://docs.joomla.org/Specification_of_language_files http://www.inmotionhosting.com/support/edu/joomla-3/languages/overrides http://www.inmotionhosting.com/support/edu/joomla-3/languages/language-files https://www.yireo.com/tutorials/joomla/joomla-programming/721-load-a-custom-language-file-in-your-joomla-template https://api.joomla.org/cms-2.5/classes/JLanguage.html#method_getProperties https://docs.joomla.org/Formatted_fields_in_language_translation_strings

JTextの使い道

普通に使っているだけだとあまり関係ないのですが、テンプレートファイルをいじる場合などは重宝することがあります。

JTextの呼び分け

JText::__()で渡す文字列も関数の返り値を入れられるので、状況に応じた文字列を表示させることができます。

例えば、曜日や時間帯によって表示するあいさつ文を変えたりなどということができます。PHPファイルやJavascriptにハードコードしているのと異なり、多言語化が簡単で新しい言語にも対応させやすいのがメリットです。

JTextに数字を入れて配列の添え字に

最近使っているCCKのFlexicontentではカスタムフィールドをたくさん作れるのでいろいろな機能を作ることができますが、カスタムフィールドの呼び出しが配列の添え字を使わないとできません。

何番目に作ったカスタムフィールドなのか覚えてなどいないのと、数が増えてくるとコードが読めなくなるので、JTextを使って添え字を呼び出すようにしています。

Flexicontentで呼び出す場合、

$item = $this->item;

$item->fieldvalues[29][0]

で29番目のフィールドの設定値を取り出せるのですが、これを$item->fieldvalues[JText::__(“DO_SOMETHING”)][0]にできるので可読性が上がります。数字だと間違えないようにしてもかなりの頻度で間違いコードを書いてしまうので・・・。

Flexicontent内のテンプレートにカスタムファイルを作るときは

$cur_lang = JFactory::getLanguage();
$lang_tag = $cur_lang->getTag();
$cur_lang->load('custom',dirname(__FILE__), $lang_tag, true);

のようにすると、Flexicontentのテンプレートフォルダ内のja-JP.custom.iniを呼び出せます。

JTextの注意点

単純な機能ですが、はまると結構大変です。

PHPエラーがでない

PHPファイルではないのと、load関数がboolしか返さないし例外を出さないので、言語設定ファイルにたどり着けていないのか、文法エラーが起こっているのか、判断できません。

異常を感じたら、まず

JFactory::getLanguage()->load('');

の返り値を確認しましょう。

INIファイルの書き方

セミコロン(;)でコメントアウトし、一行に一つの定義を書きます。

TEK2TECH="nice"

のように、=を間に左に定義する変数名、右に変換される値を書きます。

以前のバージョンのJoomlaでは変数名に小文字英字が許されていましたが、今はダメなようで読み込めませんでした。が、エラーは出ずに定義されないだけになったのでよりわかりづらい結果です・・・。長い時間ハマりました。

JTextで引数をとることもでき、””内で%s、%uのように書けば変換できます。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする