こんにちは。Riiidバックエンドチームのソン・ジュノです。
米国株投資学習ガイドアプリベストウェイ(Vest Way)をグローバル市場にリリースし、多言語対応を導入することになりました。今回の記事では、多言語対応を追加しながら経験したことと、これを効率的に実装するために
django-modeltranslationを導入した過程を共有したいと思います。
多言語対応が必要な理由
Djangoは基本的に多言語対応機能を提供しています。しかし、これはローカルファイルにあらかじめ保存された翻訳データをもとに動作するため、柔軟性に欠けます。
ベストウェイは、ブルームバーグから提供されたニュースをAIでリアルタイム翻訳して提供するサービスです。1日平均60件以上のニュースがアップロードされ、一部の動画は長さが数時間に達することもあります。このようなコンテンツの字幕、要約、タイトルなどをすべてローカルファイルで管理するのは非効率的でした。
そのため、開発の利便性と保守性を高めるために、より効率的な多言語対応ソリューションが必要でした。
django-modeltranslationを選んだ理由
ライブラリ選定基準は次のとおりでした。
導入当時は韓国語のみ対応していたサービスを英語まで拡張することが目標でしたが、長期的には日本語など他の言語も追加する可能性がありました。したがって、新しい言語を追加するたびにコード修正が最小限に抑えられることが最も重要な基準でした。
***本記事執筆日(2025–03–13)時点で日本語にも対応しています。***
Djangoエコシステムで使用可能なさまざまな多言語対応ライブラリを検討した結果、django-modeltranslationを最終的に選択しました。
django-modeltranslationを適用する
まず、プロジェクトにdjango-modeltranslationをインストールします。
pip install django-modeltranslation
settings.pyに次の設定を追加します。
INSTALLED_APPS = (
...
'modeltranslation',
'django.contrib.admin', # optional
...
)
USE_I18N = True
MODELTRANSLATION_DEFAULT_LANGUAGE = 'ko'
MODELTRANSLATION_LANGUAGES = ("ko", "en")
'django.contrib.admin'より前に配置する必要がありますMODELTRANSLATION_LANGUAGESにない言語へのリクエストはデフォルト言語(MODELTRANSLATION_DEFAULT_LANGUAGE)で提供されます。
コンテンツを例に挙げます。

元の動画はすべて英語のブルームバーグニュースでした。
翻訳された韓国語のtitleと要約が保存された状態です。
多言語対応したいモデルがあるディレクトリにtranslation.pyファイルを追加します。

では、マイグレーションを適用します。
python manage.py makemigrations
python manage.py migrate
マイグレーションを実行すると、各言語ごとに個別のフィールドが生成され、
null=Trueの状態で追加されます。

各言語別フィールドは通常のフィールドと同様に生成、照会、フィルタリングできます。
#Example
ExampleContent.objects.create(
title_en="SpaceX's Rescue Mission", title_ko="스페이스X의 구조 임무"
)
ExampleContent.objects.filter(summary_en__contains="nvidia")
Django-ModelTranslationの最大の特徴は、検出された言語に応じて、その言語に合ったデータを自動的に取得できる点です。
#Example
bloomberg_news = ExampleContent.objects.first()
#감지된 언어가 ko일 때
bloomberg_news.title # EU-남아프리카 정상회의에서 기대할 점
#감지된 언어가 ja일 때
bloomberg_news.title # EU-南アフリカ首脳会議から期待できること
ModelTranslationの言語検出は、次のような優先順位で動作します。
Accept-Languageヘッダーを確認この方法を活用すれば、新しい言語が追加される際にコード修正が不要、または最小限に抑えられます。
多言語コンテンツ管理戦略
言語別コンテンツフィルタリング
日本語対応を追加しながら、既存の韓国語/英語コンテンツをどのように管理するか検討が必要でした。現実的に、すべての過去コンテンツを日本語に翻訳するのは時間とコストの面で難しいためです。
これを解決するために、言語別コンテンツフィルタ機能を追加しました。これにより、ユーザーは希望する言語で提供されるコンテンツのみを探せます。

ブルームバーグ動画コンテンツの場合、常に該当関数を使用してクエリセットに言語別フィルタを適用します。 単純な関数ではありますが、経済コンテンツを提供するサービスでは信頼性が中核要素です。このフィルタを活用すると、ユーザーに一貫した言語環境を提供でき、これはすなわちサービスの信頼性を高めるうえで重要な役割を果たします。
翻訳漏れ防止: フォールバック(fallback)機能
たとえば、日本語ユーザーがコンテンツを閲覧する際、そのコンテンツがDBには日本語バージョンとして保存されていても、実際の翻訳が欠けている場合があります。このとき空のテキストをそのまま表示すると、ユーザー体験が低下するだけでなく、サービスの信頼性にも悪影響を及ぼす可能性があります。
翻訳が漏れているコンテンツがある場合、該当部分を空欄にする代わりに
フォールバック言語(fallback language)データを代わりに表示する方式で処理します。
MODELTRANSLATION_FALLBACK_LANGUAGES = {
'default': ('en',),
'ja': ('en', 'ko'),
}
このように設定すると:
en)ja)データがない場合、英語(en)データを表示ko)データを表示に設定されます。
特に英語ブランド名(例: AMD)のようにすべての言語で同じように使われるデータは、英語バージョンだけを保存して重複データ保存を防止できます。
これにより、次のような期待効果があります。
まとめ
今回の記事では、Django REST Frameworkでdjango-modeltranslationを活用した多言語対応方式を紹介しました。これにより、保守性を高め、新しい言語追加時のコード修正負担を最小限にすることができました。
django-modeltranslationはこのほかにもさまざまな便利機能を提供しており、今後もこれを積極的に活用して開発生産性を高めていく予定です。また、オープンソースプロジェクトとして運営されているだけに、直接貢献する方法も検討しています。特に、現在 ManyToManyFieldがfallbackをサポートしていない問題 を解決する方法について考えています.
多言語対応を検討している開発者にとって、今回の経験が役立てば幸いです。より良い方法や改善点があれば、ぜひご意見を共有してください!


