2013-09-21 16 views
8

Standard C++ definiuje sześć kategorii aspektów: collate, ctype, monetary, numeric, time i messages.Kiedy i jak używać std :: locale :: messages?

Znam użycie pierwszej piątki, ale nie wiem kiedy i jak używać ostatniego: std::locale::messages.

Jakieś przykładowe przykłady?

Odpowiedz

8

std::locale::messages służy do otwierania katalogów wiadomości (najczęściej GNU gettext), w tym do przetłumaczonych ciągów. Oto example który otwiera istniejący katalog wiadomości korzystając na Linux (dla sed) w języku niemieckim, pobiera (z wykorzystaniem get()) i wyprowadza tłumaczenia strun angielskiego:

#include <iostream> 
#include <locale> 

int main() 
{ 
    std::locale loc("de_DE.utf8"); 
    std::cout.imbue(loc); 
    auto& facet = std::use_facet<std::messages<char>>(loc); 
    auto cat = facet.open("sed", loc); 
    if(cat < 0) 
     std::cout << "Could not open german \"sed\" message catalog\n"; 
    else 
     std::cout << "\"No match\" in German: " 
        << facet.get(cat, 0, 0, "No match") << '\n' 
        << "\"Memory exhausted\" in German: " 
        << facet.get(cat, 0, 0, "Memory exhausted") << '\n'; 
    facet.close(cat); 
} 

które wyjścia:

"No match" in German: Keine Übereinstimmung 
"Memory exhausted" in German: Speicher erschöpft 

Edytuj: Wyjaśnienie zgodnie z this comment.

+3

Nie tylko GNU gettext. Katalogi wiadomości są częścią POSIX (np. Gencat (1), catopen (3)). Windows ma również katalogi wiadomości, chociaż nie jestem pewien, czy kiedykolwiek zadali sobie trud implementowania standardowych aspektów wiadomości dotyczących ustawień regionalnych. – bames53