我使用Boost.Locale与ICU后端(内部使用gettext)进行翻译。此翻译使用存储在磁盘上的字典。通过boost的generator类提供搜索路径,如下所示:
boost::locale:generator gen;
gen.add_messages_path("path");通过检查boost的源代码,它在内部通过localization_backend::set_option传递到本地化后端的路径。在我使用的ICU本地化后端实现中,这最终会使路径在gnu_gettext::messages_info (paths字段)中设置。
至于我的问题,我的要求是确保用户不会更改文本,例如修改磁盘上的.mo字典文件。我使用Boost.Locale的原因是它的代码页翻译支持、多语言支持等等,我想保留它,但我不希望用户能够自由定义以后应用程序中使用的文本。我最初的想法是以某种方式使用“内存中”的字典,例如将.mo文件内容存储在可执行文件中,并以某种方式将已经读取的数据传递到localization_backend中。但是,在检查了它的内部工作方式(上面描述)之后,似乎唯一受支持的选项是让字典在“实时”中阅读,就像我做翻译一样,这可能包括用户对这些文件所做的任何更改。要么是那个,要么是我遗漏了什么?
我有什么选择?
发布于 2022-10-13 12:05:10
您可以使用callback字段在gnu_gettext::messages_info上提供将被调用的函数,而不是从磁盘加载消息文件。来自自定义文件系统支持
namespace blg = boost::locale::gnu_gettext;
blg::messages_info info;
info.language = "he";
info.country = "IL";
info.encoding="UTF-8";
info.paths.push_back(""); // You need some even empty path
info.domains.push_back(blg::messages_info::domain("my_app"));
info.callback = some_file_loader; // Provide a callback回调签名是std::vector<char>(std::string const &file_name, std::string const &encoding)。测试中有一个例子;这实际上是从磁盘加载的,但是您可以修改它以返回硬编码的数据。
https://stackoverflow.com/questions/74025596
复制相似问题