StringManager - Tai-Kimura/SwiftJsonUI GitHub Wiki

StringManager

SwiftJsonUI 7.2.0で導入された文字列管理・ローカライゼーションシステム

概要

StringManagerは、JSONレイアウトファイルから文字列を自動的に抽出し、多言語対応を含む文字列管理を効率化するシステムです。UIKitとSwiftUIの両方で使用可能な型安全な文字列アクセサーを生成します。

主な機能

1. 自動文字列抽出

JSONレイアウトファイルから以下の文字列を自動検出・抽出:

  • 全コンポーネントのtext属性
  • partial_attributes.range.text(属性付きテキスト)
  • placeholdertitleなどのテキスト関連属性
  • ボタンやラベルのテキストコンテンツ

2. 文字列の分類

定義済み文字列(Defined Strings)

スネークケース形式のキーは、ローカライゼーションキーとして扱われます:

{
  "type": "Label",
  "text": "welcome_message"  // ローカライゼーションキー
}

未定義文字列(Undefined Strings)

直接記述されたテキストは、ローカライゼーション対象として抽出されます:

{
  "type": "Label",
  "text": "Welcome to our app!"  // 直接テキスト
}

3. 生成ファイル

strings.json

アプリで使用される全ての文字列とその翻訳を定義:

{
  "welcome_message": {
    "en": "Welcome!",
    "ja": "ようこそ!",
    "es": "¡Bienvenido!"
  },
  "login_button": {
    "en": "Login",
    "ja": "ログイン",
    "es": "Iniciar sesión"
  }
}

.stringsファイル

iOSネイティブのローカライゼーションファイルを自動生成:

en.lproj/Localizable.strings:

/* home_view.json */
"welcome_message" = "Welcome!";
"login_button" = "Login";

ja.lproj/Localizable.strings:

/* home_view.json */
"welcome_message" = "ようこそ!";
"login_button" = "ログイン";

StringManager.swift

型安全な文字列アクセサーを自動生成:

public struct StringManager {
    public static let welcomeMessage = NSLocalizedString("welcome_message", comment: "")
    public static let loginButton = NSLocalizedString("login_button", comment: "")
}

使用方法

1. 初期設定

sjui.config.jsonで設定を有効化:

{
  "resource_manager_directory": "ResourceManager",
  "localization": {
    "languages": ["en", "ja", "es"],
    "default_language": "en"
  }
}

2. ビルド時の自動処理

sjui build

ビルドコマンド実行時に以下が自動的に行われます:

  1. JSONレイアウトファイルから文字列を抽出
  2. Layouts/Resources/strings.jsonを更新
  3. 各言語の.stringsファイルを生成/更新
  4. StringManager.swiftを生成/更新

3. コードでの使用

UIKit

label.text = StringManager.welcomeMessage
button.setTitle(StringManager.loginButton, for: .normal)

SwiftUI

Text(StringManager.welcomeMessage)
Button(StringManager.loginButton) {
    // action
}

4. JSONレイアウトでの使用

ローカライゼーションキーを使用

{
  "type": "Label",
  "text": "welcome_message"  // strings.jsonのキー
}

直接テキスト(開発中)

{
  "type": "Label",
  "text": "This will be extracted"  // 自動的に抽出される
}

ローカライゼーションワークフロー

1. 開発フェーズ

  1. JSONレイアウトに直接テキストを記述
  2. sjui build実行で文字列が自動抽出
  3. strings.jsonNOT_IMPLEMENTED_YETとして記録

2. 翻訳フェーズ

  1. strings.jsonを開いて翻訳を追加
  2. 各言語のテキストを入力
  3. sjui buildを再実行して.stringsファイルを更新

3. リリースフェーズ

  1. 全てのNOT_IMPLEMENTED_YETを実際の翻訳に置換
  2. 最終ビルドで全ファイルを生成
  3. アプリは自動的に適切な言語を表示

ファイル構造

Project/
├── Layouts/
│   └── Resources/
│       ├── strings.json         # 文字列定義と翻訳
│       └── undefined_strings.json # 未定義文字列のトラッキング
├── ResourceManager/
│   └── StringManager.swift      # 生成されたSwiftコード
├── en.lproj/
│   └── Localizable.strings     # 英語ローカライゼーション
├── ja.lproj/
│   └── Localizable.strings     # 日本語ローカライゼーション
└── sjui.config.json

高度な機能

動的文字列置換

変数を含む文字列の処理:

{
  "welcome_user_message": {
    "en": "Welcome, %@!",
    "ja": "%@さん、ようこそ!"
  }
}

使用例:

let message = String(format: StringManager.welcomeUserMessage, userName)

複数形の処理

{
  "items_count": {
    "en": {
      "zero": "No items",
      "one": "1 item",
      "other": "%d items"
    },
    "ja": {
      "other": "%d個のアイテム"
    }
  }
}

コンテキスト別文字列

同じキーでも異なるコンテキストで異なる翻訳を使用:

{
  "button_title_save": {
    "en": "Save",
    "ja": "保存"
  },
  "menu_item_save": {
    "en": "Save Document",
    "ja": "ドキュメントを保存"
  }
}

ベストプラクティス

  1. 一貫した命名規則: screen_component_purpose形式を使用(例:home_button_login
  2. 早期ローカライゼーション: 開発初期から文字列キーを使用
  3. コンテキストの提供: 翻訳者のためにコメントを追加
  4. 定期的な確認: undefined_strings.jsonを定期的にチェック
  5. バージョン管理: strings.jsonをGitで管理してチーム共有

キャッシュ管理

StringManagerは効率的なビルドのためにキャッシュを使用:

  • .sjui_cache/strings_cache.json - 処理済みファイルのトラッキング
  • 変更されたファイルのみを再処理
  • sjui build --cleanでキャッシュをクリア

トラブルシューティング

文字列が抽出されない

  • JSONファイルの構文エラーをチェック
  • text属性が正しく設定されているか確認
  • sjui build --cleanでキャッシュをクリア

翻訳が反映されない

  • .stringsファイルが正しく生成されているか確認
  • Xcodeのビルドフェーズでリソースがコピーされているか確認
  • デバイスの言語設定を確認

NOT_IMPLEMENTED_YETが表示される

  • strings.jsonで該当キーの翻訳を追加
  • sjui buildを再実行

関連項目