代码之家  ›  专栏  ›  技术社区  ›  Sam94

WordPress插件翻译不工作从EN到FR,是什么原因?

  •  0
  • Sam94  · 技术社区  · 2 年前

    我正在创建一个新插件。我使用POedit为我的插件生成了PO和MO文件,并遵循了上所述的所有步骤 https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/ ,从在主插件文件中写一个完美的头,到在同一文件中添加php代码,以便加载文本域和MO文件。

    当我将网站语言从英语更改为法语时,插件仍然显示EN字符串。

    可能是什么问题?是因为这个插件还没有出现在wordpress.org上吗?

    这是我的笔记本电脑配置:

    locahost : wampserver
    Windows 10
    Php version : 8.1
    

    提前感谢!

    笔记

    在主插件文件中,为了加载PO和MO文件,我放了这个:

    /**
     * wpdocs_load_textdomain() loads Text Domain for the translation
     */
    function wpdocs_load_textdomain() {
        load_plugin_textdomain( 'str-sticky-header', false, dirname( plugin_basename( __FILE__ ) ) . '/lang' ); 
    }
    
    
    /**
     * my_plugin_load_my_own_textdomain( $mofile, $domain )  loads the MO file for the translation
     * @param $mofile
     * @param $domain
     */
    function my_plugin_load_my_own_textdomain( $mofile, $domain ) {
        if ( 'str-sticky-header' === $domain && false !== strpos( $mofile, WP_LANG_DIR . '/plugins/' ) ) {
            $locale = apply_filters( 'plugin_locale', determine_locale(), $domain );
            $mofile = WP_PLUGIN_DIR . '/' . dirname( plugin_basename( __FILE__ ) ) . '/lang/' . $domain . '-' . $locale . '.mo';
        }
        die($mofile);
        return $mofile;
    }
    
    add_action( 'init', 'wpdocs_load_textdomain' );
    add_filter( 'load_textdomain_mofile', 'my_plugin_load_my_own_textdomain', 10, 2 );
    

    这个 die($mofile) 功能是显示正确的MO文件。翻译本身有错吗?

    0 回复  |  直到 2 年前
        1
  •  0
  •   DanieleAlessandra    2 年前

    您与我们共享的所有代码都是正确的。您甚至不需要函数 my_plugin_load_my_own_textdomain 但我认为它仅用于调试。

    问题应该出现在我们看不到的代码部分。如果配置良好, 翻译必须在您的本地环境中工作,即使插件尚未分发 .

    检查以下事项:

    1. 你的.mo文件存在吗?你说过当你执行 die($mofile) 你看到的东西看起来像是正确的文件,请用类似的东西检查两次 is_file($mofile) 。如果文件丢失,实际上,翻译会无声地失败。
    2. 这个名字正确吗?你的.mo文件必须这样命名 <text_domain>-<locale>.mo ,在您的情况下,文件必须命名 str-sticky-header-fr_FR.mo 。应该已经是这样了,因为您在中看到了该名称 my_plugin_load_my_own_textdomain
    3. 你的文件有效吗?它可能已损坏,您使用什么来生成translateio文件?试试这个在线免费资源 https://localise.biz/free/poeditor (不是我的,我在谷歌上搜索了一下)。

    在试图找出你的问题时,我写了一个简单的PHP脚本,一旦放在.mo翻译的目录中,就会检查它们是否有效。希望这个脚本能帮助你和其他人调查类似的问题。你可以在这里找到它: https://github.com/DanieleAlessandra/wp-translation-check


    [编辑:添加片段以调查翻译加载状态]

    经过多次尝试,我们仍然不知道您的翻译文件是否已加载。请将以下代码段添加到任何位置,以便输出文本域中当前语言的加载字符串:

    $translations = get_translations_for_domain( 'str-sticky-header' );
    echo('<pre>');
    var_dump($translations->entries);
    

    放置此片段的最佳位置是翻译失败后的immediatelu,因此您可以将未翻译的字符串与此片段输出一起放在眼前。

    输出应该类似于以下内容:

    array(1) {
      [0]=>
      object(Translation_Entry)#2914 (9) {
        ["is_plural"]=>
        bool(false)
        ["context"]=>
        NULL
        ["singular"]=>
        string(36) "Hello, this is the original message!"
        ["plural"]=>
        NULL
        ["translations"]=>
        array(1) {
          [0]=>
          string(43) "Bonjour, ceci est un message en français!"
        }
        ["translator_comments"]=>
        string(0) ""
        ["extracted_comments"]=>
        string(0) ""
        ["references"]=>
        array(0) {
        }
        ["flags"]=>
        array(0) {
        }
      }
    }
    

    希望你能有更多的参赛作品。

    通过此输出,您将能够了解正在发生的情况:

    1. 输出是空数组?您的文件没有加载,或者文本域字符串中有拼写错误。
      • 检查文本域。
      • 检查文件名。
    2. 输出中充满了翻译?也许这个翻译缺少字符串,或者你没有使用这个翻译。
      • 检查代码中的textdomain,在任何 __() , _e() ,或任何其他翻译,您可能有拼写错误。
      • 检查字符串,它们必须与转换键、空格计数相同,并且区分大小写。
    3. 在检查了1和2之后仍然没有成功:您可能有一些缓存。
      • 删除任何缓存插件。
      • 如果可能,清除缓存。

    请随时向我通报结果。

        2
  •  0
  •   Sam94    2 年前

    以下是解决方案: 我在这里谈论我的案子, 当我在中向Gettext函数添加文本域名时 interface.php 文件,我使用了以下命令行: php add-textdomain.php TextDomainNameOfThePlugin PathToInterfaceFile/interface.php > tdn.php , 所以我生成 tdn.php 正如您在命令行中看到的,并基于这个未使用的新文件构建了我的POT、PO和MO文件,但我忘记了重命名 tdn.php 接口.php (并删除旧的 接口.php )这样我就可以使用它,或者复制它的内容并粘贴到 接口.php 在其Gettext函数中不包含文本域名的文件。

    所以现在,我只是将tdn.php的内容复制到interface.php中,翻译工作非常完美。

    谢谢@DanieleAlessandra!