让 Poedit 使用 ES6 模板字符串?

Make Poedit work with ES6 template strings?

我正在使用 Poedit 的 "Update from code" 函数从我的 javascript 代码中提取字符串。 问题是我在代码中使用了 ES6 模板字符串,如下所示:

const myVariable = 5;
const myString = `My variable value is: ${variable}`

这导致在提取字符串进行翻译时出现以下错误:

warning: RegExp literal terminated too early

一些研究告诉我这是由于 gettext 的一个错误。

有没有办法让我继续使用带有模板字符串的 Poedit 还是我应该放弃该软件?

您不应该放弃 Poedit,它甚至不是罪魁祸首 — GNU gettext 才是。您应该 做的是始终确保您使用的是遇到任何问题的任何软件的最新版本;自从您安装了您的版本后,您的问题可能已经得到解决。

GNU gettext introduced support for template literals in version 0.20. Poedit updated its bundled copy of GNU gettext to 0.20 in version 2.2.4 in September 2019.

编辑: 这是一个演示,当前的 gettext 与基于您的代码段的最小合理(即使用 something 提取)代码一起工作:

$ cat test.js
const myVariable = 5;
const myString = `My variable value is: ${variable}`
_('translatable string');

$ xgettext -o- test.js
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-03-01 10:44+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: test.js:3
msgid "translatable string"
msgstr ""

$

想通了。原来错误不是模板字面量引起的,而是JSX的使用引起的。

该应用程序是一个 React 应用程序,编写的内容类似于

function MyComponent() {
    return <Comp></Comp>
}

将触发警告,而这不会:

function MyComponent() {
    return (<Comp></Comp>)
}

一般来说,在我的代码中的任何地方使用 JSX 而没有用括号包围它似乎会导致问题。