有没有办法从 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 中的文本文件中获取字符串(数据)?的主要内容,如果未能解决你的问题,请参考以下文章

Alexa Skill Kit - 保存用户输入

Alexa(智能家居技能)确定设备是否脱机。

如何更改 Alexa Show 技能卡上的背景图像?

在“认证”期间如何继续开发我的 Alexa Skill?

有没有办法输入一个对象,以便扩展接口的所有属性都是给定的类型?

从 Alexa 向 API 进行身份验证