namespace std {
template <class charT>
class messages : public locale::facet, public messages_base;
}
概要
messagesは、メッセージカタログから翻訳済みメッセージを取得するためのロケールファセットである。
カタログの識別方法やメッセージの対応付けは処理系定義であり、POSIX環境ではcatgetsやgettextのような仕組みに対応付けられる。
メンバ関数
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