Actions

開発者エリア/言語ストリング: Difference between revisions

From Mahara Wiki

 
(260 intermediate revisions by the same user not shown)
Line 1: Line 1:
作成中です - [[User:Mits|mits]] ([[User talk:Mits|talk]])
国際化 (i18n) およびローカライゼーション (l10n) の目的のため、Maharaでユーザに表示されるストリングすべてはコードに直接記述されるのではなく、「言語ストリング」に保存された上で'''get_string($identifier, $section)'''関数により表示されます。この関数は外国語の'''言語パック'''がインストールされているか確認します。また、'''カスタム言語ファイル'''が存在するか確認して存在する場合、そのストリングを使用します。そうでない場合、コア言語ファイルに戻ります。


For internationalization (i18n) and localization (l10n) reasons, all strings that are displayed to the user in Mahara are stored in "lang strings" and printed via the '''get_string($identifier, $section)''' function, rather than being placed directly in the code. This function will check to see if the user has any foreign language '''langpacks''' instealled, or any '''custom lang files''', and will use the string from those if present. Otherwise, it will fall back to the core lang files.
=== PHPでのget_string()の使用方法 ===


=== How to use get_string() in PHP ===
関数get_string()には以下のパラメータがあります:


The function get_string() takes these parameters:
* '''identifier''': 言語ストリング名です。セクション内ではユニークです。identifierはPHP配列キーとして受け入れられるべきです。慣習により言語ストリング名は英語コンテンツと同じものであり、すべてスペースなしの半角英字です。ストリングの正確な表現の代わりにストリングの目的をストリング名として使用できます。
* '''section''': 言語ストリングが存在するファイルです。これは技術的に任意です。無視された場合、多くの一般的なコアストリングを含むデフォルトの「mahara」セクションが割り当てられます。
** 例:
*** admin: コアの「admin」セクション用です。
*** artefact.blog: 「blog」アーティファクトプラグイン用です。
*** theme.primaryschool: 「primaryschool」テーマ用です。
* '''params''': (任意) 言語ストリングには1つまたはそれ以上の[http://nz1.php.net/sprintf sprintf()]パラメータを含めます。言語ストリング内に存在する場合、get_string()がコールされて使用するストリングを配置するためにパラメータ値との合致が要求されます。パラメータは異なる語順の言語への翻訳時に役立ちます。


* '''identifier''': The name of the lang string, unique within its section. The identifier must be acceptable as a PHP array key. By convention, it's often the same as the English contents of the string, in all lowercase without spaces. Alternately, it can represent the purpose of the string rather than the exact wording of the string.
''':'''
* '''section''': The file that the lang string lives in. This is technically optional; if left off, it will default to "mahara", a section that contains many common core strings.
** Examples:
*** 'admin': For the core "admin" section
*** 'artefact.blog': For the "blog" artefact plugin
*** 'theme.primaryschool': For the "primaryschool" theme
* '''params''': (Optional) A lang string can contain one or more [http://nz1.php.net/sprintf sprintf()] params. If present in the lang string, matching param values will be expected from the get_string() call that uses the string, and will be placed in. Params are helpful for translation into languages with different word orders.


'''Examples:'''
<syntaxhighlight lang="php">
$yesstr = get_string('yes');                    // lang/en.utf8/mahara.php
$clamstr = get_string('pathtoclam', 'admin');    // lang/en.utf8/admin.php
$blogstr = get_string('blog', 'artefact.blog');  // artefact/blog/lang/en.utf8/artefact.blog.php
$copyrightstr = get_string('feedrights','artefact.blog', $USER->displayname); // パラメータ付き言語ストリング


<source lang="php" enclose="div">
// 複数形ストリング。最初の変数は複数形アイテムの数です。get_stringは単一または複数のどちらを使うか決定するために変数を使用します (英語以外の言語では2つ以上の複数形が存在する場合があります)
$yesstr = get_string('yes');                    // lives in lang/en.utf8/mahara.php
$clamstr = get_string('pathtoclam', 'admin');    // lives in lang/en.utf8/admin.php
$blogstr = get_string('blog', 'artefact.blog');  // lives in artefact/blog/lang/en.utf8/artefact.blog.php
$copyrightstr = get_string('feedrights','artefact.blog', $USER->displayname); // Lang string with one param
 
// A pluralizable string. The first argument is the count of pluralizable items; get_string will use this
// to determine whether to use the singular or plural (or which plural, in non-English languages with more than one plural form)
$updatefilesstr = get_string('updatednfiles', 'mahara', 5);
$updatefilesstr = get_string('updatednfiles', 'mahara', 5);
</source>
</syntaxhighlight>


=== How to use lang strings from a Dwoo template ===
=== Dwooテンプレートからの言語ストリング使用方法 ===


You can also access lang strings from inside Dwoo templates, with the {str} tag:
あなたは {} タグを使ってDwoテンプレート内部から言語ストリングにもアクセスできます:


<source lang="smarty" enclose="div">
<syntaxhighlight lang="smarty">
{str tag='identifier' section='section' arg1='first param value' arg2='second param value'}
{str tag='identifier' section='section' arg1='first param value' arg2='second param value'}
</source>
</syntaxhighlight>


The code that makes this work is in htdocs/lib/dwoo/mahara/plugins/function.str.php
これを動作させるコードは次のとおりです: htdocs/lib/dwoo/mahara/plugins/function.str.php


=== How to use lang strings from Javascript ===
=== JavaScriptからの言語ストリングの使用方法 ===


==== Pre-fetched ====
==== プリフェッチ ====
You can even use lang strings in Javascript. First, you have to preload them into the page by providing a $pagestrings argument to the smarty() function...
あなたはJavaScriptにも言語ストリングを使用できます。最初にsmarty()関数に$pagestrings変数を渡して言語ストリングを読み込んでください ...


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
// Providing a $pagestrings variable to smarty()
// Providing a $pagestrings variable to smarty()
$pagestrings = array(
$pagestrings = array(
Line 52: Line 49:
     'mahara' => array('yes')
     'mahara' => array('yes')
);
);
</source>
</syntaxhighlight>


... and then, you can access them from Javascript using the Javascript get_string() function, which is similar to the PHP get_string(), except that it leaves out the "section". (NOTE: This means you can't include two language strings with the same identifier and different sections.) It also only accepts substitution params of type "%s".
... そして、次にJavaScriptのget_string()関数を使用して言語ストリングにアクセスできます。これは「section」セクションを除外する以外、PHPのget_string()に似ています (注意: これはあなたが2つの言語ストリングを同じIDで異なるセクションに含めないことを意味します)。また、「%s」タイプの置換パラメータのみ受け付けます。


<source lang="html4strict" enclose="div">
<syntaxhighlight lang="html4strict">
<script type="text/javascript">
<script type="text/javascript">
     alert(get_string('yes'));
     alert(get_string('yes'));
     confirm(get_string('discardpageedits', 'first param value'));
     confirm(get_string('discardpageedits', 'first param value'));
</script>
</script>
</source>
</syntaxhighlight>


A number of Javascript strings are also hard-coded to be always available via get_string() in Javascript, if certain Javascript files are included by Dwoo. See the function "jsstrings()" in "htdocs/lib/web.php" for this list.
特定のJavaScriptファイルがDwooに含まれる場合にJavaScriptのget_string()で多くのJavaScriptストリングを常に使用できるようハードコードされています。このリストに関して「htdocs/lib/web.php」の関数「jsstrings」をご覧ください。


==== Dynamically fetched via AJAX ====
==== AJAX経由で動的に取得する ====


As of Mahara 15.10, you can also fetch language strings dynamically, via Ajax. Just use the '''get_string_ajax()''' function. Unlike pre-fetched language strings, dynamically fetched strings ''can'' include a section parameter, and other parameters. This function will cache the results for each get_string_ajax() request.
Mahara 15.10現在、あなたはAjax経由で動的に言語ストリングを取得できます。'''get_string_ajax()'''関数を使用してください。事前に取得した言語ストリングとは異なり、動的に取得したストリングにはセクションパラメータおよび他のパラメータを含めます。この機能はget_string_ajax()リクエストごとの結果をキャッシュします。


This function works asynchronously, so it is '''not''' suitable for use in alert() and confirm() calls. The function itself returns a placeholder &lt;span&gt; tag with a unique ID, which gets replaced by the evaluated string when the AJAX call comes back. So if you tried to use it directly in an alert(), confirm(), or other immediate-output method, the user will see the placeholder instead of the result string.
この関数は非同期に動作するため、alert()およびconfirm()のコールには'''適していません'''。関数自体はユニークIDを含む&lt;span&gt;タグのプレースホルダを返します。プレースホルダはAJAXコールが戻った際に評価されたストリングと置換されます。そのため、あなたが直接alert()、confirm()またはその他の即時出力メソッドを使用する場合、ユーザには結果のストリングではなく、プレースホルダが表示されます。


<source lang="html4strict" enclose="div">
<syntaxhighlight lang="html4strict">
<script type="text/javascript">
<script type="text/javascript">
     // CORRECT! Insert the return value into HTML on the page.
     // 正解! ページのHTMLに戻り値を挿入します
     var noresults = get_string_ajax('noresultsfound', 'mahara');
     var noresults = get_string_ajax('noresultsfound', 'mahara');
     jQuery('#notice').html('<p class="no-results">' + noresults + '</p>');
     jQuery('#notice').html('<p class="no-results">' + noresults + '</p>');


     // WRONG! Your user will see '<span id="str790709789087"></span>' in the alert box.
     // 不正解! あなたのユーザの警告ボックスに「<span id="str790709789087"></span>」が表示されます。
     alert(get_string_ajax('cannotremove', 'auth'));
     alert(get_string_ajax('cannotremove', 'auth'));
</script>
</script>
</source>
</syntaxhighlight>


=== Anatomy of a lang file ===
=== 言語ファイルの構造 ===


A lang will be named '''{section}.php''', where "section" is the section value to pass to get_string(). It will contain a series of lines adding keys to an array called "$string". Like all Mahara library files, it should begin by checking the [[Developer_Area/Pagetop_Constants#INTERNAL|INTERNAL constant]] to prevent direct access from a web browser.
言語ファイルは'''{section}.php'''のように名前付けされます。ここでの「section」はセクション値としてget_string()に渡されます。これには「$string」と呼ばれる配列にキーを追加するための一連の行が含まれます。すべてのMaharaライブラリファイルのようにウェブブラウザからのアクセスを防ぐため、[[Developer_Area/Pagetop_Constants#INTERNAL|内部定数]]のチェックから始めてください。
 
<syntaxhighlight lang="php">
<source lang="php" enclose="div">
<?php  
<?php  
defined('INTERNAL') || die();
defined('INTERNAL') || die();


$string['changepassworddesc'] = 'New password';
$string['changepassworddesc'] = '新しいパスワード';
$string['changepasswordotherinterface'] = 'You may change your password through a different interface.';
$string['changepasswordotherinterface'] = 'あなたは異なるインターフェースでパスワードを変更できます。 ';
$string['oldpasswordincorrect'] = 'This is not your current password.';
$string['oldpasswordincorrect'] = 'これはあなたの現在のパスワードではありません。';


// A pluralizable string. In English, the single should be mapped to key 0, the plural to key 1. For other languages, it depends on the
// 複数形ストリングです。英語では単数形はキー「0」にマップしてください。他の言語ではlangconfig.php内のpluralfunctionで定義しているキーにマップしてください。
// pluralfunction defined in their langconfig.php
$string['updatednfiles'] = array(
$string['updatednfiles'] = array(
     0 => 'You have updated %s file.',
     0 => 'あなたは %s ファイルを更新しました。',
     1 => 'You have updated %s files.',
     1 => 'あなたは %s ファイルを更新しました。',
);
);
</source>
</syntaxhighlight>


=== Plural strings ===
=== 複数形ストリング ===
正確には'''加算可能ストリング'''と読んだ方が良いのかもしれません。英語には2つの複数形があります: 単数形 (1つ) および複数形 (2つ以上)。他の言語には複数の複数形があります。例えばスロベニア語の場合、あなたが1つ、2つまたは3つ以上を持つかにより単語の語尾が異なる2通りの複数形があります。


Or maybe it'd be more accurate to call these '''countable strings'''. In the English language we have only two plural forms: singular (one) and plural (more than one). Other languages have multiple plural forms. For instance Slovenian has a dual plural form, which means that you use a different word ending depending on whether you have one, two, or more than two.
英語とは異なる複数形を持つ言語を翻訳できるようにしたい場合、「あなたには 3 つのブログがあります/あなたには 1 つのブログがあります」のように数字でカウントできる特別な構文のストリングがあります。


To allow translations into languages with different pluralization schemes than English, there's a special syntax that should be followed for strings that have words that might be pluralized with a numeric count, such as "You have 3 blogs"/"You have 1 blog".
まず、get_string()を使用する場合、第1カスタムパラメータとしてストリングのアイテムカウント数を渡してください:


First, when using get_string(), pass the count of items in the string, as the first custom param to the string:
<syntaxhighlight lang="php">
 
<source lang="php" enclose="div">
get_string('fileattachedportfolioitems', 'artefact.file', $numitems);
get_string('fileattachedportfolioitems', 'artefact.file', $numitems);
</source>
</syntaxhighlight>


Then, in the lang file, you make the string an array. In English, the array item with key 0 should be the singular form of the string, while the array item with key 1 should be the plural.
次に言語ファイルでストリング配列を作成してください。英語の場合、キーが「0」の配列のアイテムは単数形のストリング、キーが「1」の配列のアイテムは複数形となります。
 
<syntaxhighlight lang="php">
<source lang="php" enclose="div">
$string['fileattachedtoportfolioitems'] = array(
$string['fileattachedtoportfolioitems'] = array(
     0 => 'This file is attached to one other item in your portfolio.',
     0 => 'このファイルはあなたのポートフォリオの 1 の他のアイテムに添付されています。',
     1 => 'This file is attached to %s other items in your portfolio.',
     1 => 'このファイルはあなたのポートフォリオの %s の他のアイテムに添付されています。',
);
);
</source>
</syntaxhighlight>
 
This syntax allows for other languages with different pluralization structures than English. Each language's langconfig.php includes a pluralfunction, which determines what key it will return for the count number. English returns either 0 for singular, or 1 for plural. Other languages may return more or fewer keys. So, the same string in another langpack might look like this:


<source lang="php" enclose="div">
この構文により、英語とは異なる複数形を持つ他の言語を実装できます。それぞれの言語にはどのキーがカウント数を返すか決定するpluralfunction関数を含むlangconfig.phpファイルがあります。英語では単数形に「0」、複数形に「1」を返します。恐らく、他の言語はさらに多いまたは少ないキーを返すと思われます。そのため、別の言語パックの同じストリングは以下のようになります:
<syntaxhighlight lang="php">
$string['fileattachedtoportfolioitems'] = array(
$string['fileattachedtoportfolioitems'] = array(
     0 => 'Ta datoteka je pripeta k %s drugemu elementu v vašem listovniku.',
     0 => 'Ta datoteka je pripeta k %s drugemu elementu v vašem listovniku.',
Line 132: Line 124:
     3 => 'Ta datoteka je pripeta k %s drugim elementom v vašem listovniku.',
     3 => 'Ta datoteka je pripeta k %s drugim elementom v vašem listovniku.',
);
);
</source>
</syntaxhighlight>


See [[Language Packs/Plural forms]] and https://bugs.launchpad.net/mahara/+bug/901051 for more information.
詳細は[[Language Packs/Plural forms]]および https://bugs.launchpad.net/mahara/+bug/901051 をご覧ください。


The count parameter must be the first parameter. If you don't want it to be printed first in the string, use a [http://nz2.php.net/manual/en/function.sprintf.php#example-4957 sprintf position specifier] to move it around:
カウンタパラメータは最初のパラメータにしてください。あなたがカウンタパラメータをストリングの最初に表示したくない場合、[http://nz2.php.net/manual/en/function.sprintf.php#example-4957 sprintf位置指定子]で移動してください:


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
$string['setprobationpoints'] = array(
$string['setprobationpoints'] = array(
     0 => 'Set probation points to %2$d for %1$d user.',
     0 => 'Set probation points to %2$d for %1$d user.',
     1 => 'Set probation points to %2$d for %1$d users.';
     1 => 'Set probation points to %2$d for %1$d users.';
);
);
</source>
</syntaxhighlight>
 
'''Note:''' Mahara contains quite a few old plural strings which don't follow this format. It'd be great if you can fix them when you find them. The corrected string should use a different name than the old one, so that translators will be prompted to translate it. Only remove the old string once you've removed all references to it from the core code.


=== Mahara lang strings are sprintf() format strings ===
'''メモ:''' Maharaにはこのフォーマットに従わない古い複数形ストリングが相当数含まれます。あなたが古い複数形ストリングを見つけた時に直してくれると助かります。翻訳者に分かりやすくするため、正しいストリングには古いストリングとは異なるストリング名を使用してください。あなたが古いストリングのすべての参照を削除できた場合のみ、古いストリングを削除してください。


The reason we use "%s" as a placeholder, is because every Mahara language string is passed through the PHP [http://php.net/manual/en/function.sprintf.php sprintf()] function before printing. In other words, Mahara language strings are actually sprintf() format strings!
=== Mahara言語ストリングはsprintf()フォーマットストリングです ===


You can see the full sprintf() format syntax [http://php.net/manual/en/function.sprintf.php#refsect1-function.sprintf-parameters here], but there only a few things you need to know:
私たちが「%s」をプレースホルダとして使用する理由はMahara言語ストリングが表示前にPHPの[http://php.net/manual/en/function.sprintf.php sprintf()]関数で渡されるからです。言い換えれば、Mahara言語ストリングは実際にはsprintf()フォーマットストリングです!


==== Escape a literal "%" as "%%" ====
詳細なsprintf()フォーマット文法は[https://www.php.net/manual/en/function.sprintf.php#refsect1-function.sprintf-parameters ここで]確認できますが、あなたが知る必要のある内容は以下の少しだけです:


If you need to print the percent character "%" in a language string, you have to escape it by putting two percents "%%" instead.
==== 直定数「%」を「%%」としてエスケープする ====


<source lang="php" enclose="div">
言語ストリングにパーセンテージ文字 (%) を表示したい場合、あなたは代わりに2文字のパーセント (%%) でエスケープする必要があります。
$string['onehundredpercentcorrect'] = 'You are 100%% correct!';
</source>


==== You can use "%s" for most placeholders ====
<syntaxhighlight lang="php">
$string['onehundredpercentcorrect'] = 'あなたは 100%% 正しい!';
</syntaxhighlight>


When you're writing a language string with a placeholder, most of the time you can get away with using "%s", which tells sprintf() to format the value as a string. PHP will sensibly auto-cast most values appropriately for this.
==== あなたはほとんどのプレースホルダに「%s」を使用できます ====


<source lang="php" enclose="div">
あなたがプレースホルダを使用した言語ストリングを記述している場合、多くの場合、sprintf()に値をストリングとしてフォーマットするように伝える「%s」で切り抜けられます。PHPはほとんどの値を適切にオートキャストします。
$string['mynameis'] = 'Hi, my name is %s!';
</source>


==== For decimal point number placeholders... ====
<syntaxhighlight lang="php">
$string['mynameis'] = 'こんにちは、私の名前は %s です!';
</syntaxhighlight>


The main exception to using "%s" is if you need to print a decimal number in a placeholder, especially if it should have a certain number of decimal points. In that case, you can use "%" followed by ".", followed by the number of decimal points, followed by "F".
==== 小数点のプレースホルダに関して ... ====
%s」を使用する主な例外はプレースホルダに小数を表示する必要がある場合で特に小数点以下の数を表示する必要がある場合です。
この場合、あなたは「%」の後に「.」を続けて小数点以下を「F」にできます。


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
$string['twodecimalpoints'] = 'This number has two decimal points: %.2F';
$string['twodecimalpoints'] = 'この数字には小数点以下2桁あります: %.2F';
$string['threedecimalpoints'] = 'This number has three decimal points: %.3F';
$string['threedecimalpoints'] = 'この数字には小数点以下3桁あります: %.3F';
</source>
</syntaxhighlight>


Although in many cases it may be less error-prone to just handle this on the PHP side of things. That is, instead of passing a decimal number to get_string(), make your script round and/or format the number and cast it to a string, and then send that already-formatted number string to get_string().
多くの場合、これをPHP側のみで処理した方がエラーの発生は少ないように思えますが。つまり、10進数をget_string()に渡すのではなく、 スクリプトで数値を丸めたり整形したりして文字列にキャストした後、その整形済み数値の文字列をget_string()に送信してください。


=== Where the lang files are ===
=== 言語ファイルはどこに? ===


* '''Core''' lang files live under <tt>$cfg->dirroot/lang/en.utf8/{section}.php</tt>
* '''コア''' 言語ファイルは<tt>$cfg->dirroot/lang/en.utf8/{section}.php</tt>のように配置されます。
* '''Plugin''' lang files live under <tt>$cfg->dirroot/{plugintype}/{pluginname}/lang/en.utf8/{plugintype}.{pluginname}.php</tt>
* '''プラグイン''' 言語ファイルは<tt>$cfg->dirroot/{plugintype}/{pluginname}/lang/en.utf8/{plugintype}.{pluginname}.phpのように配置されます。
** Note that the "section" for a plugin when invoking it in get_string(), is "{plugintype}.{pluginname}". For example: "artefact.blog", "import.leap2a", "blocktype.contactinfo"
** プラグインをget_string()で呼び出す場合、プラグインの「セクション」は「{plugintype}.{pluginname}」のようになることに留意してください。例えば次のようになります: 「artefact.blog」「import.leap2a」「blocktype.contactinfo」
** Subplugins, such as a blocktype that belongs to an artefact, live under <tt>{$cfg->dirroot}/artefact/{pluginname}/blocktype/{blockname}/lang/en.utf8/blocktype.{blockname}.php</tt> and have "blocktype.{blockname}" as their section.
** アーティファクトに属するblocktypeのようなサブプラグインは<tt>{$cfg->dirroot}/artefact/{pluginname}/blocktype/{blockname}/lang/en.utf8/blocktype.{blockname}.php</tt>のように配置されます。また、セクションは「blocktype.{blockname}」のようになります。
* '''Theme''' lang files live under <tt>$cfg>->dirroot/theme/{themename}/lang/en.utf8/theme.{themename}.php</tt>
* '''テーマ''' 言語ファイルは<tt>$cfg>->dirroot/theme/{themename}/lang/en.utf8/theme.{themename}.php</tt>のように配置されます。
** The "section" for a theme when invoking it in get_string(), is "theme.{themename}". For example: "theme.raw", "theme.primaryschool"
** get_string()をコールする場合の「セクション」は「theme.{themename}」です。例えば次のようになります: 「theme.raw」, 「theme.primaryschool」
* '''Foreign language''' langpacks are installed into your dataroot directory: <tt>$cfg->dataroot/langpacks/{langcode}</tt>
* '''外国語''' 言語パックはあなたのdatarootディレクトリにインストールされます: <tt>$cfg->dataroot/langpacks/{langcode}</tt>
** {langcode} will be the code for the language. For example "pt.utf8", "es.utf8", "en_US.utf8" etc
** {langcode} は言語コードです。例えば次のようになります: 「pt.utf8」, 「es.utf8」, 「en_US.utf8」
* '''Local''' lang files live under <tt>$cfg->dirroot/local/lang/{langcode}/{section}.php</tt>
* '''ローカル''' 言語ファイルは<tt>$cfg->dirroot/local/lang/{langcode}/{section}.php</tt>配下に配置されます。


=== Translations ===
=== 翻訳 ===


The main point of this system is to allow for Mahara to be translated. See the "langpacks" documentation for more on that. Basically, you download a langpack from langpacks.mahara.org, unzip it, and put it in $cfg->dataroot/langpacks/. Then, users are presented with a language selection menu at the login screen.
このシステムの最大のポイントはMaharaを翻訳できるようにすることです。詳細は「言語パック」ドキュメンテーションをご覧ください。基本的にはあなたがlangpacks.mahara.orgからダウンロードした言語パックを展開して「$cfg->dataroot/langpacks/」ディレクトリ内に入れてください。ユーザのログイン画面に言語選択メニューが表示されます。


If a particular lang string is not present in the langpack, then the English language string from Mahara core is used, unless the language specifies a parent language and the parent language's langpack is installed.
もし、特定の言語ストリングが言語パックに存在しない場合、言語が指定した親言語パックがインストールされていない限り、Maharaコアの英語言語ストリングが使用されます。


=== langconfig.php ===
=== langconfig.php ===


Languages contain a small amount of configuration data. This goes in a "langconfig.php" core lang file. The following values are the most important:
言語には少ない量の設定データが含まれます。これはコア言語ファイル「langconfig.php」内にあります。以下の値は最も重要です:


* '''thislanguage''': The name of the language, in the language. This is displayed in the language selection menu that users see.
* '''thislanguage''': 言語の言語名です。これはユーザの言語選択メニューに表示されます。
* '''locale''': A list of computer locale strings which this language matches. See the other lang packs for an idea of what these should look like.
* '''locale''': この言語に合致するコンピュータのロケールストリング一覧です。これらがどのようなものであるかに関して他の言語パックを参照してください。
* '''parentlanguage''': (Optional) If this is supplied, then for untranslated strings Mahara will attempt to find a translation in the parent language (if it's installed).
* '''parentlanguage''': (任意) これが提供された場合、未翻訳のMaharaストリングは親言語の翻訳を探します (親言語がインストールされている場合)
* '''pluralization''':
* '''pluralization''':
** See the [[Developer_Area/Language_strings#Plural_strings|plural strings]] API.
** 詳細は[[Developer_Area/Language_strings#Plural_strings|ストリングの複数形 (英語)]] APIをご覧ください。
** For langpacks converted from PO Format, these values will be automatically generated if you include a "Plural-Forms:" header
** 言語パックがPOフォーマットが変換された場合、また、あなたが「Plural-Forms:」ヘッダを入れている場合、これらの値は自動的に生成されます。
** '''pluralfunction''': The name of a PHP function that will indicate which pluralization rule should be used for a given count. This function should take exactly one integer argument (the count of items) and will return a key which indicates which pluralization form should be used. For instance for English, the rule returns a "0" if the count is one, and a "1" if the count is anything else. All the lang files for the language will then define their plural strings as arrays, with a value for each possible key this function can return.
** '''pluralfunction''': 与えられたカウントに対してどの複数形ルールを使用すべきかを示すPHP関数名です。この関数は正確に1つの整数の引数 (アイテム数) を取得してどの複数形を使用すべきかを示すキーを返します。例えば英語の場合、ルールはカウントが1の場合「0」、それ以外の場合「1」を返します。言語のすべての言語ファイルは複数の文字列を配列として定義します。この配列では関数が返せる可能性のあるそれぞれのキーに対応する値を持つこととなります。
** '''pluralrule''': The Javascript equivalent of pluralfunction. This should be a snippet of Javascript that will evaluate an integer stored in the variable "n", and will return exactly the same value as the pluralfunction if it received n as its argument.
** '''pluralrule''': pluralfunctionに相当するJavaScriptの関数です。これは変数「n」に格納されている整数を評価および「n」を引数として受け取った場合の複数関数と全く同じ値を返すJavaScriptのスニペットである必要があります。


=== /local のカスタム言語ストリング ===
=== /localのカスタム言語ストリング ===
Custom lang strings in /local
/local」ディレクトリのカスタム言語ストリング


Many Mahara installations may wish to overwrite only a few lang strings. The easiest way to do this is to create custom lang files under the /local directory. If present, the strings in these files will take priority over strings in the core lang files or langpack lang files.
多くのMaharaインストレーションではいくつかの言語ストリングのみ上書きしたい場合もあることでしょう。最も簡単なのは「/local」ディレクトリにカスタム言語ファイルを作成する方法です。カスタム言語ファイルが存在する場合、これらのファイルのストリングはコアの言語ファイルまたは言語パックの言語ファイルのストリングに優先されます。


Custom lang files don't need to translate 100% of the lang file they're over-riding. They can contain as few strings as you to care to actually override.
カスタム言語ファイルではオーバーライド対象の言語を100%翻訳する必要はありません。あなたが実際にオーバーライドしたいストリングのみカスタム言語ファイルに含めます。


'''Example:'''
''':'''


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
<?php
<?php
// This file lives under /var/www/mahara/local/lang/en.utf8/mahara.php
// This file lives under /var/www/mahara/local/lang/en.utf8/mahara.php
Line 227: Line 219:
$string['yes'] = 'Yessir!';
$string['yes'] = 'Yessir!';
$string['login'] = 'Sign in!";
$string['login'] = 'Sign in!";
</source>
</syntaxhighlight>


You can place foreign language files, and plugin language files under local/lang as well. These are all acceptable:
あなたは外国語ファイルおよびプラグイン言語ファイルを「local/lang」にも配置できます。以下すべて可能です:


* local/lang/en.utf8/mahara.php
* local/lang/en.utf8/mahara.php
Line 236: Line 228:
* local/lang/mi.utf8/theme.primaryschool.php
* local/lang/mi.utf8/theme.primaryschool.php


=== Concatenation is bad for translation ===
=== 翻訳の連結は好ましくありません ===


Because word orders are different in different languages, when possible you should avoid concatenating lang strings together. You should either use lang string parameters, or just use multiple language strings.
異なる言語では単語の順序が異なるため、可能な限り言語ストリングの連結は避けるべきです。言語ストリングのパラメータを使用するか、複数言語文字列を使用してください。


'''BAD:'''
'''悪い:'''


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
<?php
<?php
// Works okay for English, but what about Spanish, where the adjective should follow the noun?
// 英語では問題ありませんが、形容詞が名詞の後に続くべきスペイン語ではどうでしょう?
$yellowdogstr = get_string('yellow') . " " . get_string('dog');
$yellowdogstr = get_string('yellow') . " " . get_string('dog');
$greendogstr = get_string('green') . " " . get_string('dog');
$greendogstr = get_string('green') . " " . get_string('dog');
</source>
</syntaxhighlight>


'''BETTER:'''
'''良い:'''


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
<?php
<?php
// English: $string['coloreddog'] = '%s dog';
// 英語: $string['coloreddog'] = '%s dog';
// Spanish: $string['coloreddog'] = 'perro %s';
// 英語: $string['coloreddog'] = 'perro %s';
$yellowdogstr = get_string('coloreddog', 'artefact.dog', get_string('yellow'));
$yellowdogstr = get_string('coloreddog', 'artefact.dog', get_string('yellow'));
$greendogstr = get_string('coloreddog', 'artefact.dog', get_string('green'));
$greendogstr = get_string('coloreddog', 'artefact.dog', get_string('green'));
</source>
</syntaxhighlight>


'''BEST:'''
'''最良:'''


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
<?php
<?php
// In some languages, the word for "dog" might change when it's paired with yellow, or the word
// 一部の言語では「yellow」と組み合わせられた場合に「dog」が変わったり、「dog」と組み合わせられた場合に「yellow」が変わります。
// for yellow might change when paired with dog
// 英語: $string['dogyellow'] = 'yellow dog';
// English: $string['dogyellow'] = 'yellow dog';
// スペイン語: $string['dogyellow'] = 'perro amarillo';
// Spanish: $string['dogyellow'] = 'perro amarillo';
// オーストラリア英語: $string['dogyellow'] = 'dingo';
// Australian English: $string['dogyellow'] = 'dingo';
$yellowdogstr = get_string('dogyellow');
$yellowdogstr = get_string('dogyellow');
$greendogstr = get_string('doggreen');
$greendogstr = get_string('doggreen');
</source>
</syntaxhighlight>


And on a similar note, definitely don't concatenate word parts together.
そして、似たようなことですが、もちろん、単語のパーツを連結しないてください。


'''BAD:'''
'''悪い:'''


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
<?php
<?php
$blogstr = get_string('blog', 'artefact.blog');
$blogstr = get_string('blog', 'artefact.blog');
$pluralblog = get_string('blog', 'artefact.blog') . get_string('s');
$pluralblog = get_string('blog', 'artefact.blog') . get_string('s');
</source>
</syntaxhighlight>


'''GOOD:'''
'''良い:'''


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
<?php
<?php
$blogstr = get_string('blog', 'artefact.blog');
$blogstr = get_string('blog', 'artefact.blog');
$pluralblog = get_string('blogs', 'artefact.blog');
$pluralblog = get_string('blogs', 'artefact.blog');


// Or if you've got a specific number of blogs, use the plural strings API
// また、ブログの数が決まっている場合、複数ストリングのAPIを使用してください。
 
$numblogs = get_blog_count();
$numblogs = get_blog_count();
$blogstr = get_string('nblogs', 'artefact.blog', $numblogs);
$blogstr = get_string('nblogs', 'artefact.blog', $numblogs);
</source>
</syntaxhighlight>


This approach has the downside of leading to a proliferation of language strings, but unfortunately it's the only way to achieve clean translations among different languages with wildly different grammars.
この方法には言語ストリングが増えてしまうという欠点がありますが、残念ながら、文法が大きく異なる言語間で美しく翻訳をするにはこの方法しかありません。


=== Alphabetize your lang files ===
=== あなたの言語ファイルをアルファベット順にする ===


From an implementation standpoint, it doesn't matter what order the lang strings are in, within a lang file. However, from a human-readability standpoint, they should be in alphabetical order by identifier.


Many developers are tempted to group them together by function, but any functional grouping scheme eventually falls apart as new strings are added which defy the classification scheme. The end result is a completely disordered file where any particular lang string could be in any place. This is how most of the lang files in Mahara core are.
実装上の観点からlangファイル内での言語ストリングの順序は問題ではありません。しかし、人間の読みやすさの観点から識別子のアルファベット順に並ぶべきです。


So just go ahead and alphabetize the lang strings, when creating a new lang file. If you want to ensure that related strings wind up next to each other, give them names that classify them by type.
多くの開発者は機能別にグループ化したくなりますが、機能別にグループ化しても分類方法を無視した新しい文字列が追加された場合、やがて破綻してしまいます。最終的な結果はどの特定の言語ストリングもどの場所にもあり得る完全に無秩序なファイルです。これがMaharaコアのほとんどの言語ファイルの状態です。


BAD:
そのため、新しい言語ファイルを作成する場合、言語文字列をアルファベット順に並べてください。もし、あなたが関連する文字列を隣り合わせになるようにしたい場合、タイプ別に分類した名前をつけてください。


<source lang="php" enclose="div">
悪い:
 
<syntaxhighlight lang="php">
<?php
<?php
// Strings are sorta grouped together by functionality, in semi-random order
// Strings are sorta grouped together by functionality, in semi-random order
Line 331: Line 324:
$string['youhaveoneblog'] = 'You have 1 journal.';
$string['youhaveoneblog'] = 'You have 1 journal.';
$string['youhaveblogs'] = 'You have %s journals.';  
$string['youhaveblogs'] = 'You have %s journals.';  
</source>
</syntaxhighlight>


GOOD:
良い:


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
<?php
<?php
// Strings are in alphabetical order by identifier
// Strings are in alphabetical order by identifier
Line 359: Line 352:
$string['youhavenoblogs'] = 'You have no journals.';
$string['youhavenoblogs'] = 'You have no journals.';
$string['youhaveoneblog'] = 'You have 1 journal.';
$string['youhaveoneblog'] = 'You have 1 journal.';
</source>
</syntaxhighlight>


=== Let translators know when lang strings change ===
=== 言語ストリング変更時に翻訳者に知らせる ===


If you make a substantial change to the content of a lang string, you should also change the name of the lang string. Normally we do this by putting (or incrementing) a number after it.
言語ストリングの内容を大幅に変更した場合、言語ストリングの名称も変更してください。通常、私たちはこれを文字列の後に数字を置く (または増加させる) ことで対応しています。


The reason for this is because the Launchpad translation interface provides no notification to translators when the English version of a string has changed. Renaming the lang string will cause it to show up as a new, untranslated string, alerting translators to its presence.
この理由はLaunchpadの翻訳インターフェースではストリングの英語版変更時に翻訳者には通知されないからです。言語ストリングの名称を変更することにより、翻訳されていない新しいストリングとして翻訳者にその存在を知らせることができます。


BEFORE:
:
<source lang="php" enclose="div">
<syntaxhighlight lang="php">
$string['namedesc'] = 'The original version of the string.';
$string['namedesc'] = 'The original version of the string.';
</source>
</syntaxhighlight>
   
   
AFTER:
:
<source lang="php" enclose="div">
<syntaxhighlight lang="php">
$string['namedesc1'] = 'The new version of the string, with content that should be reflected in all langpacks.';
$string['namedesc1'] = 'The new version of the string, with content that should be reflected in all langpacks.';
</source>
</syntaxhighlight>


Be sure to also update the name of the string in the PHP files and templates where it is used.
また、このストリングが使用されているPHPファイルおよびテンプレートのストリング名も必ず更新してください。


=== Help files ===
=== ヘルプファイル ===


Help files are a special type of lang file. They're HTML snippets (basically the contents within the <body> tag) which pop up when a user clicks on a help button.
ヘルプファイルは特殊なタイプの言語ファイルです。これはユーザがヘルプボタンをクリックしたときにポップアップするHTMLスニペット (基本的には<body>タグ内のコンテンツ) です。


They can be added in a few different ways. The main ones are:
いくつかの異なる方法でヘルプファイルを追加できます。主なものは以下のとおりです:


==== Pieforms help files ====
==== Pieformsヘルプファイル ====


They're most commonly created by adding the 'help'=>true to a pieform element definition. Pieforms will then automatically add code to pop up a help file named "help/forms/{formname}.{elementname}.html". If the form has a "pluginname" and "plugintype" field, Pieforms will look for the help file under the plugin's lang directory.
一般的にはpieform要素定義に「'help'=>true」を追加して作成します。そして、Pieformsは「help/forms/{formname}.{elementname}.html」という名称のヘルプファイルをポップアップするためのコードを自動的に追加します。フォームに「pluginname」および「plugintype」フィールドがある場合、Pieformsはプラグインの言語ディレクトリ配下のヘルプファイルを探します。


'''Example:'''
''':'''


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
// The "draft" checkbox will have a helpfile located under
// 「下書き」チェックボックスにはフォーム名「name」、「plugintype」「pluginname」および要素名をもとにディレクトリ「artefact/blog/lang/en.utf8/help/form/editpost.draft.html」にヘルプファイルがあります。
// artefact/blog/lang/en.utf8/help/form/editpost.draft.html
// because of the form's 'name', 'plugintype', 'pluginname', and the element's name.
$form = pieform(array(
$form = pieform(array(
     'name' => 'editpost',
     'name' => 'editpost',
Line 408: Line 399:
     )
     )
);
);
</source>
</syntaxhighlight>


==== Page help files ====
==== ページヘルプファイル ====


A page itself can have a helpfile as well. If the page correctly defines the "SECTION_PAGE", "SECTION_PLUGINNAME", and "SECTION_PLUGINTYPE" constants, then smarty() on setting up the page template, will call the "has_help_file()" function, which checks for the presence of a help file under "help/pages/{SECTION_PAGE}.html". If present, it will print a help button next to the page title. If SECTION_PLUGINNAME and SECTION_PLUGINTYPE are provided, it will look for the help file under the plugin's lang directory.
ページ自体にもヘルプファイルを付加できます。ページに「SECTION_PAGE」「SECTION_PLUGINNAME」「SECTION_PLUGINTYPE」の各定数が正しく定義されている場合、smarty()によるページテンプレート設定時に「has_help_file()」関数を呼び出して「help/pages/{SECTION_PAGE}.html」にヘルプファイルが存在するかどうかチェックします。ヘルプファイルが存在する場合、ページタイトルの横にヘルプボタンが表示されます。SECTION_PLUGINNAMEおよびSECTION_PLUGINTYPEが提供された場合、プラグインのlangディレクトリ配下にあるヘルプファイルを探します。


'''Example:'''
''':'''


<source lang="php" enclose="div">
<syntaxhighlight lang="php">
<?php
<?php
// Help file will be artefact/blog/lang/en.utf8/help/page/view.html  
// Help file will be artefact/blog/lang/en.utf8/help/page/view.html  
Line 422: Line 413:
define('SECTION_PLUGINNAME', 'blog');
define('SECTION_PLUGINNAME', 'blog');
define('SECTION_PAGE', 'view');
define('SECTION_PAGE', 'view');
</source>
</syntaxhighlight>
 
[[開発者エリア/ページトップ定数]]もご覧ください。
 
==== セクションヘルプファイル ====


See also [[Developer Area/Pagetop Constants]]
ページセクションにもヘルプファイルを付加できます。これらはlangディレクトリ配下の「help/sections/」ディレクトリ内にあります。ヘルプファイルは「contextualhelp」dwooタグを使用して呼び出されます。


==== Section help files ====
'''例:'''


Page sections can have help files. These live under "help/sections/" in the lang directory. They can be invoked by using the "contextualhelp" dwoo tag.
<syntaxhighlight lang="smarty">
<!-- ヘルプファイルは「lang/en.utf8/help/sections/activitytpeselect.html」となります。
これは「plugintype='core' -->
{contextualhelp plugintype='core' pluginname='activity' section='activitytypeselect'}」を理由としてコアlangディレクトリ配下に置かれることに留意してください。
</syntaxhighlight>


'''Example:'''
==== その他? ====


<source lang="smarty" enclose="div">
TODO: ヘルプファイルを呼び出す方法は他にもあるのでしょうか? ヘルプアイコンを生成する関数を呼べば良いのでしょうか?
<!-- Help file will be lang/en.utf8/help/sections/activitytpeselect.html
    Note that it's under the core lang directory, because plugintype='core' -->
{contextualhelp plugintype='core' pluginname='activity' section='activitytypeselect'}
</source>


==== Others? ====
==== localのカスタムヘルプファイル ====


TODO: Are the other ways to call up a help file? Will calling that function that generates the help icon do it?


==== Custom help files in /local ====
ヘルプファイルは/localディレクトリ内でオーバーライドできます。


Help files can also be overridden in the /local directory.
* '''Core''' ヘルプファイルは<tt>local/lang/en.utf8/help/{forms|pages|sections}/{filename}.html</tt>配下に設置されます。
** 例: <tt>local/lang/en.utf8/help/forms/adduser.friendscontrol.html</tt>
* '''Plugin''' ヘルプファイルは<tt>/local/lang/en.utf8/help/{forms|pages|sections}/{plugintype}.{pluginname}.{filename}.html</tt>配下に設置されます。
** 例: <tt>local/lang/en.utf8/help/forms/artefact.blog.addentry.draft.html</tt>


* '''Core''' help files will go under <tt>local/lang/en.utf8/help/{forms|pages|sections}/{filename}.html</tt>
=== ストリングを変更できない場合のトラブルシューティング ===
** Example: <tt>local/lang/en.utf8/help/forms/adduser.friendscontrol.html</tt>
* '''Plugin''' help files will go under <tt>/local/lang/en.utf8/help/{forms|pages|sections}/{plugintype}.{pluginname}.{filename}.html</tt>
** Example: <tt>local/lang/en.utf8/help/forms/artefact.blog.addentry.draft.html</tt>


=== Troubleshooting strings that won't change ===
あなたは開発またはローカルカスタマイゼーションのためにいくつかの言語ストリングを変更しようとしています。あなたは変更をファイルに保存してページをリロードしましたが、ストリングは変更されていません。以下、考えられるいくつかの原因です:


So, you're trying to change some language strings for development, or a local customization. You change the strings in the file, and reload the page, but the strings haven't changed. Here are some possible causes:
==== キャッシュ済みストリング ====


==== Cached strings ====
Mahara 15.10から、Maharaはナビゲーションメニュー (いくつかの翻訳された言語文字列を含む) をデータベースにキャッシュしています。Mahara 16.10以降、これらのキャッシュされた言語ストリングをリセットするため、管理画面の「キャッシュをクリアする」ボタンまたはCLIスクリプトの<tt>htdocs/admin/cli/clear_caches.php</tt>を使用できます。


Starting with Mahara 15.10, Mahara caches the navigation menus (which include several translated language strings) into the database. In Mahara 16.10 and up, you can use the "Clear caches" button on the admin screen, or the <tt>htdocs/admin/cli/clear_caches.php</tt> CLI script, to reset these cached strings.
Mahara 15.10および16.04において「キャッシュをクリア」するボタンは実装されていません。あなたは次善策としてとして「管理」→「サイト設定」でページ下部の「変更を保存」ボタンをクリックしてキャッシュをクリアできます。これにより実際に変更を加えたかどうかにかかわらずキャッシュがクリアされます。あなたは別の方法として<tt>htdocs/local/version.php</tt>のバージョン番号を上げるためのアップグレードをキャッシュクリアのトリガーにできます。


In Mahara 15.10 and 16.04, the "Clear caches" button is not yet present. As a workaround, you can clear the cache by going to "Administration -> Site Configuration" and clicking the "Save changes" button at the bottom of the page. This will clear the cache whether or not you have actually made any changes. Alternately, you can trigger a cache clearing by bumping the version number in <tt>htdocs/local/version.php</tt> and running an upgrade.
==== ユーザデータフィールドにコピーされたデフォルトストリング ====


==== Default strings copied into user data fields ====


Some language strings in Mahara are used as default values to copy into user-editable data fields. For instance, the text on "Administration -> Site pages" is generated from language strings, but is then stored in the database once admins edit it. In these cases, updating the original language string will not update the stored user data fields.
Maharaのいくつかの言語ストリングはユーザが編集可能なデータフィールドにコピーするためのデフォルト値として使用されます。例えば「管理 -> サイトページ」上のテキストは言語ストリングから生成されますが、管理者が編集した場合、データベースに保存されます。このようなケースではオリジナルの言語ストリングを修正しても、保存されているユーザデータフィールドは更新されません。


==== Haven't found the right string ====
==== 正しいストリングが見つかりませんでした ====


Some words and phrases appear in multiple language strings in different files. Double-check that you've found the right string in the right language file. Make sure to check plugin directories (like <tt>artefact/annotation/lang/en.utf8</tt>) as well as the core <tt>htdocs/lang</tt> directory.
いくつかの単語およびフレーズは異なるファイル内で複数の言語ストリングとして記述されています。正しい言語ファイルに正しいストリングが含まれているか再度確認してください。また、コアの<tt>htdocs/lang</tt>ディレクトリだけでなく、プラグインのディレクトリ (<tt>artefact/annotation/lang/en.utf8</tt>) も確認してください。


==== Hard-coded strings ====
==== ハードコーディングされたストリング ====


It's a common bug for language strings to be hard-coded into PHP files or Dwoo templates, rather than moved into the lang files for translation. If nothing else manages to change a string, it may be worth looking outside the lang files to see if it has been mistakenly hard-coded.
翻訳のために言語ストリングを言語ファイルに移動するのではなく、PHPファイルまたはDwooテンプレートにハードコーディングされることはよくあるバグです。言語ストリングを変更できない場合、誤ってハードコーディングされていないか、言語ファイルの外を確認するのも良いかもしれません。


If you find this happening in a file that is part of the Mahara standard distribution, please report it as a bug to the Mahara launchpad project. If you find this in a third-party plugin, please contact the plugin author.
あなたがMahara標準ディストリビューションの一部のファイルにこの現象を発見した場合、Mahara launchpadプロジェクトにバグとして報告してください。あなたがサードパーティ製プラグインでこの現象を見つけた場合、プラグイン開発者にご連絡ください。

Latest revision as of 13:54, 19 April 2022

国際化 (i18n) およびローカライゼーション (l10n) の目的のため、Maharaでユーザに表示されるストリングすべてはコードに直接記述されるのではなく、「言語ストリング」に保存された上でget_string($identifier, $section)関数により表示されます。この関数は外国語の言語パックがインストールされているか確認します。また、カスタム言語ファイルが存在するか確認して存在する場合、そのストリングを使用します。そうでない場合、コア言語ファイルに戻ります。

PHPでのget_string()の使用方法

関数get_string()には以下のパラメータがあります:

  • identifier: 言語ストリング名です。セクション内ではユニークです。identifierはPHP配列キーとして受け入れられるべきです。慣習により言語ストリング名は英語コンテンツと同じものであり、すべてスペースなしの半角英字です。ストリングの正確な表現の代わりにストリングの目的をストリング名として使用できます。
  • section: 言語ストリングが存在するファイルです。これは技術的に任意です。無視された場合、多くの一般的なコアストリングを含むデフォルトの「mahara」セクションが割り当てられます。
    • 例:
      • admin: コアの「admin」セクション用です。
      • artefact.blog: 「blog」アーティファクトプラグイン用です。
      • theme.primaryschool: 「primaryschool」テーマ用です。
  • params: (任意) 言語ストリングには1つまたはそれ以上のsprintf()パラメータを含めます。言語ストリング内に存在する場合、get_string()がコールされて使用するストリングを配置するためにパラメータ値との合致が要求されます。パラメータは異なる語順の言語への翻訳時に役立ちます。

例:

$yesstr = get_string('yes');                     // lang/en.utf8/mahara.php
$clamstr = get_string('pathtoclam', 'admin');    // lang/en.utf8/admin.php
$blogstr = get_string('blog', 'artefact.blog');  // artefact/blog/lang/en.utf8/artefact.blog.php
$copyrightstr = get_string('feedrights','artefact.blog', $USER->displayname); // パラメータ付き言語ストリング

// 複数形ストリング。最初の変数は複数形アイテムの数です。get_stringは単一または複数のどちらを使うか決定するために変数を使用します (英語以外の言語では2つ以上の複数形が存在する場合があります)。
$updatefilesstr = get_string('updatednfiles', 'mahara', 5);

Dwooテンプレートからの言語ストリング使用方法

あなたは {} タグを使ってDwoテンプレート内部から言語ストリングにもアクセスできます:

{str tag='identifier' section='section' arg1='first param value' arg2='second param value'}

これを動作させるコードは次のとおりです: htdocs/lib/dwoo/mahara/plugins/function.str.php

JavaScriptからの言語ストリングの使用方法

プリフェッチ

あなたはJavaScriptにも言語ストリングを使用できます。最初にsmarty()関数に$pagestrings変数を渡して言語ストリングを読み込んでください ...

// Providing a $pagestrings variable to smarty()
$pagestrings = array(
     'admin' => array(
         'discardpageedits',
         'pathtoclam'
     ),
     'mahara' => array('yes')
);

... そして、次にJavaScriptのget_string()関数を使用して言語ストリングにアクセスできます。これは「section」セクションを除外する以外、PHPのget_string()に似ています (注意: これはあなたが2つの言語ストリングを同じIDで異なるセクションに含めないことを意味します)。また、「%s」タイプの置換パラメータのみ受け付けます。

<script type="text/javascript">
    alert(get_string('yes'));
    confirm(get_string('discardpageedits', 'first param value'));
</script>

特定のJavaScriptファイルがDwooに含まれる場合にJavaScriptのget_string()で多くのJavaScriptストリングを常に使用できるようハードコードされています。このリストに関して「htdocs/lib/web.php」の関数「jsstrings」をご覧ください。

AJAX経由で動的に取得する

Mahara 15.10現在、あなたはAjax経由で動的に言語ストリングを取得できます。get_string_ajax()関数を使用してください。事前に取得した言語ストリングとは異なり、動的に取得したストリングにはセクションパラメータおよび他のパラメータを含めます。この機能はget_string_ajax()リクエストごとの結果をキャッシュします。

この関数は非同期に動作するため、alert()およびconfirm()のコールには適していません。関数自体はユニークIDを含む<span>タグのプレースホルダを返します。プレースホルダはAJAXコールが戻った際に評価されたストリングと置換されます。そのため、あなたが直接alert()、confirm()またはその他の即時出力メソッドを使用する場合、ユーザには結果のストリングではなく、プレースホルダが表示されます。

<script type="text/javascript">
    // 正解! ページのHTMLに戻り値を挿入します
    var noresults = get_string_ajax('noresultsfound', 'mahara');
    jQuery('#notice').html('<p class="no-results">' + noresults + '</p>');

    // 不正解! あなたのユーザの警告ボックスに「<span id="str790709789087"></span>」が表示されます。
    alert(get_string_ajax('cannotremove', 'auth'));
</script>

言語ファイルの構造

言語ファイルは{section}.phpのように名前付けされます。ここでの「section」はセクション値としてget_string()に渡されます。これには「$string」と呼ばれる配列にキーを追加するための一連の行が含まれます。すべてのMaharaライブラリファイルのようにウェブブラウザからのアクセスを防ぐため、内部定数のチェックから始めてください。

<?php 
defined('INTERNAL') || die();

$string['changepassworddesc'] = '新しいパスワード';
$string['changepasswordotherinterface'] = 'あなたは異なるインターフェースでパスワードを変更できます。 ';
$string['oldpasswordincorrect'] = 'これはあなたの現在のパスワードではありません。';

// 複数形ストリングです。英語では単数形はキー「0」にマップしてください。他の言語ではlangconfig.php内のpluralfunctionで定義しているキーにマップしてください。
$string['updatednfiles'] = array(
    0 => 'あなたは %s ファイルを更新しました。',
    1 => 'あなたは %s ファイルを更新しました。',
);

複数形ストリング

正確には加算可能ストリングと読んだ方が良いのかもしれません。英語には2つの複数形があります: 単数形 (1つ) および複数形 (2つ以上)。他の言語には複数の複数形があります。例えばスロベニア語の場合、あなたが1つ、2つまたは3つ以上を持つかにより単語の語尾が異なる2通りの複数形があります。

英語とは異なる複数形を持つ言語を翻訳できるようにしたい場合、「あなたには 3 つのブログがあります/あなたには 1 つのブログがあります」のように数字でカウントできる特別な構文のストリングがあります。

まず、get_string()を使用する場合、第1カスタムパラメータとしてストリングのアイテムカウント数を渡してください:

get_string('fileattachedportfolioitems', 'artefact.file', $numitems);

次に言語ファイルでストリング配列を作成してください。英語の場合、キーが「0」の配列のアイテムは単数形のストリング、キーが「1」の配列のアイテムは複数形となります。

$string['fileattachedtoportfolioitems'] = array(
    0 => 'このファイルはあなたのポートフォリオの 1 の他のアイテムに添付されています。',
    1 => 'このファイルはあなたのポートフォリオの %s の他のアイテムに添付されています。',
);

この構文により、英語とは異なる複数形を持つ他の言語を実装できます。それぞれの言語にはどのキーがカウント数を返すか決定するpluralfunction関数を含むlangconfig.phpファイルがあります。英語では単数形に「0」、複数形に「1」を返します。恐らく、他の言語はさらに多いまたは少ないキーを返すと思われます。そのため、別の言語パックの同じストリングは以下のようになります:

$string['fileattachedtoportfolioitems'] = array(
    0 => 'Ta datoteka je pripeta k %s drugemu elementu v vašem listovniku.',
    1 => 'Ta datoteka je pripeta k %s drugima elementoma v vašem listovniku.',
    2 => 'Ta datoteka je pripeta k %s drugim elementom v vašem listovniku.',
    3 => 'Ta datoteka je pripeta k %s drugim elementom v vašem listovniku.',
);

詳細はLanguage Packs/Plural formsおよび https://bugs.launchpad.net/mahara/+bug/901051 をご覧ください。

カウンタパラメータは最初のパラメータにしてください。あなたがカウンタパラメータをストリングの最初に表示したくない場合、sprintf位置指定子で移動してください:

$string['setprobationpoints'] = array(
    0 => 'Set probation points to %2$d for %1$d user.',
    1 => 'Set probation points to %2$d for %1$d users.';
);

メモ: Maharaにはこのフォーマットに従わない古い複数形ストリングが相当数含まれます。あなたが古い複数形ストリングを見つけた時に直してくれると助かります。翻訳者に分かりやすくするため、正しいストリングには古いストリングとは異なるストリング名を使用してください。あなたが古いストリングのすべての参照を削除できた場合のみ、古いストリングを削除してください。

Mahara言語ストリングはsprintf()フォーマットストリングです

私たちが「%s」をプレースホルダとして使用する理由はMahara言語ストリングが表示前にPHPのsprintf()関数で渡されるからです。言い換えれば、Mahara言語ストリングは実際にはsprintf()フォーマットストリングです!

詳細なsprintf()フォーマット文法はここで確認できますが、あなたが知る必要のある内容は以下の少しだけです:

直定数「%」を「%%」としてエスケープする

言語ストリングにパーセンテージ文字 (%) を表示したい場合、あなたは代わりに2文字のパーセント (%%) でエスケープする必要があります。

$string['onehundredpercentcorrect'] = 'あなたは 100%% 正しい!';

あなたはほとんどのプレースホルダに「%s」を使用できます

あなたがプレースホルダを使用した言語ストリングを記述している場合、多くの場合、sprintf()に値をストリングとしてフォーマットするように伝える「%s」で切り抜けられます。PHPはほとんどの値を適切にオートキャストします。

$string['mynameis'] = 'こんにちは、私の名前は %s です!';

小数点のプレースホルダに関して ...

「%s」を使用する主な例外はプレースホルダに小数を表示する必要がある場合で特に小数点以下の数を表示する必要がある場合です。 この場合、あなたは「%」の後に「.」を続けて小数点以下を「F」にできます。

$string['twodecimalpoints'] = 'この数字には小数点以下2桁あります: %.2F';
$string['threedecimalpoints'] = 'この数字には小数点以下3桁あります: %.3F';

多くの場合、これをPHP側のみで処理した方がエラーの発生は少ないように思えますが。つまり、10進数をget_string()に渡すのではなく、 スクリプトで数値を丸めたり整形したりして文字列にキャストした後、その整形済み数値の文字列をget_string()に送信してください。

言語ファイルはどこに?

  • コア 言語ファイルは$cfg->dirroot/lang/en.utf8/{section}.phpのように配置されます。
  • プラグイン 言語ファイルは$cfg->dirroot/{plugintype}/{pluginname}/lang/en.utf8/{plugintype}.{pluginname}.phpのように配置されます。
    • プラグインをget_string()で呼び出す場合、プラグインの「セクション」は「{plugintype}.{pluginname}」のようになることに留意してください。例えば次のようになります: 「artefact.blog」「import.leap2a」「blocktype.contactinfo」
    • アーティファクトに属するblocktypeのようなサブプラグインは{$cfg->dirroot}/artefact/{pluginname}/blocktype/{blockname}/lang/en.utf8/blocktype.{blockname}.phpのように配置されます。また、セクションは「blocktype.{blockname}」のようになります。
  • テーマ 言語ファイルは$cfg>->dirroot/theme/{themename}/lang/en.utf8/theme.{themename}.phpのように配置されます。
    • get_string()をコールする場合の「セクション」は「theme.{themename}」です。例えば次のようになります: 「theme.raw」, 「theme.primaryschool」
  • 外国語 言語パックはあなたのdatarootディレクトリにインストールされます: $cfg->dataroot/langpacks/{langcode}
    • {langcode} は言語コードです。例えば次のようになります: 「pt.utf8」, 「es.utf8」, 「en_US.utf8」
  • ローカル 言語ファイルは$cfg->dirroot/local/lang/{langcode}/{section}.php配下に配置されます。

翻訳

このシステムの最大のポイントはMaharaを翻訳できるようにすることです。詳細は「言語パック」ドキュメンテーションをご覧ください。基本的にはあなたがlangpacks.mahara.orgからダウンロードした言語パックを展開して「$cfg->dataroot/langpacks/」ディレクトリ内に入れてください。ユーザのログイン画面に言語選択メニューが表示されます。

もし、特定の言語ストリングが言語パックに存在しない場合、言語が指定した親言語パックがインストールされていない限り、Maharaコアの英語言語ストリングが使用されます。

langconfig.php

言語には少ない量の設定データが含まれます。これはコア言語ファイル「langconfig.php」内にあります。以下の値は最も重要です:

  • thislanguage: 言語の言語名です。これはユーザの言語選択メニューに表示されます。
  • locale: この言語に合致するコンピュータのロケールストリング一覧です。これらがどのようなものであるかに関して他の言語パックを参照してください。
  • parentlanguage: (任意) これが提供された場合、未翻訳のMaharaストリングは親言語の翻訳を探します (親言語がインストールされている場合)。
  • pluralization:
    • 詳細はストリングの複数形 (英語) APIをご覧ください。
    • 言語パックがPOフォーマットが変換された場合、また、あなたが「Plural-Forms:」ヘッダを入れている場合、これらの値は自動的に生成されます。
    • pluralfunction: 与えられたカウントに対してどの複数形ルールを使用すべきかを示すPHP関数名です。この関数は正確に1つの整数の引数 (アイテム数) を取得してどの複数形を使用すべきかを示すキーを返します。例えば英語の場合、ルールはカウントが1の場合「0」、それ以外の場合「1」を返します。言語のすべての言語ファイルは複数の文字列を配列として定義します。この配列では関数が返せる可能性のあるそれぞれのキーに対応する値を持つこととなります。
    • pluralrule: pluralfunctionに相当するJavaScriptの関数です。これは変数「n」に格納されている整数を評価および「n」を引数として受け取った場合の複数関数と全く同じ値を返すJavaScriptのスニペットである必要があります。

/localのカスタム言語ストリング

「/local」ディレクトリのカスタム言語ストリング

多くのMaharaインストレーションではいくつかの言語ストリングのみ上書きしたい場合もあることでしょう。最も簡単なのは「/local」ディレクトリにカスタム言語ファイルを作成する方法です。カスタム言語ファイルが存在する場合、これらのファイルのストリングはコアの言語ファイルまたは言語パックの言語ファイルのストリングに優先されます。

カスタム言語ファイルではオーバーライド対象の言語を100%翻訳する必要はありません。あなたが実際にオーバーライドしたいストリングのみカスタム言語ファイルに含めます。

例:

<?php
// This file lives under /var/www/mahara/local/lang/en.utf8/mahara.php
defined('INTERNAL') || die();

$string['yes'] = 'Yessir!';
$string['login'] = 'Sign in!";

あなたは外国語ファイルおよびプラグイン言語ファイルを「local/lang」にも配置できます。以下すべて可能です:

  • local/lang/en.utf8/mahara.php
  • local/lang/en.utf8/blocktype.contactinfo.php
  • local/lang/pt.utf8/artefact.blog.php
  • local/lang/mi.utf8/theme.primaryschool.php

翻訳の連結は好ましくありません

異なる言語では単語の順序が異なるため、可能な限り言語ストリングの連結は避けるべきです。言語ストリングのパラメータを使用するか、複数言語文字列を使用してください。

悪い:

<?php
// 英語では問題ありませんが、形容詞が名詞の後に続くべきスペイン語ではどうでしょう?
$yellowdogstr = get_string('yellow') . " " . get_string('dog');
$greendogstr = get_string('green') . " " . get_string('dog');

良い:

<?php
// 英語: $string['coloreddog'] = '%s dog';
// 英語: $string['coloreddog'] = 'perro %s';
$yellowdogstr = get_string('coloreddog', 'artefact.dog', get_string('yellow'));
$greendogstr = get_string('coloreddog', 'artefact.dog', get_string('green'));

最良:

<?php
// 一部の言語では「yellow」と組み合わせられた場合に「dog」が変わったり、「dog」と組み合わせられた場合に「yellow」が変わります。
// 英語: $string['dogyellow'] = 'yellow dog';
// スペイン語: $string['dogyellow'] = 'perro amarillo';
// オーストラリア英語: $string['dogyellow'] = 'dingo';
$yellowdogstr = get_string('dogyellow');
$greendogstr = get_string('doggreen');

そして、似たようなことですが、もちろん、単語のパーツを連結しないてください。

悪い:

<?php
$blogstr = get_string('blog', 'artefact.blog');
$pluralblog = get_string('blog', 'artefact.blog') . get_string('s');

良い:

<?php
$blogstr = get_string('blog', 'artefact.blog');
$pluralblog = get_string('blogs', 'artefact.blog');

// また、ブログの数が決まっている場合、複数ストリングのAPIを使用してください。

$numblogs = get_blog_count();
$blogstr = get_string('nblogs', 'artefact.blog', $numblogs);

この方法には言語ストリングが増えてしまうという欠点がありますが、残念ながら、文法が大きく異なる言語間で美しく翻訳をするにはこの方法しかありません。

あなたの言語ファイルをアルファベット順にする

実装上の観点からlangファイル内での言語ストリングの順序は問題ではありません。しかし、人間の読みやすさの観点から識別子のアルファベット順に並ぶべきです。

多くの開発者は機能別にグループ化したくなりますが、機能別にグループ化しても分類方法を無視した新しい文字列が追加された場合、やがて破綻してしまいます。最終的な結果はどの特定の言語ストリングもどの場所にもあり得る完全に無秩序なファイルです。これがMaharaコアのほとんどの言語ファイルの状態です。

そのため、新しい言語ファイルを作成する場合、言語文字列をアルファベット順に並べてください。もし、あなたが関連する文字列を隣り合わせになるようにしたい場合、タイプ別に分類した名前をつけてください。

悪い:

<?php
// Strings are sorta grouped together by functionality, in semi-random order
$string['baseline'] = 'Baseline';
$string['top'] = 'Top';
$string['middle'] = 'Middle';
$string['bottom'] = 'Bottom';
$string['texttop'] = 'Text top';
$string['textbottom'] = 'Text bottom';
$string['left'] = 'Left';
$string['right'] = 'Right';
$string['src'] = 'Image URL';
$string['image_list'] = 'Attached image';
$string['alt'] = 'Description';

$string['copyfull'] = 'Others will get their own copy of your %s';
$string['copyreference'] = 'Others may display your %s in their page';
$string['copynocopy'] = 'Skip this block entirely when copying the page'; 

$string['viewposts'] = 'Copied entries (%s)';
$string['postscopiedfromview'] = 'Entries copied from %s'; 

$string['youhavenoblogs'] = 'You have no journals.';
$string['youhaveoneblog'] = 'You have 1 journal.';
$string['youhaveblogs'] = 'You have %s journals.';

良い:

<?php
// Strings are in alphabetical order by identifier
// Strings with similar purposes have names that start with their purpose and then a 
//    description, so that they wind up next to each other alphabetically
$string['copyfull'] = 'Others will get their own copy of your %s';
$string['copynocopy'] = 'Skip this block entirely when copying the page';
$string['copyreference'] = 'Others may display your %s in their page';
$string['imagealt'] = 'Description';
$string['imagelist'] = 'Attached image';
$string['imagesrc'] = 'Image URL';
$string['positionbaseline'] = 'Baseline';
$string['positionbottom'] = 'Bottom';
$string['positionleft'] = 'Left';
$string['positionmiddle'] = 'Middle';
$string['positionright'] = 'Right';
$string['positiontextbottom'] = 'Text bottom';
$string['positiontexttop'] = 'Text top';
$string['positiontop'] = 'Top';
$string['postscopiedfromview'] = 'Entries copied from %s';
$string['viewposts'] = 'Copied entries (%s)';
$string['youhaveblogs'] = 'You have %s journals.';
$string['youhavenoblogs'] = 'You have no journals.';
$string['youhaveoneblog'] = 'You have 1 journal.';

言語ストリング変更時に翻訳者に知らせる

言語ストリングの内容を大幅に変更した場合、言語ストリングの名称も変更してください。通常、私たちはこれを文字列の後に数字を置く (または増加させる) ことで対応しています。

この理由はLaunchpadの翻訳インターフェースではストリングの英語版変更時に翻訳者には通知されないからです。言語ストリングの名称を変更することにより、翻訳されていない新しいストリングとして翻訳者にその存在を知らせることができます。

前:

$string['namedesc'] = 'The original version of the string.';

後:

$string['namedesc1'] = 'The new version of the string, with content that should be reflected in all langpacks.';

また、このストリングが使用されているPHPファイルおよびテンプレートのストリング名も必ず更新してください。

ヘルプファイル

ヘルプファイルは特殊なタイプの言語ファイルです。これはユーザがヘルプボタンをクリックしたときにポップアップするHTMLスニペット (基本的には<body>タグ内のコンテンツ) です。

いくつかの異なる方法でヘルプファイルを追加できます。主なものは以下のとおりです:

Pieformsヘルプファイル

一般的にはpieform要素定義に「'help'=>true」を追加して作成します。そして、Pieformsは「help/forms/{formname}.{elementname}.html」という名称のヘルプファイルをポップアップするためのコードを自動的に追加します。フォームに「pluginname」および「plugintype」フィールドがある場合、Pieformsはプラグインの言語ディレクトリ配下のヘルプファイルを探します。

例:

// 「下書き」チェックボックスにはフォーム名「name」、「plugintype」「pluginname」および要素名をもとにディレクトリ「artefact/blog/lang/en.utf8/help/form/editpost.draft.html」にヘルプファイルがあります。
$form = pieform(array(
    'name' => 'editpost',
    'plugintype' => 'artefact',
    'pluginname' => 'blog',
    'elements' => array(
         'draft' => array(
             'type' => 'checkbox',
             'title' => get_string('draft', 'artefact.blog'),
             'description' => get_string('thisisdrafdesc', 'artefact.blog'),
             'help' => true
         )
    )
);

ページヘルプファイル

ページ自体にもヘルプファイルを付加できます。ページに「SECTION_PAGE」「SECTION_PLUGINNAME」「SECTION_PLUGINTYPE」の各定数が正しく定義されている場合、smarty()によるページテンプレート設定時に「has_help_file()」関数を呼び出して「help/pages/{SECTION_PAGE}.html」にヘルプファイルが存在するかどうかチェックします。ヘルプファイルが存在する場合、ページタイトルの横にヘルプボタンが表示されます。SECTION_PLUGINNAMEおよびSECTION_PLUGINTYPEが提供された場合、プラグインのlangディレクトリ配下にあるヘルプファイルを探します。

例:

<?php
// Help file will be artefact/blog/lang/en.utf8/help/page/view.html 
define('SECTION_PLUGINTYPE', 'artefact');
define('SECTION_PLUGINNAME', 'blog');
define('SECTION_PAGE', 'view');

開発者エリア/ページトップ定数もご覧ください。

セクションヘルプファイル

ページセクションにもヘルプファイルを付加できます。これらはlangディレクトリ配下の「help/sections/」ディレクトリ内にあります。ヘルプファイルは「contextualhelp」dwooタグを使用して呼び出されます。

例:

<!-- ヘルプファイルは「lang/en.utf8/help/sections/activitytpeselect.html」となります。
これは「plugintype='core' -->
{contextualhelp plugintype='core' pluginname='activity' section='activitytypeselect'}」を理由としてコアlangディレクトリ配下に置かれることに留意してください。

その他?

TODO: ヘルプファイルを呼び出す方法は他にもあるのでしょうか? ヘルプアイコンを生成する関数を呼べば良いのでしょうか?

localのカスタムヘルプファイル

ヘルプファイルは/localディレクトリ内でオーバーライドできます。

  • Core ヘルプファイルはlocal/lang/en.utf8/help/{forms|pages|sections}/{filename}.html配下に設置されます。
    • 例: local/lang/en.utf8/help/forms/adduser.friendscontrol.html
  • Plugin ヘルプファイルは/local/lang/en.utf8/help/{forms|pages|sections}/{plugintype}.{pluginname}.{filename}.html配下に設置されます。
    • 例: local/lang/en.utf8/help/forms/artefact.blog.addentry.draft.html

ストリングを変更できない場合のトラブルシューティング

あなたは開発またはローカルカスタマイゼーションのためにいくつかの言語ストリングを変更しようとしています。あなたは変更をファイルに保存してページをリロードしましたが、ストリングは変更されていません。以下、考えられるいくつかの原因です:

キャッシュ済みストリング

Mahara 15.10から、Maharaはナビゲーションメニュー (いくつかの翻訳された言語文字列を含む) をデータベースにキャッシュしています。Mahara 16.10以降、これらのキャッシュされた言語ストリングをリセットするため、管理画面の「キャッシュをクリアする」ボタンまたはCLIスクリプトのhtdocs/admin/cli/clear_caches.phpを使用できます。

Mahara 15.10および16.04において「キャッシュをクリア」するボタンは実装されていません。あなたは次善策としてとして「管理」→「サイト設定」でページ下部の「変更を保存」ボタンをクリックしてキャッシュをクリアできます。これにより実際に変更を加えたかどうかにかかわらずキャッシュがクリアされます。あなたは別の方法としてhtdocs/local/version.phpのバージョン番号を上げるためのアップグレードをキャッシュクリアのトリガーにできます。

ユーザデータフィールドにコピーされたデフォルトストリング

Maharaのいくつかの言語ストリングはユーザが編集可能なデータフィールドにコピーするためのデフォルト値として使用されます。例えば「管理 -> サイトページ」上のテキストは言語ストリングから生成されますが、管理者が編集した場合、データベースに保存されます。このようなケースではオリジナルの言語ストリングを修正しても、保存されているユーザデータフィールドは更新されません。

正しいストリングが見つかりませんでした

いくつかの単語およびフレーズは異なるファイル内で複数の言語ストリングとして記述されています。正しい言語ファイルに正しいストリングが含まれているか再度確認してください。また、コアのhtdocs/langディレクトリだけでなく、プラグインのディレクトリ (artefact/annotation/lang/en.utf8等) も確認してください。

ハードコーディングされたストリング

翻訳のために言語ストリングを言語ファイルに移動するのではなく、PHPファイルまたはDwooテンプレートにハードコーディングされることはよくあるバグです。言語ストリングを変更できない場合、誤ってハードコーディングされていないか、言語ファイルの外を確認するのも良いかもしれません。

あなたがMahara標準ディストリビューションの一部のファイルにこの現象を発見した場合、Mahara launchpadプロジェクトにバグとして報告してください。あなたがサードパーティ製プラグインでこの現象を見つけた場合、プラグイン開発者にご連絡ください。