• c++11 标准模板(STL)本地化库 - 平面类别(std::messages) - 实现从消息目录获取字符串(三)


    本地化库

    本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C++ 标准库的其他组件的行为。

    平面类别

    实现从消息目录获取字符串

    std::messages

    template< class CharT >
    class messages;

    类模板 std::messages 是标准 locale 平面,它封装从消息目录取得字符串,例如 GNU gettext 或 POSIX catgets 所提供者。

    消息源是实现定义的。

    继承图

    标准库提供二个孤立(独立于本地环境)的特化:

    定义于头文件

    std::messages访问窄字符串消息目录
    std::messages访问宽字符串消息目录

    另外, C++ 程序中的每个 locale 对象还实装这些特化的其自身(本地环境限定)版本。

    成员类型

    成员类型定义
    char_typeCharT
    string_typestd::basic_string

     

    调用 do_get & 从打开的消息目录获取消息

    1. std::messages<CharT>::get,
    2. std::messages<CharT>::do_get

    public:
    string_type get( catalog cat, int set, int msgid, const string_type& dfault ) const;

    (1)

    protected:
    virtual string_type do_get( catalog cat, int set, int msgid, const string_type& dfault ) const;

    (2)

    1) 公开成员函数,调用最终导出类的受保护虚成员函数 do_get

    2) 用值 setmsgiddfault ,以实现定义方式从打开的消息目录 cat 获得消息。若目录中找不到期待 消息,则返回 dfault 的副本。

    参数

    cat-从 open() 获得且仍未传递给 close() 的标识符
    set-实现定义参数, POSIX 中为消息集
    msgid-实现定义参数, POSIX 中为消息标识
    dfault-要在目录中查找的字符串(若目录使用字符串查找),亦为失败情况下返回的字符串

    返回值

    来自目录的消息,或若找不到消息则为 dfault 的副本。

    注意

    POSIX 系统上,此函数调用通常被翻译为对 catgets() 的调用,并原态传递参数 setmsgiddfaultcatgets() 。 GNU libstdc++ 中,此函数忽略 setmsgid ,并简单地在要求的本地环境中调用 GNU gettext(dfault)

    调用示例 linux

    下列代码演示消息取得:典型的 GNU/Linux 上,它从 /usr/share/locale/de/LC_MESSAGES/sed.mo 读取

    1. #include <iostream>
    2. #include <locale>
    3. int main()
    4. {
    5. std::locale locale("de_DE.utf8");
    6. std::cout.imbue(locale);
    7. auto& facet = std::use_facet<std::messages<char>>(locale);
    8. auto cat = facet.open("sed", locale);
    9. if (cat < 0)
    10. {
    11. std::cout << "Could not open german \"sed\" message catalog" << std::endl;
    12. }
    13. else
    14. {
    15. std::cout << "\"No match\" in German: "
    16. << facet.get(cat, 0, 0, "No match") << std::endl
    17. << "\"Memory exhausted\" in German: "
    18. << facet.get(cat, 0, 0, "Memory exhausted") << std::endl;
    19. facet.close(cat);
    20. }
    21. return 0;
    22. }

    输出

    1. "No match" in German: Keine Übereinstimmung
    2. "Memory exhausted" in German: Speicher erschöpft
    3. Press <RETURN> to close this window...

    调用示例 windows

    1. #include <iostream>
    2. #include <locale>
    3. int main()
    4. {
    5. std::locale locale("Chinese (Simplified)_China.936");
    6. std::cout.imbue(locale);
    7. auto& facet = std::use_facet<std::messages<char>>(locale);
    8. auto cat = facet.open("sed", locale);
    9. if (cat < 0)
    10. {
    11. std::cout << "Could not open german \"sed\" message catalog" << std::endl;
    12. }
    13. else
    14. {
    15. std::cout << "\"No match\" in German: "
    16. << facet.get(cat, 0, 0, "No match") << std::endl
    17. << "\"Memory exhausted\" in German: "
    18. << facet.get(cat, 0, 0, "Memory exhausted") << std::endl;
    19. }
    20. facet.close(cat);
    21. return 0;
    22. }

    输出

    Could not open german "sed" message catalog

  • 相关阅读:
    多神经网络模型联合训练,全连接神经网络模型
    【IDEA】在IntelliJ IDEA中导入Eclipse项目:详细指南
    mp4音视频分离技术
    AAAAAAAAA
    衔尾法解决当无法使用空闲中断以及DMA中断时配置DMA接收串口不定长数据
    论文解读(DWL)《Dynamic Weighted Learning for Unsupervised Domain Adaptation》
    一个用mediapipe计算脸部朝向的简单方法
    1333.餐厅过滤器【leetcode】【Java】
    百货商场会员系统 加强会员身份“认同感”(上)
    Uniapp的APP端实现本地离线缓存
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/138038822