Alexa Skills kitで多言語に対応したレスポンスを作る

以前の記事:ssml-builderで多言語に対応したレスポンスを作成する alexa-sdkでは、基本的にt()関数を使うことで文言の翻訳ができます。ただし地域によって参照する情報や処理を変えたい場合は、やはり自力で何 […]

広告ここから
広告ここまで

目次

    以前の記事:ssml-builderで多言語に対応したレスポンスを作成する

    alexa-sdkでは、基本的にt()関数を使うことで文言の翻訳ができます。ただし地域によって参照する情報や処理を変えたい場合は、やはり自力で何とかする必要があります。

    ということで、5 Tips for Building Multi-Language Alexa Skillsにある内容を元にヘルパー関数をつくってみました。

    ヘルパー関数を作る

    スキルや実装によってデフォルトにしたい言語や対応言語・地域が変わることがおおいと思います。なのでそのあたりをよしなにしつつ、分類してくれる関数を用意します。

    // 言語のマッピングを作る
    const localeMappings = {
        'en-US': 'en',
        'en-GB': 'en',
        'en-CA': 'en',
        'en-IN': 'en',
        'en-AU': 'en',
        'fr-FR': 'en',
        'de-DE': 'ge',
        'ja-JP': 'ja'
    }
    
    // event.request.localeの値に応じて分類する
    const dispatchLanguageData = (event, localeMappings, defaultLocale = 'en') => {
        if (!event.request || !event.request.locale) return defaultLocale
        const locale = localeMappings[event.request.locale]
        if (!locale) return defaultLocale
        return locale
    }

    使用イメージ

    先程のコードをhelpers.jsなどにしておくと便利です。en-XXX系を丸めたり、「ドイツやフランスもとりあえず英語で対応したい」という時にこれをかませておくと、後続処理の条件分岐がかなり書きやすくなります。

    const Alexa = require('alexa-sdk')
    const { localeMappings, dispatchLanguageData } = require('./helpers')
    
    const handlers = {
        'LaunchRequest': function () {
            const locale = dispatchLanguageData(this.event, localeMappings, 'ja')
            let speech = '地域のテストです。'
            switch (locale) {
                case 'ja':
                    speech += 'これは日本からの利用です'
                    break
                case 'ge':
                    speech += 'これはドイツからの利用です'
                    break
                default:
                    speech += 'これはそれ以外からの利用です'
                    break
            }
            this.emit(':tell', speech)
        }
    }
    
    exports.handler = function (event, context, callback) {
        const alexa = Alexa.handler(event, context, callback);
        alexa.registerHandlers(handlers);
        alexa.execute();
    };

    ヘルパー関数にする意味など

    元のコードより引数を増やしていますが、これはマッピング定義を別ファイルで管理したいことがでてくるかなというところと、デフォルトの言語を外から変えれるようにしたかったというところからです。

    こういうヘルパー関数的なものをたまに勝手に作って遊んでるので、ある程度溜まってきたらnpmパッケージにしてみたりするかもしれません。

    他に「こういうヘルパー関数あるといいよ!」みたいなのあれば、みなさんもぜひブログやQiitaに記事を書いてもらえればと思います

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark