国際化 (i18n)
Accellaではi18nextを使って国際化をサポートしています。
src/config/locales/
ディレクトリ以下に翻訳ファイルを配置することで、モデル名、属性名、エラーメッセージ、Enumの値などを翻訳することができます。
翻訳ファイルは、YAML、JSON、JavaScriptのいずれかの形式で以下の例のように記述することができます。
en: translation: accelrecord: models: User: "ユーザー" attributes: User: firstName: "名" lastName: "姓"
{ "en": { "translation": { "accelrecord": { "models": { "User": "ユーザー" }, "attributes": { "User": { "firstName": "名", "lastName": "姓" } } } } }}
export default { en: { translation: { accelrecord: { models: { User: "ユーザー", }, attributes: { User: { firstName: "名", lastName: "姓", }, }, }, }, },};
デフォルトの言語などi18nextの設定を変更する場合は、src/config/initializers/i18n.ts
での初期化処理を編集してください。
モデルの翻訳
Model.modelName.human
メソッドとModel.humanAttributeName(attribute)
メソッドを使うことで、モデル名と属性名の翻訳を参照できます。
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]
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.blankaccelrecord.errors.models.User.blankaccelrecord.errors.messages.blankerrors.attributes.name.blankerrors.messages.blank
import { User } from "./models/index.js";
const user = User.build({});user.validate();console.log(User.errors.fullMessages);// => ["名 を入力してください"]
各バリデーションに対応するメッセージキーは以下の通りです。
バリデーション | オプション | メッセージキー | 式展開 |
---|---|---|---|
acceptance | - | accepted | - |
presence | - | blank | - |
length | minimum | tooShort | count |
length | maximum | tooLong | count |
uniqueness | - | taken | - |
format | - | invalid | - |
inclusion | - | inclusion | - |
numericality | equalTo | equalTo | count |
式展開が count
になっているものは、エラーメッセージに {{count}}
を含むときにその部分がオプションで指定された値に置き換えられます。
Enumの翻訳
Enumの各値に対しても翻訳を定義することができます。
enum Role { MEMBER ADMIN}
model User { /* ... */ role Role @default(MEMBER)}
User.role.options()
で、Enumの各値に対応する翻訳を取得することができます。
各User
が持つrole
に対して、roleText
というプロパティでEnumの値に対応する翻訳を取得することができます。
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.MEMBERenums.defaults.Role.MEMBERenums.Role.MEMBER