最終更新日時:
が更新

履歴 編集

class template
<locale>

std::messages

namespace std {
  template <class charT>
  class messages : public locale::facet, public messages_base;
}

概要

messagesは、メッセージカタログから翻訳済みメッセージを取得するためのロケールファセットである。

カタログの識別方法やメッセージの対応付けは処理系定義であり、POSIX環境ではcatgetsgettextのような仕組みに対応付けられる。

メンバ関数

publicメンバ関数

名前 説明
(constructor) コンストラクタ
open 翻訳カタログを開く
get 翻訳メッセージを取得する
close 翻訳カタログを閉じる

静的メンバ変数

名前 説明
static locale::id id; このファセットを識別するためのID

protectedメンバ関数

名前 説明
(destructor) デストラクタ
do_open 翻訳カタログを開く (virtual)
do_get 翻訳メッセージを取得する (virtual)
do_close 翻訳カタログを閉じる (virtual)

メンバ型

名前 説明
char_type 文字型 charT
string_type 文字列型 std::basic_string<charT>

基本的な使い方

#include <iostream>
#include <locale>

int main()
{
  std::locale loc = std::locale::classic();
  const auto& msgs = std::use_facet<std::messages<char>>(loc);

  // メッセージカタログを開く
  std::messages_base::catalog cat = msgs.open("hello", loc);

  if (cat < 0) {
    std::cout << "cannot open" << std::endl;
  }
  else {
    // 第2引数はセット番号、第3引数はメッセージ番号、
    // 第4引数はメッセージが見つからなかった場合の既定値
    std::cout << msgs.get(cat, 1, 1, "default message") << std::endl;

    msgs.close(cat);
  }
}

出力例

default message

  • カタログ名からカタログへの対応付け、およびメッセージの対応付けは処理系定義である
  • カタログを用意していない場合、カタログを開けない処理系ではcannot openが、開ける処理系では既定値default messageが出力される

用意したメッセージカタログから翻訳メッセージを取得する

カタログの形式と探索方法は処理系定義であるため、あらかじめ処理系が要求する形式でカタログを用意する必要がある。以下は、POSIXのcatgets形式のカタログを使用する処理系(libc++等)での例である。

まず、メッセージのソースファイルhello.msgを用意する。

$set 1
1 Hello, world!
2 Goodbye

これをPOSIXのgencatコマンドでカタログファイルへ変換する。

gencat hello.cat hello.msg

このカタログを開いて、セット番号1・メッセージ番号1のメッセージを取得する。

#include <iostream>
#include <locale>

int main()
{
  std::locale loc = std::locale::classic();
  const auto& msgs = std::use_facet<std::messages<char>>(loc);

  std::messages_base::catalog cat = msgs.open("./hello.cat", loc);

  if (cat >= 0) {
    // カタログに登録されているメッセージが返る
    std::cout << msgs.get(cat, 1, 1, "default message") << std::endl;

    msgs.close(cat);
  }
}

出力例

Hello, world!

  • GNU gettext形式のカタログを使用する処理系(NLSを有効にしたlibstdc++等)では、msgfmtコマンドで作成した.moファイルを、open()にドメイン名を渡して使用する
  • カタログ機構を持たない処理系(macOS上のlibstdc++等)では、open()は成功するがget()は常に既定値を返す

バージョン

言語

  • C++98

関連項目