Documents
ローカライゼーションアップデートとダイアログ入力検証の強化
ローカライゼーションアップデートとダイアログ入力検証の強化
Type
Document
Status
Published
Created
Feb 11, 2026
Updated
Feb 11, 2026
Updated by
Dosu Bot

ローカライゼーションアップデートとダイアログ入力検証の強化#

1. ローカライゼーションアップデート(英語、日本語、韓国語)#

1.1 言語カバレッジ#

Misskey は 3 つの主要言語に対して包括的なローカライゼーションファイルを提供しています:

これらのファイルは YAML 形式で管理され、階層的なキー構造を使用してネストされた翻訳をサポートしています。日本語版が最も多くの行数を持ち、文化的コンテキストやより詳細な説明が含まれていることを示唆しています。

1.2 言語設定の新しい UI 文字列#

Misskey は、投稿言語と閲覧言語を独立して設定できる二重言語システムを実装しています。これにより、ユーザーは投稿する言語と表示したい投稿の言語を個別に制御できます。

言語設定#

基本的な言語設定用の UI 文字列:

  • language: "Language"(言語)
  • uiLanguage: "User interface language"(UI の言語)
  • postingLanguage: "Posting language"(投稿言語)
  • postingLanguageDescription: 投稿が選択した言語を閲覧言語として設定しているユーザーのタイムラインに表示されることを説明

閲覧言語オプション#

タイムラインのフィルタリングを制御するための細かい設定:

これらの設定により、ユーザーはメディアとハッシュタグについて独立した言語フィルタリングを適用でき、言語タグが付いていない投稿を含めるかどうかを選択できます。

通知#

アチーブメント#

言語設定の完了を促すゲーミフィケーション要素:

1.3 新しいエラーメッセージ#

Misskey は、ユーザーフレンドリーで実用的なガイダンスを提供する包括的なエラーメッセージシステムを実装しています。すべてのエラーメッセージは 3 つの言語すべてで完全に翻訳されています。

一般的なエラー#

基本的なエラー表示:

  • error: "Error"(エラー)
  • somethingHappened: "An error has occurred"(エラーが発生しました)

ページ & ネットワークエラー#

接続とページロードに関する問題:

  • pageLoadError: "An error occurred while loading the page."(ページの読み込み中にエラーが発生しました)
  • pageLoadErrorDescription: ネットワークエラーまたはブラウザキャッシュが原因であることを説明し、キャッシュのクリアと再試行を提案
  • serverIsDead: "This server is not responding. Please wait for a while and try again."(サーバーが応答していません)

認証エラー#

サインインと認証の失敗:

  • loginFailed: "Failed to sign in"(サインインに失敗しました)
  • credentialsVerificationFailed: "We couldn't verify your credentials."(認証情報を確認できませんでした)
  • signinFailed: "Unable to sign in. The entered username or password is incorrect."(ユーザー名またはパスワードが正しくありません)
  • authenticationFailed: "Authentication failed."(認証に失敗しました)
  • passkeyVerificationFailed: "Passkey verification has failed."(パスキー検証に失敗しました)

アップロードエラー#

ファイルアップロードの問題に対する具体的なエラー:

サーバー & API エラー#

バックエンドと API 通信の問題:

外部リソースエラー#

プラグインとテーマのインストール関連:

これらのエラーメッセージは、問題の性質を明確に伝えるだけでなく、多くの場合、問題を解決するための具体的な手順(キャッシュのクリア、再試行など)を提供しています。

2. ダイアログ入力検証の強化#

2.1 ステップ機能付き数値入力#

Misskey のダイアログシステムは、数値入力に対して包括的な検証機能を提供しており、ステップ値、最小値、最大値の制約を完全にサポートしています。

型定義#

MkDialog コンポーネントは、Input 型を通じて数値入力をサポートしています:

