From a54d88b4c06355626b003d4b253af5c79a7f5e0f Mon Sep 17 00:00:00 2001 From: priya Date: Thu, 31 Oct 2019 10:31:38 -0700 Subject: [PATCH 1/5] Simplifying Localization --- .gitignore | 1 + design-assets/APL Worksheet.docx | Bin 1495804 -> 0 bytes design-assets/Cakewalk Worksheets.docx | Bin 1496869 -> 0 bytes design-assets/README.md | 8 - design-assets/cakewalk-sd.xd | Bin 214584 -> 0 bytes design-assets/script.pdf | Bin 8452 -> 0 bytes final/lambda_function.py | 220 ------------ i18n/alexa/__init__.py | 0 i18n/alexa/data.py | 16 - i18n/locales/data.pot | 57 --- i18n/locales/en-US/LC_MESSAGES/data.mo | Bin 359 -> 0 bytes i18n/locales/en-US/LC_MESSAGES/data.po | 64 ---- i18n/locales/fr-CA/LC_MESSAGES/data.mo | Bin 2037 -> 0 bytes i18n/locales/fr-CA/LC_MESSAGES/data.po | 71 ---- i18n/locales/fr-FR/LC_MESSAGES/data.mo | Bin 2089 -> 0 bytes i18n/locales/fr-FR/LC_MESSAGES/data.po | 73 ---- i18n/locales/hi-IN/LC_MESSAGES/data.mo | Bin 2622 -> 0 bytes i18n/locales/hi-IN/LC_MESSAGES/data.po | 68 ---- i18n/locales/it-IT/LC_MESSAGES/data.mo | Bin 1862 -> 0 bytes i18n/locales/it-IT/LC_MESSAGES/data.po | 68 ---- i18n/locales/ja-JP/LC_MESSAGES/data.mo | Bin 2282 -> 0 bytes i18n/locales/ja-JP/LC_MESSAGES/data.po | 69 ---- i18n/models/en-US.json | 123 ------- i18n/requirements.txt | 3 - {i18n => lambda/py}/lambda_function.py | 59 ++-- lambda/py/language_strings.json | 74 ++++ lambda/py/prompts.py | 12 + {final => lambda/py}/requirements.txt | 3 +- lambda/py/utils.py | 25 ++ {i18n/models => models}/en-AU.json | 0 {i18n/models => models}/en-IN.json | 0 {final => models}/en-US.json | 0 {i18n/models => models}/fr-CA.json | 0 {i18n/models => models}/fr-FR.json | 0 {i18n/models => models}/hi-IN.json | 0 {i18n/models => models}/it-IT.json | 0 {i18n/models => models}/ja-JP.json | 0 module-1/en-US.json | 39 --- module-1/lambda_function.py | 169 --------- module-1/requirements.txt | 2 - module-2/README.md | 400 --------------------- module-2/en-US.json | 119 ------- module-2/lambda_function.py | 175 ---------- module-2/requirements.txt | 2 - module-3/README.md | 298 ---------------- module-3/en-US.json | 119 ------- module-3/lambda_function.py | 213 ------------ module-3/requirements.txt | 3 - module-4/README.md | 458 ------------------------- module-4/en-US.json | 119 ------- module-4/lambda_function.py | 267 -------------- module-4/requirements.txt | 4 - i18n/skill.json => skill.json | 0 53 files changed, 146 insertions(+), 3255 deletions(-) create mode 100644 .gitignore delete mode 100755 design-assets/APL Worksheet.docx delete mode 100755 design-assets/Cakewalk Worksheets.docx delete mode 100755 design-assets/README.md delete mode 100755 design-assets/cakewalk-sd.xd delete mode 100755 design-assets/script.pdf delete mode 100644 final/lambda_function.py delete mode 100644 i18n/alexa/__init__.py delete mode 100644 i18n/alexa/data.py delete mode 100644 i18n/locales/data.pot delete mode 100644 i18n/locales/en-US/LC_MESSAGES/data.mo delete mode 100644 i18n/locales/en-US/LC_MESSAGES/data.po delete mode 100644 i18n/locales/fr-CA/LC_MESSAGES/data.mo delete mode 100644 i18n/locales/fr-CA/LC_MESSAGES/data.po delete mode 100644 i18n/locales/fr-FR/LC_MESSAGES/data.mo delete mode 100644 i18n/locales/fr-FR/LC_MESSAGES/data.po delete mode 100644 i18n/locales/hi-IN/LC_MESSAGES/data.mo delete mode 100644 i18n/locales/hi-IN/LC_MESSAGES/data.po delete mode 100644 i18n/locales/it-IT/LC_MESSAGES/data.mo delete mode 100644 i18n/locales/it-IT/LC_MESSAGES/data.po delete mode 100644 i18n/locales/ja-JP/LC_MESSAGES/data.mo delete mode 100644 i18n/locales/ja-JP/LC_MESSAGES/data.po delete mode 100644 i18n/models/en-US.json delete mode 100644 i18n/requirements.txt rename {i18n => lambda/py}/lambda_function.py (85%) create mode 100644 lambda/py/language_strings.json create mode 100644 lambda/py/prompts.py rename {final => lambda/py}/requirements.txt (80%) create mode 100644 lambda/py/utils.py rename {i18n/models => models}/en-AU.json (100%) rename {i18n/models => models}/en-IN.json (100%) rename {final => models}/en-US.json (100%) rename {i18n/models => models}/fr-CA.json (100%) rename {i18n/models => models}/fr-FR.json (100%) rename {i18n/models => models}/hi-IN.json (100%) rename {i18n/models => models}/it-IT.json (100%) rename {i18n/models => models}/ja-JP.json (100%) delete mode 100644 module-1/en-US.json delete mode 100644 module-1/lambda_function.py delete mode 100644 module-1/requirements.txt delete mode 100644 module-2/README.md delete mode 100644 module-2/en-US.json delete mode 100644 module-2/lambda_function.py delete mode 100644 module-2/requirements.txt delete mode 100644 module-3/README.md delete mode 100644 module-3/en-US.json delete mode 100644 module-3/lambda_function.py delete mode 100644 module-3/requirements.txt delete mode 100644 module-4/README.md delete mode 100644 module-4/en-US.json delete mode 100644 module-4/lambda_function.py delete mode 100644 module-4/requirements.txt rename i18n/skill.json => skill.json (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/design-assets/APL Worksheet.docx b/design-assets/APL Worksheet.docx deleted file mode 100755 index 0742857a3c0818c07af232dda544d9278daf84ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1495804 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%0D^UMg(42i=^ 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 RkvGz`>30AC diff --git a/design-assets/README.md b/design-assets/README.md deleted file mode 100755 index ad8c737..0000000 --- a/design-assets/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Cake Walk Design Assets - -This folder contains situational design assets for cake walk. You'll will need [Adobe XD](https://www.adobe.com/products/xd.html) to view the file. For more on situational design, please see: - -* [New Alexa Design Guide: Create Engaging Alexa Skills Using Situational Design](https://developer.amazon.com/blogs/alexa/post/ee0e00c9-37cd-46ac-8695-06552e0885b0/new-alexa-design-guide-create-engaging-alexa-skills-using-situational-design) -* [Alexa Design Guide](https://developer.amazon.com/docs/alexa-design/get-started.html) -* [Situational Design Templates](https://build.amazonalexadev.com/vui-vs-gui-guide-ww.html) -* [Video: How to Shift from ScreenFirst to Voice-First Design](https://www.twitch.tv/videos/409503308) \ No newline at end of file diff --git a/design-assets/cakewalk-sd.xd b/design-assets/cakewalk-sd.xd deleted file mode 100755 index 029f7eea24414dfbb112ea1a32063c767b84b491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214584 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 z 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≫4MBiz{-;-3HZF%yufi) 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 diff --git a/final/lambda_function.py b/final/lambda_function.py deleted file mode 100644 index 11a0a5f..0000000 --- a/final/lambda_function.py +++ /dev/null @@ -1,220 +0,0 @@ -# -*- coding: utf-8 -*- - -# This sample demonstrates handling intents from an Alexa skill and using the -# Alexa Skills Kid SDK (v2) -# Please visit https://alexa.design/cookbook for additional examples on -# implementing slots, dialog management, -# session persistence, api calls, and more. - -import requests -import logging -import calendar -from datetime import datetime -from pytz import timezone - -from ask_sdk_s3.adapter import S3Adapter -from ask_sdk_core.skill_builder import CustomSkillBuilder -from ask_sdk_core.dispatch_components import ( - AbstractRequestHandler, AbstractExceptionHandler -) -from ask_sdk_core.utils import is_request_type, is_intent_name - -s3_adapter = S3Adapter(bucket_name="custom-walk-testing") -sb = CustomSkillBuilder(persistence_adapter=s3_adapter) - -logger = logging.getLogger("main") -logger.setLevel(logging.INFO) - - -class LaunchRequestIntentHandler(AbstractRequestHandler): - """ - Handler for Skill Launch - """ - def can_handle(self, handler_input): - return is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - speech = "Hello! Welcome to Cake walk. What is your birthday?" - reprompt = "I was born Nov. 6th, 2015. When were you born?" - - handler_input.response_builder.speak(speech).ask(reprompt) - return handler_input.response_builder.response - - -class HasBirthdayLaunchRequestHandler(AbstractRequestHandler): - """ - Handler for launch after they have set their birthday - """ - def can_handle(self, handler_input): - # extract persistent attributes and check if they are all present - attr = handler_input.attributes_manager.persistent_attributes - attributes_are_present = ("year" in attr and "month" in attr and "day" in attr) - - return attributes_are_present and is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - attr = handler_input.attributes_manager.persistent_attributes - - year = int(attr['year']) - month = attr['month'] # month is a string, and we need to convert it to a month index later - day = int(attr['day']) - - # get device id / timezones - sys_object = handler_input.request_envelope.context.system - - # get systems api information - api_endpoint = sys_object.api_endpoint - device_id = sys_object.device.device_id - api_access_token = sys_object.api_access_token - - # construct systems api timezone url - url = '{api_endpoint}/v2/devices/{device_id}/settings/System.timeZone'.format(api_endpoint=api_endpoint, device_id=device_id) - headers = {'Authorization': 'Bearer ' + api_access_token} - - userTimeZone = "" - try: - r = requests.get(url, headers=headers) - res = r.json() - logger.info("Device API result: {}".format(str(res))) - userTimeZone = res - except Exception: - handler_input.response_builder.speak("There was a problem connecting to the service") - return handler_input.response_builder.response - - # getting the current date with the time - now_time = datetime.now(timezone(userTimeZone)) - - # Removing the time from the date because it affects our difference calculation - now_date = datetime(now_time.year, now_time.month, now_time.day) - current_year = now_time.year - - # getting the next birthday - month_as_index = list(calendar.month_abbr).index(month[:3]) - next_birthday = datetime(current_year, month_as_index, day) - - # check if we need to adjust bday by one year - if now_date > next_birthday: - next_birthday = datetime( - current_year + 1, - month_as_index, - day - ) - current_year += 1 - # setting the default speak_output to Happy xth Birthday!! - # alexa will automatically correct the oridinal for you. - # no need to worry about when to use st, th, rd - speak_output = "Happy {}th birthday!".format(str(current_year - year)) - if now_date != next_birthday: - diff_days = abs((now_date - next_birthday).days) - speak_output = "Welcome back. It looks like there are \ - {days} days until your {birthday_num}th\ - birthday".format( - days=diff_days, - birthday_num=(current_year-year) - ) - - handler_input.response_builder.speak(speak_output) - return handler_input.response_builder.response - - -class BirthdayIntentHandler(AbstractRequestHandler): - """ - Handler for Capturing the Birthday - """ - def can_handle(self, handler_input): - return is_intent_name("CaptureBirthdayIntent")(handler_input) - - def handle(self, handler_input): - slots = handler_input.request_envelope.request.intent.slots - - # extract slot values - year = slots["year"].value - month = slots["month"].value - day = slots["day"].value - - # save slots into session attributes - session_attr = handler_input.attributes_manager.session_attributes - session_attr['year'] = year - session_attr['month'] = month - session_attr['day'] = day - - # save session attributes as persistent attributes - handler_input.attributes_manager.persistent_attributes = session_attr - handler_input.attributes_manager.save_persistent_attributes() - - speech = 'Thanks, I will remember that you were born {month} {day} {year} \ - '.format(month=month, day=day, year=year) - handler_input.response_builder.speak(speech) - return handler_input.response_builder.response - - -class HelpIntentHandler(AbstractRequestHandler): - """ - Handler for AMAZON.HelpIntent - """ - def can_handle(self, handler_input): - return is_intent_name("AMAZON.HelpIntent")(handler_input) - - def handle(self, handler_input): - speak_output = "You can say hello to me! How can I help?" - - handler_input.response_builder.speak( - speak_output - ).ask(speak_output) - return handler_input.response_builder.response - - -class CatchAllExceptionHandler(AbstractExceptionHandler): - """ - Catch all exception handler, log exception and - respond with custom message. - """ - def can_handle(self, handler_input, exception): - return True - - def handle(self, handler_input, exception): - - speak_output = "Sorry, I couldn't understand what you said. Please try again." - handler_input.response_builder.speak(speak_output).ask(speak_output) - return handler_input.response_builder.response - - -class CancelAndStopIntentHandler(AbstractRequestHandler): - """ - Handler for AMAZON.CancelIntent and AMAZON.StopIntent - """ - def can_handle(self, handler_input): - return is_intent_name("AMAZON.CancelIntent")(handler_input) \ - and is_intent_name("AMAZON.StopIntent")(handler_input) - - def handle(self, handler_input): - speak_output = "Goodbye!" - handler_input.response_builder.speak(speak_output) - return handler_input.response_builder.response - - -class SessionEndedRequestHandler(AbstractRequestHandler): - """ - Handler for SessionEndedRequest - """ - def can_handle(self, handler_input): - return is_request_type("SessionEndedRequest")(handler_input) - - def handle(self, handler_input): - # Any cleanup logic goes here - return handler_input.response_builder.response - - - -# register request / intent handlers -sb.add_request_handler(HasBirthdayLaunchRequestHandler()) -sb.add_request_handler(LaunchRequestIntentHandler()) -sb.add_request_handler(BirthdayIntentHandler()) -sb.add_request_handler(HelpIntentHandler()) -sb.add_request_handler(CancelAndStopIntentHandler()) -sb.add_request_handler(SessionEndedRequestHandler()) - -# register exception handlers -sb.add_exception_handler(CatchAllExceptionHandler()) - -lambda_handler = sb.lambda_handler() \ No newline at end of file diff --git a/i18n/alexa/__init__.py b/i18n/alexa/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/i18n/alexa/data.py b/i18n/alexa/data.py deleted file mode 100644 index 29bccdc..0000000 --- a/i18n/alexa/data.py +++ /dev/null @@ -1,16 +0,0 @@ -from gettext import gettext as _ - -WELCOME_MSG = _("Hello! Welcome to Cake walk. What is your birthday?") -WELCOME_REMPROMPT_MSG = _("I was born Nov. 6th, 2014. When were you born?") -WELCOME_BACK_MSG = _( - "Welcome back. It looks like there is {} day until your {}th birthday.") -WELCOME_BACK_MSG_plural = _( - "Welcome back. It looks like there are {} days until your {}th birthday") -HAPPY_BIRTHDAY_MSG = _("Happy {}th birthday!") -REGISTER_BIRTHDAY_MSG = _("Thanks, I'll remember that you were born {} {} {}") -HELP_MSG = _("You can tell me your date of birth and I'll take note. You can also just say, 'register my birthday' and I will guide you. Which one would you like to try?") -GOODBYE_MSG = _("Goodbye!") -ERROR_MSG = _( - "Sorry, I couldn't understand what you said. Can you reformulate?") -ERROR_TIMEZONE_MSG = _( - "I can't determine your timezone. Please check your device settings and make sure a timezone was selected. After that please reopen the skill and try again!") diff --git a/i18n/locales/data.pot b/i18n/locales/data.pot deleted file mode 100644 index c350609..0000000 --- a/i18n/locales/data.pot +++ /dev/null @@ -1,57 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2019-10-02 17:11-0400\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=cp1252\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" - - -#: alexa\data.py:3 -msgid "Hello! Welcome to Cake walk. What is your birthday?" -msgstr "" - -#: alexa\data.py:4 -msgid "I was born Nov. 6th, 2014. When were you born?" -msgstr "" - -#: alexa\data.py:5 -msgid "Welcome back. It looks like there is {} day until your {}th birthday." -msgstr "" - -#: alexa\data.py:7 -msgid "Welcome back. It looks like there are {} days until your {}th birthday" -msgstr "" - -#: alexa\data.py:9 -msgid "Happy {}th birthday!" -msgstr "" - -#: alexa\data.py:10 -msgid "Thanks, I'll remember that you were born {} {} {}" -msgstr "" - -#: alexa\data.py:11 -msgid "You can tell me your date of birth and I'll take note. You can also just say, 'register my birthday' and I will guide you. Which one would you like to try?" -msgstr "" - -#: alexa\data.py:12 -msgid "Goodbye!" -msgstr "" - -#: alexa\data.py:13 -msgid "Sorry, I couldn't understand what you said. Can you reformulate?" -msgstr "" - -#: alexa\data.py:15 -msgid "I can't determine your timezone. Please check your device settings and make sure a timezone was selected. After that please reopen the skill and try again!" -msgstr "" - diff --git a/i18n/locales/en-US/LC_MESSAGES/data.mo b/i18n/locales/en-US/LC_MESSAGES/data.mo deleted file mode 100644 index 0d2f2da3281f1b64ec8dbe88acae656cc492c788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 zcmYL^!Ait15QbOul%r=4BY047YFbw8ru3rj%7TkUyW&k^JJw1!DQQ;hgZO$ri&K@| zA3id}{P{Ea-rxHgv38gP=7`y4PMJY5gFKw@Ie0e8oPDRlA;+7Pc-bpx`-=P!7PLKt!MS+C ze}i=jGD~IcAqt{k%qw>M`jFaaKTJi|tetLfX5Fe&VA|idOQQt-%JkU4VG7|%viY9^ KGSABgG5P_hH)HDn diff --git a/i18n/locales/en-US/LC_MESSAGES/data.po b/i18n/locales/en-US/LC_MESSAGES/data.po deleted file mode 100644 index 80297ce..0000000 --- a/i18n/locales/en-US/LC_MESSAGES/data.po +++ /dev/null @@ -1,64 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2019-10-02 17:11-0400\n" -"PO-Revision-Date: 2019-10-02 17:19-0400\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.2.4\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: en_US\n" - -#: alexa\data.py:3 -msgid "Hello! Welcome to Cake walk. What is your birthday?" -msgstr "" - -#: alexa\data.py:4 -msgid "I was born Nov. 6th, 2014. When were you born?" -msgstr "" - -#: alexa\data.py:5 -msgid "Welcome back. It looks like there is {} day until your {}th birthday." -msgstr "" - -#: alexa\data.py:7 -msgid "Welcome back. It looks like there are {} days until your {}th birthday" -msgstr "" - -#: alexa\data.py:9 -msgid "Happy {}th birthday!" -msgstr "" - -#: alexa\data.py:10 -msgid "Thanks, I'll remember that you were born {} {} {}" -msgstr "" - -#: alexa\data.py:11 -msgid "" -"You can tell me your date of birth and I'll take note. You can also just " -"say, 'register my birthday' and I will guide you. Which one would you like " -"to try?" -msgstr "" - -#: alexa\data.py:12 -msgid "Goodbye!" -msgstr "" - -#: alexa\data.py:13 -msgid "Sorry, I couldn't understand what you said. Can you reformulate?" -msgstr "" - -#: alexa\data.py:15 -msgid "" -"I can't determine your timezone. Please check your device settings and make " -"sure a timezone was selected. After that please reopen the skill and try " -"again!" -msgstr "" diff --git a/i18n/locales/fr-CA/LC_MESSAGES/data.mo b/i18n/locales/fr-CA/LC_MESSAGES/data.mo deleted file mode 100644 index a31b6cfb18fa51ae7366c90cda21000000d1cc41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2037 zcmb7FOK%%h6uy-5G8>9mAr>dy7*J+vhxFwtq-kCRQAi=QutGPUWBVpE_nP}~>XeFK z!HNy+2rKq1y+iy4*8Bm)1_{11!}>@DlJ_U>}$R{|4R!=I4~^0v&J*_&snF_&ZSS^JkS>gzYcD z7M}k+uhiSXbI&Pt2bclB0)7p=3H%Fq6}a-eQaxY-ZUBD*t^@x7{tUeSf>H=uU($tY&j@I=d(~&L@bGkRukxZbeOa9DfRqaq;+jgXaBm2r&ZVaNS_}E#_X}4q@nEE5` zA2#0#o|ryU;24b^2GX{mN)m7h1u0kuhledjHG=q5Q`iK9hY>U5W-8#o>@@}ZyFWL16Qyq_)-I&!Hjq^V>J z_904vN0L`;gElB;UEBJ}^T7Ekl{)gO+8b$m7!aY2T0B==?VnaGo^`sqng>g4>@G%Pob6F-_oM7%Xi1*34b<6_;a<$7Zb z;CzpE9Tz6jQofWgqr`yh5*1RCudUrOd0l2(kXPuD9oLUxW$6agFJD&PwDc}@-@0+u zUXKR;i}kgZT1!yh#2LS!ZaE85w`M;^UZAyffRPsMQ8J4(aS5w8;bReo#{C9@C3#4Yy~R6e;tJ$C!A7Fi<_Or7(i7J8%Ondf6oss21um$5V|Ef; zIXhXTgU9;7$vE}~4D7lD@*0QJQvh|Ys@v@Q;1^C4a3PE2Q6r8qk4#cEc(0R5X;N8z z6yP^ka~U?x!E8Q7+9?}1G>&bAy$njGr!7w2ww75pV+{W@$Wvl~yfLTyQhbm;E#jXs z{;yHzv|)t2%9;64q`pPMbC9uUTMyw0b;zj;oe@@G?ioylbG^bE(#4>W6#o=xAWU79 YAi}3mSDzZtNu$BX6xbg*b07Tw0}gD1cK`qY diff --git a/i18n/locales/fr-CA/LC_MESSAGES/data.po b/i18n/locales/fr-CA/LC_MESSAGES/data.po deleted file mode 100644 index 18509ea..0000000 --- a/i18n/locales/fr-CA/LC_MESSAGES/data.po +++ /dev/null @@ -1,71 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2019-10-02 17:11-0400\n" -"PO-Revision-Date: 2019-10-02 17:45-0400\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.2.4\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: fr_CA\n" - -#: alexa\data.py:3 -msgid "Hello! Welcome to Cake walk. What is your birthday?" -msgstr "" -"Bonjour! Bienvenue sur le Génie des Fêtes. Quelle est votre date de " -"naissance ?" - -#: alexa\data.py:4 -msgid "I was born Nov. 6th, 2014. When were you born?" -msgstr "Je suis née le 6 novembre 2014. Et vous, quand êtes-vous né ?" - -#: alexa\data.py:5 -msgid "Welcome back. It looks like there is {} day until your {}th birthday." -msgstr "Content de vous revoir! Il vous reste {} jour avant d'avoir {} ans." - -#: alexa\data.py:7 -msgid "Welcome back. It looks like there are {} days until your {}th birthday" -msgstr "Content de vous revoir! Il vous reste {} jours avant d'avoir {} ans." - -#: alexa\data.py:9 -msgid "Happy {}th birthday!" -msgstr "Bonne Fête! Aujourd'hui, vous avez {} an!" - -#: alexa\data.py:10 -msgid "Thanks, I'll remember that you were born {} {} {}" -msgstr "Merci, je vais me rappeler que vous êtes né le {} {} {}." - -#: alexa\data.py:11 -msgid "" -"You can tell me your date of birth and I'll take note. You can also just " -"say, 'register my birthday' and I will guide you. Which one would you like " -"to try?" -msgstr "" -"Je peux me souvenir de votre date de naissance. Dites-moi votre jour, mois " -"et année de naissance ou bien dites-moi simplement \"sauve ma fête\" et je " -"vous guiderai. Quel est votre choix ?" - -#: alexa\data.py:12 -msgid "Goodbye!" -msgstr "Au revoir!" - -#: alexa\data.py:13 -msgid "Sorry, I couldn't understand what you said. Can you reformulate?" -msgstr "Désolé, je n'ai pas compris. Pouvez-vous reformuler ?" - -#: alexa\data.py:15 -msgid "" -"I can't determine your timezone. Please check your device settings and make " -"sure a timezone was selected. After that please reopen the skill and try " -"again!" -msgstr "" -"Je n'ai pas réussi à déterminer votre fuseau horaire. Veuillez vérifier les " -"paramètres de votre appareil et réessayez." diff --git a/i18n/locales/fr-FR/LC_MESSAGES/data.mo b/i18n/locales/fr-FR/LC_MESSAGES/data.mo deleted file mode 100644 index 7a2ce59ea3fb728bafda2dbe7e8b40106d40e72a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2089 zcmcIkJ#!mH7+ym7QX0ZgF)3c95zOc=l5oJtV}!qP27?GD2^Fk#ucWo^cE#?VY&qmF z&{07F9pZ1OVHkQkYW@KwJbNcA&M=vQf*r4(S>L{&&-3o@uU!2`U|qw$f$g!cWB-aB z*2~Wb@gnd#@KxYzz&C-nfZqc9z!>-!@I7FBMTjQQ0QZ4E0QZ1@0K@(GSt07U`wOsw z^Pg9RXaTQ0C&UBbZQxhHub1a*&kON3&Izy${0_Ja{0+DRyzzn%KLfu2!fmlaEnx-! z2rF>4r~$BA2rpnF5Jn({V!af84~$8AGp>sFUvZeNOu( zWAcV}Pubol(1);Db3{tuQEP2nq%swEFDvS#Qkyk zE#ax^GdcEN>7gU36Uss$ms=)D7q$rOa4Y4$=Om`B0V0qOX-rC=md%7U{sq&qO4GuV zw=&1rI%AHGOENF}>wSb!s)5YoQt#o-*R0p5jVJd}6Gf)d>}uJWWDTxlY(R z9}+wbal>6F6_VMJx;R-L7@Os(^xP50BdNy@9%{(Na>iNjBI96Lge$Un_z11XpSWms zPxjH`Lr+3ba=G)*iAETRCbK^tbKGmo4||bGkMg2?L%I!O?pxs-DYb8>JMKwU)S_5HQ(4+mDi?$ z{e1s!MQr6z-_$5u6?e>x^E2AgT20Y6sVrA%D?b6XNo|y?I!#TE5uEaQ5QxOoY#SXu zS7}?Zp0du1!K9SwU@_NlZqx7 zO1qfn&M8`aPsw7wd^+sXc#u1mIgN}B`NnjQbLa&bP8V~l1`3)=k;6n, YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2019-10-02 17:11-0400\n" -"PO-Revision-Date: 2019-10-02 18:18-0400\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.2.4\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: fr_FR\n" - -#: alexa\data.py:3 -msgid "Hello! Welcome to Cake walk. What is your birthday?" -msgstr "" -"Bonjour! Bienvenue sur le Génie des Anniversaires. Quelle est votre date de " -"naissance ?" - -#: alexa\data.py:4 -msgid "I was born Nov. 6th, 2014. When were you born?" -msgstr "" -"Bonjour! Bienvenue sur le Génie des Anniversaires. Quelle est votre date de " -"naissance ?" - -#: alexa\data.py:5 -msgid "Welcome back. It looks like there is {} day until your {}th birthday." -msgstr "Content de vous revoir! Il vous reste {} jour avant d'avoir {} ans." - -#: alexa\data.py:7 -msgid "Welcome back. It looks like there are {} days until your {}th birthday" -msgstr "Content de vous revoir! Il vous reste {} jours avant d'avoir {} ans." - -#: alexa\data.py:9 -msgid "Happy {}th birthday!" -msgstr "Joyeux Anniversaire! Aujourd'hui, vous avez {} an!" - -#: alexa\data.py:10 -msgid "Thanks, I'll remember that you were born {} {} {}" -msgstr "Merci, je vais me rappeler que vous êtes né le {} {} {}." - -#: alexa\data.py:11 -msgid "" -"You can tell me your date of birth and I'll take note. You can also just " -"say, 'register my birthday' and I will guide you. Which one would you like " -"to try?" -msgstr "" -"Je peux me souvenir de votre date de naissance. Dites-moi votre jour, mois " -"et année de naissance ou bien dites-moi simplement \"enregistre mon " -"anniversaire\" et je vous guiderai. Quel est votre choix ?" - -#: alexa\data.py:12 -msgid "Goodbye!" -msgstr "Au revoir!" - -#: alexa\data.py:13 -msgid "Sorry, I couldn't understand what you said. Can you reformulate?" -msgstr "Désolé, je n'ai pas compris. Pouvez-vous reformuler ?" - -#: alexa\data.py:15 -msgid "" -"I can't determine your timezone. Please check your device settings and make " -"sure a timezone was selected. After that please reopen the skill and try " -"again!" -msgstr "" -"Je n'ai pas réussi à déterminer votre fuseau horaire. Veuillez vérifier les " -"paramètres de votre appareil et réessayez." diff --git a/i18n/locales/hi-IN/LC_MESSAGES/data.mo b/i18n/locales/hi-IN/LC_MESSAGES/data.mo deleted file mode 100644 index 58caa80a572941793d0347fd9464976b16bb78cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2622 zcmbtVO>Y}T7#^T}nG2~nAr5c21f=ZN4rvJvQGhfFk!Xl$pm2hotbyuujiS`uSbvU z2s{treGIS0JA(HYy! z_#2Sz-FvVfwm$=pV*KY3A)W<}+$+Qd;4<)c;7`C7@W=avI1ikUB$8tL zb>IU0{Q(4+hil;{hZkW5T$maF{RiO%TnU5`NWnZ0^4~?J{8C$viWj{`qfHkt=_-|i zSXX_ojY%1XYLw2%u&nBmw4yn$CaL9xHJ8p*JxxJEZPkqXduGKFmAz<8lP|T5>p>)~ zfez~Of{LU|E1~ofN#&|6*X)`v&jn>kiPSoXDhYX!PjwEIG-F8~_4Xog0;^D#we($j zehm>wa~cinGnT3$BTQjyEeJ#7NylySDqawcA~*I>QgKAf>YPg_bak92@`XvR1{+%v z@lcO3nH8s19Jj{_6{%+Eb5YI6mvN#w!4}75+r$fy%$ygQQ7qR~TyKV+ma}5D>P58# z9>$PMEbFpf>SfG3O*oUy#Y<>Cexldvl2=BHmo$Y+)e;H=bOU8^JMh95{3J+62chlZ z0p|XL8xUu`+|h|E-aw8ZlQd*N;2$~12&^TkHOshZu&GWnUy;%vxVOy<6Gdm6iAIai z#<5sdf`lonxBGe-vmU6$Y*m_pZ=x_ALAgrM3$?iSrnR;Sia_YBSc%nH=)hU>o!3A~ zprRt>R$g{qftGmWoJ5{QCifYqkas2~sgN%of7;1U=JUCiyr|OjD$-e%ULE^REuESl zxGA{#+?8h2n|g`w_XgT&b+$1;7kqdVlPV8WbDjGW#vP~MVcxF zI=3hz86y+ld7)jTM!N!y!=jbt)!a(h zjJ?oVfV`3-MGZ4dW+tYgeqNb*BAS`W)A~9A3r|k>t1MDAcynnvC$jXNEd4f1_p2o!v-BD^!UG1@+$Ql+mZt7M4NMjXQ^3~iFhkgP;jw!(c_VV; znIRXQEe!TeVmCP^m-9VxLnQOPi{)-6NFOEcn&~fl<$aEIEFjc|bqr(P1DE(pVK$s_ zXM;}K>+5vy`Z7tG!uuDOy|ip#_J!VW13s{xufX$Q)a`Tk2Fub9Vav32wq4P44HmeQ z1G?x0hRAvkDI2PG?Zt*!bbw=_9*}q$U!9>6%(`jqHPc9t&W^3|6=U4l>feOJ?cTF) zZKJQk@<7kPHY9cvJ>+It62J!gW-S1?1sn+NH`BfL8v43ClgQHVOy1T5Ou-lX=~9o1 zu7X;)<4HKh7xuz2gvG(Y*lmD`X>M4)^@hv%m$FSmHpM`_2-H06R12jn0}v<4?&16kn93X3Ib7x_G3h4&m#+5d_BR<{KBwI{jTGF%480Oy@^8A!=! z9Jxa#+&ajSHIJ`D8S0C;cM$o10F2Rit_`w<9`R#7dKF&J#F(7@-Iv*%OrH|+Dk AT>t<8 diff --git a/i18n/locales/hi-IN/LC_MESSAGES/data.po b/i18n/locales/hi-IN/LC_MESSAGES/data.po deleted file mode 100644 index d381a2e..0000000 --- a/i18n/locales/hi-IN/LC_MESSAGES/data.po +++ /dev/null @@ -1,68 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR ORGANIZATION -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2019-10-02 17:11-0400\n" -"PO-Revision-Date: 2019-10-24 10:57-0400\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.2.4\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=2; plural=(n==0 || n==1);\n" -"Language: hi_IN\n" - -#: alexa\data.py:3 -msgid "Hello! Welcome to Cake walk. What is your birthday?" -msgstr "नमस्ते. Cake Walk में आपका स्वागत. आपका जनमदिन कब हैं?" - -#: alexa\data.py:4 -msgid "I was born Nov. 6th, 2014. When were you born?" -msgstr "मेरा जन्म 6 नवंबर, 2014 को हुआ था. आप कब पैदा हुए थे?" - -#: alexa\data.py:5 -msgid "Welcome back. It looks like there is {} day until your {}th birthday." -msgstr "वापसी पर स्वागत है. आपके {} वे जनमदिन तक {} दिन हैं`" - -#: alexa\data.py:7 -msgid "Welcome back. It looks like there are {} days until your {}th birthday" -msgstr "आपके {} वे जनमदिन तक {} दिन हैं" - -#: alexa\data.py:9 -msgid "Happy {}th birthday!" -msgstr "{} वां जन्मदिन मुबारक हो" - -#: alexa\data.py:10 -msgid "Thanks, I'll remember that you were born {} {} {}" -msgstr "शुक्रिया. मुझे याद होगा कि आप {} {} {} मैं पैदा हुए थेैं" - -#: alexa\data.py:11 -msgid "" -"You can tell me your date of birth and I'll take note. You can also just " -"say, 'register my birthday' and I will guide you. Which one would you like " -"to try?" -msgstr "" -"आप मुझे अपनी जन्मतिथि बता सकते हैं और मैं note कर लूंगा. आप यह भी कह सकते हैं, \"मेरा " -"जन्मदिन register करें. आप कौन सा प्रयास करना चाहेंगे?" - -#: alexa\data.py:12 -msgid "Goodbye!" -msgstr "अलवादी" - -#: alexa\data.py:13 -msgid "Sorry, I couldn't understand what you said. Can you reformulate?" -msgstr "Sorry, मैं वो समझ नहीं पायी. क्या आप दोहरा सकते हैं " - -#: alexa\data.py:15 -msgid "" -"I can't determine your timezone. Please check your device settings and make " -"sure a timezone was selected. After that please reopen the skill and try " -"again!" -msgstr "" -"Sorry. मैं आपके समयक्षेत्र का निर्धारण नहीं कर सकता. आपकी Device Settings में " -"timezone select कर दो और एक और बार skill खोलो." diff --git a/i18n/locales/it-IT/LC_MESSAGES/data.mo b/i18n/locales/it-IT/LC_MESSAGES/data.mo deleted file mode 100644 index 5cbbc206b7bf00a0a7dde8a5b04de41ec52b366b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1862 zcma)6O>Y}T7@n5$WiAx;ggCsB5C$o`wL=nuqsTOA5-gF{&_Ll*G~OMrC*GZRnVGe5 ztNskcffF~*{Ds~S;=-LXKY<%OGp-#W5s8t z!+QOi5U&7l0&fA|1ilZv4g3L^0aM`Lz>k3Gbs@Sy2A%+a1Rewb1P1x^1tAj1{sMdz z=f7?U@iy@Ki$WX%+rSC%0+;}Q2ZsA=FA4Dh@EzbD@DXqq_&snA{0#`RafMvMYGK2z zz*WovuwHO4UdD!bfe_*f@rYCAe6&y-;$vCY3wrX@PiUmApX73ZkE$$rgC43f<4Tcd zI+9aGb6HMPdN`4uw4((#cCFJF1Inand&-qpw$er|1-!1*V>T+KVX353lucANUEbwt zrZYuOd9O|3NSd6g;K(&rk))L_96LyrD)TB&>CPA)$cHfMrA@22RtBG-I@M(vEqS{j zSx9X*5L>V?Vr%Fg&r;g;lTF&{bhkq`P@F6HLq1WYFCMV9i%mjC+?07psxi5;&W8Z! z!EcatQX`lnY2wMMG25ysrB{7%K9OeXV4;mztg2KsT16Z*qq`W*lcy*>eqvSXk<3uy zfv1vr>ZsJH2GR=Uz=kaP;}DM5<+6tV>fHY@gT^hbTxlc~Um->`lRRiZ=s#k%aO@TF zc-iq-;Fz5c{W9#);FX#z9n(eQJW7Nzwyi3(3oWY_YreFX7HA&2RWv$}UP3!`HX-nZ z=Arhnw96tep`m>-w0r>`B!fKp0xi*Odej=;Pd)>e!YR3nID4VFA12*Svb9a!PH$%? z>1=m8txu#W8d<31T*(T0XM?ljOEcZH(>h|~mGQ~>qJ|Z(zV)~35**qGZ>0rO4?aIX zN%k(~tTb+{Y;tTe&cWgy?Txf=ohqX&BFU4(MUU!50gl61idpNXJFPF1=K^edG-Q=) zPh06$x{VMWya%hGQn+mm%f`wwIRU*~k4znp?qF*l><>2w?;6@TpzeG7>->78{nvx@ zmbgQ;RnGHe}*5reeV4*f2aJ0@&UK3uhQKcv?>OG2D?xDj6p7 zLDo3A36U6GCTs2Ce%P=M7Q>STq0``7ZBi9JW^6I@&wjol(_W}r{H3vMu?P*%P`@*2 zFg+Y@3yn7?)bX1JZwHf{S-GmW{%^l, YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2019-10-02 17:11-0400\n" -"PO-Revision-Date: 2019-10-24 10:55-0400\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.2.4\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: it_IT\n" - -#: alexa\data.py:3 -msgid "Hello! Welcome to Cake walk. What is your birthday?" -msgstr "Ciao! Benvenuti a Buon Compleanno. Qual'è la tua data di nascita?" - -#: alexa\data.py:4 -msgid "I was born Nov. 6th, 2014. When were you born?" -msgstr "Io sono nata il 6 novembre 2014. E tu invece?" - -#: alexa\data.py:5 -msgid "Welcome back. It looks like there is {} day until your {}th birthday." -msgstr "Ciao di nuovo! Manca {} giorno a quando avrai {} anni." - -#: alexa\data.py:7 -msgid "Welcome back. It looks like there are {} days until your {}th birthday" -msgstr "Ciao di nuovo! Mancano {} giorni a quando avrai {} anni." - -#: alexa\data.py:9 -msgid "Happy {}th birthday!" -msgstr "Buon compleanno! Oggi compi {} anno!" - -#: alexa\data.py:10 -msgid "Thanks, I'll remember that you were born {} {} {}" -msgstr "Grazie, mi ricorderò la tua data di nascita: {} {} {}." - -#: alexa\data.py:11 -msgid "" -"You can tell me your date of birth and I'll take note. You can also just " -"say, 'register my birthday' and I will guide you. Which one would you like " -"to try?" -msgstr "" -"Posso segnarmi la tua data di nascita. Dimmi pure la data oppure dimmi di " -"ricordami il tuo compleanno. Cosa preferisci?" - -#: alexa\data.py:12 -msgid "Goodbye!" -msgstr "A presto!" - -#: alexa\data.py:13 -msgid "Sorry, I couldn't understand what you said. Can you reformulate?" -msgstr "Scusa, non ho capito. Puoi ripetere?" - -#: alexa\data.py:15 -msgid "" -"I can't determine your timezone. Please check your device settings and make " -"sure a timezone was selected. After that please reopen the skill and try " -"again!" -msgstr "" -"Non ho potuto determinare il tuo fuso orario. Verifica la configurazione " -"del tuo dispositivo, e riprova." diff --git a/i18n/locales/ja-JP/LC_MESSAGES/data.mo b/i18n/locales/ja-JP/LC_MESSAGES/data.mo deleted file mode 100644 index 73cf0837419ce9d2456362bafaaa440bb962493c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2282 zcmb7EU2has7(OU|trv>%%6M_Ou`ywW-BJi{(^Npfs^~_m;FX!~obC>towJ!aOIe%7 zJ+oR16d_PPDhd>lZcAFC7*jq1UK@XaSH|Sf?e>cJ3-mc>+frgpWU^1fUiO%Xw9W-(N_WsX$iKP8UV`|(i3bYNJAjOT+itHZqD7FGFwmHbc)3? z9T*gO+T(>H?>c3?WWLYW)4j~k@&coR(;ZG9qy3KGXVblTM^G=KWnK!G_jHmjnstH} zL0u+TSnvYY3=m#{eaZu7(~QrYh|z4GW&4`Hx$JL;`MzNiVVOEP#|zd&n`Y?YVL;#I2W+}U zIg-Q#3oahISz=Y0|NJ-C6g zv>jN8MSmj55uV@l@S)EA4;nPC$?~5hHu)GD(M&2Z1{D2=<`9VmqrA7-abvKlPUwCG zT%f^A+Z;dQbbl!lun0D`ge>Ppx@Cp(^1QS(8EC)mR<7i^CW~%|m(5em3+>n58*7^; zaEgX@l1#|=V-Bn?*ZK%8@pzD?iOhS}`hvS+tamY=L4FQolNZDfnb5Ky30kd2zF3xEc%$CcFe64Vp2Ok?A~Q< zeGnHqLDb7aYiE$Sw-J6^Ta`<36Ee%><7sd0NTOmAs?m z*!|lQL?=~zQpu}Ijw^Xh?}>j<)!Qn*rs69qo?QGcXP5FJ_*+$pmBeRC$qUH(ASDT%5!-_S{G)0!YYv2gl`l1Gj5f8~)Q_37^n<*@}hTR(i>7&oHi z6|FPIMwC<2axUF$OhJfAu1kYo6NVGthwjZ*=5AhTOkx)Ta6hKxMNI{gN=)V_;PJKA zWU_7U#!sna{hQ$}+JAW!jnK8lNC?9h3wspjOU)+F`@E zEIeLyNOdLJ==#hNgs&unv3hKOlq1}P4HQjQ|x12#y z_imlVWHf4L>q9@A?m_C99(`>qnu#GW2c|M&24KZ8z&wrJS{V6paa<~BPi, YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: 2019-10-02 17:11-0400\n" -"PO-Revision-Date: 2019-10-24 10:53-0400\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: pygettext.py 1.5\n" -"X-Generator: Poedit 2.2.4\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Language: ja_JP\n" - -#: alexa\data.py:3 -msgid "Hello! Welcome to Cake walk. What is your birthday?" -msgstr "こんにちは、ケークウォークへようこそ。あなたの誕生日はいつですか?" - -#: alexa\data.py:4 -msgid "I was born Nov. 6th, 2014. When were you born?" -msgstr "私は2004年10月6日に生まれました。あなたの誕生日はいつですか?" - -#: alexa\data.py:5 -msgid "Welcome back. It looks like there is {} day until your {}th birthday." -msgstr "おかえりなさい。{}歳のお誕生日まで、あと{{count}}日です。" - -#: alexa\data.py:7 -msgid "Welcome back. It looks like there are {} days until your {}th birthday" -msgstr "おかえりなさい。{}歳のお誕生日まで、残り{}日です。" - -#: alexa\data.py:9 -msgid "Happy {}th birthday!" -msgstr "{}歳のお誕生日、おめでとうございます!" - -#: alexa\data.py:10 -msgid "Thanks, I'll remember that you were born {} {} {}" -msgstr "ありがとうございます。誕生日は {}年 {}月 {}日ですね?" - -#: alexa\data.py:11 -msgid "" -"You can tell me your date of birth and I'll take note. You can also just " -"say, 'register my birthday' and I will guide you. Which one would you like " -"to try?" -msgstr "" -"あなたの誕生日を言うと、その日付を記憶します。もしくは、「私の誕生日を登録し" -"て」と言うと、詳しくご案内します。どちらにしますか?" - -#: alexa\data.py:12 -msgid "Goodbye!" -msgstr "さようなら" - -#: alexa\data.py:13 -msgid "Sorry, I couldn't understand what you said. Can you reformulate?" -msgstr "" -"ごめんなさい、うまく理解できませんでした。もう一度言ってみてください。" - -#: alexa\data.py:15 -msgid "" -"I can't determine your timezone. Please check your device settings and make " -"sure a timezone was selected. After that please reopen the skill and try " -"again!" -msgstr "" -"タイムゾーンを特定できませんでした。Alexaアプリでデバイスの設定を開き、タイ" -"ムゾーンが正しく選択されていることを確認したあとで、もう一度試してください。" diff --git a/i18n/models/en-US.json b/i18n/models/en-US.json deleted file mode 100644 index 45f2bbf..0000000 --- a/i18n/models/en-US.json +++ /dev/null @@ -1,123 +0,0 @@ -{ - "interactionModel": { - "languageModel": { - "invocationName": "cake walk", - "intents": [ - { - "name": "AMAZON.CancelIntent", - "samples": [] - }, - { - "name": "AMAZON.HelpIntent", - "samples": [] - }, - { - "name": "AMAZON.StopIntent", - "samples": [] - }, - { - "name": "AMAZON.NavigateHomeIntent", - "samples": [] - }, - { - "name": "CaptureBirthdayIntent", - "slots": [ - { - "name": "month", - "type": "AMAZON.Month" - }, - { - "name": "day", - "type": "AMAZON.Ordinal" - }, - { - "name": "year", - "type": "AMAZON.FOUR_DIGIT_NUMBER" - } - ], - "samples": [ - "{month} {day}", - "{month} {day} {year}", - "{month} {year}", - "I was born on {month} {day} ", - "I was born on {month} {day} {year}", - "I was born on {month} {year}" - ] - } - ], - "types": [] - }, - "dialog": { - "intents": [ - { - "name": "CaptureBirthdayIntent", - "confirmationRequired": false, - "prompts": {}, - "slots": [ - { - "name": "month", - "type": "AMAZON.Month", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.303899476312.795077103633" - } - }, - { - "name": "day", - "type": "AMAZON.Ordinal", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.303899476312.985837334781" - } - }, - { - "name": "year", - "type": "AMAZON.FOUR_DIGIT_NUMBER", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.303899476312.27341833344" - } - } - ] - } - ], - "delegationStrategy": "ALWAYS" - }, - "prompts": [ - { - "id": "Elicit.Slot.303899476312.795077103633", - "variations": [ - { - "type": "PlainText", - "value": "I was born in November. When what were you born?" - }, - { - "type": "PlainText", - "value": "What month were you born?" - } - ] - }, - { - "id": "Elicit.Slot.303899476312.985837334781", - "variations": [ - { - "type": "PlainText", - "value": "I was born on the sixth. What day were you born?" - } - ] - }, - { - "id": "Elicit.Slot.303899476312.27341833344", - "variations": [ - { - "type": "PlainText", - "value": "I was born in two thousand fifteen, what year were you born?" - } - ] - } - ] - } -} diff --git a/i18n/requirements.txt b/i18n/requirements.txt deleted file mode 100644 index 1be00c5..0000000 --- a/i18n/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -ask-sdk-core -ask-sdk-s3-persistence-adapter -pytz \ No newline at end of file diff --git a/i18n/lambda_function.py b/lambda/py/lambda_function.py similarity index 85% rename from i18n/lambda_function.py rename to lambda/py/lambda_function.py index b894841..9e1414c 100644 --- a/i18n/lambda_function.py +++ b/lambda/py/lambda_function.py @@ -9,11 +9,12 @@ import requests import logging import calendar +import os +import json +import prompts + from datetime import datetime from pytz import timezone -import gettext - -from alexa import data from ask_sdk_s3.adapter import S3Adapter from ask_sdk_core.skill_builder import CustomSkillBuilder @@ -23,7 +24,7 @@ ) from ask_sdk_core.utils import is_request_type, is_intent_name -s3_adapter = S3Adapter(bucket_name="custom-walk-testing") +s3_adapter = S3Adapter(bucket_name=os.environ.get('S3_PERSISTENCE_BUCKET')) sb = CustomSkillBuilder(persistence_adapter=s3_adapter) logger = logging.getLogger("main") @@ -39,10 +40,10 @@ def can_handle(self, handler_input): return is_request_type("LaunchRequest")(handler_input) def handle(self, handler_input): - _ = handler_input.attributes_manager.request_attributes["_"] + data = handler_input.attributes_manager.request_attributes["_"] - speech = _(data.WELCOME_MSG) - reprompt = _(data.WELCOME_REMPROMPT_MSG) + speech = data[prompts.WELCOME_MSG] + reprompt = data[prompts.WELCOME_REMPROMPT_MSG] handler_input.response_builder.speak(speech).ask(reprompt) return handler_input.response_builder.response @@ -57,12 +58,12 @@ def can_handle(self, handler_input): # extract persistent attributes and check if they are all present attr = handler_input.attributes_manager.persistent_attributes attributes_are_present = ( - "year" in attr and "month" in attr and "day" in attr) + "year" in attr and "month" in attr and "day" in attr) return attributes_are_present and is_request_type("LaunchRequest")(handler_input) def handle(self, handler_input): - _ = handler_input.attributes_manager.request_attributes["_"] + data = handler_input.attributes_manager.request_attributes["_"] attr = handler_input.attributes_manager.persistent_attributes @@ -91,7 +92,7 @@ def handle(self, handler_input): logger.info("Device API result: {}".format(str(res))) userTimeZone = res except Exception: - speech = _(data.ERROR_TIMEZONE_MSG) + speech = data[prompts.ERROR_TIMEZONE_MSG] handler_input.response_builder.speak(speech) return handler_input.response_builder.response @@ -117,19 +118,19 @@ def handle(self, handler_input): # setting the default speak_output to Happy xth Birthday!! # alexa will automatically correct the oridinal for you. # no need to worry about when to use st, th, rd - speak_output = _(data.HAPPY_BIRTHDAY_MSG).format( + speak_output = data[prompts.HAPPY_BIRTHDAY_MSG].format( str(current_year - year)) if now_date != next_birthday: diff_days = abs((now_date - next_birthday).days) logger.info(speak_output) - speak_output = _(data.WELCOME_BACK_MSG).format( + speak_output = data[prompts.WELCOME_BACK_MSG].format( diff_days, - (current_year-year) + (current_year - year) ) - if(diff_days != 1): - speak_output = _(data.WELCOME_BACK_MSG_plural).format( + if (diff_days != 1): + speak_output = data[prompts.WELCOME_BACK_MSG_plural].format( diff_days, - (current_year-year) + (current_year - year) ) handler_input.response_builder.speak(speak_output) @@ -145,7 +146,7 @@ def can_handle(self, handler_input): return is_intent_name("CaptureBirthdayIntent")(handler_input) def handle(self, handler_input): - _ = handler_input.attributes_manager.request_attributes["_"] + data = handler_input.attributes_manager.request_attributes["_"] slots = handler_input.request_envelope.request.intent.slots locale = handler_input.request_envelope.request.locale @@ -193,8 +194,8 @@ def can_handle(self, handler_input): return is_intent_name("AMAZON.HelpIntent")(handler_input) def handle(self, handler_input): - _ = handler_input.attributes_manager.request_attributes["_"] - speak_output = _(data.HELP_MSG) + data = handler_input.attributes_manager.request_attributes["_"] + speak_output = data[prompts.HELP_MSG] handler_input.response_builder.speak( speak_output @@ -213,8 +214,8 @@ def can_handle(self, handler_input, exception): def handle(self, handler_input, exception): logger.info(exception) - _ = handler_input.attributes_manager.request_attributes["_"] - speak_output = _(data.ERROR_MSG) + data = handler_input.attributes_manager.request_attributes["_"] + speak_output = data[prompts.ERROR_MSG] handler_input.response_builder.speak(speak_output).ask(speak_output) return handler_input.response_builder.response @@ -226,11 +227,11 @@ class CancelAndStopIntentHandler(AbstractRequestHandler): def can_handle(self, handler_input): return is_intent_name("AMAZON.CancelIntent")(handler_input) \ - and is_intent_name("AMAZON.StopIntent")(handler_input) + and is_intent_name("AMAZON.StopIntent")(handler_input) def handle(self, handler_input): - _ = handler_input.attributes_manager.request_attributes["_"] - speak_output = _(data.GOODBYE_MSG) + data = handler_input.attributes_manager.request_attributes["_"] + speak_output = data[prompts.GOODBYE_MSG] handler_input.response_builder.speak(speak_output) return handler_input.response_builder.response @@ -268,9 +269,12 @@ class LocalizationInterceptor(AbstractRequestInterceptor): def process(self, handler_input): locale = handler_input.request_envelope.request.locale logger.info("Locale is {}".format(locale)) - i18n = gettext.translation( - 'data', localedir='locales', languages=[locale], fallback=True) - handler_input.attributes_manager.request_attributes["_"] = i18n.gettext + + # localized strings stored in language_strings.json + with open("language_strings.json") as language_prompts: + language_data = json.load(language_prompts) + data = language_data[locale] + handler_input.attributes_manager.request_attributes["_"] = data # register request / intent handlers @@ -289,3 +293,4 @@ def process(self, handler_input): sb.add_global_response_interceptor(CacheSpeechForRepeatInterceptor()) lambda_handler = sb.lambda_handler() + diff --git a/lambda/py/language_strings.json b/lambda/py/language_strings.json new file mode 100644 index 0000000..82360b4 --- /dev/null +++ b/lambda/py/language_strings.json @@ -0,0 +1,74 @@ +{ + "en-US" : { + "WELCOME_MSG" : "Hello! Welcome to Cake walk. What is your birthday?", + "WELCOME_REMPROMPT_MSG" : "I was born Nov. 6th, 2014. When were you born?", + "WELCOME_BACK_MSG" : "Welcome back. It looks like there is {} day until your {}th birthday.", + "WELCOME_BACK_MSG_plural" : "Welcome back. It looks like there are {} days until your {}th birthday", + "HAPPY_BIRTHDAY_MSG" : "Happy {}th birthday!", + "REGISTER_BIRTHDAY_MSG" : "Thanks, I'll remember that you were born {} {} {}", + "HELP_MSG" : "You can tell me your date of birth and I'll take note. You can also just say, 'register my birthday' and I will guide you. Which one would you like to try?", + "GOODBYE_MSG" : "Goodbye!", + "ERROR_MSG" : "Sorry, I couldn't understand what you said. Can you reformulate?", + "ERROR_TIMEZONE_MSG" : "I can't determine your timezone. Please check your device settings and make sure a timezone was selected. After that please reopen the skill and try again!" + }, + "fr-CA" : { + "WELCOME_MSG" : "Bonjour! Bienvenue sur le Génie des Anniversaires. Quelle est votre date de naissance ?", + "WELCOME_REMPROMPT_MSG" : "Je suis née le 6 novembre 2014. Et vous, quand êtes-vous né ?", + "WELCOME_BACK_MSG" : "Content de vous revoir! Il vous reste {} jour avant d'avoir {} ans.", + "WELCOME_BACK_MSG_plural" : "Content de vous revoir! Il vous reste {} jours avant d'avoir {} ans.", + "HAPPY_BIRTHDAY_MSG" : "Bonne Fête! Aujourd'hui, vous avez {} an!", + "REGISTER_BIRTHDAY_MSG" : "Merci, je vais me rappeler que vous êtes né le {} {} {}.", + "HELP_MSG" : "Je peux me souvenir de votre date de naissance. Dites-moi votre jour, mois et année de naissance ou bien dites-moi simplement \"sauve ma fête\" et je vous guiderai. Quel est votre choix ?", + "GOODBYE_MSG" : "Au revoir!", + "ERROR_MSG" : "Désolé, je n'ai pas compris. Pouvez-vous reformuler ?", + "ERROR_TIMEZONE_MSG" : "Je n'ai pas réussi à déterminer votre fuseau horaire. Veuillez vérifier les paramètres de votre appareil et réessayez." + }, + "fr-FR":{ + "WELCOME_MSG" : "Bonjour! Bienvenue sur le Génie des Anniversaires. Quelle est votre date de naissance ?", + "WELCOME_REMPROMPT_MSG" : "Bonjour! Bienvenue sur le Génie des Anniversaires. Quelle est votre date de naissance ?", + "WELCOME_BACK_MSG" : "Content de vous revoir! Il vous reste {} jour avant d'avoir {} ans.", + "WELCOME_BACK_MSG_plural" : "Content de vous revoir! Il vous reste {} jours avant d'avoir {} ans.", + "HAPPY_BIRTHDAY_MSG" : "Joyeux Anniversaire! Aujourd'hui, vous avez {} an!", + "REGISTER_BIRTHDAY_MSG" : "Merci, je vais me rappeler que vous êtes né le {} {} {}.", + "HELP_MSG" : "Je peux me souvenir de votre date de naissance. Dites-moi votre jour, mois et année de naissance ou bien dites-moi simplement \"enregistre mon anniversaire\" et je vous guiderai. Quel est votre choix ?", + "GOODBYE_MSG" : "Au revoir!", + "ERROR_MSG" : "Désolé, je n'ai pas compris. Pouvez-vous reformuler ?", + "ERROR_TIMEZONE_MSG" : "Je n'ai pas réussi à déterminer votre fuseau horaire. Veuillez vérifier les paramètres de votre appareil et réessayez." + }, + "hi-IN":{ + "WELCOME_MSG" : "नमस्ते. Cake Walk में आपका स्वागत. आपका जनमदिन कब हैं?", + "WELCOME_REMPROMPT_MSG" : "मेरा जन्म 6 नवंबर, 2014 को हुआ था. आप कब पैदा हुए थे?", + "WELCOME_BACK_MSG" : "वापसी पर स्वागत है. आपके {} वे जनमदिन तक {} दिन हैं`", + "WELCOME_BACK_MSG_plural" : "आपके {} वे जनमदिन तक {} दिन हैं", + "HAPPY_BIRTHDAY_MSG" : "{} वां जन्मदिन मुबारक हो", + "REGISTER_BIRTHDAY_MSG" : "शुक्रिया. मुझे याद होगा कि आप {} {} {} मैं पैदा हुए थे", + "HELP_MSG" : "आप मुझे अपनी जन्मतिथि बता सकते हैं और मैं note कर लूंगा. आप यह भी कह सकते हैं, \"मेरा जन्मदिन register करें. आप कौन सा प्रयास करना चाहेंगे?", + "GOODBYE_MSG" : "अलवादी", + "ERROR_MSG" : "Sorry, मैं वो समझ नहीं पायी. क्या आप दोहरा सकते हैं ", + "ERROR_TIMEZONE_MSG" : "Sorry. मैं आपके समयक्षेत्र का निर्धारण नहीं कर सकता. आपकी Device Settings में timezone select कर दो और एक और बार skill खोलो." + }, + "it-IT":{ + "WELCOME_MSG" : "Ciao! Benvenuti a Buon Compleanno. Qual'è la tua data di nascita?", + "WELCOME_REMPROMPT_MSG" : "Io sono nata il 6 novembre 2014. E tu invece?", + "WELCOME_BACK_MSG" : "Ciao di nuovo! Manca {} giorno a quando avrai {} anni.", + "WELCOME_BACK_MSG_plural" : "Ciao di nuovo! Mancano {} giorni a quando avrai {} anni.", + "HAPPY_BIRTHDAY_MSG" : "Buon compleanno! Oggi compi {} anno!", + "REGISTER_BIRTHDAY_MSG" : "Grazie, mi ricorderò la tua data di nascita: {} {} {}.", + "HELP_MSG" : "Posso segnarmi la tua data di nascita. Dimmi pure la data oppure dimmi di ricordami il tuo compleanno. Cosa preferisci?", + "GOODBYE_MSG" : "A presto!", + "ERROR_MSG" : "Scusa, non ho capito. Puoi ripetere?", + "ERROR_TIMEZONE_MSG" : "Non ho potuto determinare il tuo fuso orario. Verifica la configurazione del tuo dispositivo, e riprova." + }, + "ja-JP":{ + "WELCOME_MSG" : "こんにちは、ケークウォークへようこそ。あなたの誕生日はいつですか?", + "WELCOME_REMPROMPT_MSG" : "私は2004年10月6日に生まれました。あなたの誕生日はいつですか?", + "WELCOME_BACK_MSG" : "おかえりなさい。{}歳のお誕生日まで、あと{{count}}日です。", + "WELCOME_BACK_MSG_plural" : "おかえりなさい。{}歳のお誕生日まで、残り{}日です。", + "HAPPY_BIRTHDAY_MSG" : "{}歳のお誕生日、おめでとうございます!", + "REGISTER_BIRTHDAY_MSG" : "ありがとうございます。誕生日は {}年 {}月 {}日ですね?", + "HELP_MSG" : "あなたの誕生日を言うと、その日付を記憶します。もしくは、「私の誕生日を登録して」と言うと、詳しくご案内します。どちらにしますか?", + "GOODBYE_MSG" : "さようなら", + "ERROR_MSG" : "ごめんなさい、うまく理解できませんでした。もう一度言ってみてください。", + "ERROR_TIMEZONE_MSG" : "タイムゾーンを特定できませんでした。Alexaアプリでデバイスの設定を開き、タイムゾーンが正しく選択されていることを確認したあとで、もう一度試してください。" + } +} diff --git a/lambda/py/prompts.py b/lambda/py/prompts.py new file mode 100644 index 0000000..4f4d681 --- /dev/null +++ b/lambda/py/prompts.py @@ -0,0 +1,12 @@ +# Alexa Prompts Language Constants + +WELCOME_MSG = "WELCOME_MSG" +WELCOME_REMPROMPT_MSG = "WELCOME_REMPROMPT_MSG" +WELCOME_BACK_MSG = "WELCOME_BACK_MSG" +WELCOME_BACK_MSG_plural = "WELCOME_BACK_MSG_plural" +HAPPY_BIRTHDAY_MSG = "HAPPY_BIRTHDAY_MSG" +REGISTER_BIRTHDAY_MSG = "REGISTER_BIRTHDAY_MSG" +HELP_MSG = "HELP_MSG" +GOODBYE_MSG = "GOODBYE_MSG" +ERROR_MSG = "ERROR_MSG" +ERROR_TIMEZONE_MSG = "ERROR_TIMEZONE_MSG" diff --git a/final/requirements.txt b/lambda/py/requirements.txt similarity index 80% rename from final/requirements.txt rename to lambda/py/requirements.txt index 1be00c5..1b5d6a9 100644 --- a/final/requirements.txt +++ b/lambda/py/requirements.txt @@ -1,3 +1,4 @@ ask-sdk-core ask-sdk-s3-persistence-adapter -pytz \ No newline at end of file +boto3 +pytz diff --git a/lambda/py/utils.py b/lambda/py/utils.py new file mode 100644 index 0000000..628dd1f --- /dev/null +++ b/lambda/py/utils.py @@ -0,0 +1,25 @@ +import logging +import os +import boto3 +from botocore.exceptions import ClientError + + +def create_presigned_url(object_name): + """Generate a presigned URL to share an S3 object with a capped expiration of 60 seconds + + :param object_name: string + :return: Presigned URL as string. If error, returns None. + """ + s3_client = boto3.client('s3', config=boto3.session.Config(signature_version='s3v4',s3={'addressing_style': 'path'})) + try: + bucket_name = os.environ.get('S3_PERSISTENCE_BUCKET') + response = s3_client.generate_presigned_url('get_object', + Params={'Bucket': bucket_name, + 'Key': object_name}, + ExpiresIn=60*1) + except ClientError as e: + logging.error(e) + return None + + # The response contains the presigned URL + return response diff --git a/i18n/models/en-AU.json b/models/en-AU.json similarity index 100% rename from i18n/models/en-AU.json rename to models/en-AU.json diff --git a/i18n/models/en-IN.json b/models/en-IN.json similarity index 100% rename from i18n/models/en-IN.json rename to models/en-IN.json diff --git a/final/en-US.json b/models/en-US.json similarity index 100% rename from final/en-US.json rename to models/en-US.json diff --git a/i18n/models/fr-CA.json b/models/fr-CA.json similarity index 100% rename from i18n/models/fr-CA.json rename to models/fr-CA.json diff --git a/i18n/models/fr-FR.json b/models/fr-FR.json similarity index 100% rename from i18n/models/fr-FR.json rename to models/fr-FR.json diff --git a/i18n/models/hi-IN.json b/models/hi-IN.json similarity index 100% rename from i18n/models/hi-IN.json rename to models/hi-IN.json diff --git a/i18n/models/it-IT.json b/models/it-IT.json similarity index 100% rename from i18n/models/it-IT.json rename to models/it-IT.json diff --git a/i18n/models/ja-JP.json b/models/ja-JP.json similarity index 100% rename from i18n/models/ja-JP.json rename to models/ja-JP.json diff --git a/module-1/en-US.json b/module-1/en-US.json deleted file mode 100644 index 06f728f..0000000 --- a/module-1/en-US.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "interactionModel": { - "languageModel": { - "invocationName": "cake walk", - "intents": [ - { - "name": "AMAZON.CancelIntent", - "samples": [] - }, - { - "name": "AMAZON.HelpIntent", - "samples": [] - }, - { - "name": "AMAZON.StopIntent", - "samples": [] - }, - { - "name": "HelloWorldIntent", - "slots": [], - "samples": [ - "hello", - "how are you", - "say hi world", - "say hi", - "hi", - "say hello world", - "say hello" - ] - }, - { - "name": "AMAZON.NavigateHomeIntent", - "samples": [] - } - ], - "types": [] - } - } -} \ No newline at end of file diff --git a/module-1/lambda_function.py b/module-1/lambda_function.py deleted file mode 100644 index 80d3f3a..0000000 --- a/module-1/lambda_function.py +++ /dev/null @@ -1,169 +0,0 @@ -# -*- coding: utf-8 -*- - -# This sample demonstrates handling intents from an Alexa skill using the Alexa Skills Kit SDK for Python. -# Please visit https://alexa.design/cookbook for additional examples on implementing slots, dialog management, -# session persistence, api calls, and more. -# This sample is built using the handler classes approach in skill builder. -import logging -import ask_sdk_core.utils as ask_utils - -from ask_sdk_core.skill_builder import SkillBuilder -from ask_sdk_core.dispatch_components import AbstractRequestHandler -from ask_sdk_core.dispatch_components import AbstractExceptionHandler -from ask_sdk_core.handler_input import HandlerInput - -from ask_sdk_model import Response - -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) - - -class LaunchRequestHandler(AbstractRequestHandler): - """Handler for Skill Launch.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - - return ask_utils.is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Hello! Welcome to cake walk. That was a piece of cake! Bye!" - - return ( - handler_input.response_builder - .speak(speak_output) - #.ask(speak_output) - .response - ) - - -class HelloWorldIntentHandler(AbstractRequestHandler): - """Handler for Hello World Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_intent_name("HelloWorldIntent")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Hello World!" - - return ( - handler_input.response_builder - .speak(speak_output) - # .ask("add a reprompt if you want to keep the session open for the user to respond") - .response - ) - - -class HelpIntentHandler(AbstractRequestHandler): - """Handler for Help Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_intent_name("AMAZON.HelpIntent")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "You can say hello to me! How can I help?" - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(speak_output) - .response - ) - - -class CancelOrStopIntentHandler(AbstractRequestHandler): - """Single handler for Cancel and Stop Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return (ask_utils.is_intent_name("AMAZON.CancelIntent")(handler_input) or - ask_utils.is_intent_name("AMAZON.StopIntent")(handler_input)) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Goodbye!" - - return ( - handler_input.response_builder - .speak(speak_output) - .response - ) - - -class SessionEndedRequestHandler(AbstractRequestHandler): - """Handler for Session End.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_request_type("SessionEndedRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - - # Any cleanup logic goes here. - - return handler_input.response_builder.response - - -class IntentReflectorHandler(AbstractRequestHandler): - """The intent reflector is used for interaction model testing and debugging. - It will simply repeat the intent the user said. You can create custom handlers - for your intents by defining them above, then also adding them to the request - handler chain below. - """ - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_request_type("IntentRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - intent_name = ask_utils.get_intent_name(handler_input) - speak_output = "You just triggered " + intent_name + "." - - return ( - handler_input.response_builder - .speak(speak_output) - # .ask("add a reprompt if you want to keep the session open for the user to respond") - .response - ) - - -class CatchAllExceptionHandler(AbstractExceptionHandler): - """Generic error handling to capture any syntax or routing errors. If you receive an error - stating the request handler chain is not found, you have not implemented a handler for - the intent being invoked or included it in the skill builder below. - """ - def can_handle(self, handler_input, exception): - # type: (HandlerInput, Exception) -> bool - return True - - def handle(self, handler_input, exception): - # type: (HandlerInput, Exception) -> Response - logger.error(exception, exc_info=True) - - speak_output = "Sorry, I had trouble doing what you asked. Please try again." - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(speak_output) - .response - ) - -# The SkillBuilder object acts as the entry point for your skill, routing all request and response -# payloads to the handlers above. Make sure any new handlers or interceptors you've -# defined are included below. The order matters - they're processed top to bottom. - - -sb = SkillBuilder() - -sb.add_request_handler(LaunchRequestHandler()) -sb.add_request_handler(HelloWorldIntentHandler()) -sb.add_request_handler(HelpIntentHandler()) -sb.add_request_handler(CancelOrStopIntentHandler()) -sb.add_request_handler(SessionEndedRequestHandler()) -sb.add_request_handler(IntentReflectorHandler()) # make sure IntentReflectorHandler is last so it doesn't override your custom intent handlers - -sb.add_exception_handler(CatchAllExceptionHandler()) - -lambda_handler = sb.lambda_handler() \ No newline at end of file diff --git a/module-1/requirements.txt b/module-1/requirements.txt deleted file mode 100644 index d3cbd61..0000000 --- a/module-1/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -boto3==1.9.216 -ask-sdk-core==1.11.0 \ No newline at end of file diff --git a/module-2/README.md b/module-2/README.md deleted file mode 100644 index 7be81a2..0000000 --- a/module-2/README.md +++ /dev/null @@ -1,400 +0,0 @@ -## Collecting slots turn-by-turn with auto-delegation -In the previous section, you built an Alexa skill that says, “Hello! Welcome to Cake Walk. That was a piece of cake! Bye!” In this section, you will make the skill more useful by having it ask the user for their birthday. When the user responds, the skill will understand and repeat the user’s birthday back to them. - -To do this, you will need to use utterances, intents, and slots. You will also learn how to use dialog management to have your skill automatically ask follow-up questions to collect required information. For example, if the user says, “I was born July 12th,” dialog management will automatically ask the user what year they were born. - -At the end of this module, your Cake Walk skill will be able to: -* **Ask** the user a question -* **Listen** for the answer -* **Respond** to the user - -Use the [Alexa developer console](https://developer.amazon.com/alexa/console/ask) for this module. Log in to the console and open the Cake Walk skill. - -## Step 1: Ask the user for their birthday -At the moment, the skill simply greets the user and exits. The welcome message helps set the context of the interaction—the user knows they are interacting with Cake Walk. Now you need to capture the user’s birthday to eventually calculate the number of days until the user’s next birthday. To do that, update the skill with programming logic that instructs Alexa to ask for the user’s birthday. - -![](http://alexa-github.s3.amazonaws.com/python-code-tab.png) - -**a.** In the developer console, click the **Code** tab. - -Find the **LaunchRequestHandler**. Within the handler, the **speak_output** variable is passed to the **.speak()** function. In the next step, update the string to ask the user for their birthday. - -**b.** Within the **LaunchRequestHandler**, in the **handle()** function, find the line that begins with **speak_output =**. Replace that line with the following: - -```py -speak_output = "Hello! This is Cake walk. What is your birthday?" -``` - -Your `LaunchRequestHandler` should now look like: - -```py -class LaunchRequestHandler(AbstractRequestHandler): - """Handler for Skill Launch.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - - return ask_utils.is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Hello! This is Cake walk. What is your birthday?" - - return ( - handler_input.response_builder - .speak(speak_output) - #.ask(speak_output) - .response - ) -``` - -Now, remember that after Alexa responds, the skill exits. You need to tell Alexa to listen for the user to respond. To do that, you will use the **.ask()** function, which you previously commented out. - -**c.** Within the **LaunchRequestHandler**, in the **handle()** function, remove the “#” before the **.ask()** function. - -The **.ask()** function does two things: -* Tells the skill to wait for the user to reply, rather than simply exiting -* Allows you to specify a way to ask the question to the user again, if they don’t respond - -> **A best practice is to make your reprompt text different from your initial speech text.** - -The user may not have responded for a variety of reasons. The skill should pose the initial question again but do so in a natural way. The reprompt should provide more context to help the user provide an answer. Specify the reprompt text by creating a new variable named **reprompt_text**. - -**d.** Within the **LaunchRequestHandler**, in the **handle()** function, find the line that begins **speak_output =**. Create a new line _below_ it by clicking at the end of the line and pressing **ENTER**. - -**e.** Copy and paste the following code on the new line: -```py -reprompt_text = "I was born Nov. 6th, 2014. When are you born?" -``` - -Notice the reprompt gives an example of what Alexa expects the user to say by having Alexa provide her own birthday in the format she is looking for. Providing examples like this is a best practice. - -> **Notice the numbers are spelled out in the reprompt text. You can use Speech Synthesis Markup Language (SSML) to have Alexa read "2014."** - -Now you want the code to pass the `reprompt_text` variable to the **.ask()** function. - -**f.** Within the **LaunchRequestHandler**, in the **handle()** function, replace **.ask(speak_output)** with **.ask(reprompt_text)** - -Your `LaunchRequestHandler` should now look like: - -```py -class LaunchRequestHandler(AbstractRequestHandler): - """Handler for Skill Launch.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - - return ask_utils.is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Hello! This is Cake walk. What is your birthday?" - reprompt_text = "I was born Nov. 6th, 2015. When are you born?" - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(reprompt_text) - .response - ) -``` - -There is a potential complication with asking the user for their birthday. They might respond in many different ways. For example, the user might give only the month and day, or they might say something like, "Next Tuesday." -In this course, you won't handle all the different ways a user might respond, but we challenge you to account for them when you finish the course. Let's focus on a way to ensure that Alexa is able to collect the month, day, and year from the user. - -Before moving on, save and deploy your updated code. - -**g.** Click **Save**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/3/building-a-skill-3-save.png) - -**h.** Click **Deploy**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-4j.png) - -> **Get into the habit of saving and deploying your changes regularly to ensure you don't lose anything. Save as you go!** - -The Cake Walk skill can now ask and listen, but it can't respond yet. You need to update our skill's front end before testing it. Specifically, you need to create an intent to interpret the user's response to the skill's question. - -## Step 2: Use an intent and slots to capture information -Now make some adjustments to the skill's front end. Specifically, you need to create an intent that will interpret how the user responds to Alexa's question. -When you name an intent, think about what the intent is going to do. In this case, the intent is going to capture the user's birthday, so name it **CaptureBirthdayIntent**. Notice the words are not separated by spaces, and each new word begins with an uppercase letter. - -**a.** Click the **Build** tab. - -**b.** To the right of **Intents**, click **Add**. The Add Intent window opens. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-2a.png) - -**c.** Select **Create custom intent** and enter the following text for the name of the intent: **CaptureBirthdayIntent** - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-2c.png) - -**d.** Click **Create custom intent**. The intent is created. - -> **Remember, an intent is an action to fulfill a user's request. An utterance is what invokes the intent. In response to the birthday question, a user might say - "I was born on November seventh, nineteen eighty three." You will add this utterance to the CaptureBirthdayIntent by typing it in exactly the way the user is expected to say it.** - -**e.** In the **Sample Utterances** field, type the following, and then press **ENTER** or click the + icon: **I was born on November seventh nineteen eighty three** -Notice that the text does not include punctuation. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-2e.png) - -> **When finished, the Cake Walk skill will be able to capture any birthday.** - -From this utterance, there are three key pieces of information to collect: month, day, and year. These are called slots. You need to let Alexa know which words are slots and what kind of slots they are. -Start with the month slot. In the utterance, you will replace the word representing the month (November) with the word **month** in curly brackets ({ }). This creates a slot called month. The utterance will then look like this: **I was born on {month} seventh nineteen eighty three** -There are two ways to create a slot. The first way is to select the word in the sample utterance where the slot should go and type the name of the slot in curly brackets (for example, **{month}**). -The second way is to select the word in the sample utterance and use the **Select an Existing Slot** dialog box when it appears. In the dialog box, click the field under **Create a new slot**, type the name of the slot without curly brackets (for example, **month**), and click **Add**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-2e2.png) - -**f.** In the utterance, use either method of creating a slot to create a slot called **month** over the word **November**. - -**g.** Repeat this process for the other variable pieces of information (day and year). -Your utterance should now look like this: **I was born on {month} {day} {year}** -What if the user omits the words _I was born on_? Account for this by adding a second utterance with only the slots. - -**h.** In the **Sample Utterances** field, type the following, and then press **ENTER** or click the + icon: **{month} {day} {year}** - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-2h.png) - -> **When entering a sample utterance, you may need to press ENTER twice for the utterance to be added. You can also click the + icon.** - -Now, you should account for a few other potential slot combinations. - -**i.** Enter each of the examples below as sample utterances. When you are finished, you should have six utterances. -{month} {day} -{month} {day} {year} -{month} {year} -I was born on {month} {day} -I was born on {month} {day} {year} -I was born in {month} {year} - -You have let Alexa know what slots need to be collected (and covered some of the different patterns users might provide that information in). Now you need to define exactly what those slots are by assigning a slot type to each slot. - -Scroll down the page to **Intent Slots**. This area displays the slots you have created. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-2i.png) - -Slots are assigned from the **Slot Type** drop-down menu to the right of each slot. - -There are two types of slot types: custom and built-in. Wherever possible, use built-in slots. Alexa manages the definitions of built-in slots. These slots begin with **AMAZON** followed by what they define (for example, **AMAZON.Month**). - -If an applicable built-in slot does not exist, create a custom slot and define the values it represents. For this course, you will only use built-in slots. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-2i2.png) - -**j.** To the right of the **month** slot, select **AMAZON.Month** from the **Slot Type** drop-down menu. - -**k.** For the **day** slot, select **AMAZON.Ordinal** as the slot type. - -**l.** For the **year** slot, select **AMAZON.FOUR_DIGIT_NUMBER** as the slot type. -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-2j.png) - -You have created an intent to collect the user's birthday. - -But what about a user who doesn't respond with all three slot values? For example, a user who responds, "In July." Let's take a look at solving that problem. - -**m.** At the top of the page, click **Save Model**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-2m.png) - -## Step 3: Use dialog management -Slots can be required or optional. That is, if you need a given value from the user, you can designate a slot as required using dialog management. Marking a slot as required triggers Alexa to actively work to fill it. Start by making each of the slots required. - -**a.** Click on “CaptureBirthdayIntent” on the left nav bar. In the **Intent Slots** section, to the right of the **month** slot, click **Edit Dialog**. - -**b.** Under **Slot Filling**, toggle to make the slot required. - -The **Alexa speech prompts** field appears. Here, you will enter text for Alexa to say if the user fails to provide a value for the **month** slot. - -**c.** In the field, type **What month were you born in?** and then press **ENTER** or click the + icon. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-3c.png) - -**d.** Repeat the process for the **day** and **year** slots. - -Note: Return to the screen where you entered the sample utterances by clicking **CaptureBirthdayIntent** in the left-hand panel. - -> Now that the slots are required, if a user responds, "July nineteen eighty two," Alexa recognizes that the month and year slots are filled, but the day slot is not. - -> Alexa will prompt the user for each unfilled slot. In this example, Alexa would ask, "What day were you born?" - -One of the great things about dialog management is that the skill doesn't break or get confused if the user leaves out a piece of information or provides it out of the expected order. Instead, Alexa takes on the responsibility of collecting information designated as required to ensure a useful experience. - -You have built an intent that listens for the user's answer to the birthday question. When the user responds, Alexa collects the user's birthday month, day, and year. This information will be sent to the skill's backend code in a JSON request. - -Before moving on, notice the **HelloWorld** intent in the left-hand panel. That is a leftover from the starter template that you don't need. - -**e.** Delete the **HelloWorldIntent** intent by clicking the trash can icon to the right of it. When prompted, click **Delete Intent**. - -Be careful to delete **HelloWorldIntent** and _not_ **CaptureBirthdayIntent**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-3e.png) - -> **You may notice other intents (such as AMAZON.HelpIntent) were automatically added to your skill. These are required for every skill and provide the user a means to cancel, stop, and get help. Do not remove these.** - -**f.** At the top of the page, click **Save Model**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-2m.png) - -**g.** Click **Build Model**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-3g.png) - -When you click **Build Model**, your skill starts to build the training data that will help Alexa know how to map what the user says to your skill's intents. It may take a minute for the model to build. - -At this point, your skill can ask and listen. Now, make it respond. - -## Step 4: Define a new handler -To make the Cake Walk skill respond, you need to update the backend. - -**a.** Click the **Code** tab. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-4a.png) - -Remember modifying the **LaunchRequestHandler**? This time, you are going to build a new handler. This handler will acknowledge that the user provided their birthday and repeat the birthday back to the user. - -If you look at the code, you will notice the **HelloWorldIntentHandler**. But you deleted the **HelloWorldIntent**, right? Not entirely. The intent is gone from the front end, but the backend handler is still there. You need a new handler, so make things easier and reuse this handler for a new one called **CaptureBirthdayIntentHandler**. - -**b.** Find the line that starts **class HelloWorldIntentHandler**. On that line, rename **HelloWorldIntentHandler** to **CaptureBirthdayIntentHandler** - -**c.** Within the **CaptureBirthdayIntentHandler**, on the line that begins **return ask_utils.is_intent_name("HelloWorldIntent")(handler_input)**, change '**HelloWorldIntent**' to '**CaptureBirthdayIntent**' - -This change ensures that the **canHandle()** function will be invoked when a **CaptureBirthdayIntent** request comes through. - -Your `CaptureBirthdayIntentHandler ` should now look like: - -```py -class CaptureBirthdayIntentHandler(AbstractRequestHandler): - """Handler for Hello World Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_intent_name("CaptureBirthdayIntent")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Hello World!" - - return ( - handler_input.response_builder - .speak(speak_output) - # .ask("add a reprompt if you want to keep the session open for the user to respond") - .response - ) -``` - -Now you need to update the logic within the handler so Alexa will confirm to the user that she heard their birthday. In this case, you will have Alexa read the birthday back to the user, like this: “Thanks, I'll remember that you were born on {month} {day} {year}.” - -Start by creating three variables in the handler to save the slots the skill is collecting. - -**d.** Within the **CaptureBirthdayIntentHandler**, find the line that begins **def handle(self, handler_input):**. Create a new line _below_it. - -**e.** Copy and paste the following code on the new line: - -```py - slots = handler_input.request_envelope.request.intent.slots - year = slots["year"].value - month = slots["month"].value - day = slots["day"].value -``` - -Next, update the **speak_output**. To do this, we use string interpolation to substitute values of our variables into placeholders in our string. While Python supports multiple ways to do this, we will use .format() function to replace placeholder values inside braces {} with the values of our variables. - -This allows you to drop the new variables into a text string. - -Here is an example of a string interpolation: - -*`’Looks like you were born in #{month}’.format(month=month)`* - -**f.** Within the **CaptureBirthdayIntentHandler**, in the **handle()** function, find the line that begins with **speak_output =**. Replace that line with the following code: - -```py -speak_output = 'Thanks, I will remember that you were born {month} {day} {year}.'.format(month=month, day=day, year=year) -``` - -Your **CaptureBirthdayIntentHandler** should now look like: - -```py -class CaptureBirthdayIntentHandler(AbstractRequestHandler): - """Handler for Hello World Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_intent_name("CaptureBirthdayIntent")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - slots = handler_input.request_envelope.request.intent.slots - year = slots["year"].value - month = slots["month"].value - day = slots["day"].value - - speak_output = 'Thanks, I will remember that you were born {month} {day} {year}.'.format(month=month, day=day, year=year) - - return ( - handler_input.response_builder - .speak(speak_output) - # .ask("add a reprompt if you want to keep the session open for the user to respond") - .response - ) -``` - -You are almost finished. Remember changing the **HelloWorldIntentHandler** to **CaptureBirthdayIntentHandler**? In every skill that uses the SDK, there is a place to notify the SDK of the available handlers. This is called registering. Update the code to register the new handler. - -**g.** Scroll down in the code until you find the line that begins **sb = SkillBuilder()**. - -Under this line, you will notice the list of handlers in the skill. **HelloWorldIntentHandler** is listed, and you need to change it to **CaptureBirthdayIntentHandler**. Otherwise, the skill will give an error. - -**h.** Replace the line **sb.add_request_handler(HelloWorldIntentHandler())** with **sb.add_request_handler(CaptureBirthdayIntentHandler())** - -Your handler code at the bottom of the file should now look like: - -### Register request / intent handlers -```py -sb = SkillBuilder() - -sb.add_request_handler(LaunchRequestHandler()) -sb.add_request_handler(CaptureBirthdayIntentHandler()) -sb.add_request_handler(HelpIntentHandler()) -sb.add_request_handler(CancelOrStopIntentHandler()) -sb.add_request_handler(SessionEndedRequestHandler()) -sb.add_request_handler(IntentReflectorHandler()) # make sure IntentReflectorHandler is last so it doesn't override your custom intent handlers - -sb.add_exception_handler(CatchAllExceptionHandler()) - -lambda_handler = sb.lambda_handler() -``` - -**i.** Click **Save**. - -**j.** Click **Deploy**. Because of the new handler, your skill will take a few moments to deploy. - -## Step 5: Test your skill - -It is time to test! The Cake Walk skill should now be able to do the following: -* **Ask** the user for their birthday -* **Listen** to the answer from the user and automatically follow up with questions if any required slots (month, day, year) are missing -* **Respond** to the user by repeating their birthday -Let's test the skill. - -**a.** Click the **Test** tab. -Remember that you can test by typing what the user would say in the box at the top left, or you can speak to the skill by clicking and holding the microphone icon and speaking. - -**b.** Test your skill by opening Cake Walk and responding when Alexa asks for your birthday. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/4/chapter4-5a.png) - -> **If you are testing by typing what the user would say, spell out the numbers (for example, November seventh nineteen eighty three). Otherwise, the numbers won't be understood. You may have noticed that numbers have been have purposefully spelled out throughout the course. This is only a requirement when typing. If you speak to the skill, the numbers are automatically converted.** - -Alexa should respond with, "Thanks, I'll remember that your birthday is {month} {day} {year}." -Go ahead and test what happens if you provide only the year, the year and the day, or other combinations. Alexa should prompt you for any slot values that you omit. - -## Wrap-up -At this point, your skill has become slightly more nuanced. It can ask the user for their birthday and repeat it back to the user. Congratulations! - -However, while your skill can ask for a user’s birthday, your skill doesn’t remember it the next time the skill is opened. It would be a better user experience if Cake Walk remembered the user’s birthday. In the next section, you will learn how to make your skill remember things. - -## Code -If your skill isn’t working or you’re getting some kind of syntax error, download the code sample in Python from the link below. Then, go to the Code tab in the Alexa developer console and copy and paste the code into the **lambda_function.py** file. Be sure to save and deploy the code before testing it. - - [Python Github Code Sample, Module 2: Collecting Slots Turn by Turn](https://github.com/alexa/skill-sample-python-first-skill/tree/master/module-2) - - [Continue to module 3](https://github.com/alexa/skill-sample-python-first-skill/tree/master/module-3) diff --git a/module-2/en-US.json b/module-2/en-US.json deleted file mode 100644 index 5a5675c..0000000 --- a/module-2/en-US.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "interactionModel": { - "languageModel": { - "invocationName": "cake walk", - "intents": [ - { - "name": "AMAZON.CancelIntent", - "samples": [] - }, - { - "name": "AMAZON.HelpIntent", - "samples": [] - }, - { - "name": "AMAZON.StopIntent", - "samples": [] - }, - { - "name": "AMAZON.NavigateHomeIntent", - "samples": [] - }, - { - "name": "CaptureBirthdayIntent", - "slots": [ - { - "name": "month", - "type": "AMAZON.Month" - }, - { - "name": "day", - "type": "AMAZON.Ordinal" - }, - { - "name": "year", - "type": "AMAZON.FOUR_DIGIT_NUMBER" - } - ], - "samples": [ - "I was born in {month} {year}", - "I was born on {month} {day}", - "{month} {year}", - "{month} {day} {year}", - "{month} {day}", - "I was born on {month} {day} {year} " - ] - } - ], - "types": [] - }, - "dialog": { - "intents": [ - { - "name": "CaptureBirthdayIntent", - "confirmationRequired": false, - "prompts": {}, - "slots": [ - { - "name": "month", - "type": "AMAZON.Month", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.1323207333291.110752114450" - } - }, - { - "name": "day", - "type": "AMAZON.Ordinal", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.1323207333291.563366041005" - } - }, - { - "name": "year", - "type": "AMAZON.FOUR_DIGIT_NUMBER", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.1323207333291.854898796228" - } - } - ] - } - ], - "delegationStrategy": "ALWAYS" - }, - "prompts": [ - { - "id": "Elicit.Slot.1323207333291.110752114450", - "variations": [ - { - "type": "PlainText", - "value": "What month were you born in?" - } - ] - }, - { - "id": "Elicit.Slot.1323207333291.563366041005", - "variations": [ - { - "type": "PlainText", - "value": "What day were you born on?" - } - ] - }, - { - "id": "Elicit.Slot.1323207333291.854898796228", - "variations": [ - { - "type": "PlainText", - "value": "What year were you born in?" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/module-2/lambda_function.py b/module-2/lambda_function.py deleted file mode 100644 index f0597b0..0000000 --- a/module-2/lambda_function.py +++ /dev/null @@ -1,175 +0,0 @@ -# -*- coding: utf-8 -*- - -# This sample demonstrates handling intents from an Alexa skill using the Alexa Skills Kit SDK for Python. -# Please visit https://alexa.design/cookbook for additional examples on implementing slots, dialog management, -# session persistence, api calls, and more. -# This sample is built using the handler classes approach in skill builder. -import logging -import ask_sdk_core.utils as ask_utils - -from ask_sdk_core.skill_builder import SkillBuilder -from ask_sdk_core.dispatch_components import AbstractRequestHandler -from ask_sdk_core.dispatch_components import AbstractExceptionHandler -from ask_sdk_core.handler_input import HandlerInput - -from ask_sdk_model import Response - -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) - - -class LaunchRequestHandler(AbstractRequestHandler): - """Handler for Skill Launch.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - - return ask_utils.is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Hello! This is Cake walk. What is your birthday?" - reprompt_text = "I was born Nov. 6th, 2015. When are you born?" - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(reprompt_text) - .response - ) - - -class CaptureBirthdayIntentHandler(AbstractRequestHandler): - """Handler for Hello World Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_intent_name("CaptureBirthdayIntent")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - slots = handler_input.request_envelope.request.intent.slots - year = slots["year"].value - month = slots["month"].value - day = slots["day"].value - - speak_output = 'Thanks, I will remember that you were born {month} {day} {year}.'.format(month=month, day=day, year=year) - - return ( - handler_input.response_builder - .speak(speak_output) - # .ask("add a reprompt if you want to keep the session open for the user to respond") - .response - ) - - -class HelpIntentHandler(AbstractRequestHandler): - """Handler for Help Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_intent_name("AMAZON.HelpIntent")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "You can say hello to me! How can I help?" - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(speak_output) - .response - ) - - -class CancelOrStopIntentHandler(AbstractRequestHandler): - """Single handler for Cancel and Stop Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return (ask_utils.is_intent_name("AMAZON.CancelIntent")(handler_input) or - ask_utils.is_intent_name("AMAZON.StopIntent")(handler_input)) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Goodbye!" - - return ( - handler_input.response_builder - .speak(speak_output) - .response - ) - - -class SessionEndedRequestHandler(AbstractRequestHandler): - """Handler for Session End.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_request_type("SessionEndedRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - - # Any cleanup logic goes here. - - return handler_input.response_builder.response - - -class IntentReflectorHandler(AbstractRequestHandler): - """The intent reflector is used for interaction model testing and debugging. - It will simply repeat the intent the user said. You can create custom handlers - for your intents by defining them above, then also adding them to the request - handler chain below. - """ - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_request_type("IntentRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - intent_name = ask_utils.get_intent_name(handler_input) - speak_output = "You just triggered " + intent_name + "." - - return ( - handler_input.response_builder - .speak(speak_output) - # .ask("add a reprompt if you want to keep the session open for the user to respond") - .response - ) - - -class CatchAllExceptionHandler(AbstractExceptionHandler): - """Generic error handling to capture any syntax or routing errors. If you receive an error - stating the request handler chain is not found, you have not implemented a handler for - the intent being invoked or included it in the skill builder below. - """ - def can_handle(self, handler_input, exception): - # type: (HandlerInput, Exception) -> bool - return True - - def handle(self, handler_input, exception): - # type: (HandlerInput, Exception) -> Response - logger.error(exception, exc_info=True) - - speak_output = "Sorry, I had trouble doing what you asked. Please try again." - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(speak_output) - .response - ) - -# The SkillBuilder object acts as the entry point for your skill, routing all request and response -# payloads to the handlers above. Make sure any new handlers or interceptors you've -# defined are included below. The order matters - they're processed top to bottom. - - -sb = SkillBuilder() - -sb.add_request_handler(LaunchRequestHandler()) -sb.add_request_handler(CaptureBirthdayIntentHandler()) -sb.add_request_handler(HelpIntentHandler()) -sb.add_request_handler(CancelOrStopIntentHandler()) -sb.add_request_handler(SessionEndedRequestHandler()) -sb.add_request_handler(IntentReflectorHandler()) # make sure IntentReflectorHandler is last so it doesn't override your custom intent handlers - -sb.add_exception_handler(CatchAllExceptionHandler()) - -lambda_handler = sb.lambda_handler() \ No newline at end of file diff --git a/module-2/requirements.txt b/module-2/requirements.txt deleted file mode 100644 index d3cbd61..0000000 --- a/module-2/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -boto3==1.9.216 -ask-sdk-core==1.11.0 \ No newline at end of file diff --git a/module-3/README.md b/module-3/README.md deleted file mode 100644 index c13340c..0000000 --- a/module-3/README.md +++ /dev/null @@ -1,298 +0,0 @@ -## Adding memory to your skill -In this section, you will enable the Cake Walk skill to remember the user’s birthday. What’s the point of the skill collecting information if the skill won’t remember it? - -Use the [Alexa developer console](https://developer.amazon.com/alexa/console/ask) for this module. Log in to the console and open the Cake Walk skill. - -## Step 1: Use Amazon S3 to save and read data -Right now, you have the birthday, month, and year within the code. The problem is that the skill forgets these values when the code finishes running. To solve the problem, you are going to save the values to Amazon S3. This way, the skill can read them from session to session. - -The SDK provides a useful mechanism for saving information across sessions: the AttributesManager. With the manager, your read/write code can remain the same, even if you change where you save your data later. - -The backend code for Alexa skills can live on any HTTPS server. Most of the time, Alexa developers write and host their backend code using AWS. While building Cake Walk, you have been writing code in the developer console using an Alexa-hosted skill. That code is running on the AWS Free Tier, which has limitations. Alexa-hosted skills are great for learning to build and even to publish simple skills before you have a large audience. However, if your skill becomes popular, you may want to consider moving your backend code over to your own AWS resources. - -How does this relate to adding memory to your skill? When using an Alexa-hosted skill for your backend code, it will be stored in Amazon S3. If you choose to build your code on your own AWS resources, it may make more sense to use Amazon DynamoDB. Don’t worry if you don’t know the difference between the two. The important thing to know is that the backend code you are writing now will work with Amazon S3, and it will only require minor changes to work with DynamoDB if you decide to migrate to your own AWS resources later. - -Start by using the AttributesManager to save the user’s birthday in Cake Walk. - -**a.** In the developer console, click the **Code** tab. - -**b.** Double-click the**requirements.txt** file in the pane on the left. The file opens in the editor. - -![](http://alexa-github.s3.amazonaws.com/python-requirements-1.png) - -**c.** You are going to add a **requirement**. It’s easiest to put a new dependency at the bottom of the existing list. - -**d.** Copy and paste the following line of code at the end of the file by adding a new line. This will import the dependency for the S3 adapter. - -``` -ask-sdk-s3-persistence-adapter -``` - -Your requirements.text file should now look like: - -``` -boto3==1.9.216 -ask-sdk-core==1.11.0 -ask-sdk-s3-persistence-adapter -``` - -![](http://alexa-github.s3.amazonaws.com/python-requirements-2.png) - -**e.** Click **Save**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/5/chapter5-1e.png) - -**f.** Switch back to the other file by clicking the **lambda_function.py** tab. -The new dependency allows you to use the AttributesManager to save and read user data using Amazon S3. Now, you need to import that dependency to the code. To do this, you need to let the code know the dependency exists. - -**g.** In the **lambda_function.py** file, find the line that begins **import ask_sdk_core.utils as ask_utils**. Create a new line just _below_ it, and copy and paste in the following code: - -```py -import os -from ask_sdk_s3.adapter import S3Adapter -s3_adapter = S3Adapter(bucket_name=os.environ["S3_PERSISTENCE_BUCKET"]) -``` - -**h.** In the **lambda_function.py** file, find the line that begins **from ask_sdk_core.skill_builder import SkillBuilder**. Replace this line with the following code: - -```py -from ask_sdk_core.skill_builder import CustomSkillBuilder -``` - -This will import the S3 Persistence adapter, create your S3 adapter and set you up with a bucket on S3 to store your data. Once done, this section of code should look like: - -```py -import logging -import ask_sdk_core.utils as ask_utils -import os -from ask_sdk_s3.adapter import S3Adapter -s3_adapter = S3Adapter(bucket_name=os.environ["S3_PERSISTENCE_BUCKET"]) - -from ask_sdk_core.skill_builder import CustomSkillBuilder -from ask_sdk_core.dispatch_components import AbstractRequestHandler -from ask_sdk_core.dispatch_components import AbstractExceptionHandler -from ask_sdk_core.handler_input import HandlerInput - -from ask_sdk_model import Response - -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) -``` - -**i.** In the **lambda_function.py** file, scroll all the way down to find the line that begins **sb = SkillBuilder()**. Replace this line with the following code: - -```py -sb = CustomSkillBuilder(persistence_adapter=s3_adapter) -``` - -**j.** Click **Save**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/5/chapter5-1e.png) - -You are now set up to use AttributesManager to save and read data to Amazon S3. Later, if you decide to move your skill’s backend code to your own AWS resources, you will reverse the changes made in this step. - -## Step 2: Save Data -Now you will modify the code to save the user’s birthday. On the **Code** tab, within the **lambda_function.py** file, find the **CaptureBirthdayIntentHandler.** This is the handler you created in the last section. - -**a.** You will use the AttributesManager to save the user’s birthday. Within the **CaptureBirthdayIntentHandler**, in the **handle()** function, find the line that begins **day = slots["day"].value**. Create a new line just _below_ it, and copy and paste in the following code: - -```py -attributes_manager = handler_input.attributes_manager -``` - -The Cake Walk skill code receives the year, month, and day. You need to tell Amazon S3 to save these values. The code tells the AttributesManager what the data is, and the manager sends it to Amazon S3. - -**b.** Within the **CaptureBirthdayIntentHandler**, find the line you just added (it begins **attributes_manager = handler_input.attributes_manager**). Create a new line just _below_ it, and copy and paste in the following code: - -```py -birthday_attributes = { - "year": year, - "month": month, - "day": day - } -``` - -This piece of code is mapping the variables already declared in the code to corresponding variables that will be created in Amazon S3 when the code runs. - -These variables are now declared as _persistent_ (they are local to the function in which they are declared, yet their values are retained in memory between calls to the function). Now you can save the user’s data to them. First, use the **AttributesManager** to set the data to save to Amazon S3. - - -**c.** Within the **CaptureBirthdayIntentHandler**, find the line you just added (it begins **birthday_attributes =**). Create a new line just _below_ it, and copy and paste in the following code: - -```py -attributes_manager.persistent_attributes = birthday_attributes -``` - -**d.** Within the **CaptureBirthdayIntentHandler**, find the line you just added (it begins **attributes_manager.persistent_attributes = birthday_attributes**). Create a new line just _below_ it, and copy and paste in the following code: - -```py -attributes_manager.save_persistent_attributes() -``` - - Your final code should now look like: - -Your **CaptureBirthdayIntentHandler** should now look like: - -```py -class CaptureBirthdayIntentHandler(AbstractRequestHandler): - """Handler for Hello World Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_intent_name("CaptureBirthdayIntent")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - slots = handler_input.request_envelope.request.intent.slots - year = slots["year"].value - month = slots["month"].value - day = slots["day"].value - - attributes_manager = handler_input.attributes_manager - - birthday_attributes = { - "year": year, - "month": month, - "day": day - } - - attributes_manager.persistent_attributes = birthday_attributes - attributes_manager.save_persistent_attributes() - - speak_output = 'Thanks, I will remember that you were born {month} {day} {year}.’.format(month=month, day=day, year=year) - - return ( - handler_input.response_builder - .speak(speak_output) - # .ask("add a reprompt if you want to keep the session open for the user to respond") - .response - ) -``` - -**e.** Click **Save**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/5/chapter5-1e.png) - -## Step 3: Read stored data -Great, now the user’s birthday is saved to Amazon S3. However, now the skill needs to be updated so the next time the user opens Cake Walk, Alexa knows the user’s birthday information is stored and she doesn’t have to ask for it. To do this, you will modify the code to read the data stored in Amazon S3 before asking the user for their birthday. If the data exists, Alexa doesn’t need to ask for it. If the data isn’t there, Alexa will ask for the information. - -> **An Amazon S3 bucket is a public cloud storage resource. A bucket is similar to a file folder for storing objects, which consists of data and descriptive metadata.** - -A new handler is needed to read the stored data. The **canHandle()** and **handle()** functions in the new handler will communicate with Amazon S3. You will add it between the **LaunchRequestHandler** and the **CaptureBirthdayIntentHandler**. - -**a.** Find the line that begins **CaptureBirthdayIntentHandler**. Create a new line just above, and copy and paste in the following code for the new handler: - -```py -class HasBirthdayLaunchRequestHandler(AbstractRequestHandler): - """Handler for launch after they have set their birthday""" - - def can_handle(self, handler_input): - # extract persistent attributes and check if they are all present - attr = handler_input.attributes_manager.persistent_attributes - attributes_are_present = ("year" in attr and "month" in attr and "day" in attr) - - return attributes_are_present and ask_utils.is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - attr = handler_input.attributes_manager.persistent_attributes - year = attr[‘year’] - month = attr[‘month’] # month is a string, and we need to convert it to a month index later - day = attr[‘day’] - - # TODO:: Use the settings API to get current date and then compute how many days until user’s bday - # TODO:: Say happy birthday on the user’s birthday - - speak_output = "Welcome back it looks like there are X more days until your y-th birthday." - handler_input.response_builder.speak(speak_output) - - return handler_input.response_builder.response -``` - -The new handler has the **canHandle()** and **handle()** functions. The **canHandle()** function checks if the user's birthday information is saved in Amazon S3. If it is, the handler lets the SDK know it can do the work (it has the user's birthday information and can do what comes next). The **handle()** function tells Alexa to say, "Welcome back. It looks like there are x more days until your y-th birthday." - -When you changed the name of a handler in a previous section, you also had to change the name in the list of handlers at the bottom of the code. Because you added a new handler, you must add the new handler to this list. - -**b.** Toward the bottom of the code, find the line that begins with **sb.add_request_handler(LaunchRequestHandler())**, Create a new line just _above_ it. Copy and paste in the following code on the new line: - -```py -sb.add_request_handler(HasBirthdayLaunchRequestHandler()) -``` - -That section of code should now look like the following: - -```py -sb.add_request_handler(HasBirthdayLaunchRequestHandler()) -sb.add_request_handler(LaunchRequestHandler()) -sb.add_request_handler(CaptureBirthdayIntentHandler()) -sb.add_request_handler(HelpIntentHandler()) -sb.add_request_handler(CancelOrStopIntentHandler()) -sb.add_request_handler(SessionEndedRequestHandler()) -sb.add_request_handler(IntentReflectorHandler()) # make sure IntentReflectorHandler is last so it doesn’t override your custom intent handlers - -sb.add_exception_handler(CatchAllExceptionHandler()) - -lambda_handler = sb.lambda_handler() -``` - -**c.** Click **Save**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/5/chapter5-1e.png) - -**d.** Click **Deploy**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/5/chapter5-3f.png) - -# How to delete or reset the user’s birthday -When testing, you may need to delete or reset the user’s birthday. There are two ways to do this. - -Use the first method in the simulator on the **Test** tab of the Alexa developer console. Type or say, "Alexa, tell Cake Walk I was born on {month} {day} {year}." - -The second method is to delete the saved information from Amazon S3 by using the following steps: - -**a.** While on the **Code** tab, click **Media storage** on the bottom left-hand corner of the screen. The S3 Management Console opens. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/5/chapter5-reset-a.png) - -**b.** At the top of the page, find the breadcrumbs. Click the breadcrumb that starts **amzn-1-ask-skill**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/5/chapter5-reset-b.png) - -**c.** Click on the check box next to the file(s) that begins with **amzn1.ask.account**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/5/chapter5-reset-c.png) - -**d.** Click **Actions**. - -**e.** Click **Delete**. - -**f.** Click **Delete**. The user’s birthday is deleted. - -## Wrap-up -Here’s a summary of what you did in this section. First, you adjusted the Cake Walk skill to use the AttributesManager to save and read user information to Amazon S3. Then, you added code to the **CaptureBirthdayIntentHandler** to save the user’s birthday. Lastly, you created a new handler (**HasBirthdayLaunchRequestHandler**) so Alexa doesn’t repeatedly ask the same user for their birthday. - -It’s time to test, so click the **Test** tab, then follow the steps below. - -### Step 1: Launch the skill -Say “Open Cake Walk”. - -Alexa should respond, “Hello! This is Cake walk. When is your birthday?” - -### Tell Alexa your birthday -Feel free to try giving Alexa partial information and ensure she asks for and collects the missing information. - -Once she has your birth month, day, and year, Alexa should respond, “Thanks, I’ll remember that your birthday is {month} {day} {year}.” - -The session ends. At this point, without the code you added in this section, the next time you invoke the skill, Alexa would ask for your birthday again. Now, Alexa stores this information. - -### Launch the skill a second time -Say “Open Cake Walk”. - -Alexa should respond, “Welcome back. It looks like there are X more days until your y-th birthday.” - -You probably noticed that, with the way the code works right now, Alexa is saying “X” and “Y T H”. Don’t worry. In the next section, you will work on the code to calculate how many days until the user’s next birthday so Alexa can respond with that information. - -## Code -If your skill isn’t working or you’re getting some kind of syntax error, download the code sample in Python from the link below. Then, go to the Code tab in the Alexa developer console and copy and paste the code into the **lambda_function.py** file. Be sure to save and deploy the code before testing it. - - [Python Github Code Sample, Module 3: Add Memory to Your Skill](https://github.com/alexa/skill-sample-python-first-skill/tree/master/module-3) - -[Continue to module 4](https://github.com/alexa/skill-sample-python-first-skill/tree/master/module-4) \ No newline at end of file diff --git a/module-3/en-US.json b/module-3/en-US.json deleted file mode 100644 index 5a5675c..0000000 --- a/module-3/en-US.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "interactionModel": { - "languageModel": { - "invocationName": "cake walk", - "intents": [ - { - "name": "AMAZON.CancelIntent", - "samples": [] - }, - { - "name": "AMAZON.HelpIntent", - "samples": [] - }, - { - "name": "AMAZON.StopIntent", - "samples": [] - }, - { - "name": "AMAZON.NavigateHomeIntent", - "samples": [] - }, - { - "name": "CaptureBirthdayIntent", - "slots": [ - { - "name": "month", - "type": "AMAZON.Month" - }, - { - "name": "day", - "type": "AMAZON.Ordinal" - }, - { - "name": "year", - "type": "AMAZON.FOUR_DIGIT_NUMBER" - } - ], - "samples": [ - "I was born in {month} {year}", - "I was born on {month} {day}", - "{month} {year}", - "{month} {day} {year}", - "{month} {day}", - "I was born on {month} {day} {year} " - ] - } - ], - "types": [] - }, - "dialog": { - "intents": [ - { - "name": "CaptureBirthdayIntent", - "confirmationRequired": false, - "prompts": {}, - "slots": [ - { - "name": "month", - "type": "AMAZON.Month", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.1323207333291.110752114450" - } - }, - { - "name": "day", - "type": "AMAZON.Ordinal", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.1323207333291.563366041005" - } - }, - { - "name": "year", - "type": "AMAZON.FOUR_DIGIT_NUMBER", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.1323207333291.854898796228" - } - } - ] - } - ], - "delegationStrategy": "ALWAYS" - }, - "prompts": [ - { - "id": "Elicit.Slot.1323207333291.110752114450", - "variations": [ - { - "type": "PlainText", - "value": "What month were you born in?" - } - ] - }, - { - "id": "Elicit.Slot.1323207333291.563366041005", - "variations": [ - { - "type": "PlainText", - "value": "What day were you born on?" - } - ] - }, - { - "id": "Elicit.Slot.1323207333291.854898796228", - "variations": [ - { - "type": "PlainText", - "value": "What year were you born in?" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/module-3/lambda_function.py b/module-3/lambda_function.py deleted file mode 100644 index 6350c9d..0000000 --- a/module-3/lambda_function.py +++ /dev/null @@ -1,213 +0,0 @@ -# -*- coding: utf-8 -*- - -# This sample demonstrates handling intents from an Alexa skill using the Alexa Skills Kit SDK for Python. -# Please visit https://alexa.design/cookbook for additional examples on implementing slots, dialog management, -# session persistence, api calls, and more. -# This sample is built using the handler classes approach in skill builder. -import logging -import ask_sdk_core.utils as ask_utils -import os -from ask_sdk_s3.adapter import S3Adapter -s3_adapter = S3Adapter(bucket_name=os.environ["S3_PERSISTENCE_BUCKET"]) - -from ask_sdk_core.skill_builder import CustomSkillBuilder -from ask_sdk_core.dispatch_components import AbstractRequestHandler -from ask_sdk_core.dispatch_components import AbstractExceptionHandler -from ask_sdk_core.handler_input import HandlerInput - -from ask_sdk_model import Response - -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) - - -class LaunchRequestHandler(AbstractRequestHandler): - """Handler for Skill Launch.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - - return ask_utils.is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Hello! This is Cake walk. What is your birthday?" - reprompt_text = "I was born Nov. 6th, 2015. When are you born?" - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(reprompt_text) - .response - ) - -class HasBirthdayLaunchRequestHandler(AbstractRequestHandler): - """Handler for launch after they have set their birthday""" - - def can_handle(self, handler_input): - # extract persistent attributes and check if they are all present - attr = handler_input.attributes_manager.persistent_attributes - attributes_are_present = ("year" in attr and "month" in attr and "day" in attr) - - return attributes_are_present and ask_utils.is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - attr = handler_input.attributes_manager.persistent_attributes - year = attr['year'] - month = attr['month'] # month is a string, and we need to convert it to a month index later - day = attr['day'] - - # TODO:: Use the settings API to get current date and then compute how many days until user's bday - # TODO:: Say happy birthday on the user's birthday - - speak_output = "Welcome back it looks like there are X more days until your y-th birthday." - handler_input.response_builder.speak(speak_output) - - return handler_input.response_builder.response - -class CaptureBirthdayIntentHandler(AbstractRequestHandler): - """Handler for Hello World Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_intent_name("CaptureBirthdayIntent")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - slots = handler_input.request_envelope.request.intent.slots - year = slots["year"].value - month = slots["month"].value - day = slots["day"].value - - attributes_manager = handler_input.attributes_manager - - birthday_attributes = { - "year": year, - "month": month, - "day": day - } - - attributes_manager.persistent_attributes = birthday_attributes - attributes_manager.save_persistent_attributes() - - speak_output = 'Thanks, I will remember that you were born {month} {day} {year}.'.format(month=month, day=day, year=year) - - return ( - handler_input.response_builder - .speak(speak_output) - # .ask("add a reprompt if you want to keep the session open for the user to respond") - .response - ) - - -class HelpIntentHandler(AbstractRequestHandler): - """Handler for Help Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_intent_name("AMAZON.HelpIntent")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "You can say hello to me! How can I help?" - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(speak_output) - .response - ) - - -class CancelOrStopIntentHandler(AbstractRequestHandler): - """Single handler for Cancel and Stop Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return (ask_utils.is_intent_name("AMAZON.CancelIntent")(handler_input) or - ask_utils.is_intent_name("AMAZON.StopIntent")(handler_input)) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Goodbye!" - - return ( - handler_input.response_builder - .speak(speak_output) - .response - ) - - -class SessionEndedRequestHandler(AbstractRequestHandler): - """Handler for Session End.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_request_type("SessionEndedRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - - # Any cleanup logic goes here. - - return handler_input.response_builder.response - - -class IntentReflectorHandler(AbstractRequestHandler): - """The intent reflector is used for interaction model testing and debugging. - It will simply repeat the intent the user said. You can create custom handlers - for your intents by defining them above, then also adding them to the request - handler chain below. - """ - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_request_type("IntentRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - intent_name = ask_utils.get_intent_name(handler_input) - speak_output = "You just triggered " + intent_name + "." - - return ( - handler_input.response_builder - .speak(speak_output) - # .ask("add a reprompt if you want to keep the session open for the user to respond") - .response - ) - - -class CatchAllExceptionHandler(AbstractExceptionHandler): - """Generic error handling to capture any syntax or routing errors. If you receive an error - stating the request handler chain is not found, you have not implemented a handler for - the intent being invoked or included it in the skill builder below. - """ - def can_handle(self, handler_input, exception): - # type: (HandlerInput, Exception) -> bool - return True - - def handle(self, handler_input, exception): - # type: (HandlerInput, Exception) -> Response - logger.error(exception, exc_info=True) - - speak_output = "Sorry, I had trouble doing what you asked. Please try again." - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(speak_output) - .response - ) - -# The SkillBuilder object acts as the entry point for your skill, routing all request and response -# payloads to the handlers above. Make sure any new handlers or interceptors you've -# defined are included below. The order matters - they're processed top to bottom. - - -sb = CustomSkillBuilder(persistence_adapter=s3_adapter) - -sb.add_request_handler(HasBirthdayLaunchRequestHandler()) -sb.add_request_handler(LaunchRequestHandler()) -sb.add_request_handler(CaptureBirthdayIntentHandler()) -sb.add_request_handler(HelpIntentHandler()) -sb.add_request_handler(CancelOrStopIntentHandler()) -sb.add_request_handler(SessionEndedRequestHandler()) -sb.add_request_handler(IntentReflectorHandler()) # make sure IntentReflectorHandler is last so it doesn't override your custom intent handlers - -sb.add_exception_handler(CatchAllExceptionHandler()) - -lambda_handler = sb.lambda_handler() \ No newline at end of file diff --git a/module-3/requirements.txt b/module-3/requirements.txt deleted file mode 100644 index 9101c5a..0000000 --- a/module-3/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -boto3==1.9.216 -ask-sdk-core==1.11.0 -ask-sdk-s3-persistence-adapter \ No newline at end of file diff --git a/module-4/README.md b/module-4/README.md deleted file mode 100644 index 30146b4..0000000 --- a/module-4/README.md +++ /dev/null @@ -1,458 +0,0 @@ -## Using the Alexa Settings API -In this section, you will enable the Cake Walk skill to calculate the number of days until the user’s next birthday. -Use the [Alexa developer console](https://developer.amazon.com/alexa/console/ask) for this module. Log in to the console and open the Cake Walk skill. - -To calculate the number of days until the user’s next birthday accurately, we need additional information, like current date, and user’s time zone. Luckily, you can use the Alexa Settings API to get this information. To do that, we need to pass the following information to the Alexa Settings API: - -1. Device ID -2. URL for the Alexa Settings API (API Endpoint) -3. Authorization token (Access Token) -4. Import supporting libraries (We will do this in Step 3) - -We will retrieve items 1-3 in Step 1 below, and tackle the import of libraries in in Step 3. - -## Step 1: Get Device ID, API endpoint, and Authorization Token for Alexa Settings API -To query the Alexa Settings API, you need to provide the device ID for the Alexa-enabled device that prompted the Cake Walk skill to open. - -The device ID is provided in every request that comes to the skill code. We will traverse the request object to get the device ID using the **requestEnvelope:** - -``` -handlerInput.requestEnvelope.context.System.device.deviceId -``` - -> **Alternatively, the SDK provides a utility function that simplifies getting the device ID. Feel free to use it instead:** -> -> **device_id = ask_sdk_core.utils.request_util.get_device_id(handler_input)** -> -> *For additional information, refer to [ASK SDK Python Utilities. ](https://alexa-skills-kit-python-sdk.readthedocs.io/en/latest/api/core.html#module-ask_sdk_core.utils.predicate)* - -**a.** In the developer console, click the **Code** tab, then click on the file **requirements.txt** - -**b.** Add a new line at the end of this file, and type the following line of code - - -``` -pytz -``` - -The **pytz** library allows accurate and cross platform timezone calculations, and will help us figure out the user's timezone accurately. - -Your **requirements.txt** file should now look like: - -``` -boto3==1.9.216 -ask-sdk-core==1.11.0 -ask-sdk-s3-persistence-adapter -pytz -``` - -**c.** In the developer console, click the **Code** tab, then click on the file **lambda_function.py** - -**d.** Find the **HasBirthdayLaunchRequestHandler** and then the **handle()** function within the handler. Create a new line just below the line that begins **day = attr['day']**. Copy and paste in the following code: - -```py - # get device id - sys_object = handler_input.request_envelope.context.system - device_id = sys_object.device.device_id - - # get Alexa Settings API information - api_endpoint = sys_object.api_endpoint - api_access_token = sys_object.api_access_token -``` - -Your **HasBirthdayLaunchRequestHandler** should now look like: - -```py -class HasBirthdayLaunchRequestHandler(AbstractRequestHandler): - “””Handler for launch after they have set their birthday””” - - def can_handle(self, handler_input): - # extract persistent attributes and check if they are all present - attr = handler_input.attributes_manager.persistent_attributes - attributes_are_present = (“year” in attr and “month” in attr and “day” in attr) - - return attributes_are_present and ask_utils.is_request_type(“LaunchRequest”)(handler_input) - - def handle(self, handler_input): - attr = handler_input.attributes_manager.persistent_attributes - year = attr['year'] - month = attr['month'] # month is a string, and we need to convert it to a month index later - day = attr['day'] - - # get device id - sys_object = handler_input.request_envelope.context.system - device_id = sys_object.device.device_id - - # get systems api information - api_endpoint = sys_object.api_endpoint - api_access_token = sys_object.api_access_token - - # TODO:: Use the settings API to get current date and then compute how many days until user’s bday - # TODO:: Say happy birthday on the user’s birthday - - speak_output = “Welcome back it looks like there are X more days until your y-th birthday.” - handler_input.response_builder.speak(speak_output) - - return handler_input.response_builder.response -``` - -Now that we have the Device ID, API endpoint, and the access token, we are ready to call the Alexa Settings API to get the user time zone. - -## Step 2: Using the Alexa Settings API to retrieve the user time zone -There’s a chance that an error can happen when the code makes a call to the Alexa Settings API. For example, if the API takes too long to respond, the code could time out. Therefore, you need to wrap the code in a **try_catch_**_ block. A _**_try_catch** block is a way to ensure the skill code doesn’t crash if it encounters an error. You will wrap the code that _could_ crash in a **try** block. If the code within that block crashes, the **catch** block will run to handle errors. - -You want to know the time zone for the user’s Alexa-enabled device. In the **try** block, use **serviceClientFactory** to get the settings service client—upsServiceClient—and pass the device ID to the **getSystemTimeZone** function to get the time zone. The **catch** block will log an error message using **console.log** and return an error message response that Alexa will say to the user. - -**a.** Within the **HasBirthdayLaunchRequestHandler**, find the line that begins with **api_access_token = sys_object.api_access_token** (you just added this in the previous step). Create a new line just below this, and copy/paste the following code: - -```py - # construct systems api timezone url - url = '{api_endpoint}/v2/devices/{device_id}/settings/System.timeZone'.format(api_endpoint=api_endpoint, device_id=device_id) - headers = {'Authorization': 'Bearer ' + api_access_token} - - userTimeZone = "" - try: - r = requests.get(url, headers=headers) - res = r.json() - logger.info("Device API result: {}".format(str(res))) - userTimeZone = res - except Exception: - handler_input.response_builder.speak("There was a problem connecting to the service") - return handler_input.response_builder.response -``` - -Your **HasBirthdayLaunchRequestHandler** should now look like: - -```py -class HasBirthdayLaunchRequestHandler(AbstractRequestHandler): - “””Handler for launch after they have set their birthday””” - - def can_handle(self, handler_input): - # extract persistent attributes and check if they are all present - attr = handler_input.attributes_manager.persistent_attributes - attributes_are_present = (“year” in attr and “month” in attr and “day” in attr) - - return attributes_are_present and ask_utils.is_request_type(“LaunchRequest”)(handler_input) - - def handle(self, handler_input): - attr = handler_input.attributes_manager.persistent_attributes - year = attr['year'] - month = attr['month'] # month is a string, and we need to convert it to a month index later - day = attr['day'] - - # get device id - sys_object = handler_input.request_envelope.context.system - device_id = sys_object.device.device_id - - # get Alexa Settings API information - api_endpoint = sys_object.api_endpoint - api_access_token = sys_object.api_access_token - - # construct systems api timezone url - url = '{api_endpoint}/v2/devices/{device_id}/settings/System.timeZone'.format(api_endpoint=api_endpoint, device_id=device_id) - headers = {'Authorization': 'Bearer ' + api_access_token} - - userTimeZone = “” - try: - r = requests.get(url, headers=headers) - res = r.json() - logger.info(“Device API result: {}”.format(str(res))) - userTimeZone = res - except Exception: - handler_input.response_builder.speak(“There was a problem connecting to the service”) - return handler_input.response_builder.response - - # TODO:: Use the settings API to get current date and then compute how many days until user's bday - # TODO:: Say happy birthday on the user's birthday - - speak_output = "Welcome back it looks like there are X more days until your y-th birthday." - handler_input.response_builder.speak(speak_output) - - return handler_input.response_builder.response -``` - -**b.** Click **Save**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/6/chapter6-1d.png) - - -## Step 3: Retrieve the current date -The code will use the time zone to get the current date. You can use the **currentDateTime** function to return the correct date according to the time zone captured from the user's device. You will add this function below the **try/catch** block added in a previous step. - -**a.** In the **lambda_function.py** file, find the line that begins **import ask_sdk_core.utils as ask_utils**. Create a new line just _below_ it, and copy and paste in the following code: - -```py -import os -import requests -import calendar -from datetime import datetime -from pytz import timezone -``` - -We will need these libraries to work with date and timezones. Once done, this section of code should look like: - -```py -import logging -import ask_sdk_core.utils as ask_utils -import os -import requests -import calendar -from datetime import datetime -from pytz import timezone -from ask_sdk_s3.adapter import S3Adapter -s3_adapter = S3Adapter(bucket_name=os.environ[“S3_PERSISTENCE_BUCKET”]) - -from ask_sdk_core.skill_builder import CustomSkillBuilder -from ask_sdk_core.dispatch_components import AbstractRequestHandler -from ask_sdk_core.dispatch_components import AbstractExceptionHandler -from ask_sdk_core.handler_input import HandlerInput - -from ask_sdk_model import Response - -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) -``` - -**b.** Within the **HasBirthdayLaunchRequestHandler**, find the comment that begins with **# TODO:: Use the settings API to get current date and then compute how many days until user’s bday**. Replace this line with the following code: - -```py - # getting the current date with the time - now_time = datetime.now(timezone(userTimeZone)) -``` - -**c.** Click **Save**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/6/chapter6-1d.png) - -## Step 4: Extract the month, day, and year -You would like the Cake Walk skill to wish the user happy birthday at midnight in their time zone. This could be a problem because **currentDateTime** provides the date and time to the second. The Cake Walk skill does not ask the user to provide their birthday down to the second. Therefore, the code needs to extract just the month, day, and year from **currentDateTime**, and then re-create the date without the seconds included. - -**a.** Within the **HasBirthdayLaunchRequestHandler**, in the **handle()** function, create a new line just _below_ the code you just added (**now_time =**). Copy and paste in the following code: - -```py - # Removing the time from the date because it affects our difference calculation - now_date = datetime(now_time.year, now_time.month, now_time.day) - current_year = now_time.year -``` - -Your **HasBirthdayLaunchRequestHandler** should now look like: - -```py -class HasBirthdayLaunchRequestHandler(AbstractRequestHandler): - “””Handler for launch after they have set their birthday””” - - def can_handle(self, handler_input): - # extract persistent attributes and check if they are all present - attr = handler_input.attributes_manager.persistent_attributes - attributes_are_present = (“year” in attr and “month” in attr and “day” in attr) - - return attributes_are_present and ask_utils.is_request_type(“LaunchRequest”)(handler_input) - - def handle(self, handler_input): - attr = handler_input.attributes_manager.persistent_attributes - year = attr['year'] - month = attr['month'] # month is a string, and we need to convert it to a month index later - day = attr['day'] - - # get device id - sys_object = handler_input.request_envelope.context.system - device_id = sys_object.device.device_id - - # get Alexa Settings API information - api_endpoint = sys_object.api_endpoint - api_access_token = sys_object.api_access_token - - # construct systems api timezone url - url = '{api_endpoint}/v2/devices/{device_id}/settings/System.timeZone'.format(api_endpoint=api_endpoint, device_id=device_id) - headers = {'Authorization': 'Bearer ' + api_access_token} - - userTimeZone = “” - try: - r = requests.get(url, headers=headers) - res = r.json() - logger.info(“Device API result: {}”.format(str(res))) - userTimeZone = res - except Exception: - handler_input.response_builder.speak(“There was a problem connecting to the service”) - return handler_input.response_builder.response - - # getting the current date with the time - now_time = datetime.now(timezone(userTimeZone)) - - # Removing the time from the date because it affects our difference calculation - now_date = datetime(now_time.year, now_time.month, now_time.day) - current_year = now_time.year - - # TODO:: Say happy birthday on the user’s birthday - - speak_output = "Welcome back it looks like there are X more days until your y-th birthday." - handler_input.response_builder.speak(speak_output) - - return handler_input.response_builder.response -``` - -**b.** Click **Save**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/6/chapter6-1d.png) - -## Step 5: Determine the user's next birthday -Now the code needs to determine the user's next birthday. First, the code will combine the year and month of their birthday with the current year. Second, the code will determine if the user's birthday has already passed this calendar year. If it has, the code will add a year to the value of their next birthday. - -**a.** Within the **HasBirthdayLaunchRequestHandler**, in the **handle()** function, create a new line just _below_ the lines you just added (**now_date** and **current_year**). Copy and paste in the following code: - -```py -# getting the next birthday -month_as_index = list(calendar.month_abbr).index(month[:3]) -next_birthday = datetime(current_year, month_as_index, day) -``` - -**b.** Within the **HasBirthdayLaunchRequestHandler**, find the following code - -```py -year = attr['year'] -month = attr['month'] # month is a string, and we need to convert it to a month index later -day = attr['day'] -``` - -Replace above lines of code with the ones below: - -```py -year = int(attr['year']) -month = attr['month'] # month is a string, and we need to convert it to a month index later -day = int(attr['day']) -``` - -**c.** Click **Save**. - -## Step 6: Compute difference between current date and user's next birthday -Now that the code has the current date and the date of the user's next birthday, it's time to compute the difference. First, the code needs to convert each date into Unix epoch time (the number of seconds elapsed since 00:00:00 January 1, 1970, Coordinated Universal Time (UTC), minus leap seconds). -Second, the code will calculate the difference in milliseconds between the two dates and take the absolute value of the difference. -Finally, the code will convert the difference in milliseconds back to days. One day in milliseconds = 24 hours X 60 minutes X 60 seconds X 1000 milliseconds. -The following is how this would appear in the code—but don’t add it to the code yet: - -```py -diff_days = abs((now_date - next_birthday).days) -``` - - The code only needs to calculate the difference when it’s not the users birthday. Therefore, you will wrap this code in an **if** statement that checks if the current date is the user’s birthday. - -If it is the user’s birthday, you want the skill to wish them happy birthday. You can combine the code for this with the **if** statement so when it is not the user’s birthday, the **speakOutput** is set to tell the user how many days until their next birthday. - -**a.** Within the **HasBirthdayLaunchRequestHandler**, in the **handle()** function, find the line that begins with **speak_output = "Welcome back it looks like there are X more days until your y-th birthday."**. Replace that line with the following code: - -```py - # check if we need to adjust bday by one year - if now_date > next_birthday: - next_birthday = datetime( - current_year + 1, - month_as_index, - day - ) - current_year += 1 - # setting the default speak_output to Happy xth Birthday!! - # Alexa will automatically correct the ordinal for you. - # no need to worry about when to use st, th, rd - speak_output = “Happy {}th birthday!”.format(str(current_year - year)) - if now_date != next_birthday: - diff_days = abs((now_date - next_birthday).days) - speak_output = “Welcome back. It looks like there are \ - {days} days until your {birthday_num}th\ - birthday”.format( - days=diff_days, - birthday_num=(current_year-year) - ) -``` - -**b.** Within the **HasBirthdayLaunchRequestHandler**, remove the comment that begins with **# TODO:: Say happy birthday on the user’s birthday**. We’ve just added this functionality. - -Your **HasBirthdayLaunchRequestHandler** should now look like: - -```py -class HasBirthdayLaunchRequestHandler(AbstractRequestHandler): - """Handler for launch after they have set their birthday""" - - def can_handle(self, handler_input): - # extract persistent attributes and check if they are all present - attr = handler_input.attributes_manager.persistent_attributes - attributes_are_present = ("year" in attr and "month" in attr and "day" in attr) - - return attributes_are_present and ask_utils.is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - attr = handler_input.attributes_manager.persistent_attributes - year = int(attr['year']) - month = attr['month'] # month is a string, and we need to convert it to a month index later - day = int(attr['day']) - - # get device id - sys_object = handler_input.request_envelope.context.system - device_id = sys_object.device.device_id - - # get Alexa Settings API information - api_endpoint = sys_object.api_endpoint - api_access_token = sys_object.api_access_token - - # construct systems api timezone url - url = '{api_endpoint}/v2/devices/{device_id}/settings/System.timeZone'.format(api_endpoint=api_endpoint, device_id=device_id) - headers = {'Authorization': 'Bearer ' + api_access_token} - - userTimeZone = "" - try: - r = requests.get(url, headers=headers) - res = r.json() - logger.info("Device API result: {}".format(str(res))) - userTimeZone = res - except Exception: - handler_input.response_builder.speak("There was a problem connecting to the service") - return handler_input.response_builder.response - - # getting the current date with the time - now_time = datetime.now(timezone(userTimeZone)) - - # Removing the time from the date because it affects our difference calculation - now_date = datetime(now_time.year, now_time.month, now_time.day) - current_year = now_time.year - - # getting the next birthday - month_as_index = list(calendar.month_abbr).index(month[:3]) - next_birthday = datetime(current_year, month_as_index, day) - - # check if we need to adjust bday by one year - if now_date > next_birthday: - next_birthday = datetime( - current_year + 1, - month_as_index, - day - ) - current_year += 1 - # setting the default speak_output to Happy xth Birthday!! - # alexa will automatically correct the ordinal for you. - # no need to worry about when to use st, th, rd - speak_output = "Happy {}th birthday!".format(str(current_year - year)) - if now_date != next_birthday: - diff_days = abs((now_date - next_birthday).days) - speak_output = "Welcome back. It looks like there are \ - {days} days until your {birthday_num}th\ - birthday".format( - days=diff_days, - birthday_num=(current_year-year) - ) - - handler_input.response_builder.speak(speak_output) - - return handler_input.response_builder.response -``` - -**c.** Click **Save**. - -![](https://d3ogm7ac91k97u.cloudfront.net/content/dam/alexa/alexa-skills-kit/courses/cake-walk/6/chapter6-1d.png) - -## Step 7: Save, deploy, and test - -**a.** Click **Deploy** to build the skill. - -**b.** Go to the **Test** tab, open the skill, and see if Alexa responds by telling you how many days until your next birthday. If she does, congratulations! - -## Code -If your skill isn’t working or you’re getting some kind of syntax error, download the code sample in Python from the link below. Then, go to the Code tab in the Alexa developer console and copy and paste the code into the **lambda_function.py** file. Be sure to save and deploy the code before testing it. - - [Python Github Code Sample, Module 4: Using the Alexa Setting API](https://github.com/alexa/skill-sample-python-first-skill/tree/master/module-4) \ No newline at end of file diff --git a/module-4/en-US.json b/module-4/en-US.json deleted file mode 100644 index 5a5675c..0000000 --- a/module-4/en-US.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "interactionModel": { - "languageModel": { - "invocationName": "cake walk", - "intents": [ - { - "name": "AMAZON.CancelIntent", - "samples": [] - }, - { - "name": "AMAZON.HelpIntent", - "samples": [] - }, - { - "name": "AMAZON.StopIntent", - "samples": [] - }, - { - "name": "AMAZON.NavigateHomeIntent", - "samples": [] - }, - { - "name": "CaptureBirthdayIntent", - "slots": [ - { - "name": "month", - "type": "AMAZON.Month" - }, - { - "name": "day", - "type": "AMAZON.Ordinal" - }, - { - "name": "year", - "type": "AMAZON.FOUR_DIGIT_NUMBER" - } - ], - "samples": [ - "I was born in {month} {year}", - "I was born on {month} {day}", - "{month} {year}", - "{month} {day} {year}", - "{month} {day}", - "I was born on {month} {day} {year} " - ] - } - ], - "types": [] - }, - "dialog": { - "intents": [ - { - "name": "CaptureBirthdayIntent", - "confirmationRequired": false, - "prompts": {}, - "slots": [ - { - "name": "month", - "type": "AMAZON.Month", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.1323207333291.110752114450" - } - }, - { - "name": "day", - "type": "AMAZON.Ordinal", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.1323207333291.563366041005" - } - }, - { - "name": "year", - "type": "AMAZON.FOUR_DIGIT_NUMBER", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.1323207333291.854898796228" - } - } - ] - } - ], - "delegationStrategy": "ALWAYS" - }, - "prompts": [ - { - "id": "Elicit.Slot.1323207333291.110752114450", - "variations": [ - { - "type": "PlainText", - "value": "What month were you born in?" - } - ] - }, - { - "id": "Elicit.Slot.1323207333291.563366041005", - "variations": [ - { - "type": "PlainText", - "value": "What day were you born on?" - } - ] - }, - { - "id": "Elicit.Slot.1323207333291.854898796228", - "variations": [ - { - "type": "PlainText", - "value": "What year were you born in?" - } - ] - } - ] - } -} \ No newline at end of file diff --git a/module-4/lambda_function.py b/module-4/lambda_function.py deleted file mode 100644 index d021057..0000000 --- a/module-4/lambda_function.py +++ /dev/null @@ -1,267 +0,0 @@ -# -*- coding: utf-8 -*- - -# This sample demonstrates handling intents from an Alexa skill using the Alexa Skills Kit SDK for Python. -# Please visit https://alexa.design/cookbook for additional examples on implementing slots, dialog management, -# session persistence, api calls, and more. -# This sample is built using the handler classes approach in skill builder. -import logging -import ask_sdk_core.utils as ask_utils -import os -import requests -import calendar -from datetime import datetime -from pytz import timezone -from ask_sdk_s3.adapter import S3Adapter -s3_adapter = S3Adapter(bucket_name=os.environ["S3_PERSISTENCE_BUCKET"]) - -from ask_sdk_core.skill_builder import CustomSkillBuilder -from ask_sdk_core.dispatch_components import AbstractRequestHandler -from ask_sdk_core.dispatch_components import AbstractExceptionHandler -from ask_sdk_core.handler_input import HandlerInput - -from ask_sdk_model import Response - -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) - - -class LaunchRequestHandler(AbstractRequestHandler): - """Handler for Skill Launch.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - - return ask_utils.is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Hello! This is Cake walk. What is your birthday?" - reprompt_text = "I was born Nov. 6th, 2015. When are you born?" - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(reprompt_text) - .response - ) - -class HasBirthdayLaunchRequestHandler(AbstractRequestHandler): - """Handler for launch after they have set their birthday""" - - def can_handle(self, handler_input): - # extract persistent attributes and check if they are all present - attr = handler_input.attributes_manager.persistent_attributes - attributes_are_present = ("year" in attr and "month" in attr and "day" in attr) - - return attributes_are_present and ask_utils.is_request_type("LaunchRequest")(handler_input) - - def handle(self, handler_input): - attr = handler_input.attributes_manager.persistent_attributes - year = int(attr['year']) - month = attr['month'] # month is a string, and we need to convert it to a month index later - day = int(attr['day']) - - # get device id - sys_object = handler_input.request_envelope.context.system - device_id = sys_object.device.device_id - - # get Alexa Settings API information - api_endpoint = sys_object.api_endpoint - api_access_token = sys_object.api_access_token - - # construct systems api timezone url - url = '{api_endpoint}/v2/devices/{device_id}/settings/System.timeZone'.format(api_endpoint=api_endpoint, device_id=device_id) - headers = {'Authorization': 'Bearer ' + api_access_token} - - userTimeZone = "" - try: - r = requests.get(url, headers=headers) - res = r.json() - logger.info("Device API result: {}".format(str(res))) - userTimeZone = res - except Exception: - handler_input.response_builder.speak("There was a problem connecting to the service") - return handler_input.response_builder.response - - # getting the current date with the time - now_time = datetime.now(timezone(userTimeZone)) - - # Removing the time from the date because it affects our difference calculation - now_date = datetime(now_time.year, now_time.month, now_time.day) - current_year = now_time.year - - # getting the next birthday - month_as_index = list(calendar.month_abbr).index(month[:3]) - next_birthday = datetime(current_year, month_as_index, day) - - # check if we need to adjust bday by one year - if now_date > next_birthday: - next_birthday = datetime( - current_year + 1, - month_as_index, - day - ) - current_year += 1 - # setting the default speak_output to Happy xth Birthday!! - # alexa will automatically correct the ordinal for you. - # no need to worry about when to use st, th, rd - speak_output = "Happy {}th birthday!".format(str(current_year - year)) - if now_date != next_birthday: - diff_days = abs((now_date - next_birthday).days) - speak_output = "Welcome back. It looks like there are \ - {days} days until your {birthday_num}th\ - birthday".format( - days=diff_days, - birthday_num=(current_year-year) - ) - - handler_input.response_builder.speak(speak_output) - - return handler_input.response_builder.response - -class CaptureBirthdayIntentHandler(AbstractRequestHandler): - """Handler for Hello World Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_intent_name("CaptureBirthdayIntent")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - slots = handler_input.request_envelope.request.intent.slots - year = slots["year"].value - month = slots["month"].value - day = slots["day"].value - - attributes_manager = handler_input.attributes_manager - - birthday_attributes = { - "year": year, - "month": month, - "day": day - } - - attributes_manager.persistent_attributes = birthday_attributes - attributes_manager.save_persistent_attributes() - - speak_output = 'Thanks, I will remember that you were born {month} {day} {year}.'.format(month=month, day=day, year=year) - - return ( - handler_input.response_builder - .speak(speak_output) - # .ask("add a reprompt if you want to keep the session open for the user to respond") - .response - ) - - -class HelpIntentHandler(AbstractRequestHandler): - """Handler for Help Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_intent_name("AMAZON.HelpIntent")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "You can say hello to me! How can I help?" - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(speak_output) - .response - ) - - -class CancelOrStopIntentHandler(AbstractRequestHandler): - """Single handler for Cancel and Stop Intent.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return (ask_utils.is_intent_name("AMAZON.CancelIntent")(handler_input) or - ask_utils.is_intent_name("AMAZON.StopIntent")(handler_input)) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - speak_output = "Goodbye!" - - return ( - handler_input.response_builder - .speak(speak_output) - .response - ) - - -class SessionEndedRequestHandler(AbstractRequestHandler): - """Handler for Session End.""" - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_request_type("SessionEndedRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - - # Any cleanup logic goes here. - - return handler_input.response_builder.response - - -class IntentReflectorHandler(AbstractRequestHandler): - """The intent reflector is used for interaction model testing and debugging. - It will simply repeat the intent the user said. You can create custom handlers - for your intents by defining them above, then also adding them to the request - handler chain below. - """ - def can_handle(self, handler_input): - # type: (HandlerInput) -> bool - return ask_utils.is_request_type("IntentRequest")(handler_input) - - def handle(self, handler_input): - # type: (HandlerInput) -> Response - intent_name = ask_utils.get_intent_name(handler_input) - speak_output = "You just triggered " + intent_name + "." - - return ( - handler_input.response_builder - .speak(speak_output) - # .ask("add a reprompt if you want to keep the session open for the user to respond") - .response - ) - - -class CatchAllExceptionHandler(AbstractExceptionHandler): - """Generic error handling to capture any syntax or routing errors. If you receive an error - stating the request handler chain is not found, you have not implemented a handler for - the intent being invoked or included it in the skill builder below. - """ - def can_handle(self, handler_input, exception): - # type: (HandlerInput, Exception) -> bool - return True - - def handle(self, handler_input, exception): - # type: (HandlerInput, Exception) -> Response - logger.error(exception, exc_info=True) - - speak_output = "Sorry, I had trouble doing what you asked. Please try again." - - return ( - handler_input.response_builder - .speak(speak_output) - .ask(speak_output) - .response - ) - -# The SkillBuilder object acts as the entry point for your skill, routing all request and response -# payloads to the handlers above. Make sure any new handlers or interceptors you've -# defined are included below. The order matters - they're processed top to bottom. - - -sb = CustomSkillBuilder(persistence_adapter=s3_adapter) - -sb.add_request_handler(HasBirthdayLaunchRequestHandler()) -sb.add_request_handler(LaunchRequestHandler()) -sb.add_request_handler(CaptureBirthdayIntentHandler()) -sb.add_request_handler(HelpIntentHandler()) -sb.add_request_handler(CancelOrStopIntentHandler()) -sb.add_request_handler(SessionEndedRequestHandler()) -sb.add_request_handler(IntentReflectorHandler()) # make sure IntentReflectorHandler is last so it doesn't override your custom intent handlers - -sb.add_exception_handler(CatchAllExceptionHandler()) - -lambda_handler = sb.lambda_handler() \ No newline at end of file diff --git a/module-4/requirements.txt b/module-4/requirements.txt deleted file mode 100644 index 7773534..0000000 --- a/module-4/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -boto3==1.9.216 -ask-sdk-core==1.11.0 -ask-sdk-s3-persistence-adapter -pytz \ No newline at end of file diff --git a/i18n/skill.json b/skill.json similarity index 100% rename from i18n/skill.json rename to skill.json From e552d471c1d384bc9a99b44de91e45253bc2d34b Mon Sep 17 00:00:00 2001 From: bbezerra Date: Tue, 7 Jan 2020 11:16:18 +0000 Subject: [PATCH 2/5] added missing models and logic to deal with different dates --- lambda/py/lambda_function.py | 358 ++++++++++------- lambda/py/language_strings.json | 192 +++++---- lambda/py/prompts.py | 6 +- lambda/py/requirements.txt | 1 - lambda/py/requirements.txt~HEAD | 4 + .../requirements.txt~Simplifying Localization | 4 + models/de-DE.json | 125 ++++++ models/en-CA.json | 124 ++++++ models/en-GB.json | 124 ++++++ models/es-ES.json | 136 +++++++ models/es-MX.json | 136 +++++++ models/es-US.json | 136 +++++++ models/fr-FR.json | 13 +- models/hi-IN.json | 376 ++++++++++++------ models/pt-BR.json | 128 ++++++ skill.json | 19 +- 16 files changed, 1530 insertions(+), 352 deletions(-) create mode 100644 lambda/py/requirements.txt~HEAD create mode 100644 lambda/py/requirements.txt~Simplifying Localization create mode 100644 models/de-DE.json create mode 100644 models/en-CA.json create mode 100644 models/en-GB.json create mode 100644 models/es-ES.json create mode 100644 models/es-MX.json create mode 100644 models/es-US.json create mode 100644 models/pt-BR.json diff --git a/lambda/py/lambda_function.py b/lambda/py/lambda_function.py index 9e1414c..7ca23c0 100644 --- a/lambda/py/lambda_function.py +++ b/lambda/py/lambda_function.py @@ -1,37 +1,42 @@ # -*- coding: utf-8 -*- -# This sample demonstrates handling intents from an Alexa skill and using the -# Alexa Skills Kid SDK (v2) -# Please visit https://alexa.design/cookbook for additional examples on -# implementing slots, dialog management, +# This sample demonstrates handling intents from an Alexa skill using the Alexa Skills Kit SDK for Python. +# Please visit https://alexa.design/cookbook for additional examples on implementing slots, dialog management, # session persistence, api calls, and more. - -import requests +# This sample is built using the handler classes approach in skill builder. import logging -import calendar +import ask_sdk_core.utils as ask_utils import os import json +import locale +import requests +import calendar +import gettext import prompts - from datetime import datetime from pytz import timezone - from ask_sdk_s3.adapter import S3Adapter +s3_adapter = S3Adapter(bucket_name=os.environ["S3_PERSISTENCE_BUCKET"]) + +from alexa import data + from ask_sdk_core.skill_builder import CustomSkillBuilder from ask_sdk_core.dispatch_components import ( - AbstractRequestHandler, AbstractExceptionHandler, - AbstractRequestInterceptor, AbstractResponseInterceptor -) + AbstractRequestHandler, AbstractRequestInterceptor, AbstractExceptionHandler) +from ask_sdk_core.handler_input import HandlerInput + +from ask_sdk_model import Response + from ask_sdk_core.utils import is_request_type, is_intent_name -s3_adapter = S3Adapter(bucket_name=os.environ.get('S3_PERSISTENCE_BUCKET')) -sb = CustomSkillBuilder(persistence_adapter=s3_adapter) +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) -logger = logging.getLogger("main") +logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) -class LaunchRequestIntentHandler(AbstractRequestHandler): +class LaunchRequestHandler(AbstractRequestHandler): """ Handler for Skill Launch """ @@ -41,101 +46,121 @@ def can_handle(self, handler_input): def handle(self, handler_input): data = handler_input.attributes_manager.request_attributes["_"] - speech = data[prompts.WELCOME_MSG] - reprompt = data[prompts.WELCOME_REMPROMPT_MSG] + reprompt = data[prompts.WELCOME_REPROMPT_MSG] handler_input.response_builder.speak(speech).ask(reprompt) return handler_input.response_builder.response - class HasBirthdayLaunchRequestHandler(AbstractRequestHandler): - """ - Handler for launch after they have set their birthday - """ + """Handler for launch after they have set their birthday""" def can_handle(self, handler_input): # extract persistent attributes and check if they are all present attr = handler_input.attributes_manager.persistent_attributes - attributes_are_present = ( - "year" in attr and "month" in attr and "day" in attr) + attributes_are_present = ("year" in attr and "month" in attr and "day" in attr) - return attributes_are_present and is_request_type("LaunchRequest")(handler_input) + return attributes_are_present and ask_utils.is_request_type("LaunchRequest")(handler_input) def handle(self, handler_input): - data = handler_input.attributes_manager.request_attributes["_"] - attr = handler_input.attributes_manager.persistent_attributes - + year = int(attr['year']) - # month is a string, and we need to convert it to a month index later - month = attr['month'] + month = attr['month'] # month gets stored as string, so no need to convert it to int day = int(attr['day']) + + data = handler_input.attributes_manager.request_attributes["_"] + error_timezone_speech = data[prompts.ERROR_TIMEZONE_MSG] + + # get skill locale from request + skill_locale = handler_input.request_envelope.request.locale - # get device id / timezones + # get device id sys_object = handler_input.request_envelope.context.system + device_id = sys_object.device.device_id - # get systems api information + # get Alexa Settings API information api_endpoint = sys_object.api_endpoint - device_id = sys_object.device.device_id api_access_token = sys_object.api_access_token # construct systems api timezone url - url = '{api_endpoint}/v2/devices/{device_id}/settings/System.timeZone'.format( - api_endpoint=api_endpoint, device_id=device_id) + url = '{api_endpoint}/v2/devices/{device_id}/settings/System.timeZone'.format(api_endpoint=api_endpoint, device_id=device_id) headers = {'Authorization': 'Bearer ' + api_access_token} userTimeZone = "" try: - r = requests.get(url, headers=headers) - res = r.json() - logger.info("Device API result: {}".format(str(res))) - userTimeZone = res - except Exception: - speech = data[prompts.ERROR_TIMEZONE_MSG] - handler_input.response_builder.speak(speech) - return handler_input.response_builder.response - - # getting the current date with the time + r = requests.get(url, headers=headers) + res = r.json() + logger.info("Device API result: {}".format(str(res))) + userTimeZone = res + except Exception: + handler_input.response_builder.speak(error_timezone_speech) + return handler_input.response_builder.response + + # get the current date with the time now_time = datetime.now(timezone(userTimeZone)) - # Removing the time from the date because it affects our difference calculation + # remove the time from the date because it affects our difference calculation now_date = datetime(now_time.year, now_time.month, now_time.day) current_year = now_time.year - # getting the next birthday - month_as_index = list(calendar.month_abbr).index(month[:3]) - next_birthday = datetime(current_year, month_as_index, day) + # get the next birthday + next_birthday = datetime(current_year, month, day) - # check if we need to adjust bday by one year + # check if we need to adjust birthday by one year if now_date > next_birthday: next_birthday = datetime( current_year + 1, - month_as_index, + month, day ) current_year += 1 - # setting the default speak_output to Happy xth Birthday!! - # alexa will automatically correct the oridinal for you. - # no need to worry about when to use st, th, rd - speak_output = data[prompts.HAPPY_BIRTHDAY_MSG].format( - str(current_year - year)) - if now_date != next_birthday: - diff_days = abs((now_date - next_birthday).days) - logger.info(speak_output) - speak_output = data[prompts.WELCOME_BACK_MSG].format( - diff_days, - (current_year - year) - ) - if (diff_days != 1): - speak_output = data[prompts.WELCOME_BACK_MSG_plural].format( - diff_days, - (current_year - year) - ) - - handler_input.response_builder.speak(speak_output) - return handler_input.response_builder.response - + + # calculate how many days until the next birthday + diff_days = abs((now_date - next_birthday).days) + + # the following locales have a different HAPPY_BIRTHDAY_MSG for plural + if (('fr' in skill_locale) or ('it' in skill_locale) or ('es' in skill_locale)) or ('pt' in skill_locale): + + # if it is not the user birthday + if now_date != next_birthday: + if diff_days > 1: + speak_output = data[prompts.WELCOME_BACK_MSG_plural].format(diff_days, current_year-year) + if diff_days < 2: + speak_output = data[prompts.WELCOME_BACK_MSG].format(diff_days, current_year - year) + + # if it is the user birthday + else: + if (current_year - year > 1): + speak_output = data[prompts.HAPPY_BIRTHDAY_MSG_plural].format(current_year - year) + if current_year - year < 2: + speak_output = data[prompts.HAPPY_BIRTHDAY_MSG].format(current_year - year) + + # all other locales + else: + speak_output = data[prompts.HAPPY_BIRTHDAY_MSG].format(current_year - year) + + # if it is not the user birthday + if now_date != next_birthday: + if diff_days > 1: + # for ja and hi, the order of the slots is inverted, i.e. year before day + if ('ja' in skill_locale or 'hi' in skill_locale): + speak_output = data[prompts.WELCOME_BACK_MSG_plural].format(current_year-year, diff_days) + else: + speak_output = data[prompts.WELCOME_BACK_MSG_plural].format(diff_days, current_year-year) + elif diff_days < 2: + # for ja and hi, the order of the slots is inverted, i.e. year before day + if ('ja' in skill_locale or 'hi' in skill_locale): + speak_output = data[prompts.WELCOME_BACK_MSG].format(current_year - year, diff_days) + else: + speak_output = data[prompts.WELCOME_BACK_MSG].format(diff_days, current_year - year) + + return ( + handler_input.response_builder + .speak(speak_output) + # .ask("add a reprompt if you want to keep the session open for the user to respond") + .response + ) class BirthdayIntentHandler(AbstractRequestHandler): """ @@ -148,117 +173,164 @@ def can_handle(self, handler_input): def handle(self, handler_input): data = handler_input.attributes_manager.request_attributes["_"] slots = handler_input.request_envelope.request.intent.slots - locale = handler_input.request_envelope.request.locale + skill_locale = handler_input.request_envelope.request.locale # extract slot values year = slots["year"].value - month = slots["month"].value + + # if the interaction models uses synonyms for the month slot (for example hi-IN) the following logic will return the ID for the value + try: + month = slots["month"].resolutions.resolutions_per_authority[0].values[0].value.id + except: + # if the above fails, it means that there are no synonyms being used, so retrieve the value for the month in the regular way + month = slots["month"].value + day = slots["day"].value + # get the month as an integer instead of string + month_as_index = self.monthIndex(month[:3]) + # save slots into session attributes session_attr = handler_input.attributes_manager.session_attributes session_attr['year'] = year - session_attr['month'] = month + session_attr['month'] = month_as_index session_attr['day'] = day # save session attributes as persistent attributes handler_input.attributes_manager.persistent_attributes = session_attr handler_input.attributes_manager.save_persistent_attributes() - date = self.formatDate(year, month, day, locale) + # ensure that the order the arguments is correct (MM/DD/YYYY or DD/MM/YYYY) according to locale + date = self.formatDate(year, month, day, skill_locale) - speech = _(data.REGISTER_BIRTHDAY_MSG).format(date[0], date[1], date[2]) + speech = data[prompts.REGISTER_BIRTHDAY_MSG].format(date[0], date[1], date[2]) handler_input.response_builder.speak(speech) return handler_input.response_builder.response # function to ensure that the date format corresponds with the locale that is triggering thee skill - def formatDate(self, year, month, day, locale): - if locale == 'en-US': + def formatDate(self, year, month, day, skill_locale): + if skill_locale == 'en-US': + # MM/DD/YYYY for USA date = [month, day, year] - elif locale == 'jp-JP': + elif skill_locale == 'ja-JP': + # YYYY/MM/DD for Japan date = [year, month, day] else: + # DD/MM/YYY for RoW date = [day, month, year] - return date - - + # function to convert a month name to number, i.e. March as 3, July as 7 and so on + def monthIndex(self, month): + month_list = list(calendar.month_name) + i = 0 + while i < len(month_list): + if (month.lower() in month_list[i].lower()): + return i + i += 1 class HelpIntentHandler(AbstractRequestHandler): - """ - Handler for AMAZON.HelpIntent - """ - + """Handler for Help Intent.""" def can_handle(self, handler_input): - return is_intent_name("AMAZON.HelpIntent")(handler_input) + # type: (HandlerInput) -> bool + return ask_utils.is_intent_name("AMAZON.HelpIntent")(handler_input) def handle(self, handler_input): + # type: (HandlerInput) -> Response + data = handler_input.attributes_manager.request_attributes["_"] speak_output = data[prompts.HELP_MSG] - handler_input.response_builder.speak( - speak_output - ).ask(speak_output) - return handler_input.response_builder.response - + return ( + handler_input.response_builder + .speak(speak_output) + .ask(speak_output) + .response + ) -class CatchAllExceptionHandler(AbstractExceptionHandler): - """ - Catch all exception handler, log exception and - respond with custom message. - """ - def can_handle(self, handler_input, exception): - return True +class CancelOrStopIntentHandler(AbstractRequestHandler): + """Single handler for Cancel and Stop Intent.""" + def can_handle(self, handler_input): + # type: (HandlerInput) -> bool + return (ask_utils.is_intent_name("AMAZON.CancelIntent")(handler_input) or + ask_utils.is_intent_name("AMAZON.StopIntent")(handler_input)) - def handle(self, handler_input, exception): - logger.info(exception) + def handle(self, handler_input): + # type: (HandlerInput) -> Response data = handler_input.attributes_manager.request_attributes["_"] - speak_output = data[prompts.ERROR_MSG] - handler_input.response_builder.speak(speak_output).ask(speak_output) - return handler_input.response_builder.response + speak_output = data[prompts.GOODBYE_MSG] + return ( + handler_input.response_builder + .speak(speak_output) + .response + ) -class CancelAndStopIntentHandler(AbstractRequestHandler): - """ - Handler for AMAZON.CancelIntent and AMAZON.StopIntent - """ +class SessionEndedRequestHandler(AbstractRequestHandler): + """Handler for Session End.""" def can_handle(self, handler_input): - return is_intent_name("AMAZON.CancelIntent")(handler_input) \ - and is_intent_name("AMAZON.StopIntent")(handler_input) + # type: (HandlerInput) -> bool + return ask_utils.is_request_type("SessionEndedRequest")(handler_input) def handle(self, handler_input): - data = handler_input.attributes_manager.request_attributes["_"] - speak_output = data[prompts.GOODBYE_MSG] - handler_input.response_builder.speak(speak_output) + # type: (HandlerInput) -> Response + + # Any cleanup logic goes here. + return handler_input.response_builder.response -class SessionEndedRequestHandler(AbstractRequestHandler): - """ - Handler for SessionEndedRequest +class IntentReflectorHandler(AbstractRequestHandler): + """The intent reflector is used for interaction model testing and debugging. + It will simply repeat the intent the user said. You can create custom handlers + for your intents by defining them above, then also adding them to the request + handler chain below. """ - def can_handle(self, handler_input): - return is_request_type("SessionEndedRequest")(handler_input) + # type: (HandlerInput) -> bool + return ask_utils.is_request_type("IntentRequest")(handler_input) def handle(self, handler_input): - # Any cleanup logic goes here - return handler_input.response_builder.response + # type: (HandlerInput) -> Response + data = handler_input.attributes_manager.request_attributes["_"] + intent_name = ask_utils.get_intent_name(handler_input) + speak_output = data[prompts.REFLECTOR_MSG].format(intent_name) + + return ( + handler_input.response_builder + .speak(speak_output) + # .ask("add a reprompt if you want to keep the session open for the user to respond") + .response + ) -class CacheSpeechForRepeatInterceptor(AbstractResponseInterceptor): - """Cache the output speech and reprompt to session attributes, - for repeat intent. +class CatchAllExceptionHandler(AbstractExceptionHandler): + """Generic error handling to capture any syntax or routing errors. If you receive an error + stating the request handler chain is not found, you have not implemented a handler for + the intent being invoked or included it in the skill builder below. """ + def can_handle(self, handler_input, exception): + # type: (HandlerInput, Exception) -> bool + return True - def process(self, handler_input, response): - # type: (HandlerInput, Response) -> None - session_attr = handler_input.attributes_manager.session_attributes - session_attr["speech"] = response.output_speech - session_attr["reprompt"] = response.reprompt + def handle(self, handler_input, exception): + # type: (HandlerInput, Exception) -> Response + logger.error(exception, exc_info=True) + data = handler_input.attributes_manager.request_attributes["_"] + speak_output = data[prompts.ERROR_MSG] + + return ( + handler_input.response_builder + .speak(speak_output) + .ask(speak_output) + .response + ) + +# The SkillBuilder object acts as the entry point for your skill, routing all request and response +# payloads to the handlers above. Make sure any new handlers or interceptors you've +# defined are included below. The order matters - they're processed top to bottom. class LocalizationInterceptor(AbstractRequestInterceptor): @@ -267,30 +339,38 @@ class LocalizationInterceptor(AbstractRequestInterceptor): """ def process(self, handler_input): - locale = handler_input.request_envelope.request.locale - logger.info("Locale is {}".format(locale)) + skill_locale = handler_input.request_envelope.request.locale # localized strings stored in language_strings.json with open("language_strings.json") as language_prompts: language_data = json.load(language_prompts) - data = language_data[locale] + # set default translation data to broader translation + data = language_data[skill_locale[:2]] + # if a more specialized translation exists, then select it instead + # example: "fr-CA" will pick "fr" translations first, but if "fr-CA" translation exists, + # then pick that instead + if skill_locale in language_data: + data.update(language_data[skill_locale]) handler_input.attributes_manager.request_attributes["_"] = data + # configure the runtime to treat time according to the skill locale + skill_locale = skill_locale.replace('-','_') + locale.setlocale(locale.LC_TIME, skill_locale) + + +sb = CustomSkillBuilder(persistence_adapter=s3_adapter) -# register request / intent handlers sb.add_request_handler(HasBirthdayLaunchRequestHandler()) -sb.add_request_handler(LaunchRequestIntentHandler()) +sb.add_request_handler(LaunchRequestHandler()) sb.add_request_handler(BirthdayIntentHandler()) sb.add_request_handler(HelpIntentHandler()) -sb.add_request_handler(CancelAndStopIntentHandler()) +sb.add_request_handler(CancelOrStopIntentHandler()) sb.add_request_handler(SessionEndedRequestHandler()) +sb.add_request_handler(IntentReflectorHandler()) # make sure IntentReflectorHandler is last so it doesn’t override your custom intent handlers -# register exception handlers sb.add_exception_handler(CatchAllExceptionHandler()) -# register localization interceptor and cache speech interceptor sb.add_global_request_interceptor(LocalizationInterceptor()) -sb.add_global_response_interceptor(CacheSpeechForRepeatInterceptor()) -lambda_handler = sb.lambda_handler() +lambda_handler = sb.lambda_handler() \ No newline at end of file diff --git a/lambda/py/language_strings.json b/lambda/py/language_strings.json index 82360b4..d5c5b0e 100644 --- a/lambda/py/language_strings.json +++ b/lambda/py/language_strings.json @@ -1,74 +1,122 @@ { - "en-US" : { - "WELCOME_MSG" : "Hello! Welcome to Cake walk. What is your birthday?", - "WELCOME_REMPROMPT_MSG" : "I was born Nov. 6th, 2014. When were you born?", - "WELCOME_BACK_MSG" : "Welcome back. It looks like there is {} day until your {}th birthday.", - "WELCOME_BACK_MSG_plural" : "Welcome back. It looks like there are {} days until your {}th birthday", - "HAPPY_BIRTHDAY_MSG" : "Happy {}th birthday!", - "REGISTER_BIRTHDAY_MSG" : "Thanks, I'll remember that you were born {} {} {}", - "HELP_MSG" : "You can tell me your date of birth and I'll take note. You can also just say, 'register my birthday' and I will guide you. Which one would you like to try?", - "GOODBYE_MSG" : "Goodbye!", - "ERROR_MSG" : "Sorry, I couldn't understand what you said. Can you reformulate?", - "ERROR_TIMEZONE_MSG" : "I can't determine your timezone. Please check your device settings and make sure a timezone was selected. After that please reopen the skill and try again!" - }, - "fr-CA" : { - "WELCOME_MSG" : "Bonjour! Bienvenue sur le Génie des Anniversaires. Quelle est votre date de naissance ?", - "WELCOME_REMPROMPT_MSG" : "Je suis née le 6 novembre 2014. Et vous, quand êtes-vous né ?", - "WELCOME_BACK_MSG" : "Content de vous revoir! Il vous reste {} jour avant d'avoir {} ans.", - "WELCOME_BACK_MSG_plural" : "Content de vous revoir! Il vous reste {} jours avant d'avoir {} ans.", - "HAPPY_BIRTHDAY_MSG" : "Bonne Fête! Aujourd'hui, vous avez {} an!", - "REGISTER_BIRTHDAY_MSG" : "Merci, je vais me rappeler que vous êtes né le {} {} {}.", - "HELP_MSG" : "Je peux me souvenir de votre date de naissance. Dites-moi votre jour, mois et année de naissance ou bien dites-moi simplement \"sauve ma fête\" et je vous guiderai. Quel est votre choix ?", - "GOODBYE_MSG" : "Au revoir!", - "ERROR_MSG" : "Désolé, je n'ai pas compris. Pouvez-vous reformuler ?", - "ERROR_TIMEZONE_MSG" : "Je n'ai pas réussi à déterminer votre fuseau horaire. Veuillez vérifier les paramètres de votre appareil et réessayez." - }, - "fr-FR":{ - "WELCOME_MSG" : "Bonjour! Bienvenue sur le Génie des Anniversaires. Quelle est votre date de naissance ?", - "WELCOME_REMPROMPT_MSG" : "Bonjour! Bienvenue sur le Génie des Anniversaires. Quelle est votre date de naissance ?", - "WELCOME_BACK_MSG" : "Content de vous revoir! Il vous reste {} jour avant d'avoir {} ans.", - "WELCOME_BACK_MSG_plural" : "Content de vous revoir! Il vous reste {} jours avant d'avoir {} ans.", - "HAPPY_BIRTHDAY_MSG" : "Joyeux Anniversaire! Aujourd'hui, vous avez {} an!", - "REGISTER_BIRTHDAY_MSG" : "Merci, je vais me rappeler que vous êtes né le {} {} {}.", - "HELP_MSG" : "Je peux me souvenir de votre date de naissance. Dites-moi votre jour, mois et année de naissance ou bien dites-moi simplement \"enregistre mon anniversaire\" et je vous guiderai. Quel est votre choix ?", - "GOODBYE_MSG" : "Au revoir!", - "ERROR_MSG" : "Désolé, je n'ai pas compris. Pouvez-vous reformuler ?", - "ERROR_TIMEZONE_MSG" : "Je n'ai pas réussi à déterminer votre fuseau horaire. Veuillez vérifier les paramètres de votre appareil et réessayez." - }, - "hi-IN":{ - "WELCOME_MSG" : "नमस्ते. Cake Walk में आपका स्वागत. आपका जनमदिन कब हैं?", - "WELCOME_REMPROMPT_MSG" : "मेरा जन्म 6 नवंबर, 2014 को हुआ था. आप कब पैदा हुए थे?", - "WELCOME_BACK_MSG" : "वापसी पर स्वागत है. आपके {} वे जनमदिन तक {} दिन हैं`", - "WELCOME_BACK_MSG_plural" : "आपके {} वे जनमदिन तक {} दिन हैं", - "HAPPY_BIRTHDAY_MSG" : "{} वां जन्मदिन मुबारक हो", - "REGISTER_BIRTHDAY_MSG" : "शुक्रिया. मुझे याद होगा कि आप {} {} {} मैं पैदा हुए थे", - "HELP_MSG" : "आप मुझे अपनी जन्मतिथि बता सकते हैं और मैं note कर लूंगा. आप यह भी कह सकते हैं, \"मेरा जन्मदिन register करें. आप कौन सा प्रयास करना चाहेंगे?", - "GOODBYE_MSG" : "अलवादी", - "ERROR_MSG" : "Sorry, मैं वो समझ नहीं पायी. क्या आप दोहरा सकते हैं ", - "ERROR_TIMEZONE_MSG" : "Sorry. मैं आपके समयक्षेत्र का निर्धारण नहीं कर सकता. आपकी Device Settings में timezone select कर दो और एक और बार skill खोलो." - }, - "it-IT":{ - "WELCOME_MSG" : "Ciao! Benvenuti a Buon Compleanno. Qual'è la tua data di nascita?", - "WELCOME_REMPROMPT_MSG" : "Io sono nata il 6 novembre 2014. E tu invece?", - "WELCOME_BACK_MSG" : "Ciao di nuovo! Manca {} giorno a quando avrai {} anni.", - "WELCOME_BACK_MSG_plural" : "Ciao di nuovo! Mancano {} giorni a quando avrai {} anni.", - "HAPPY_BIRTHDAY_MSG" : "Buon compleanno! Oggi compi {} anno!", - "REGISTER_BIRTHDAY_MSG" : "Grazie, mi ricorderò la tua data di nascita: {} {} {}.", - "HELP_MSG" : "Posso segnarmi la tua data di nascita. Dimmi pure la data oppure dimmi di ricordami il tuo compleanno. Cosa preferisci?", - "GOODBYE_MSG" : "A presto!", - "ERROR_MSG" : "Scusa, non ho capito. Puoi ripetere?", - "ERROR_TIMEZONE_MSG" : "Non ho potuto determinare il tuo fuso orario. Verifica la configurazione del tuo dispositivo, e riprova." - }, - "ja-JP":{ - "WELCOME_MSG" : "こんにちは、ケークウォークへようこそ。あなたの誕生日はいつですか?", - "WELCOME_REMPROMPT_MSG" : "私は2004年10月6日に生まれました。あなたの誕生日はいつですか?", - "WELCOME_BACK_MSG" : "おかえりなさい。{}歳のお誕生日まで、あと{{count}}日です。", - "WELCOME_BACK_MSG_plural" : "おかえりなさい。{}歳のお誕生日まで、残り{}日です。", - "HAPPY_BIRTHDAY_MSG" : "{}歳のお誕生日、おめでとうございます!", - "REGISTER_BIRTHDAY_MSG" : "ありがとうございます。誕生日は {}年 {}月 {}日ですね?", - "HELP_MSG" : "あなたの誕生日を言うと、その日付を記憶します。もしくは、「私の誕生日を登録して」と言うと、詳しくご案内します。どちらにしますか?", - "GOODBYE_MSG" : "さようなら", - "ERROR_MSG" : "ごめんなさい、うまく理解できませんでした。もう一度言ってみてください。", - "ERROR_TIMEZONE_MSG" : "タイムゾーンを特定できませんでした。Alexaアプリでデバイスの設定を開き、タイムゾーンが正しく選択されていることを確認したあとで、もう一度試してください。" - } + "en": { + "WELCOME_MSG": "Hello! Welcome to Cake walk. What is your birthday?", + "WELCOME_REPROMPT_MSG": "I was born Nov. 6th, 2014. When were you born?", + "WELCOME_BACK_MSG": "Welcome back. It looks like there is {} day until your {}th birthday.", + "WELCOME_BACK_MSG_plural": "Welcome back. It looks like there are {} days until your {}th birthday.", + "HAPPY_BIRTHDAY_MSG": "Happy {}th birthday!", + "REGISTER_BIRTHDAY_MSG": "Thanks, I'll remember that you were born {} {} {}.", + "HELP_MSG": "You can tell me your date of birth and I'll take note. You can also just say, 'register my birthday' and I will guide you. Which one would you like to try?", + "GOODBYE_MSG": "Goodbye!", + "REFLECTOR_MSG": "You just triggered {}", + "ERROR_MSG": "Sorry, I couldn't understand what you said. Can you reformulate?", + "ERROR_TIMEZONE_MSG": "I can't determine your timezone. Please check your device settings and make sure a timezone was selected. After that please reopen the skill and try again!" + }, + "pt": { + "WELCOME_MSG": "Olá! Boas vindas à skill Feliz Aniversário. Quando é o seu aniversário?", + "WELCOME_REPROMPT_MSG": "Eu nasci no dia 6 de novembro de 2014. Quando você nasceu?", + "WELCOME_BACK_MSG": "Que bom que você está de volta! Parece que falta {} dia até o seu aniversário de {} anos.", + "WELCOME_BACK_MSG_plural": "Que bom que você está de volta! Parece que faltam {} dias até o seu aniversário de {} anos.", + "HAPPY_BIRTHDAY_MSG": "Feliz aniversário de {} ano", + "HAPPY_BIRTHDAY_MSG_plural": "Feliz aniversário de {} anos", + "REGISTER_BIRTHDAY_MSG": "Obrigada, eu vou lembrar que você nasceu no dia {} de {} de {}.", + "HELP_MSG": "Você pode me dizer o dia em que você nasceu e eu vou me lembrar. Você também pode dizer, 'anote meu aniversário' eu irei guiar sua interação. Qual deles você quer tentar?", + "GOODBYE_MSG": "Tchau!", + "REFLECTOR_MSG": "Você acabou de acionar o {}", + "ERROR_MSG": "Desculpe, eu não entendi o que você falou. Pode reformular?", + "ERROR_TIMEZONE_MSG": "Não consegui determinar seu fuso horário. Por favor verifique as configurações de seu aparelho e certifique-se de que um fuso horário está selecionado. Depois disso, reinicie a skill e tente novamente!" + }, + "de": { + "WELCOME_MSG": "Hallo! Herzlich willkommen zu Herzlichen Glückwunsch. Wann hast du Geburtstag?", + "WELCOME_REPROMPT_MSG": "Ich bin am 6. November 2014 geboren. Wann bist du geboren?", + "WELCOME_BACK_MSG": "Willkommen zurück. Es sieht so aus, als ob noch {} Tag bis zu Deinem {}. Geburtstag verbleibt.", + "WELCOME_BACK_MSG_plural": "Willkommen zurück. Es sieht so aus, als ob noch {} Tage zu Deinem {}. Geburtstag verbleiben.", + "HAPPY_BIRTHDAY_MSG": "Alles Gute zum {}. Geburtstag!", + "REGISTER_BIRTHDAY_MSG": "Danke, ich werde mir merken, dass du am {} {} {} geboren wurdest.", + "HELP_MSG": "Du kannst mir sagen, wann du Geburtstag hast und ich werde es mir merken. Du kannst auch einfach 'merke dir meinen Geburtstag' sagen und ich werde dir weiterhelfen. Was würdest du gerne probieren?", + "GOODBYE_MSG": "Tschüss!", + "REFLECTOR_MSG": "Du hast gerade {} gestartet.", + "ERROR_MSG": "Sorry, ich konnte nicht verstehen was du gesagt hast. Kannst du das bitte umformulieren?", + "ERROR_TIMEZONE_MSG": "Ich kann deine Zeitzone nicht bestimmen. Bitte überprüfe deine Geräteoptionen und stelle sicher, dass eine Zeitzone ausgeewählt ist. Öffne danach den Skill wieder und probiere es erneut!" + + }, + "fr": { + "WELCOME_MSG": "Bonjour! Bienvenue sur le Génie des Anniversaires. Quelle est votre date de naissance ?", + "WELCOME_REPROMPT_MSG": "Je suis née le 6 novembre 2014. Et vous, quand êtes-vous né ?", + "WELCOME_BACK_MSG": "Content de vous revoir! Il vous reste {} jour avant d'avoir {} ans.", + "WELCOME_BACK_MSG_plural": "Content de vous revoir! Il vous reste {} jours avant d'avoir {} ans.", + "HAPPY_BIRTHDAY_MSG": "Joyeux Anniversaire! Aujourd'hui, vous avez {} an!", + "HAPPY_BIRTHDAY_MSG_plural": "Joyeux Anniversaire! Aujourd'hui, vous avez {} ans!", + "REGISTER_BIRTHDAY_MSG": "Merci, je vais me rappeler que vous êtes né le {} {} {}.", + "HELP_MSG": "Je peux me souvenir de votre date de naissance. Dites-moi votre jour, mois et année de naissance ou bien dites-moi simplement 'enregistre mon anniversaire' et je vous guiderai. Quel est votre choix ?", + "GOODBYE_MSG": "Au revoir!", + "REFLECTOR_MSG": "Vous avez invoqué l'intention {}", + "ERROR_MSG": "Désolé, je n'ai pas compris. Pouvez-vous reformuler ?", + "ERROR_TIMEZONE_MSG": "Je n'ai pas réussi à déterminer votre fuseau horaire. Veuillez vérifier les paramètres de votre appareil et réessayez." + + }, + "fr-CA": { + "WELCOME_MSG": "Bonjour! Bienvenue sur le Génie des Fêtes. Quelle est votre date de naissance ?", + "HAPPY_BIRTHDAY_MSG": "Bonne Fête! Aujourd'hui, vous avez {} an!", + "HAPPY_BIRTHDAY_MSG_plural": "Bonne Fête! Aujourd'hui, vous avez {} ans!", + "HELP_MSG": "Je peux me souvenir de votre date de naissance. Dites-moi votre jour, mois et année de naissance ou bien dites-moi simplement 'sauve ma fête' et je vous guiderai. Quel est votre choix ?" + + }, + "it": { + "WELCOME_MSG": "Ciao! Benvenuti a Buon Compleanno. Qual'è la tua data di nascita?", + "WELCOME_REPROMPT_MSG": "Io sono nata il 6 novembre 2014. E tu invece?", + "WELCOME_BACK_MSG": "Ciao di nuovo! Manca {} giorno a quando avrai {} anni.", + "WELCOME_BACK_MSG_plural": "Ciao di nuovo! Mancano {} giorni a quando avrai {} anni.", + "HAPPY_BIRTHDAY_MSG": "Buon compleanno! Oggi compi {} anno!", + "HAPPY_BIRTHDAY_MSG_plural": "Buon compleanno! Oggi compi {} anni!", + "REGISTER_BIRTHDAY_MSG": "Grazie, mi ricorderò la tua data di nascita: {} {} {}.", + "HELP_MSG": "Posso segnarmi la tua data di nascita. Dimmi pure la data oppure dimmi di ricordami il tuo compleanno. Cosa preferisci?", + "GOODBYE_MSG": "A presto!", + "REFLECTOR_MSG": "Hai invocato l'intento {}", + "ERROR_MSG": "Scusa, non ho capito. Puoi ripetere?", + "ERROR_TIMEZONE_MSG": "Non ho potuto determinare il tuo fuso orario. Verifica la configurazione del tuo dispositivo, e riprova." + + }, + "es": { + "WELCOME_MSG": "Hola! Bienvenidos a Feliz Cumpleaños. Cual es tu fecha de nacimiento?", + "WELCOME_REPROMPT_MSG": "Yo nací el 6 de noviembre 2014. Y tú?", + "WELCOME_BACK_MSG": "Hola otra vez! Falta {} día para que cumplas {} año.", + "WELCOME_BACK_MSG_plural": "Hola otra vez! Faltan {} días para que cumplas {} años.", + "HAPPY_BIRTHDAY_MSG": "Feliz Cumpleaños! Hoy cumples {} año!", + "HAPPY_BIRTHDAY_MSG_plural": "Feliz Cumpleaños! Hoy cumples {} años!", + "REGISTER_BIRTHDAY_MSG": "Gracias, me acordaré de tu fecha de nacimiento: {} {} {}.", + "HELP_MSG": "Puedo apuntarme tu fecha de nacimiento. Dime la fecha o dime de acordarme de tu cumpleaños. Qué prefieres?", + "GOODBYE_MSG": "Hasta luego!", + "REFLECTOR_MSG": "Has invocado {}", + "ERROR_MSG": "Perdona, no entendido. Puedes repetir?", + "ERROR_TIMEZONE_MSG": "No he potido determinar tu zona horaria. Verifica la configuración de tu dispositivo, y intenta otra vez." + + }, + "ja": { + "WELCOME_MSG": "こんにちは、ケークウォークへようこそ。あなたの誕生日はいつですか?", + "WELCOME_REPROMPT_MSG": "私は2004年10月6日に生まれました。あなたの誕生日はいつですか?", + "WELCOME_BACK_MSG": "おかえりなさい。{}歳のお誕生日まで、あと1日です。", + "WELCOME_BACK_MSG_plural": "おかえりなさい。{}歳のお誕生日まで、残り{}日です。", + "HAPPY_BIRTHDAY_MSG": "{}歳のお誕生日、おめでとうございます!", + "REGISTER_BIRTHDAY_MSG": "ありがとうございます。誕生日は {}年 {}月 {}日ですね?", + "HELP_MSG": "あなたの誕生日を言うと、その日付を記憶します。もしくは、「私の誕生日を登録して」と言うと、詳しくご案内します。どちらにしますか?", + "GOODBYE_MSG": "さようなら", + "REFLECTOR_MSG": "{}がトリガーされました。", + "ERROR_MSG": "ごめんなさい、うまく理解できませんでした。もう一度言ってみてください。", + "ERROR_TIMEZONE_MSG": "タイムゾーンを特定できませんでした。Alexaアプリでデバイスの設定を開き、タイムゾーンが正しく選択されていることを確認したあとで、もう一度試してください。" + + }, + "hi": { + "WELCOME_MSG": "नमस्ते. Cake Walk में आपका स्वागत. आपका जनमदिन कब हैं?", + "WELCOME_REPROMPT_MSG": "मेरा जन्म 6 नवंबर, 2014 को हुआ था. आप कब पैदा हुए थे?", + "WELCOME_BACK_MSG": "वापसी पर स्वागत है. आपके {} वे जन्मदिन तक {} दिन हैं", + "WELCOME_BACK_MSG_plural": "वापसी पर स्वागत है. आपके {} वे जन्मदिन तक {} दिन हैं", + "HAPPY_BIRTHDAY_MSG": "{} वां जन्मदिन मुबारक हो", + "REGISTER_BIRTHDAY_MSG": "शुक्रिया. मुझे याद होगा कि आप {} {} {} मैं पैदा हुए थेैं", + "HELP_MSG": "आप मुझे अपनी जन्मतिथि बता सकते हैं और मैं note कर लूंगा. आप यह भी कह सकते हैं, 'मेरा जन्मदिन register करें. आप कौन सा प्रयास करना चाहेंगे?", + "GOODBYE_MSG": "अलवादी ", + "REFLECTOR_MSG": "आपने {} trigger किया हैं ", + "ERROR_MSG": "Sorry, मैं वो समझ नहीं पायी. क्या आप दोहरा सकते हैं ", + "ERROR_TIMEZONE_MSG": "Sorry. मैं आपके समयक्षेत्र का निर्धारण नहीं कर सकता. आपकी Device Settings में timezone select कर दो और एक और बार skill खोलो" + } } diff --git a/lambda/py/prompts.py b/lambda/py/prompts.py index 4f4d681..1e69284 100644 --- a/lambda/py/prompts.py +++ b/lambda/py/prompts.py @@ -1,12 +1,14 @@ # Alexa Prompts Language Constants WELCOME_MSG = "WELCOME_MSG" -WELCOME_REMPROMPT_MSG = "WELCOME_REMPROMPT_MSG" +WELCOME_REPROMPT_MSG = "WELCOME_REPROMPT_MSG" WELCOME_BACK_MSG = "WELCOME_BACK_MSG" WELCOME_BACK_MSG_plural = "WELCOME_BACK_MSG_plural" HAPPY_BIRTHDAY_MSG = "HAPPY_BIRTHDAY_MSG" +HAPPY_BIRTHDAY_MSG_plural = "HAPPY_BIRTHDAY_MSG_plural" REGISTER_BIRTHDAY_MSG = "REGISTER_BIRTHDAY_MSG" HELP_MSG = "HELP_MSG" GOODBYE_MSG = "GOODBYE_MSG" +REFLECTOR_MSG = "REFLECTOR_MSG" ERROR_MSG = "ERROR_MSG" -ERROR_TIMEZONE_MSG = "ERROR_TIMEZONE_MSG" +ERROR_TIMEZONE_MSG = "ERROR_TIMEZONE_MSG" \ No newline at end of file diff --git a/lambda/py/requirements.txt b/lambda/py/requirements.txt index 1b5d6a9..3e9b116 100644 --- a/lambda/py/requirements.txt +++ b/lambda/py/requirements.txt @@ -1,4 +1,3 @@ ask-sdk-core ask-sdk-s3-persistence-adapter -boto3 pytz diff --git a/lambda/py/requirements.txt~HEAD b/lambda/py/requirements.txt~HEAD new file mode 100644 index 0000000..1b5d6a9 --- /dev/null +++ b/lambda/py/requirements.txt~HEAD @@ -0,0 +1,4 @@ +ask-sdk-core +ask-sdk-s3-persistence-adapter +boto3 +pytz diff --git a/lambda/py/requirements.txt~Simplifying Localization b/lambda/py/requirements.txt~Simplifying Localization new file mode 100644 index 0000000..1b5d6a9 --- /dev/null +++ b/lambda/py/requirements.txt~Simplifying Localization @@ -0,0 +1,4 @@ +ask-sdk-core +ask-sdk-s3-persistence-adapter +boto3 +pytz diff --git a/models/de-DE.json b/models/de-DE.json new file mode 100644 index 0000000..e732bd6 --- /dev/null +++ b/models/de-DE.json @@ -0,0 +1,125 @@ +{ + "interactionModel": { + "languageModel": { + "invocationName": "herzlichen glückwunsch", + "intents": [ + { + "name": "AMAZON.CancelIntent", + "samples": [] + }, + { + "name": "AMAZON.HelpIntent", + "samples": [] + }, + { + "name": "AMAZON.StopIntent", + "samples": [] + }, + { + "name": "AMAZON.NavigateHomeIntent", + "samples": [] + }, + { + "name": "CaptureBirthdayIntent", + "slots": [ + { + "name": "month", + "type": "AMAZON.Month" + }, + { + "name": "day", + "type": "AMAZON.Ordinal" + }, + { + "name": "year", + "type": "AMAZON.FOUR_DIGIT_NUMBER" + } + ], + "samples": [ + "{day} {month}", + "{day} {month} {year}", + "{month} {year}", + "Ich bin am {day} {month} geboren", + "Ich bin am {day} {month} {year} geboren", + "Ich bin am {month} {year} geboren", + "merke dir meinen Geburtstag" + ] + } + ], + "types": [] + }, + "dialog": { + "intents": [ + { + "name": "CaptureBirthdayIntent", + "confirmationRequired": false, + "prompts": {}, + "slots": [ + { + "name": "month", + "type": "AMAZON.Month", + "elicitationRequired": true, + "confirmationRequired": false, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.795077103633" + } + }, + { + "name": "day", + "type": "AMAZON.Ordinal", + "elicitationRequired": true, + "confirmationRequired": false, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.985837334781" + } + }, + { + "name": "year", + "type": "AMAZON.FOUR_DIGIT_NUMBER", + "elicitationRequired": true, + "confirmationRequired": false, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.27341833344" + } + } + ] + } + ], + "delegationStrategy": "ALWAYS" + }, + "prompts": [ + { + "id": "Elicit.Slot.303899476312.795077103633", + "variations": [ + { + "type": "PlainText", + "value": "Ich wurde im November geboren. In welchem Monat wurdest du geboren?" + }, + { + "type": "PlainText", + "value": "In welchem Monat wurdest du geboren?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.985837334781", + "variations": [ + { + "type": "PlainText", + "value": "Ich wurde am sechsten geboren. An welchem Tag wurdest du geboren?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.27341833344", + "variations": [ + { + "type": "PlainText", + "value": "Ich wurde im Jahr zweitausendvierzehn geboren. In welchem Jahr wurdest du geboren?" + } + ] + } + ] + }, + "version": "2" + } \ No newline at end of file diff --git a/models/en-CA.json b/models/en-CA.json new file mode 100644 index 0000000..5a0b593 --- /dev/null +++ b/models/en-CA.json @@ -0,0 +1,124 @@ +{ + "interactionModel": { + "languageModel": { + "invocationName": "cake walk", + "intents": [ + { + "name": "AMAZON.CancelIntent", + "samples": [] + }, + { + "name": "AMAZON.HelpIntent", + "samples": [] + }, + { + "name": "AMAZON.StopIntent", + "samples": [] + }, + { + "name": "AMAZON.NavigateHomeIntent", + "samples": [] + }, + { + "name": "CaptureBirthdayIntent", + "slots": [ + { + "name": "month", + "type": "AMAZON.Month" + }, + { + "name": "day", + "type": "AMAZON.Ordinal" + }, + { + "name": "year", + "type": "AMAZON.FOUR_DIGIT_NUMBER" + } + ], + "samples": [ + "{month} {day}", + "{month} {day} {year}", + "{month} {year}", + "I was born on {month} {day} ", + "I was born on {month} {day} {year}", + "I was born on {month} {year}", + "register my birthday" + ] + } + ], + "types": [] + }, + "dialog": { + "intents": [ + { + "name": "CaptureBirthdayIntent", + "confirmationRequired": false, + "prompts": {}, + "slots": [ + { + "name": "month", + "type": "AMAZON.Month", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.795077103633" + } + }, + { + "name": "day", + "type": "AMAZON.Ordinal", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.985837334781" + } + }, + { + "name": "year", + "type": "AMAZON.FOUR_DIGIT_NUMBER", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.27341833344" + } + } + ] + } + ], + "delegationStrategy": "ALWAYS" + }, + "prompts": [ + { + "id": "Elicit.Slot.303899476312.795077103633", + "variations": [ + { + "type": "PlainText", + "value": "I was born in November. What month were you born?" + }, + { + "type": "PlainText", + "value": "What month were you born?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.985837334781", + "variations": [ + { + "type": "PlainText", + "value": "I was born on the sixth. What day were you born?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.27341833344", + "variations": [ + { + "type": "PlainText", + "value": "I was born in two thousand fourteen, what year were you born?" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/models/en-GB.json b/models/en-GB.json new file mode 100644 index 0000000..245304d --- /dev/null +++ b/models/en-GB.json @@ -0,0 +1,124 @@ +{ + "interactionModel": { + "languageModel": { + "invocationName": "cake walk", + "intents": [ + { + "name": "AMAZON.CancelIntent", + "samples": [] + }, + { + "name": "AMAZON.HelpIntent", + "samples": [] + }, + { + "name": "AMAZON.StopIntent", + "samples": [] + }, + { + "name": "AMAZON.NavigateHomeIntent", + "samples": [] + }, + { + "name": "CaptureBirthdayIntent", + "slots": [ + { + "name": "month", + "type": "AMAZON.Month" + }, + { + "name": "day", + "type": "AMAZON.Ordinal" + }, + { + "name": "year", + "type": "AMAZON.FOUR_DIGIT_NUMBER" + } + ], + "samples": [ + "{month} {day}", + "{month} {day} {year}", + "{month} {year}", + "I was born on {month} {day} ", + "I was born on {month} {day} {year}", + "I was born on {month} {year}", + "register my birthday" + ] + } + ], + "types": [] + }, + "dialog": { + "intents": [ + { + "name": "CaptureBirthdayIntent", + "confirmationRequired": false, + "prompts": {}, + "slots": [ + { + "name": "month", + "type": "AMAZON.Month", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.795077103633" + } + }, + { + "name": "day", + "type": "AMAZON.Ordinal", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.985837334781" + } + }, + { + "name": "year", + "type": "AMAZON.FOUR_DIGIT_NUMBER", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.27341833344" + } + } + ] + } + ], + "delegationStrategy": "ALWAYS" + }, + "prompts": [ + { + "id": "Elicit.Slot.303899476312.795077103633", + "variations": [ + { + "type": "PlainText", + "value": "I was born in November. What month were you born?" + }, + { + "type": "PlainText", + "value": "What month were you born?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.985837334781", + "variations": [ + { + "type": "PlainText", + "value": "I was born on the sixth. What day were you born?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.27341833344", + "variations": [ + { + "type": "PlainText", + "value": "I was born in two thousand fourteen, what year were you born?" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/models/es-ES.json b/models/es-ES.json new file mode 100644 index 0000000..b86c272 --- /dev/null +++ b/models/es-ES.json @@ -0,0 +1,136 @@ +{ + "interactionModel": { + "languageModel": { + "invocationName": "feliz cumpleaños", + "intents": [ + { + "name": "AMAZON.CancelIntent", + "samples": [] + }, + { + "name": "AMAZON.HelpIntent", + "samples": [] + }, + { + "name": "AMAZON.StopIntent", + "samples": [] + }, + { + "name": "AMAZON.NavigateHomeIntent", + "samples": [] + }, + { + "name": "CaptureBirthdayIntent", + "slots": [ + { + "name": "month", + "type": "AMAZON.Month" + }, + { + "name": "day", + "type": "AMAZON.NUMBER" + }, + { + "name": "year", + "type": "AMAZON.NUMBER" + } + ], + "samples": [ + "{month} del {year}", + "{day} de {month}", + "el año {year}", + "en {year}", + "nací en {year}", + "nací en {year}", + "el {day} de {month}", + "el día {day} de {month}", + "mi fecha de nacimiento es el {day} de {month} de {year}", + "mi fecha de nacimiento es el {day} de {month} {year}", + "nací el {day} de {month} {year}", + "mi cumpleaños es el {day} de {month} {year}", + "registra mi cumpleaños", + "apunta mi cumpleaños", + "apunta mi fecha de nacimiento", + "registra mi fecha de nacimiento", + "recuerda mi cumpleaños", + "acuérdate de mi cumpleaños", + "apúntate mi cumple" + ] + } + ], + "types": [] + }, + "dialog": { + "intents": [ + { + "name": "CaptureBirthdayIntent", + "confirmationRequired": false, + "prompts": {}, + "slots": [ + { + "name": "month", + "type": "AMAZON.Month", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.795077103633" + } + }, + { + "name": "day", + "type": "AMAZON.NUMBER", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.985837334781" + } + }, + { + "name": "year", + "type": "AMAZON.NUMBER", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.27341833344" + } + } + ] + } + ], + "delegationStrategy": "ALWAYS" + }, + "prompts": [ + { + "id": "Elicit.Slot.303899476312.795077103633", + "variations": [ + { + "type": "PlainText", + "value": "Yo nací en noviembre. Y tú?" + }, + { + "type": "PlainText", + "value": "Cual es tu mes de nacimiento?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.985837334781", + "variations": [ + { + "type": "PlainText", + "value": "Nací el 6. Qué día del mes es tu cumpleaños?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.27341833344", + "variations": [ + { + "type": "PlainText", + "value": "Nací en dos mil catorce, y tú en qué año?" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/models/es-MX.json b/models/es-MX.json new file mode 100644 index 0000000..b86c272 --- /dev/null +++ b/models/es-MX.json @@ -0,0 +1,136 @@ +{ + "interactionModel": { + "languageModel": { + "invocationName": "feliz cumpleaños", + "intents": [ + { + "name": "AMAZON.CancelIntent", + "samples": [] + }, + { + "name": "AMAZON.HelpIntent", + "samples": [] + }, + { + "name": "AMAZON.StopIntent", + "samples": [] + }, + { + "name": "AMAZON.NavigateHomeIntent", + "samples": [] + }, + { + "name": "CaptureBirthdayIntent", + "slots": [ + { + "name": "month", + "type": "AMAZON.Month" + }, + { + "name": "day", + "type": "AMAZON.NUMBER" + }, + { + "name": "year", + "type": "AMAZON.NUMBER" + } + ], + "samples": [ + "{month} del {year}", + "{day} de {month}", + "el año {year}", + "en {year}", + "nací en {year}", + "nací en {year}", + "el {day} de {month}", + "el día {day} de {month}", + "mi fecha de nacimiento es el {day} de {month} de {year}", + "mi fecha de nacimiento es el {day} de {month} {year}", + "nací el {day} de {month} {year}", + "mi cumpleaños es el {day} de {month} {year}", + "registra mi cumpleaños", + "apunta mi cumpleaños", + "apunta mi fecha de nacimiento", + "registra mi fecha de nacimiento", + "recuerda mi cumpleaños", + "acuérdate de mi cumpleaños", + "apúntate mi cumple" + ] + } + ], + "types": [] + }, + "dialog": { + "intents": [ + { + "name": "CaptureBirthdayIntent", + "confirmationRequired": false, + "prompts": {}, + "slots": [ + { + "name": "month", + "type": "AMAZON.Month", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.795077103633" + } + }, + { + "name": "day", + "type": "AMAZON.NUMBER", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.985837334781" + } + }, + { + "name": "year", + "type": "AMAZON.NUMBER", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.27341833344" + } + } + ] + } + ], + "delegationStrategy": "ALWAYS" + }, + "prompts": [ + { + "id": "Elicit.Slot.303899476312.795077103633", + "variations": [ + { + "type": "PlainText", + "value": "Yo nací en noviembre. Y tú?" + }, + { + "type": "PlainText", + "value": "Cual es tu mes de nacimiento?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.985837334781", + "variations": [ + { + "type": "PlainText", + "value": "Nací el 6. Qué día del mes es tu cumpleaños?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.27341833344", + "variations": [ + { + "type": "PlainText", + "value": "Nací en dos mil catorce, y tú en qué año?" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/models/es-US.json b/models/es-US.json new file mode 100644 index 0000000..b86c272 --- /dev/null +++ b/models/es-US.json @@ -0,0 +1,136 @@ +{ + "interactionModel": { + "languageModel": { + "invocationName": "feliz cumpleaños", + "intents": [ + { + "name": "AMAZON.CancelIntent", + "samples": [] + }, + { + "name": "AMAZON.HelpIntent", + "samples": [] + }, + { + "name": "AMAZON.StopIntent", + "samples": [] + }, + { + "name": "AMAZON.NavigateHomeIntent", + "samples": [] + }, + { + "name": "CaptureBirthdayIntent", + "slots": [ + { + "name": "month", + "type": "AMAZON.Month" + }, + { + "name": "day", + "type": "AMAZON.NUMBER" + }, + { + "name": "year", + "type": "AMAZON.NUMBER" + } + ], + "samples": [ + "{month} del {year}", + "{day} de {month}", + "el año {year}", + "en {year}", + "nací en {year}", + "nací en {year}", + "el {day} de {month}", + "el día {day} de {month}", + "mi fecha de nacimiento es el {day} de {month} de {year}", + "mi fecha de nacimiento es el {day} de {month} {year}", + "nací el {day} de {month} {year}", + "mi cumpleaños es el {day} de {month} {year}", + "registra mi cumpleaños", + "apunta mi cumpleaños", + "apunta mi fecha de nacimiento", + "registra mi fecha de nacimiento", + "recuerda mi cumpleaños", + "acuérdate de mi cumpleaños", + "apúntate mi cumple" + ] + } + ], + "types": [] + }, + "dialog": { + "intents": [ + { + "name": "CaptureBirthdayIntent", + "confirmationRequired": false, + "prompts": {}, + "slots": [ + { + "name": "month", + "type": "AMAZON.Month", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.795077103633" + } + }, + { + "name": "day", + "type": "AMAZON.NUMBER", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.985837334781" + } + }, + { + "name": "year", + "type": "AMAZON.NUMBER", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.27341833344" + } + } + ] + } + ], + "delegationStrategy": "ALWAYS" + }, + "prompts": [ + { + "id": "Elicit.Slot.303899476312.795077103633", + "variations": [ + { + "type": "PlainText", + "value": "Yo nací en noviembre. Y tú?" + }, + { + "type": "PlainText", + "value": "Cual es tu mes de nacimiento?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.985837334781", + "variations": [ + { + "type": "PlainText", + "value": "Nací el 6. Qué día del mes es tu cumpleaños?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.27341833344", + "variations": [ + { + "type": "PlainText", + "value": "Nací en dos mil catorce, y tú en qué año?" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/models/fr-FR.json b/models/fr-FR.json index 2da3d0d..72e891c 100644 --- a/models/fr-FR.json +++ b/models/fr-FR.json @@ -24,7 +24,7 @@ "slots": [ { "name": "day", - "type": "AMAZON.Ordinal", + "type": "AMAZON.NUMBER", "samples": [ "{day}", "le {day}", @@ -46,7 +46,7 @@ }, { "name": "year", - "type": "AMAZON.Ordinal", + "type": "AMAZON.FOUR_DIGIT_NUMBER", "samples": [ "je suis né en {year}", "mon année de naissance est {year}", @@ -58,6 +58,11 @@ } ], "samples": [ + "{day} {month} {year}", + "{day} {month}", + "{day} du mois de {month}", + "{day} du mois d' {month}", + "{day} {month} de l'année {year}", "le {day} {month} {year}", "le {day} {month}", "le {day} du mois de {month}", @@ -91,7 +96,7 @@ "slots": [ { "name": "day", - "type": "AMAZON.Ordinal", + "type": "AMAZON.NUMBER", "confirmationRequired": false, "elicitationRequired": true, "prompts": { @@ -109,7 +114,7 @@ }, { "name": "year", - "type": "AMAZON.Ordinal", + "type": "AMAZON.FOUR_DIGIT_NUMBER", "confirmationRequired": false, "elicitationRequired": true, "prompts": { diff --git a/models/hi-IN.json b/models/hi-IN.json index 59543dd..87cb675 100644 --- a/models/hi-IN.json +++ b/models/hi-IN.json @@ -1,128 +1,256 @@ { - "interactionModel": { - "languageModel": { - "invocationName": "cake walk", - "intents": [ - { - "name": "AMAZON.CancelIntent", - "samples": [] - }, - { - "name": "AMAZON.HelpIntent", - "samples": [] - }, - { - "name": "AMAZON.StopIntent", - "samples": [] - }, - { - "name": "AMAZON.NavigateHomeIntent", - "samples": [] - }, - { - "name": "CaptureBirthdayIntent", - "slots": [ + "interactionModel": { + "languageModel": { + "invocationName": "cakewalk", + "intents": [ + { + "name": "AMAZON.CancelIntent", + "samples": [] + }, + { + "name": "AMAZON.HelpIntent", + "samples": [] + }, + { + "name": "AMAZON.StopIntent", + "samples": [] + }, + { + "name": "AMAZON.NavigateHomeIntent", + "samples": [] + }, + { + "name": "CaptureBirthdayIntent", + "slots": [ + { + "name": "month", + "type": "AMAZON.Month" + }, + { + "name": "day", + "type": "AMAZON.Ordinal" + }, + { + "name": "year", + "type": "AMAZON.FOUR_DIGIT_NUMBER" + } + ], + "samples": [ + "{month} {day}", + "{day} of {month}", + "{month} {day} {year}", + "{day} of {month} {year}", + "{month} {year}", + "मेरा जन्मदिन {month} {day} मैं था ", + "मेरा जन्मदिन {month} {day} {year} था ", + "मेरा जन्मदिन {month} {year} था ", + "register my birthday", + "जनमदिन register कर दो", + "जनमदिन register करो", + "जन्मदिन register कर दो", + "जन्मदिन register करो" + ] + } + ], + "types": [ + { + "name": "AMAZON.Month", + "values": [ + { + "id": "जनवरी", + "name": { + "value": "january", + "synonyms": [ + "January", + "जनवरी" + ] + } + }, + { + "id": "फ़रवरी", + "name": { + "value": "february", + "synonyms": [ + "February", + "फ़रवरी" + ] + } + }, + { + "id": "मार्च", + "name": { + "value": "march", + "synonyms": [ + "March", + "मार्च" + ] + } + }, { - "name": "month", - "type": "AMAZON.NUMBER" - }, - { - "name": "day", - "type": "AMAZON.NUMBER" - }, - { - "name": "year", - "type": "AMAZON.FOUR_DIGIT_NUMBER" - } - ], - "samples": [ - "{month} {day}", - "{month} {day} {year}", - "{month} {year}", - "मेरा जन्मदिन {month} {day} मैं था ", - "मेरा जन्मदिन {month} {day} {year} था ", - "मेरा जन्मदिन {month} {year} था ", - "register my birthday", - "जनमदिन register कर दो", - "जनमदिन register करो", - "जन्मदिन register कर दो", - "जन्मदिन register करो" - ] - } - ], - "types": [] - }, - "dialog": { - "intents": [ - { - "name": "CaptureBirthdayIntent", - "confirmationRequired": false, - "prompts": {}, - "slots": [ - { - "name": "month", - "type": "AMAZON.NUMBER", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.303899476312.795077103633" + "id": "अप्रेल", + "name": { + "value": "april", + "synonyms": [ + "April", + "अप्रेल" + ] } }, - { - "name": "day", - "type": "AMAZON.NUMBER", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.303899476312.985837334781" - } - }, - { - "name": "year", - "type": "AMAZON.FOUR_DIGIT_NUMBER", - "confirmationRequired": false, - "elicitationRequired": true, - "prompts": { - "elicitation": "Elicit.Slot.303899476312.27341833344" - } - } - ] - } - ], - "delegationStrategy": "ALWAYS" - }, - "prompts": [ - { - "id": "Elicit.Slot.303899476312.795077103633", - "variations": [ - { - "type": "PlainText", - "value": "मेरा जन्म नवंबर में हुआ था. आपका जन्मदिन कब हैं?" - }, - { - "type": "PlainText", - "value": "किस महीना में आपका जन्म हुआ था." - } - ] - }, - { - "id": "Elicit.Slot.303899476312.985837334781", - "variations": [ - { - "type": "PlainText", - "value": "मेरा जन्म छठे पर हुआ था. आप किस दिन पैदा हुए थे?" - } - ] - }, - { - "id": "Elicit.Slot.303899476312.27341833344", - "variations": [ - { - "type": "PlainText", - "value": "मेरा जन्म 2014 में हुआ था, आप किस वर्ष पैदा हुए थे?" - } - ] - } - ] - } -} + { + "id": "मई", + "name": { + "value": "may", + "synonyms": [ + "May", + "मई" + ] + } + }, + { + "id": "जून", + "name": { + "value": "june", + "synonyms": [ + "June", + "जून" + ] + } + }, + { + "id": "जुलाई", + "name": { + "value": "july", + "synonyms": [ + "July", + "जुलाई" + ] + } + }, + { + "id": "अगस्त", + "name": { + "value": "august", + "synonyms": [ + "August", + "अगस्त" + ] + } + }, + { + "id": "सितम्बर", + "name": { + "value": "september", + "synonyms": [ + "Septembeer", + "सितम्बर" + ] + } + }, + { + "id": "अक्टूबर", + "name": { + "value": "october", + "synonyms": [ + "October", + "अक्टूबर" + ] + } + }, + { + "id": "नवम्बर", + "name": { + "value": "november", + "synonyms": [ + "November", + "नवम्बर" + ] + } + }, + { + "id": "दिसम्बर", + "name": { + "value": "december", + "synonyms": [ + "December", + "दिसम्बर" + ] + } + } + ] + } + ] + }, + "dialog": { + "intents": [ + { + "name": "CaptureBirthdayIntent", + "confirmationRequired": false, + "prompts": {}, + "slots": [ + { + "name": "month", + "type": "AMAZON.Month", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.795077103633" + } + }, + { + "name": "day", + "type": "AMAZON.Ordinal", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.985837334781" + } + }, + { + "name": "year", + "type": "AMAZON.FOUR_DIGIT_NUMBER", + "confirmationRequired": false, + "elicitationRequired": true, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.27341833344" + } + } + ] + } + ], + "delegationStrategy": "ALWAYS" + }, + "prompts": [ + { + "id": "Elicit.Slot.303899476312.795077103633", + "variations": [ + { + "type": "PlainText", + "value": "मेरा जन्म नवंबर में हुआ था. आपका जन्मदिन कब हैं?" + }, + { + "type": "PlainText", + "value": "किस महीना में आपका जन्म हुआ था." + } + ] + }, + { + "id": "Elicit.Slot.303899476312.985837334781", + "variations": [ + { + "type": "PlainText", + "value": "मेरा जन्म छठे पर हुआ था. आप किस दिन पैदा हुए थे?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.27341833344", + "variations": [ + { + "type": "PlainText", + "value": "मेरा जन्म 2014 में हुआ था, आप किस वर्ष पैदा हुए थे?" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/models/pt-BR.json b/models/pt-BR.json new file mode 100644 index 0000000..53da622 --- /dev/null +++ b/models/pt-BR.json @@ -0,0 +1,128 @@ +{ + "interactionModel": { + "languageModel": { + "invocationName": "feliz aniversário", + "intents": [ + { + "name": "AMAZON.CancelIntent", + "samples": [] + }, + { + "name": "AMAZON.HelpIntent", + "samples": [] + }, + { + "name": "AMAZON.StopIntent", + "samples": [] + }, + { + "name": "AMAZON.NavigateHomeIntent", + "samples": [] + }, + { + "name": "CaptureBirthdayIntent", + "slots": [ + { + "name": "month", + "type": "AMAZON.Month" + }, + { + "name": "day", + "type": "AMAZON.NUMBER" + }, + { + "name": "year", + "type": "AMAZON.FOUR_DIGIT_NUMBER" + } + ], + "samples": [ + "dia {day} de {month} de {year}", + "{day} de {month} de {year}", + "{day} de {month}", + "Eu nasci em {day} de {month}", + "Eu nasci em {day} de {month} de {year}", + "Eu nasci em {month} de {year}", + "Eu nasci no dia {day}", + "Eu nasci no dia {day} de {month}", + "Eu nasci no dia {day} de {month} de {year}", + "anote meu aniversário" + ] + } + ], + "types": [] + }, + "dialog": { + "intents": [ + { + "name": "CaptureBirthdayIntent", + "confirmationRequired": false, + "prompts": {}, + "slots": [ + { + "name": "month", + "type": "AMAZON.Month", + "elicitationRequired": true, + "confirmationRequired": false, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.795077103633" + } + }, + { + "name": "day", + "type": "AMAZON.NUMBER", + "elicitationRequired": true, + "confirmationRequired": false, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.985837334781" + } + }, + { + "name": "year", + "type": "AMAZON.FOUR_DIGIT_NUMBER", + "elicitationRequired": true, + "confirmationRequired": false, + "prompts": { + "elicitation": "Elicit.Slot.303899476312.27341833344" + } + } + ] + } + ], + "delegationStrategy": "ALWAYS" + }, + "prompts": [ + { + "id": "Elicit.Slot.303899476312.795077103633", + "variations": [ + { + "type": "PlainText", + "value": "Eu nasci em Novembro. Em que mês você nasceu?" + }, + { + "type": "PlainText", + "value": "Qual o mês do seu nascimento?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.985837334781", + "variations": [ + { + "type": "PlainText", + "value": "Eu nasci no dia seis. Qual o dia do seu nascimento?" + } + ] + }, + { + "id": "Elicit.Slot.303899476312.27341833344", + "variations": [ + { + "type": "PlainText", + "value": "Eu nasci em dois mil e catorze, em que ano você nasceu?" + } + ] + } + ] + }, + "version": "4" + } \ No newline at end of file diff --git a/skill.json b/skill.json index dc10556..44ae74f 100644 --- a/skill.json +++ b/skill.json @@ -3,25 +3,25 @@ "publishingInformation": { "locales": { "en-US": { - "name": "cake walk" + "name": "cake walk" }, "en-AU": { - "name": "cake walk" + "name": "cake walk" }, "en-CA": { - "name": "cake walk" + "name": "cake walk" }, "en-GB": { - "name": "cake walk" + "name": "cake walk" }, "en-IN": { - "name": "cake walk" + "name": "cake walk" }, "pt-BR": { - "name": "feliz aniversário" + "name": "feliz aniversário" }, "it-IT": { - "name": "buon compleanno" + "name": "buon compleanno" }, "fr-FR": { "name": "Joyeux Anniversaire" @@ -56,11 +56,10 @@ "apis": { "custom": { "endpoint": { - "sourceDir": "lambda", - "uri": "ask-custom-cake-walk" + "uri": "arn:aws:lambda:us-east-1:272347969877:function:dd1e21e4-3af4-4b76-a8e1-e582e9fd2c22:Release_0" } } }, "manifestVersion": "1.0" } -} +} \ No newline at end of file From 1693069cc2ff6cd2928eefec55502c03116a398a Mon Sep 17 00:00:00 2001 From: bbezerra Date: Tue, 7 Jan 2020 13:22:12 +0000 Subject: [PATCH 3/5] reverted manifst.apis.custom.endpoint property to original value --- skill.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/skill.json b/skill.json index 44ae74f..079ea1c 100644 --- a/skill.json +++ b/skill.json @@ -56,7 +56,8 @@ "apis": { "custom": { "endpoint": { - "uri": "arn:aws:lambda:us-east-1:272347969877:function:dd1e21e4-3af4-4b76-a8e1-e582e9fd2c22:Release_0" + "sourceDir": "lambda", + "uri": "ask-custom-cake-walk" } } }, From 9f195c6a609b62aabf696f1ac00b9fc8acc1cecd Mon Sep 17 00:00:00 2001 From: bbezerra Date: Fri, 17 Jan 2020 11:46:55 +0000 Subject: [PATCH 4/5] removed dependency from prompts.py --- lambda/py/lambda_function.py | 36 ++++++++++++++++++------------------ lambda/py/prompts.py | 14 -------------- 2 files changed, 18 insertions(+), 32 deletions(-) delete mode 100644 lambda/py/prompts.py diff --git a/lambda/py/lambda_function.py b/lambda/py/lambda_function.py index 7ca23c0..b764619 100644 --- a/lambda/py/lambda_function.py +++ b/lambda/py/lambda_function.py @@ -12,7 +12,6 @@ import requests import calendar import gettext -import prompts from datetime import datetime from pytz import timezone from ask_sdk_s3.adapter import S3Adapter @@ -46,8 +45,8 @@ def can_handle(self, handler_input): def handle(self, handler_input): data = handler_input.attributes_manager.request_attributes["_"] - speech = data[prompts.WELCOME_MSG] - reprompt = data[prompts.WELCOME_REPROMPT_MSG] + speech = data["WELCOME_MSG"] + reprompt = data["WELCOME_REPROMPT_MSG"] handler_input.response_builder.speak(speech).ask(reprompt) return handler_input.response_builder.response @@ -70,7 +69,7 @@ def handle(self, handler_input): day = int(attr['day']) data = handler_input.attributes_manager.request_attributes["_"] - error_timezone_speech = data[prompts.ERROR_TIMEZONE_MSG] + error_timezone_speech = data["ERROR_TIMEZONE_MSG"] # get skill locale from request skill_locale = handler_input.request_envelope.request.locale @@ -125,35 +124,35 @@ def handle(self, handler_input): # if it is not the user birthday if now_date != next_birthday: if diff_days > 1: - speak_output = data[prompts.WELCOME_BACK_MSG_plural].format(diff_days, current_year-year) + speak_output = data["WELCOME_BACK_MSG_plural"].format(diff_days, current_year-year) if diff_days < 2: - speak_output = data[prompts.WELCOME_BACK_MSG].format(diff_days, current_year - year) + speak_output = data["WELCOME_BACK_MSG"].format(diff_days, current_year - year) # if it is the user birthday else: if (current_year - year > 1): - speak_output = data[prompts.HAPPY_BIRTHDAY_MSG_plural].format(current_year - year) + speak_output = data["HAPPY_BIRTHDAY_MSG_plural"].format(current_year - year) if current_year - year < 2: - speak_output = data[prompts.HAPPY_BIRTHDAY_MSG].format(current_year - year) + speak_output = data["HAPPY_BIRTHDAY_MSG"].format(current_year - year) # all other locales else: - speak_output = data[prompts.HAPPY_BIRTHDAY_MSG].format(current_year - year) + speak_output = data["HAPPY_BIRTHDAY_MSG"].format(current_year - year) # if it is not the user birthday if now_date != next_birthday: if diff_days > 1: # for ja and hi, the order of the slots is inverted, i.e. year before day if ('ja' in skill_locale or 'hi' in skill_locale): - speak_output = data[prompts.WELCOME_BACK_MSG_plural].format(current_year-year, diff_days) + speak_output = data["WELCOME_BACK_MSG_plural"].format(current_year-year, diff_days) else: - speak_output = data[prompts.WELCOME_BACK_MSG_plural].format(diff_days, current_year-year) + speak_output = data["WELCOME_BACK_MSG_plural"].format(diff_days, current_year-year) elif diff_days < 2: # for ja and hi, the order of the slots is inverted, i.e. year before day if ('ja' in skill_locale or 'hi' in skill_locale): - speak_output = data[prompts.WELCOME_BACK_MSG].format(current_year - year, diff_days) + speak_output = data["WELCOME_BACK_MSG"].format(current_year - year, diff_days) else: - speak_output = data[prompts.WELCOME_BACK_MSG].format(diff_days, current_year - year) + speak_output = data["WELCOME_BACK_MSG"].format(diff_days, current_year - year) return ( handler_input.response_builder @@ -203,8 +202,9 @@ def handle(self, handler_input): # ensure that the order the arguments is correct (MM/DD/YYYY or DD/MM/YYYY) according to locale date = self.formatDate(year, month, day, skill_locale) - speech = data[prompts.REGISTER_BIRTHDAY_MSG].format(date[0], date[1], date[2]) + speech = data["REGISTER_BIRTHDAY_MSG"].format(date[0], date[1], date[2]) handler_input.response_builder.speak(speech) + handler_input.response_builder.set_should_end_session(True) return handler_input.response_builder.response # function to ensure that the date format corresponds with the locale that is triggering thee skill @@ -239,7 +239,7 @@ def handle(self, handler_input): # type: (HandlerInput) -> Response data = handler_input.attributes_manager.request_attributes["_"] - speak_output = data[prompts.HELP_MSG] + speak_output = data["HELP_MSG"] return ( handler_input.response_builder @@ -259,7 +259,7 @@ def can_handle(self, handler_input): def handle(self, handler_input): # type: (HandlerInput) -> Response data = handler_input.attributes_manager.request_attributes["_"] - speak_output = data[prompts.GOODBYE_MSG] + speak_output = data["GOODBYE_MSG"] return ( handler_input.response_builder @@ -296,7 +296,7 @@ def handle(self, handler_input): # type: (HandlerInput) -> Response data = handler_input.attributes_manager.request_attributes["_"] intent_name = ask_utils.get_intent_name(handler_input) - speak_output = data[prompts.REFLECTOR_MSG].format(intent_name) + speak_output = data["REFLECTOR_MSG"].format(intent_name) return ( handler_input.response_builder @@ -319,7 +319,7 @@ def handle(self, handler_input, exception): # type: (HandlerInput, Exception) -> Response logger.error(exception, exc_info=True) data = handler_input.attributes_manager.request_attributes["_"] - speak_output = data[prompts.ERROR_MSG] + speak_output = data["ERROR_MSG"] return ( handler_input.response_builder diff --git a/lambda/py/prompts.py b/lambda/py/prompts.py deleted file mode 100644 index 1e69284..0000000 --- a/lambda/py/prompts.py +++ /dev/null @@ -1,14 +0,0 @@ -# Alexa Prompts Language Constants - -WELCOME_MSG = "WELCOME_MSG" -WELCOME_REPROMPT_MSG = "WELCOME_REPROMPT_MSG" -WELCOME_BACK_MSG = "WELCOME_BACK_MSG" -WELCOME_BACK_MSG_plural = "WELCOME_BACK_MSG_plural" -HAPPY_BIRTHDAY_MSG = "HAPPY_BIRTHDAY_MSG" -HAPPY_BIRTHDAY_MSG_plural = "HAPPY_BIRTHDAY_MSG_plural" -REGISTER_BIRTHDAY_MSG = "REGISTER_BIRTHDAY_MSG" -HELP_MSG = "HELP_MSG" -GOODBYE_MSG = "GOODBYE_MSG" -REFLECTOR_MSG = "REFLECTOR_MSG" -ERROR_MSG = "ERROR_MSG" -ERROR_TIMEZONE_MSG = "ERROR_TIMEZONE_MSG" \ No newline at end of file From bc4f61f9cdd651fd67aca94b5c8147063aea279e Mon Sep 17 00:00:00 2001 From: bbezerra Date: Fri, 17 Jan 2020 11:57:59 +0000 Subject: [PATCH 5/5] corrected skill names --- skill.json | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/skill.json b/skill.json index 079ea1c..29f6f5b 100644 --- a/skill.json +++ b/skill.json @@ -2,52 +2,52 @@ "manifest": { "publishingInformation": { "locales": { - "en-US": { - "name": "cake walk" + "de-DE": { + "name": "Herzlichen Glückwunsch" }, "en-AU": { - "name": "cake walk" + "name": "Cake Walk" }, "en-CA": { - "name": "cake walk" + "name": "Cake Walk" }, "en-GB": { - "name": "cake walk" + "name": "Cake Walk" }, "en-IN": { - "name": "cake walk" + "name": "Cake Walk" }, - "pt-BR": { - "name": "feliz aniversário" + "en-US": { + "name": "Cake Walk" }, - "it-IT": { - "name": "buon compleanno" + "es-ES": { + "name": "Feliz Cumpleaños" + }, + "es-MX": { + "name": "Feliz Cumpleaños" + }, + "es-US": { + "name": "Feliz Cumpleaños" }, - "fr-FR": { - "name": "Joyeux Anniversaire" - }, "fr-CA": { "name": "Bonne Fête" }, + "fr-FR": { + "name": "Joyeux Anniversaire" + }, "hi-IN": { - "name": "cake walk" + "name": "Cake Walk" + }, + "it-IT": { + "name": "Buon Compleanno" }, "ja-JP": { "name": "ケークウォーク" }, - "de-DE": { - "name": "Herzlichen Glückwunsch" - }, - "es-ES": { - "name": "feliz cumpleaños" - }, - "es-MX": { - "name": "feliz cumpleaños" - }, - "es-US": { - "name": "feliz cumpleaños" + "pt-BR": { + "name": "Feliz Aniversário" } - }, + }, "isAvailableWorldwide": true, "testingInstructions": "Sample Testing Instructions.", "category": "EDUCATION_AND_REFERENCE",