国際化 (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.blankimport { 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