-
Notifications
You must be signed in to change notification settings - Fork 0
StringManager
Taichiro Kimura edited this page Apr 19, 2026
·
1 revision
SwiftJsonUI 7.2.0で導入された文字列管理・ローカライゼーションシステム
StringManagerは、JSONレイアウトファイルから文字列を自動的に抽出し、多言語対応を含む文字列管理を効率化するシステムです。UIKitとSwiftUIの両方で使用可能な型安全な文字列アクセサーを生成します。
JSONレイアウトファイルから以下の文字列を自動検出・抽出:
- 全コンポーネントの
text属性 -
partial_attributes.range.text(属性付きテキスト) -
placeholder、titleなどのテキスト関連属性 - ボタンやラベルのテキストコンテンツ
スネークケース形式のキーは、ローカライゼーションキーとして扱われます:
{
"type": "Label",
"text": "welcome_message" // ローカライゼーションキー
}直接記述されたテキストは、ローカライゼーション対象として抽出されます:
{
"type": "Label",
"text": "Welcome to our app!" // 直接テキスト
}アプリで使用される全ての文字列とその翻訳を定義:
{
"welcome_message": {
"en": "Welcome!",
"ja": "ようこそ!",
"es": "¡Bienvenido!"
},
"login_button": {
"en": "Login",
"ja": "ログイン",
"es": "Iniciar sesión"
}
}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" = "ログイン";
型安全な文字列アクセサーを自動生成:
public struct StringManager {
public static let welcomeMessage = NSLocalizedString("welcome_message", comment: "")
public static let loginButton = NSLocalizedString("login_button", comment: "")
}sjui.config.jsonで設定を有効化:
{
"resource_manager_directory": "ResourceManager",
"localization": {
"languages": ["en", "ja", "es"],
"default_language": "en"
}
}sjui buildビルドコマンド実行時に以下が自動的に行われます:
- JSONレイアウトファイルから文字列を抽出
-
Layouts/Resources/strings.jsonを更新 - 各言語の
.stringsファイルを生成/更新 -
StringManager.swiftを生成/更新
label.text = StringManager.welcomeMessage
button.setTitle(StringManager.loginButton, for: .normal)Text(StringManager.welcomeMessage)
Button(StringManager.loginButton) {
// action
}{
"type": "Label",
"text": "welcome_message" // strings.jsonのキー
}{
"type": "Label",
"text": "This will be extracted" // 自動的に抽出される
}- JSONレイアウトに直接テキストを記述
-
sjui build実行で文字列が自動抽出 -
strings.jsonにNOT_IMPLEMENTED_YETとして記録
-
strings.jsonを開いて翻訳を追加 - 各言語のテキストを入力
-
sjui buildを再実行して.stringsファイルを更新
- 全ての
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のビルドフェーズでリソースがコピーされているか確認
- デバイスの言語設定を確認
-
strings.jsonで該当キーの翻訳を追加 -
sjui buildを再実行