最終更新日時:
が更新

履歴 編集

function
<locale>

std::messages_byname::コンストラクタ

explicit messages_byname(const char* name, size_t refs = 0);   // (1) C++98
explicit messages_byname(const string& name, size_t refs = 0); // (2) C++98

概要

名前で指定したロケールの、翻訳メッセージの取得ファセットオブジェクトを構築する。

  • (1) : ロケール名をconst char*で受け取る
  • (2) : ロケール名をstringで受け取る

効果

  • (1) : nameを名前としてlocale(const char*)で構築されるロケールの、messagesファセットと等価な仮想関数の意味論を持つよう構築する。refsは基底クラスのコンストラクタへ渡される
  • (2) : messages_byname(name.c_str(), refs)と同じ効果を持つ

例外

nameが妥当なロケール名でない場合、もしくはヌルポインタである場合、std::runtime_errorを送出する。

備考

refsは、このファセットの参照カウントの初期値である。

  • refs == 0の場合、このファセットを保持するlocaleオブジェクトが破棄されるとき、ファセットも破棄される
  • refs == 1の場合、localeオブジェクトの破棄によってファセットが破棄されることはない

妥当なロケール名は処理系定義である。"C"と、処理系のネイティブロケールを表す空文字列""は、すべての処理系でサポートされる。

メッセージカタログの形式と探索方法は処理系定義である。以下は、POSIXのcatgets形式のカタログを使用する処理系での例である。

日本語のメッセージのソースファイルja.msgを、

$set 1
1 こんにちは、世界!

POSIXのgencatコマンドでカタログファイルja.catへ変換したものが存在するとする。

gencat ja.cat ja.msg

#include <iostream>
#include <locale>
#include <string>

int main()
{
  std::string name = "ja_JP.UTF-8";

  // (1) ロケール名をconst char*で渡す
  std::locale loc1{std::locale::classic(), new std::messages_byname<char>{"ja_JP.UTF-8"}};

  // (2) ロケール名をstringで渡す
  std::locale loc2{std::locale::classic(), new std::messages_byname<char>{name}};

  for (const std::locale& loc : {loc1, loc2}) {
    const auto& msgs = std::use_facet<std::messages<char>>(loc);

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

    if (cat >= 0) {
      std::cout << msgs.get(cat, 1, 1, "Hello, world!") << std::endl;
      msgs.close(cat);
    }
  }
}

出力例

こんにちは、世界!
こんにちは、世界!

  • messages_bynameを使うと、グローバルロケールを変更することなく、メッセージのカテゴリだけを特定の名前のロケールのものに固定できる
  • カタログ名からカタログへの対応付けは処理系定義である。GNU gettextを使用する処理系では、open()にドメイン名を渡すことで、ロケール名に対応するカタログが選択される
  • 妥当なロケール名は処理系定義である。指定した名前が妥当でない場合、コンストラクタはstd::runtime_errorを送出する

バージョン

言語

  • C++98

関連項目