如何将Google翻译结果与输入字符串匹配

时间:2019-04-24 10:50:53

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

我想将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个字符串。因此,我将输入反序列化为JSON并遍历数据。这意味着我为每个字符串调用了Google翻译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'
    }"> 

我得到了结果,因为out是我通过的输入顺序,

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

这对正常测试很好。

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

Google是否希望您输入密钥以识别正确的回报?

1 个答案:

答案 0 :(得分:0)

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

<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翻译API调用-印度-项目负责人

我可以通过调用以下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调用返回的数据如下图所示, enter image description here

因此,转换后的字符串应具有传递的分隔符,例如

现在,我可以根据自己的定界符-(连字符)遍历结果,并像下面的代码一样匹配我的结构键。

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

最后我得到了预期的结果。

原始结构

enter image description here

翻译后:

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

enter image description here

谢谢您对这些的关注。