StringManager - Tai-Kimura/SwiftJsonUI GitHub Wiki
StringManager
SwiftJsonUI 7.2.0で導入された文字列管理・ローカライゼーションシステム
概要
StringManagerは、JSONレイアウトファイルから文字列を自動的に抽出し、多言語対応を含む文字列管理を効率化するシステムです。UIKitとSwiftUIの両方で使用可能な型安全な文字列アクセサーを生成します。
主な機能
1. 自動文字列抽出
JSONレイアウトファイルから以下の文字列を自動検出・抽出:
- 全コンポーネントの
text属性 partial_attributes.range.text(属性付きテキスト)placeholder、titleなどのテキスト関連属性- ボタンやラベルのテキストコンテンツ
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
ビルドコマンド実行時に以下が自動的に行われます:
- JSONレイアウトファイルから文字列を抽出
Layouts/Resources/strings.jsonを更新- 各言語の
.stringsファイルを生成/更新 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. 開発フェーズ
- JSONレイアウトに直接テキストを記述
sjui build実行で文字列が自動抽出strings.jsonにNOT_IMPLEMENTED_YETとして記録
2. 翻訳フェーズ
strings.jsonを開いて翻訳を追加- 各言語のテキストを入力
sjui buildを再実行して.stringsファイルを更新
3. リリースフェーズ
- 全ての
NOT_IMPLEMENTED_YETを実際の翻訳に置換 - 最終ビルドで全ファイルを生成
- アプリは自動的に適切な言語を表示
ファイル構造
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": "ドキュメントを保存"
}
}
ベストプラクティス
- 一貫した命名規則:
screen_component_purpose形式を使用(例:home_button_login) - 早期ローカライゼーション: 開発初期から文字列キーを使用
- コンテキストの提供: 翻訳者のためにコメントを追加
- 定期的な確認:
undefined_strings.jsonを定期的にチェック - バージョン管理:
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を再実行