2017-09-23 148 views
0

我有一個組件需要來自後端的字符串。我目前請求服務器上的.po文件,將其轉換爲.json並將其返回給我的React組件。然後,我希望能夠同時在字符串中替換正確的值顯示這些字符串,即React-Intl:從API響應中加載新字符串

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

dynamicId從單獨的API調用拉動,以及dynamicVals。

我的問題是,這些字符串沒有像我所有的其他應用程序字符串捆綁在一起,所以react-intl是不知道他們。如何將這些字符串添加到庫客戶端/異步?我試圖使用defineMessagesaddLocaleData,但我要麼做的不正確,要麼沒有使用正確的API方法。 addLocaleData提供了將字符串添加到庫的方法嗎?這可能嗎?

總結:

我怎樣才能收到

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

從API,並使用它顯示:

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

感謝提前的幫助。

+0

你有沒有嘗試過,當然'ID = {notifications.friendships.nowfriends}' – bennygenel

+0

是的。但是react-intl沒有對該id的任何引用。我想知道如何將字符串添加到反應組件中的庫中,我在該API中調用並顯示字符串 – jacoballenwood

+0

我之前沒有使用該庫,所以我只是猜測。你可以使用['addlocaledata'](https://github.com/yahoo/react-intl/wiki/API#addlocaledata)與你的API調用的結果嗎?或['definemessages'](https://github.com/yahoo/react-intl/wiki/API#definemessages) – bennygenel

回答

0

如果有人想知道什麼,我終於實現了......

因爲我已經有字符串和變量與插值,我繞過了本地化庫,只是使用了以下功能(感謝在這個question答案,尤其是@ user2501097和@Bryan雷納)

/** 
* 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