Skip to content

[Feature] NDMF Localization & Crowdin Integration / NDMFローカライズとCrowdin自動化の導入 #25

@Rollphes

Description

@Rollphes

📝 Is your feature request related to a problem?

avatar-compressor のユーザー層は日本だけでなく国外にも需要が広がっており、多言語対応(I18n)の需要が出始めています。
現在の UI 実装(ハードコードされた文字列など)では、多言語対応を行うのが難しく、また開発者が翻訳ファイルを管理する負担も大きいです。
さらに、Modular Avatar や Avatar Optimizer といった他の NDMF ツールとの一貫性(言語設定の共有など)も不足しています。
また、現状のUIは英語ですがユーザー数が多いのは日本であると考えます。

💡 Describe the solution you'd like

NDMF (Non-Destructive Modular Framework) が提供する標準のローカライズ機能 (nadena.dev.ndmf.localization) を導入し、Crowdin を用いた翻訳ワークフローの自動化を提案します。

1. NDMF Localization API の採用

  • NDMF の Localizer クラスを使用することで、Modular Avatar 等と共通の言語設定 (LanguagePrefs) を利用できるようにします。
  • LocalizeUIElements メソッドを活用し、UI Toolkit (UXML) ベースの翻訳適用を簡素化します。

2. Crowdin + GitHub Actions による自動化

  • Crowdin(翻訳管理プラットフォーム)と連携し、翻訳作業をコミュニティに開放します。
  • GitHub Actions を設定し、main ブランチへのプッシュで原文 (en-US.json) を Crowdin にアップロードし、翻訳結果を定期的に Pull Request として取り込むワークフローを構築します。

👥 Implementation Details (Draft & AI Base)

ディレクトリ構成案:
Editor/
└── Localization/
├── en-US.json (Source)
├── ja-JP.json
├── ko-KR.json
├── zh-CN.json
└── ACLocalization.cs

ACLocalization.cs 実装イメージ:

using nadena.dev.ndmf.localization;

internal static class ACLocalization
{
    private static Localizer _localizer;
    public static Localizer Localizer
    {
        get
        {
            if (_localizer == null)
            {
                _localizer = new Localizer("en-US", () => LoadLocalizationAssets());
            }
            return _localizer;
        }
    }
    
    // 簡易アクセサ
    public static string Tr(string key) => Localizer.GetLocalizedString(key);
}

Describe alternatives you've considered

  • 独自のローカライズ実装: メンテナンスコストが高く、他のツールと言語設定が連動しないため却下。
  • PRベースの手動翻訳: 翻訳ファイルの競合や、開発者によるマージ作業の負担が大きいため、Crowdin による自動化が望ましい。

Additional context

なし

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions