【ITニュース解説】Implementing UI translation in SumatraPDF, a C++ Windows application
2025年09月26日に「Hacker News」が公開したITニュース「Implementing UI translation in SumatraPDF, a C++ Windows application」について初心者にもわかりやすく解説しています。
ITニュース概要
SumatraPDFというC++製Windowsアプリで、ユーザーインターフェースを様々な言語に翻訳して対応させる実装方法を解説する。開発者が直面した技術的な課題やその解決策を具体的に紹介しており、多言語対応の学びとなる。
ITニュース解説
ソフトウェア開発において、アプリケーションを世界中の人々に使ってもらうためには、ユーザーインターフェース(UI)を多言語に対応させる作業が非常に重要になる。これは「国際化(i18n)」や「地域化(l10n)」と呼ばれ、単に言葉を翻訳するだけでなく、日付や通貨の表示形式など、地域ごとの文化的な違いにも対応することを目指す。ここでは、PDFビューアであるSumatraPDFというC++言語で書かれたWindowsアプリケーションを例に、UIを多言語化する具体的なプロセスについて解説する。システムエンジニアを目指す上で、このような多言語対応の考え方や実装方法は、非常に実践的な知識となるだろう。
SumatraPDFはこれまで、UIの本格的な翻訳に対応していなかった。そのため、アプリケーションのソースコードの中に、ボタンのラベルやメニュー項目といったUIに表示される文字列が直接英語で記述されている部分が多かった。この状態では、もし他の言語に対応しようとすると、開発者がコードを直接変更し、その変更が翻訳者の作業にも影響を与えるため、非常に手間がかかり、非効率的だった。そこで、SumatraPDFのUIを多言語に対応させるためのプロジェクトが開始された。このプロジェクトの目的は、世界中のユーザーが自分の母国語でSumatraPDFを使えるようにするとともに、翻訳作業を効率化することだった。
多言語対応の最初のステップは、翻訳が必要なすべての文字列をアプリケーションのコードから探し出し、それらをコードとは別の場所に分離することだ。手作業でこれを行うと、非常に時間がかかり、見落としも発生しやすいため、非現実的である。このプロジェクトでは「lupdate」という専用のツールが使われた。lupdateはC++のソースコードを解析し、翻訳の対象となる文字列を自動的に識別して抽出する。抽出された文字列は「TSファイル」と呼ばれる特殊な形式のファイルに出力される。TSファイルはXMLベースのテキストファイルで、オリジナルの文字列と、それに対応する各言語の翻訳文をペアで格納するためのフォーマットとなっている。例えば、「Open」という元の文字列に対して、「開く」(日本語)や「Öffnen」(ドイツ語)といった翻訳が後から追加されていくことになる。
次に、このTSファイルを使って実際の翻訳作業を進める。世界中の複数の翻訳者が効率的に作業を進めるためには、使いやすい翻訳環境が不可欠だ。このプロジェクトでは「Weblate」というWebベースの翻訳プラットフォームが採用された。Weblateを利用することで、翻訳者はインターネットに接続されたブラウザ上でTSファイルの内容を閲覧し、直感的に翻訳を入力できるようになる。さらに、翻訳の進行状況を管理したり、複数の翻訳者間での共同作業をスムーズに進めたりする機能も提供される。これにより、翻訳の品質を維持しながら、効率的に多くの言語への対応を進めることが可能になった。
翻訳が完了し、TSファイルに各言語の翻訳文が揃ったら、アプリケーションがそれらの翻訳を利用できるように準備する。アプリケーションが直接TSファイルを読み込むのではなく、さらに効率的なバイナリ形式に変換するプロセスが必要となる。この変換には「lrelease」というツールが使われ、TSファイルは「QMファイル」と呼ばれるバイナリ形式のファイルにコンパイルされる。QMファイルは、アプリケーションが起動時に高速に読み込むことができるように最適化されており、各言語ごとに一つずつ作成される。
アプリケーションが起動する際、まずユーザーがオペレーティングシステムで設定している言語や、SumatraPDF内でユーザーが選択した言語を判別する。そして、その判別された言語に対応するQMファイルをメモリに読み込む。これにより、アプリケーションはUIに表示すべき文字列がどの言語の翻訳文であるかを知ることができるようになる。
実際にUIの各要素に翻訳された文字列を適用する段階は、既存のコードに変更を加える最も複雑な部分となる。これまでコードの中に直接「Open」や「Save」といった文字列が書かれていた箇所を、メモリから翻訳された文字列を読み込んで表示する形に置き換える必要がある。Windowsアプリケーションでは、Win32 APIというWindows OSが提供するプログラミングインターフェースを使ってUIを構築することが多い。記事では、「LoadString」関数を使って翻訳済み文字列をメモリから読み込んだり、「SetWindowText」関数でウィンドウのタイトルやボタンのテキストを設定したりする具体的な例が挙げられている。また、メニュー項目を追加する「AppendMenu」関数や、ツールバーのボタンを定義する「TBBUTTON」構造体など、さまざまなUI要素に対して、これまでハードコードされていた文字列を置き換える作業が必要となる。特に、ユーザーのアクションによって動的に生成されるメニューやダイアログ、メッセージボックスなども翻訳に対応させる必要があるため、アプリケーションの隅々まで変更を加えることになり、非常に多くの工数を要する作業となる。
多言語対応を実装する際には、単に文字列を置き換えるだけでなく、いくつか考慮すべき重要な課題が存在する。その一つが「フォントの問題」だ。日本語や中国語、韓国語といった言語(CJK言語)は、英語などのアルファベット言語に比べて文字の種類が非常に多く、また同じ内容でも翻訳によって文字列の長さが大きく変わることがある。例えば、英語の「File」が日本語の「ファイル」やドイツ語の「Datei」になることで、UI上で表示に必要なスペースが異なってくる。これにより、UIのレイアウトが崩れたり、文字が途中で切れてしまったりする可能性がある。また、特定の言語の文字が表示できない「文字化け」も発生しうる。これらの問題に対処するためには、適切なフォントを選択したり、UI要素のサイズを動的に調整したり、高解像度ディスプレイでの表示調整(DPIスケーリング)との連携を考慮したりする必要がある。
最後に、翻訳が正しく機能しているかを徹底的に「テスト」することも不可欠だ。すべてのUI要素が意図した通りに翻訳されているか、レイアウトが崩れていないか、特定の言語環境でエラーが発生しないかなどを、実際にその言語を使用する翻訳者やテスターの協力も得て、細かく確認する必要がある。
SumatraPDFのUI翻訳プロジェクトは、C++で書かれた既存のWindowsアプリケーションを多言語対応させるための具体的なプロセスと、それに伴う様々な技術的課題を示している。ソースコードからの文字列抽出、Webベースの翻訳プラットフォームの活用、アプリケーションへの翻訳済み文字列の統合、そしてフォントやレイアウトの問題への対処など、一連の作業は、システムエンジニアとしてアプリケーション開発に携わる上で避けて通れない重要な経験となるだろう。ユーザーエクスペリエンスを向上させるためには、このような地道な努力が不可欠であり、多言語対応はその代表的な例の一つと言える。