0

我有一个需要来自后端的字符串的组件。我目前.po从服务器请求文件,将其转换为.json并将其返回给我的 React 组件。然后我希望能够显示这些字符串,同时替换字符串中的正确值,即

<FormattedMessage id={dynamicId} values={dynamicVals} />

dynamicId 是从单独的 api 调用以及 dynamicVals 中提取的。

我的问题是这些字符串不像我所有的其他应用程序字符串那样捆绑在一起,所以react-intl不知道它们。如何将这些字符串添加到库客户端/异步?我尝试使用defineMessagesand addLocaleData,但我要么做错了事,要么没有使用正确的 api 方法。是否addLocaleData提供将字符串添加到库的方法?这可能吗?

总之:

我怎样才能收到

{
  notifications.friendships.nowfriends: "{name} is now your friend"
}

从 api 并使用以下方法显示它:

<FormattedMessage id='notifications.friendships.nowfriends' values={{ name: 'StackOver Bro' }} />

我在这里先向您的帮助表示感谢。

4

1 回答 1

0

万一有人想知道我最后做了什么...

因为我已经有了要插入的字符串和变量,所以我绕过了本地化库,只使用了以下函数(感谢这个问题的答案,尤其是 @user2501097 和 @Bryan Rayner)

/**
 *  see: https://stackoverflow.com/questions/29182244/convert-a-string-to-a-template-string
 *
 * Produces a function which uses template strings to do simple interpolation from objects.
 *
 * Usage:
 *    var makeMeKing = generateTemplateString('${name} is now the king of {country}!');
 *
 *    console.log(makeMeKing({ name: 'Bryan', country: 'Scotland'}));
 *    // Logs 'Bryan is now the king of Scotland!'
 */
const generateTemplateString = (function () {
    const cache = {}

    function generateTemplate(template) {
        let fn = cache[template]

        if (!fn) {
            // Replace ${expressions} (etc) with ${map.expressions}.
            const sanitized = template
                .replace(/\$?\{([\s]*[^;\s\{]+[\s]*)\}/g, (_, match) => {
                    return `\$\{map.${match.trim()}\}`
                })
                // Afterwards, replace anything that's not ${map.expressions}' (etc) with a blank string.
                .replace(/(\$\{(?!map\.)[^}]+\})/g, '')

            fn = Function('map', `return \`${sanitized}\``)
            cache[template] = fn
        }

        return fn
    }

    return generateTemplate
}())

export default generateTemplateString
于 2017-09-24T21:10:41.797 回答