【问题标题】:How to match Google translate result with input string如何将谷歌翻译结果与输入字符串匹配
【发布时间】:2019-09-13 15:35:16
【问题描述】:

我想将 N 个美国英语转换为其他一些语言。我有一个美国字符串为“JSON”格式,如下所示,

"AdminLocales": {
    "-locale": "en_US",
    "global": {
      "search": "Search",
      "noOrdersFound": "No Orders Found",
      "prevPage": "Prev Page",
      "nextPage": "Next Page"
    },
     "languageList": {
      "1": {
        "type": "Student",
        "area": "Kovilpatti"
      },
      "2": {
        "type": "Employee",
        "area": "Tuticorin"
      },
    }
}

我想转换近 3000 个字符串。所以我反序列化了我的输入并循环了数据。这意味着我为每个字符串调用了谷歌翻译 API,所以我的 API 调用将是 3000 次。

所以我在该 API 中调用这么多时间时遇到了请求超时问题。就像下面的代码

<cfset myKey = 'abcd'>
<cfhttp url="https://translation.googleapis.com/language/translate/v2?key=#myKey#" method="post" charset="utf-8"  result="getTokens">
      <cfhttpparam type="header" name="Content-Type" value="application/json">
      <cfhttpparam type="body" name="data" value="{
 'q': 'Welcome',
 'target': 'hi'
}"> 
</cfhttp>

我发现因为我们可以同时传递N个源字符串输入所以我传递它如下

<cfhttpparam type="body" name="data" value="{
     'q': 'Welcome',
     'q': 'Good Morning',
     'q': 'Good Evening',
     'q':'Welcome to all',
     'q': 'Good night',
     'target': 'hi'
    }"> 

我得到了结果,因为输出与我通过的输入顺序相同,

" { "data": { "translations": [ { "translatedText": "स्वागत हे", "detectedSourceLanguage": "en" }, { "translatedText": "शुभ प्रभात", "detectedSourceLanguage": "en" }, { "translatedText": "सुसंध्या", "detectedSourceLanguage": "en" }, { "translatedText": "सभी का स्वागत हैं", "detectedSourceLanguage": "en" }, { "translatedText": "शुभ रात्रि", "detectedSourceLanguage": "en" } ] } } "

这对于正常测试来说很好。

现在回到我的输入,如何同时传递所有输入并匹配 https 调用的结果。因为我没有任何输入顺序。我有结构的结构,它是子结构等...从我的输入中,如果我传递为“搜索、上一页、下一页、Studen、Kovilpatti 等”(源字符串),它会返回相同的顺序。在这里,我如何匹配该特定结果是针对特定源字符串的。

Google 是否希望您传递一个密钥来识别正确的返回值?

【问题讨论】:

  • 你可以控制源字符串吗?
  • 是的。我有一个控制。 @Ageax
  • 如果您正在构建 JSON 字符串,您可以使用“有序”结构(CF2016 中的新功能)来维护添加项目的顺序。否则,您可能必须使用数组手动跟踪订单。然后将其与 google 返回的数组匹配。 编辑 AFAIK,当您使用结构文字语法时,不支持有序结构,而不是任何版本。鉴于 JSON 的流行,这非常令人惊讶....

标签: json coldfusion google-translate google-translation-api


【解决方案1】:

最后我得到了我的逻辑的解决方案。在这里,我解释了如何解决这种情况。我们可以通过传递一些分隔符来实现这一点。在这里,我使用 -(连字符)作为分隔符。

<cfset myStr = {'Name':'Kannan','State':'Tamilnadu','Country':'India','Position':'Projects Lead','Description':'Test translate API call'}>

以上是我原来的结构。我已经用连字符分隔符转换了这个结构键值,如下所示,

<cfset convertString = ''>
<cfloop index='keys' list="#keyList#">
    <cfset convertString = listAppend(convertString,structFind(myStr,keys),'-')>
</cfloop>

现在我的字符串看起来像 Tamilnadu-Kannan-Test translate API call-India-Projects Lead

我可以通过调用下面的 API 在单个 http 调用中传递上面的字符串,

<cfhttp url="https://translation.googleapis.com/language/translate/v2?key=myApiKey132" method="post" charset="utf-8"  result="returnData">
     <cfhttpparam type="header" name="Content-Type" value="application/json">
     <cfhttpparam type="body" name="data" value="{
'q': '#convertString#',
'target': 'hi'
}"> 
 </cfhttp>

API 调用返回数据如下图,

所以我的转换字符串应该具有我通过的二倍仪,如तमिलनाडु-कन्नन-टेस्टअनुवादएपीआई-इंडिया-प्रोजेक्ट्सलीड

现在我可以根据我的分隔符 -(连字符)循环结果并匹配我的结构键,如下面的代码。

<cfset convertStr = {}>
<cfset apiResult = deserializeJSON(returnData.filecontent)>

<cfset a = 1>
<cfloop index="result" list="#apiResult.data.translations[1].translatedText#" delimiters="-">
    <cfset structInsert(convertStr,listgetat(keyList,a),result)>
    <cfset a = a+1>
</cfloop>

终于得到了我预期的结果。

原始结构

翻译后:

<cfdump var="#convertStr#" label="Google Translate Structure" />

感谢您对这些的关注。

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 2011-12-26
    • 2021-04-05
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2015-02-25
    相关资源
    最近更新 更多