Help:Extension:Translate/バリデーター
翻訳対象の文字列は、翻訳結果でもそのまま保持されるべきマークアップを含むことがよくあります。 マークアップは特殊な文字を多く含むため、タイプするのが低速・困難になる場合があります。 Translate 拡張機能は、翻訳者がボタンをクリックすると、現在のカーソル位置にマークアップの一部が挿入されるようにすることができます。 さらに、翻訳に特定のマークアップが欠けている場合、Translate 拡張機能は翻訳者に警告するか、または翻訳を拒否できます。これは、エンド ユーザーにメッセージを正しく表示するためには、通常、このようなマークアップが必須だからです。
例えば、
Adapted by %{name} from a work by %{original}
という文字列の中には、%{name}
と %{original}
という 2 つの挿入可能な文字列が存在します。
翻訳者がこれらを追加して翻訳しないと、ソフトウェアを使用するエンド ユーザーには適切なメッセージが表示されません。
翻訳の検証を支援する目的で、MessageValidator
フレームワークが追加されました。
翻訳されたメッセージに対してバリデーターが実行され、設定に基づいて警告またはエラー メッセージが翻訳者に表示されます。
警告がある翻訳は保存できますが、エラーがある翻訳は保存できません。
translate-manage
の権限がある利用者のみが、エラーのある翻訳を保存できます。
バリデーターを設定する際、必須となるマークアップを識別するための正規表現を定義します。 バリデーターは挿入可能としてマークすることもでき、その場合はそのマークアップを翻訳に追加するためのボタンが翻訳者に表示されます。
カスタム バリデーターを追加でき、これはより専門的な検証をするために必要となります。
設定
以下はバリデーターの設定の要約です。
VALIDATORS:
# 例 1
- id: InsertableRegex
enforce: true
insertable: true
params: /\$[a-z0-9]+/
keymatch:
- 'untranslated' # 翻訳されていないキーに直接マッチする
-
type: 'wildcard'
pattern: '*translated*' # 翻訳されたものが含まれるキーにマッチする
# 例 2
- id: InsertableRegex
insertable: true
params:
regex: /(?<pre>\[)[^]]+(?<post>\]\([^)]+\))/
display: $pre $post
pre: $pre
post: $post
# 例 3
- class: MathJaxMessageValidator
enforce: true
# 例 4
- id: BraceBalance
上記の例では:
InsertableRegex
は、カスタム正規表現を受け取って検証を実行できる同梱されているバリデーターです。MathJaxMessageValidator
はカスタム バリデーター クラスです。BraceBalance
は別の同梱されているバリデーターです。
VALIDATORS
は配列の書式を使用します。
ここで、各配列の項目で使用されているさまざまなパラメーターを見てみましょう。
パラメーター
プロパティ | 型 | 説明 |
---|---|---|
id | 文字列 | 同梱/提供済みのバリデーターを使用する場合は、バリデーターの ID を指定します。 class が指定されていない場合は必須です。
|
class | 文字列 | カスタム バリデーターを使用する場合は、id の代わりにこのオプションを使用します。 バリデーター クラスの名前を指定します。 上記の設定の例 3 を参照。 AUTOLOAD オプションを使用すると、クラスを読み込めます。 id が指定されていない場合は必須です。
|
enforce | 真偽値 | バリデータを強制するかどうか。 true に設定すると翻訳は検証されずエラーを表示しますので、修正しないと訳文を保存できません。 |
insertable | 真偽値 | バリデータも挿入可能にするかどうか |
keymatch | 配列 | このオプションは特定のメッセージに対する特定のバリデータ処理(認証)に制限をかけます。 Keymatch is an array with each option being either a string or a prototype. If it is a string, a direct comparison with the message key is done. 上記の設定の例 1 を参照。 |
keymatch[i].type | 文字列 | タイプは regex か wildcard の片方。 この方法はメッセージ キーが特定のパターンと一致するかどうか調べるために使います。 |
keymatch[i].pattern | 文字列 | パターンとはマッチングに用いる文字列のこと。 |
params | 文字列 / 連想配列 | If params is specified as a string, it is used as the regex. 例 1 を参照
In this case if insertable is true,
If params is specified as an associative array (see example #2), see below for further details. |
params.regex | 文字列 | The regex to be used for validator. Must use named captures. When specifying named captures, do not use the $ symbol in the name.
In example #2, two named captures are used - |
params.display | 文字列 | Mandatory value. The display value for the insertable. Named captures prefixed with $ are used here. 例 2 を参照。 |
params.pre | 文字列 | The pre value for the insertable. Value inserted before the cursor position. Named captures prefixed with $ are used here. If not specified, is set to the display value. 例 2 を参照。 |
params.post | 文字列 | The post value for the insertable. Value inserted after the cursor position. Named captures prefixed with $ are used here. 例 2 を参照。 If not specified, defaults to an empty string. |
Pre-provided / Bundled validators
Following is a list of bundled validators,
BraceBalance
ID: BraceBalance
Ensures that the number of open braces / brackets, matches the number of closed braces / brackets in the translation.
For example, the following translations would pass,
{{ }}
[ ]
whereas, the following would fail,
[ ]]
{{ }
This validator cannot be marked as insertable.
EscapeCharacter
ID: EscapeCharacter
The validator ensures that only the specified escape character are present in a translation.
The allowed escape characters can be specified when adding the validator, and can only include,
\t
\n
\'
\"
\f
\r
\a
\b
\\
このバリデーターは挿入可能ではありません。
GettextNewline
ID: GettextNewline
This works specifically for GetText based message groups.
Ensures that the translation has the same number of newlines as the source message at the beginning and end of the string.
GettextPlural
ID: GettextPlural
This works specifically on GetText based message groups.
Ensures that if the source / definition contains a plural in the format - foo {{PLURAL:GETTEXT|one|many}} bar
, the translation must contain it as well.
Based on the language this also checks if the translation has the correct number of plural forms.
For example, English has two, but Hebrew has four.
InsertableRegex
ID: InsertableRegex
A generic reusable validator that can be used to specify custom validations and insertables.
For example, take the following configuration where the validator is marked as insertable and enforced,
- id: InsertableRegex
enforce: true
insertable: true
params: "/\$[a-zA-Z0-9]+/"
Given the following source message - Hello $name. My name is $myName. that is being translated, the translation must have the parameters - $name and $myName. They will also be displayed as insertables to make it easier for translators to use them in the translation. An absence of these parameters will cause an error to be displayed to the translator.
InsertableRubyVariable
ID: InsertableRubyVariable
This is a validator that matches ruby variables in the translations.
Internally it extends InsertableRegexValidator
and uses the following regex - %{[a-zA-Z_]+}
.
このバリデーターは挿入可能です。
例:
%{abc}
IosVariable
ID: IosVariable
An insertable variable validator for Ios. Regex is used from this Rubustrings source. このバリデーターは挿入可能です。
例:
%@
MatchSet
ID: MatchSet
Ensures that the translation is present in the list of values.
Also takes a parameter - caseSensitive
that can be either true (default) or false.
For example the following configuration, the validator will validate the message with key - html.dir
and ensure that the values for it can either be ltr or rtl.
Note that LTR or RTL will not be valid values, since caseSensitive
is true by default.
- id: MatchSet
enforce: true
keymatch:
- html.dir
params:
values:
- ltr
- rtl
MediaWikiLink
ID: MediaWikiLink
Checks if the translation uses links that are discouraged.
Valid links are those that link to Special: pages, {{ns:special}}:
or project pages trough MediaWiki messages like {{MediaWiki:helppage-url}}:
.
Also links in the definition are allowed.
MediaWikiPageName
ID: MediaWikiPageName
Ensures that if the source / definition contains a namespace such as {{ns:project}}:hello
the translations made do not try to translate the namespaces itself.
MediaWikiParameter
ID: MediaWikiParameter
This is a validator that matches wiki parameters in the translations.
Internally it extends InsertableRegexValidator
and uses the following regex - /\$[1-9]/
.
このバリデーターは挿入可能です。
例:
$1
, $2
.
MediaWikiPlural
ID: MediaWikiPlural
Ensures that if the source / definition contains a {{PLURAL:$1|message|messages}}
, the translation should also have it.
It can also be used as an insertable.
Based on the language this also checks if the translation has the correct number of plural forms.
例えば、英語には 2 個、ヘブライ語には 3 個あります。
MediaWikiTimeList
ID: MediaWikiTimeList
Provides validations for expiry options and IP block options specified in the MediaWiki core. These are usually in the format,
indefinite:indefinite,3 hours:3 hours,12 hours:12 hours,24 hours:24 hours,31 hours:31 hours,36 hours:36 hours,48 hours:48 hours,60 hours:60 hours,72 hours:72 hours,1 week:1 week,2 weeks:2 weeks,1 month:1 month,3 months:3 months,6 months:6 months,1 year:1 year,2 years:2 years,3 years:3 years,infinite:indefinite
The validations ensure that the translations have the exact same number of key-value pairs. These validations are run only on messages with keys,
- protect-expiry-options
- ipboptions
Newline
ID: Newline
Ensures that the translation has the same number of newlines as the source / definition message at the beginning of the string. このバリデーターは挿入可能ではありません。
NotEmpty
ID: NotEmpty
Ensures that the translation has some content, and that content is not just whitespace. このバリデーターは挿入可能ではありません。
NumericalParameter
ID: NumericalParameter
This validator matches numerical parameters by using the following regex: /\$\d+/
.
このバリデーターは挿入可能です。
例:
$33
, $1
etc.
Printf
ID: Printf
This validator checks for missing and unknown printf formatting characters in translations. このバリデーターは挿入可能です。
例:
%2$f
, %d
etc.
PythonInterpolation
ID: PythonInterpolation
This validator matches python string interpolation variables by using the following regex: /\%(?:\([a-zA-Z0-9]*?\))?[diouxXeEfFgGcrs]/U
.
このバリデーターは挿入可能です。
例:
%s
, %(name)s
Replacement
ID: Replacement
Checks if a translation is using the search
string, and instead suggests the translator to use the string mentioned under replacement
.
このバリデーターは挿入可能ではありません。
- id: Replacement
enforce: true
params:
search: '{{PLURAL:'
replace: '{PLURAL:'
SmartFormatPlural
ID: SmartFormatPlural
This works specifically on SmartFormat based message groups.
Ensures that if the source / definition contains a plural in the format - {1:test|tests}{0:message|messages}
, the translation must contain it as well.
Based on the language this also checks if the translation has the correct number of plural forms.
例えば、英語には 2 個、ヘブライ語には 4 個あります。
UnicodePlural
ID: UnicodePlural
Ensures that if the source / definition contains a plural in the format - foo {{PLURAL|one=one|many}} bar
, the translation must contain it as well.
Based on the language this also checks if the translation has the correct number of plural forms.
例えば、英語には 2 個、ヘブライ語には 3 個あります。
User interface
The user interface has been updated to differentiate between errors and warnings.
During translation, if an error is noticed with the translation, the Save translation button is disabled unless the user who is translating has translate-manage
permission.
Additionally validation is also done on the server when the user is saving the translation.
This will still allow users who have the translate-manage
permission to save the translation even if it has errors.
Custom validators
Certain complicated validations might still require a custom validator to be written.
Custom validators must implement the MediaWiki\Extensions\Translate\Validation\MessageValidator
interface [1].
Below is an example of a custom validator,
<?php
// Filename: Validator.php
use MediaWiki\Extensions\Translate\Validation\MessageValidator;
use MediaWiki\Extensions\Translate\Validation\ValidationIssue;
use MediaWiki\Extensions\Translate\Validation\ValidationIssues;
/**
* My Custom Validator
*/
class MyCustomValidator implements MessageValidator {
public function getIssues( TMessage $message, string $targetLanguage ): ValidationIssues {
$issues = new ValidationIssues();
// Validation code goes here. ValidationIssueをValidationIssuesにプッシュ。 例:
$issue = new ValidationIssue(
'value-not-present', // タイプ
'invalid', // サブタイプ
'translate-checks-value-not-present', // メッセージ キー
[ // メッセージ パラメータ
[ 'PLAIN-PARAMS', $this->possibleValues ],
[ 'COUNT', count( $this->possibleValues ) ]
]
);
$issues->add( $issue );
return $issues;
}
}
また以下のクラスを参照し、
ValidationIssues
- https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/extensions/Translate/+/master/src/Validation/ValidationIssues.phpValidationIssue
- https://gerrit.wikimedia.org/r/plugins/gitiles/mediawiki/extensions/Translate/+/master/src/Validation/ValidationIssue.php
カスタム バリデータを設定ファイルに追加するには、
VALIDATORS:
- class: MyCustomValidator
enforce: true
AUTOLOAD:
MyCustomValidator: Validator.php