コンテンツにスキップ

国際化 (i18n)

Accellaではi18nextを使って国際化をサポートしています。 src/config/locales/ディレクトリ以下に翻訳ファイルを配置することで、モデル名、属性名、エラーメッセージ、Enumの値などを翻訳することができます。 翻訳ファイルは、YAML、JSON、JavaScriptのいずれかの形式で以下の例のように記述することができます。

src/config/locales/models/user/en.yml
en:
translation:
accelrecord:
models:
User: "ユーザー"
attributes:
User:
firstName: ""
lastName: ""

デフォルトの言語などi18nextの設定を変更する場合は、src/config/initializers/i18n.tsでの初期化処理を編集してください。

モデルの翻訳

Model.modelName.humanメソッドとModel.humanAttributeName(attribute)メソッドを使うことで、モデル名と属性名の翻訳を参照できます。

src/sample.ts
import { User } from "./models/index.js";
// accelrecord.models.User が参照される
console.log(User.modelName.human); // => "ユーザー"
// accelrecord.attributes.User.firstName が参照される
console.log(User.humanAttributeName("firstName")); // => "名"

エラーメッセージの翻訳

バリデーションエラーメッセージも翻訳に対応しており、以下からエラーメッセージを参照します。

accelrecord.errors.models.[ModelName].attributes.[attribute].[messageKey]
accelrecord.errors.models.[ModelName].[messageKey]
accelrecord.errors.messages.[messageKey]
errors.attributes.[attribute].[messageKey]
errors.messages.[messageKey]
src/models/user.ts
import { validates } from "accel-record/validations";
import { ApplicationRecord } from "./applicationRecord.js";
class UserModel extends ApplicationRecord {
static validations = validates(this, [["firstName", { presence: true }]]);
}

上のUserModelの例では、blankというメッセージキーの翻訳がエラーメッセージに利用されます。

この例では、以下のキーを順に探し、最初に見つかったキーが利用されます。

accelrecord.errors.models.User.attributes.name.blank
accelrecord.errors.models.User.blank
accelrecord.errors.messages.blank
errors.attributes.name.blank
errors.messages.blank
src/sample.ts
import { User } from "./models/index.js";
const user = User.build({});
user.validate();
console.log(User.errors.fullMessages);
// => ["名 を入力してください"]

各バリデーションに対応するメッセージキーは以下の通りです。

バリデーションオプションメッセージキー式展開
acceptance-accepted-
presence-blank-
lengthminimumtooShortcount
lengthmaximumtooLongcount
uniqueness-taken-
format-invalid-
inclusion-inclusion-
numericalityequalToequalTocount

式展開が count になっているものは、エラーメッセージに {{count}} を含むときにその部分がオプションで指定された値に置き換えられます。

Enumの翻訳

Enumの各値に対しても翻訳を定義することができます。

prisma/schema.prisma
enum Role {
MEMBER
ADMIN
}
model User {
/* ... */
role Role @default(MEMBER)
}

User.role.options()で、Enumの各値に対応する翻訳を取得することができます。 各Userが持つroleに対して、roleTextというプロパティでEnumの値に対応する翻訳を取得することができます。

src/sample.ts
import { User } from "./models/index.js";
User.role.options(); // => [["メンバー", "MEMBER"], ["管理者", "ADMIN"]]
const user = User.build({});
user.role; // => "MEMBER"
user.roleText; // => "メンバー"

user.roleの例では、以下のキーを順に探し、最初に見つかったキーが利用されます。

enums.User.Role.MEMBER
enums.defaults.Role.MEMBER
enums.Role.MEMBER

関連リンク