为什么我的应用程序无法加载库的翻译文件

为什么我的应用程序无法加载库的翻译文件

我有一个依赖于某些库的点击应用程序,
并且我已将该库打包在点击包中。
该库加载良好。但未找到翻译文件(.mo)。
我的点击文件免费看起来像这样:

/
/share
/share/locale/<LANG>/LC_MESSAGES/somlib.mo
/lib/i386-linux-gnu/somelib.so

当然,还有更多文件,但我认为这与问题相关。

我也试着穿上它/usr/share/locale/<LANG>/LC_MESSAGES/somlib.mo

但我发现,该库尝试在真实的 /usr/share/locale/...我无法访问它,请单击包将文件放在那里...
(我用 将文件复制到此路径mv,并且可以工作)

我试图使用strace它来知道该库在哪里查找他的文件,但我不知道如何在手机上执行此操作(使用模拟器)。尝试时strace qmlscene出现错误,我必须连接到 mir 服务器,或类似的东西。

谢谢。

答案1

gettext 搜索特定翻译域的翻译的目录由bindtextdomain函数。库很可能在其初始化例程的某个地方调用此函数。因此,您可以尝试以下两个选项:

  1. 修改库,以便bindtextdomain调用根据指定目录$APP_DIR。因此库可能运行的位置:

    bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR);
    

    您可以将其更改为类似以下内容:

    const char *app_dir = getenv("APP_DIR");
    if (app_dir) {
        char *localedir = NULL;
        asprintf(&localedir, "%s/share/locale", app_dir);
        bindtextdomain(PACKAGE, localedir);
        free(localedir);
    } else {
        /* Not running as a click package: use compiled in default */
        bindtextdomain(PACKAGE, PACKAGE_LOCALE_DIR);
    }
    
  2. bindtextdomain在库初始化之后运行第二次调用,为库的翻译域设置正确的目录(可能使用与上述类似的代码)。

如果不知道更多具体情况,很难提供更多建议。

相关内容