type Input = {
  type?: 'text' | 'number' | 'password' | 'email' | 'url' | 'date' | 'time' | 'search' | 'datetime-local' | 'textarea';
  placeholder?: string | null;
  autocomplete?: string;
  default: string | number | null;
  minLength?: number;
  maxLength?: number;
  min?: number;
  max?: number;
  step?: InputHTMLAttributes['step'];
};

この型定義により、開発者は数値入力に対して以下のパラメータを指定できます:

  • min: 許可される最小値
  • max: 許可される最大値
  • step: 増減時のステップ値(例:0.1、1、10 など)

コンポーネント実装#

step 属性はMkInput コンポーネントに渡されます

<MkInput v-if="input.type !== 'textarea'" 
  ref="inputComponent" 
  v-model="inputValue" 
  :type="input.type || 'text'" 
  :min="input.min" 
  :max="input.max" 
  :step="input.step" 
  @keydown="onInputKeydown">

MkInput コンポーネントは、これらをネイティブ HTML 属性としてレンダリングします:

<input
  :type="type"
  :step="step"
  :min="min"
  :max="max"
  ...
/>

数値ダイアログの API#

os.ts モジュールは inputNumber 関数を提供しています:

export function inputNumber(props: {
  title?: string | null;
  text?: string | null;
  placeholder?: string | null;
  autocomplete?: string;
  default?: number | null;
  min?: number;
  max?: number;
  step?: InputHTMLAttributes['step'];
}): Promise<{
  canceled: true; result: undefined;
} | {
  canceled: false; result: number | null;
}>;

使用例

const { canceled, result } = await os.inputNumber({
  title: i18n.ts.dimension,
  default: current ?? prefer.r.dimension.value,
  min: 0,
  max,
  step: 1,
});

この例では、0 以上の値を持ち、1 ずつ増減する数値入力ダイアログを作成しています。

2.2 境界チェック(最小値 / 最大値)#

MkDialog コンポーネントは、算出プロパティを通じて検証を実装しています:

const okButtonDisabledReason = computed<null | 'charactersExceeded' | 'charactersBelow' | 'numberBelow' | 'numberAbove' | 'invalid'>(() => {
  if (props.input) {
    if (props.input.type === 'number') {
      const rawValue = inputValue.value;
      const numericValue = typeof rawValue === 'number'
        ? rawValue
        : rawValue === '' || rawValue == null
          ? null
          : Number(rawValue);

      if (numericValue != null && Number.isFinite(numericValue)) {
        if (props.input.min != null && numericValue < props.input.min) {
          return 'numberBelow';
        }
        if (props.input.max != null && numericValue > props.input.max) {
          return 'numberAbove';
        }
      } else if (numericValue != null) {
        return 'invalid';
      }

      if (inputComponent.value && !inputComponent.value.inputEl.validity.valid) {
        return 'invalid';
      }
    }
    // ... 文字列長の検証 ...
  }
  return null;
});

この検証システムの動作:

  1. 型変換: 入力値を数値型に変換
  2. 最小値チェック: 値が最小閾値を下回っていないか確認
  3. 最大値チェック: 値が最大閾値を超えていないか確認
  4. HTML5 検証: HTML5 validity API を使用した追加検証
  5. ボタン制御: 検証が失敗した場合、OK ボタンを無効化

この多層的な検証アプローチにより、クライアント側でデータの整合性を確保し、無効なデータがサブミットされるのを防ぎます。

2.3 検証エラーの表示方法#

インラインエラーメッセージ#

検証エラーは、入力フィールドの下にインラインキャプションとして表示されます:

