4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コントロールのローカライズ

FireMonkey で作られたアプリは、Windows / macOS / iOS / Android など、様々なプラットフォームで動作します。
また、世界中の様々な地域で利用される可能性があります。

地域によって使用する言語が異なるため、メッセージを表示する際には各国語にローカライズされた文字列を表示する必要があります。

そんなとき TLang を使います。
フォーム上のコントロールであれば、あらかじめ言語ごとの文字列を登録しておくことで、ロケールに応じた文字列が自動的に選択されます。

たとえば下図の例では、言語デザイナで英語(デフォルト)に対する日本語の文字列を設定しています。

image.png

コントロールではない文字列のローカライズ

コントロールに表示される文字列は TLang でローカライズできます。
では、ダイアログメッセージなど、コード側で扱う文字列はどうすれば良いのでしょうか。

その場合は IFMXLocaleService を使います。

IFMXLocaleService.GetCurrentLangID を使うと jafr, en といった言語コードを取得できます。
取得した言語コードに応じて、返すメッセージを切り替えます。

以下は Hello, World! を各国語で返す例です。

各国語版 Hello, World! を返す
// uses に FMX.Platform を追加

function GetHelloWorld: String;
begin
  // デフォルトの文字列(英語)
  Result := 'Hello, World!';

  var Id := '';

  var S: IFMXLocaleService;
  if
    TPlatformServices.Current.SupportsPlatformService(IFMXLocaleService, S)
  then
    Id := S.GetCurrentLangID.ToLower;

  // 日本語の文字列
  if Id = 'ja' then
    Result := 'こんにちは、世界!';

  // フランス語の文字列
  if Id = 'fr' then
    Result :=  'Bonjour le monde !';

  // ドイツ語の文字列
  if Id = 'de' then
    Result := 'Hallo Welt!';
end;

実際には、Id を毎回取得するのではなく initialization などで一度だけ取得し、変数に保持して使い回すのが良いでしょう。
(アプリ起動中にロケールが変更されることはほとんど無いため)

まとめ

ローカライズ文字列を扱う際は、用途に応じて使い分けます。

  • コントロール上の文字列は TLang
  • コード側の文字列は IFMXLocaleService.GetCurrentLangID

を使います。

簡単ですね!

VCL の場合

この記事では FireMonkey の TLangIFMXLocaleService を使った方法を紹介しました。

一方、VCL アプリケーションでは resourcestring を使い、言語ごとのリソース DLL を用意する方法がよく使われます。

resourcestring として定義した文字列はリソースとして扱われるため、言語ごとのリソース DLL を切り替えることで、アプリケーション本体を変更せずに表示文字列をローカライズできます。

詳しくは下記をご覧ください。

プロジェクトに言語を追加する

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?