有没有办法从 Alexa localisation.js 文件中存储在 s3 中的文本文件中获取字符串(数据)?
Posted
技术标签:
【中文标题】有没有办法从 Alexa localisation.js 文件中存储在 s3 中的文本文件中获取字符串(数据)?【英文标题】:is there a way to get string (data) from text file stored in s3 in Alexa localisation.js file? 【发布时间】:2021-03-13 03:41:54 【问题描述】:问题: 我正在尝试从存储在 s3 中的文本文件中获取数据,我使用同步等待在意图处理程序中正确获取数据,但我想在本地化文件中获取字符串,因为我正在尝试以 2 种语言实现解决方案。 我说技能没有正确响应是错误的。
这是file.js
const AWS = require('aws-sdk');
//========================
// This step is not required if you are running your code inside lambda or in
// the local environment that has AWS set up
//========================
const s3 = new AWS.S3();
async function getS3Object (bucket, objectKey)
try
const params =
Bucket: 'my-bucket',
Key: 'file.txt',
;
const data = await s3.getObject(params).promise();
let dat = data.Body.toString('utf-8');
return dat;
catch (e)
throw new Error(`Could not retrieve file from S3: $e.message`);
module.exports = getS3Object;
这是localisation.js
文件代码
const dataText = require('file.js');
async let textTitle = await dataText().then(); **// this does not work**
module.exports =
en:
translation:
WELCOME_BACK_MSG : textTitle,
,
it:
translation:
WELCOME_MSG: textTitle,
【问题讨论】:
你需要的file.js在哪里? @thedreamsaver 该文件已附加 技能执行的 CloudWatch 日志会很有帮助 - 您可以发布这些吗? “技能没有正确响应”错误是我在开发技能时经常看到的错误,未捕获的异常是输出而不是必要的技能 JSON 有效负载。 【参考方案1】:问题在于,在您的localisation.js
文件中,您尝试导出通过异步函数调用获得的内容,但您不能直接执行此操作,module.exports
被分配并同步返回。请参阅 this SO question and answer 以了解深入背景。
当您提到 Alexa 技能时,对于文件名称 localisation.js
,我假设您正在尝试类似于 this GitHub 存储库中提出的解决方案。
分析他们提供的index.js
文件的内容,似乎该库正在使用i18next 进行本地化。
如果您需要从外部资源加载本地化信息,该库提供了backend 的概念。
您可以实现自定义后端,尽管库提供了一个可以满足您需求的后端,i18next-http-backend。
如文档中所述,您可以配置库以使用此后端获取本地化资源,如下所示:
import i18next from 'i18next';
import Backend from 'i18next-http-backend';
i18next
.use(Backend)
.init(
backend:
// for all available options read the backend's repository readme file
loadPath: '/locales/lng/ns.json'
);
Here 在 SO 你可以找到一个更完整的例子。
您需要提供与 Alexa 技能示例项目中提供的 localisation interceptor 类似的配置,可能类似于:
import HttpApi from 'i18next-http-backend';
/**
* This request interceptor will bind a translation function 't' to the handlerInput
*/
const LocalizationInterceptor =
process(handlerInput)
const localisationClient = i18n
.use(HttpApi)
.init(
lng: Alexa.getLocale(handlerInput.requestEnvelope),
// resources: languageStrings,
backend:
loadPath: 'https://your-bucket.amazonaws.com/locales/lng/translations.json',
crossDomain: true,
,
returnObjects: true
);
localisationClient.localise = function localise()
const args = arguments;
const value = i18n.t(...args);
if (Array.isArray(value))
return value[Math.floor(Math.random() * value.length)];
return value;
;
handlerInput.t = function translate(...args)
return localisationClient.localise(...args);
;
请注意,您需要返回带有适当翻译的有效子文件,而不是文本文件:
"WELCOME_MSG" : "Welcome!!",
"WELCOME_BACK_MSG" : "Welcome back!!"
【讨论】:
如果将数据存储在 s3 存储桶中作为文本文件,那么我该怎么做? 嗨@AqibFarid。这就是问题所在,你不能那样做。您需要使用某种后端动态加载信息,并以 json 格式提供翻译。请看答案。 cr*** s3 系统非常有用的手册; )以上是关于有没有办法从 Alexa localisation.js 文件中存储在 s3 中的文本文件中获取字符串(数据)?的主要内容,如果未能解决你的问题,请参考以下文章