<template #caption>
  <span v-if="okButtonDisabledReason === 'charactersExceeded'" 
    v-text="i18n.tsx._dialog.charactersExceeded({ current: (inputValue as string)?.length ?? 0, max: input.maxLength ?? 'NaN' })"/>
  <span v-else-if="okButtonDisabledReason === 'charactersBelow'" 
    v-text="i18n.tsx._dialog.charactersBelow({ current: (inputValue as string)?.length ?? 0, min: input.minLength ?? 'NaN' })"/>
  <span v-else-if="okButtonDisabledReason === 'numberBelow'" 
    v-text="i18n.tsx._dialog.numberBelow({ current: inputValue ?? 'NaN', min: input.min ?? 'NaN' })"/>
  <span v-else-if="okButtonDisabledReason === 'numberAbove'" 
    v-text="i18n.tsx._dialog.numberAbove({ current: inputValue ?? 'NaN', max: input.max ?? 'NaN' })"/>
  <span v-else-if="okButtonDisabledReason === 'invalid'" 
    v-text="i18n.tsx._dialog.invalid({ current: inputValue ?? 'NaN' })"/>
</template>

このアプローチにより、ユーザーは入力中にリアルタイムでエラーを確認でき、即座に修正できます。

国際化されたエラーメッセージ#

ダイアログの検証エラーは、文脈情報付きでローカライズされています:

_dialog:
  charactersExceeded: "You've exceeded the maximum character limit! Currently at {current} of {max}."
  charactersBelow: "You're below the minimum character limit! Currently at {current} of {min}."
  numberBelow: "The value is below the minimum. Currently at {current} of {min}."
  numberAbove: "The value exceeds the maximum. Currently at {current} of {max}."
  invalid: "The input is invalid. Currently {current}."

これらのメッセージの特徴:

  • パラメータ化: 現在の値と制限値を動的に表示
  • 明確性: 何が問題なのかを具体的に説明
  • 多言語対応: 英語、日本語、韓国語を含むすべての言語で翻訳

エラーメッセージはユーザーに現在の入力値と許容される範囲を明示することで、修正すべき内容を直感的に理解できるようにしています。

2.4 追加のフォームコンポーネント#

MkFormDialog#

MkFormDialog コンポーネントは、複雑なフォームのサポートを提供します:

<MkInput v-else-if="v.type === 'number'" 
  v-model="values[k]" 
  type="number" 
  :min="v.min" 
  :max="v.max" 
  :step="v.step || 1">

このコンポーネントは、複数の入力フィールドを持つフォームを宣言的に定義でき、各フィールドに独立した検証ルールを適用できます。

フォーム型システム#

form.ts ユーティリティは、型安全なスキーマを定義します:

type FormItem = {
  label?: string;
  type: 'number';
  default?: number | null;
  description?: string;
  required?: boolean;
  hidden?: Hidden;
  step?: number;
  min?: number;
  max?: number;
} | // ... その他の型

この型システムにより、TypeScript の型チェックを活用して、コンパイル時にフォーム定義のエラーを検出できます。

MkRange コンポーネント#

MkRange コンポーネントは、スライダーベースの数値入力を提供します:

const props = withDefaults(defineProps<{
  modelValue: number;
  disabled?: boolean;
  min: number;
  max: number;
  step?: number;
  textConverter?: (value: number) => string,
  showTicks?: boolean;
  easing?: boolean;
  continuousUpdate?: boolean;
}>(), {
  step: 1,
  textConverter: (v) => v.toString(),
  easing: false,
});

MkRange コンポーネントは、ユーザーインタラクション中にステップ値と境界を自動的に適用します。視覚的なスライダー UI により、数値の範囲を直感的に理解し、有効な値を選択できます。

3. まとめ#

Misskey は、英語、日本語、韓国語に対して、言語 1 つあたり 3,200 以上の翻訳キーを持つ包括的なローカライゼーションサポートを提供しています。これには、言語設定 UI、エラーメッセージ、ユーザー通知が含まれます。

ダイアログ入力検証システムは以下の機能を実装しています:

  • リアルタイム境界チェック: ステップ機能付き数値入力
  • HTML5 統合: validity API による追加検証
  • 国際化されたエラーメッセージ: 現在の値と制限値を表示
  • インライン表示: 入力フィールド下にエラーを表示
  • 自動制御: 検証失敗時の OK ボタン無効化

これらの機能により、サブミット前にデータの整合性を確保し、ユーザーフレンドリーで多言語対応の入力体験を提供しています。