diff --git a/libraries/botbuilder-dialogs-adaptive-testing/tests/action.test.js b/libraries/botbuilder-dialogs-adaptive-testing/tests/action.test.js index 7eaaf7ed4b..9ae74163b7 100644 --- a/libraries/botbuilder-dialogs-adaptive-testing/tests/action.test.js +++ b/libraries/botbuilder-dialogs-adaptive-testing/tests/action.test.js @@ -390,10 +390,6 @@ describe('ActionTests', function () { await TestUtils.runTestScript(resourceExplorer, 'Action_SetProperties'); }); - it('MissingProperty', async () => { - await TestUtils.runTestScript(resourceExplorer, 'Action_MissingProperty'); - }); - it('SetProperty', async () => { await TestUtils.runTestScript(resourceExplorer, 'Action_SetProperty'); }); diff --git a/libraries/botbuilder-dialogs-adaptive-testing/tests/resources/ActionTests/Action_MissingProperty.test.dialog b/libraries/botbuilder-dialogs-adaptive-testing/tests/resources/ActionTests/Action_MissingProperty.test.dialog deleted file mode 100644 index c766a054c8..0000000000 --- a/libraries/botbuilder-dialogs-adaptive-testing/tests/resources/ActionTests/Action_MissingProperty.test.dialog +++ /dev/null @@ -1,167 +0,0 @@ -{ - "$schema": "../../../tests.schema", - "$kind": "Microsoft.Test.Script", - "dialog": { - "$kind": "Microsoft.AdaptiveDialog", - "id": "planningTest", - "generator": "main.lg", - "triggers": [ - { - "$kind": "Microsoft.OnBeginDialog", - "actions": [ - { - "$kind": "Microsoft.SetProperty", - "property": "user.missingProperties", - "value": "=missingProperties('${dialog.first} and ${dialog.second}')" - }, - { - "$kind": "Microsoft.Foreach", - "itemsProperty": "user.missingProperties", - "actions": [ - { - "$kind": "Microsoft.IfCondition", - "condition": "empty(getProperty(dialog.foreach.value))", - "actions": [ - { - "$kind": "Microsoft.TextInput", - "property": "=dialog.foreach.value", - "prompt": "Hello, please input ${dialog.foreach.value}" - } - ] - } - ] - }, - { - "$kind": "Microsoft.SendActivity", - "activity": "You finish all slot filling. And get result: ${dialog.first} and ${dialog.second}" - }, - { - "$kind": "Microsoft.SetProperty", - "property": "user.missingProperties", - "value": "=missingProperties('${nameAndAge()}')" - }, - { - "$kind": "Microsoft.Foreach", - "itemsProperty": "user.missingProperties", - "actions": [ - { - "$kind": "Microsoft.IfCondition", - "condition": "empty(getProperty(dialog.foreach.value))", - "actions": [ - { - "$kind": "Microsoft.TextInput", - "property": "=dialog.foreach.value", - "prompt": "Hello, please input ${dialog.foreach.value}" - } - ] - } - ] - }, - { - "$kind": "Microsoft.SendActivity", - "activity": "You finish all slot filling. And get result: ${nameAndAge()}" - }, - { - "$kind": "Microsoft.SetProperty", - "property": "user.missingProperties", - "value": "=missingProperties('${nameAndAge()}')" - }, - { - "$kind": "Microsoft.SendActivity", - "activity": "${count(user.missingProperties)}" - }, - { - "$kind": "Microsoft.BeginDialog", - "options": {}, - "dialog": { - "$kind": "Microsoft.AdaptiveDialog", - "generator": "sub.lg", - "triggers": [ - { - "$kind": "Microsoft.OnBeginDialog", - "actions": [ - { - "$kind": "Microsoft.SetProperty", - "property": "user.missingProperties", - "value": "=missingProperties('${showPetName()}')" - }, - { - "$kind": "Microsoft.SendActivity", - "activity": "${count(user.missingProperties)}" - } - ] - } - ] - } - }, - { - "$kind": "Microsoft.SetProperty", - "property": "user.missingProperties", - "value": "=missingProperties('${nameAndAge()}')" - }, - { - "$kind": "Microsoft.SendActivity", - "activity": "${count(user.missingProperties)}" - } - ] - } - ] - }, - "script": [ - { - "$kind": "Microsoft.Test.UserConversationUpdate" - }, - { - "$kind": "Microsoft.Test.AssertReply", - "text": "Hello, please input dialog.first" - }, - { - "$kind": "Microsoft.Test.UserSays", - "text": "1" - }, - { - "$kind": "Microsoft.Test.AssertReply", - "text": "Hello, please input dialog.second" - }, - { - "$kind": "Microsoft.Test.UserSays", - "text": "2" - }, - { - "$kind": "Microsoft.Test.AssertReply", - "text": "You finish all slot filling. And get result: 1 and 2" - }, - { - "$kind": "Microsoft.Test.AssertReply", - "text": "Hello, please input user.name" - }, - { - "$kind": "Microsoft.Test.UserSays", - "text": "Jack" - }, - { - "$kind": "Microsoft.Test.AssertReply", - "text": "Hello, please input user.age" - }, - { - "$kind": "Microsoft.Test.UserSays", - "text": "20" - }, - { - "$kind": "Microsoft.Test.AssertReply", - "text": "You finish all slot filling. And get result: my name is Jack and my age is 20" - }, - { - "$kind": "Microsoft.Test.AssertReply", - "text": "2" - }, - { - "$kind": "Microsoft.Test.AssertReply", - "text": "1" - }, - { - "$kind": "Microsoft.Test.AssertReply", - "text": "2" - } - ] -} diff --git a/libraries/botbuilder-dialogs-adaptive-testing/tests/resources/ActionTests/main.lg b/libraries/botbuilder-dialogs-adaptive-testing/tests/resources/ActionTests/main.lg index ba864d3ad2..8457d4f11f 100644 --- a/libraries/botbuilder-dialogs-adaptive-testing/tests/resources/ActionTests/main.lg +++ b/libraries/botbuilder-dialogs-adaptive-testing/tests/resources/ActionTests/main.lg @@ -18,6 +18,3 @@ # length - length in main - -# nameAndAge -- my name is ${user.name} and my age is ${user.age} \ No newline at end of file diff --git a/libraries/botbuilder-dialogs-adaptive-testing/tests/resources/ActionTests/sub.lg b/libraries/botbuilder-dialogs-adaptive-testing/tests/resources/ActionTests/sub.lg deleted file mode 100644 index df3743368b..0000000000 --- a/libraries/botbuilder-dialogs-adaptive-testing/tests/resources/ActionTests/sub.lg +++ /dev/null @@ -1,2 +0,0 @@ -# showPetName -- the pet's name is ${petName} \ No newline at end of file diff --git a/libraries/botbuilder-dialogs-adaptive/etc/botbuilder-dialogs-adaptive.api.md b/libraries/botbuilder-dialogs-adaptive/etc/botbuilder-dialogs-adaptive.api.md index 2327a416ae..e88ab2dbff 100644 --- a/libraries/botbuilder-dialogs-adaptive/etc/botbuilder-dialogs-adaptive.api.md +++ b/libraries/botbuilder-dialogs-adaptive/etc/botbuilder-dialogs-adaptive.api.md @@ -43,11 +43,9 @@ import { Headers as Headers_2 } from 'node-fetch'; import { ImportResolverDelegate } from 'botbuilder-lg'; import { IntExpression } from 'adaptive-expressions'; import { ListStyle } from 'botbuilder-dialogs'; -import { MemoryInterface } from 'adaptive-expressions'; import { ModelResult } from 'botbuilder-dialogs'; import { NumberExpression } from 'adaptive-expressions'; import { ObjectExpression } from 'adaptive-expressions'; -import { Options } from 'adaptive-expressions'; import { PromptOptions } from 'botbuilder-dialogs'; import { Recognizer } from 'botbuilder-dialogs'; import { RecognizerConfiguration } from 'botbuilder-dialogs'; @@ -1366,7 +1364,6 @@ export class LanguageGenerationBotComponent extends BotComponent { // @public export interface LanguageGenerator> { generate(dialogContext: DialogContext, template: string, data: D): Promise; - missingProperties(dialogContext: DialogContext, template: string, state?: MemoryInterface, options?: Options): string[]; } // @public @@ -1448,12 +1445,6 @@ export class MentionEntityRecognizer extends TextEntityRecognizer { protected _recognize(text: string, culture: string): ModelResult[]; } -// @public -export class MissingPropertiesFunction extends ExpressionEvaluator { - constructor(context: DialogContext); - static readonly functionName = "missingProperties"; - } - // @public (undocumented) export class MostSpecificSelector extends TriggerSelector implements MostSpecificSelectorConfiguration { // (undocumented) @@ -1489,8 +1480,6 @@ export abstract class MultiLanguageGeneratorBase; @@ -2339,8 +2328,7 @@ export class TemplateEngineLanguageGenerator; // (undocumented) id: string; - missingProperties(dialogContext: DialogContext, template: string, _state?: MemoryInterface, _options?: Options): string[]; -} + } // @public (undocumented) export interface TemplateEngineLanguageGeneratorConfiguration { diff --git a/libraries/botbuilder-dialogs-adaptive/package.json b/libraries/botbuilder-dialogs-adaptive/package.json index ecbf7bc0be..29f24208dd 100644 --- a/libraries/botbuilder-dialogs-adaptive/package.json +++ b/libraries/botbuilder-dialogs-adaptive/package.json @@ -36,8 +36,7 @@ "botbuilder-dialogs-declarative": "4.1.6", "botbuilder-lg": "4.1.6", "lodash": "^4.17.21", - "node-fetch": "^2.6.0", - "uuid": "^8.3.2" + "node-fetch": "^2.6.0" }, "devDependencies": { "@microsoft/recognizers-text": "~1.1.4", diff --git a/libraries/botbuilder-dialogs-adaptive/src/adaptiveDialog.ts b/libraries/botbuilder-dialogs-adaptive/src/adaptiveDialog.ts index acb27798d2..d6bfb659e0 100644 --- a/libraries/botbuilder-dialogs-adaptive/src/adaptiveDialog.ts +++ b/libraries/botbuilder-dialogs-adaptive/src/adaptiveDialog.ts @@ -6,7 +6,7 @@ * Licensed under the MIT License. */ -import { BoolExpression, BoolExpressionConverter, Expression, IntExpression } from 'adaptive-expressions'; +import { BoolExpression, BoolExpressionConverter, IntExpression } from 'adaptive-expressions'; import { Activity, ActivityTypes, @@ -48,7 +48,6 @@ import { EntityAssignment } from './entityAssignment'; import { EntityAssignmentComparer } from './entityAssignmentComparer'; import { EntityAssignments } from './entityAssignments'; import { EntityInfo, NormalizedEntityInfos } from './entityInfo'; -import { MissingPropertiesFunction } from './functions'; import { LanguageGenerator } from './languageGenerator'; import { languageGeneratorKey } from './languageGeneratorExtensions'; import { BoolProperty } from './properties'; @@ -776,10 +775,6 @@ export class AdaptiveDialog extends DialogContainer im protected onSetScopedServices(dialogContext: DialogContext): void { if (this.generator) { dialogContext.services.set(languageGeneratorKey, this.generator); - Expression.functions.set( - MissingPropertiesFunction.functionName, - new MissingPropertiesFunction(dialogContext) - ); } } diff --git a/libraries/botbuilder-dialogs-adaptive/src/functions/index.ts b/libraries/botbuilder-dialogs-adaptive/src/functions/index.ts index 32b48d1647..50e62b43f5 100644 --- a/libraries/botbuilder-dialogs-adaptive/src/functions/index.ts +++ b/libraries/botbuilder-dialogs-adaptive/src/functions/index.ts @@ -8,4 +8,3 @@ export * from './hasPendingActionsFunction'; export * from './isDialogActiveFunction'; -export * from './missingPropertiesFunction'; diff --git a/libraries/botbuilder-dialogs-adaptive/src/functions/missingPropertiesFunction.ts b/libraries/botbuilder-dialogs-adaptive/src/functions/missingPropertiesFunction.ts deleted file mode 100644 index e56abc1ab3..0000000000 --- a/libraries/botbuilder-dialogs-adaptive/src/functions/missingPropertiesFunction.ts +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @module botbuilder-dialogs-adaptive - */ -/** - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. - */ - -import { - Expression, - ExpressionEvaluator, - FunctionUtils, - MemoryInterface, - Options, - ReturnType, - ValueWithError, -} from 'adaptive-expressions'; -import { LanguageGenerator } from '../languageGenerator'; - -import { DialogContext, DialogStateManager } from 'botbuilder-dialogs'; -/** - * Defines missingProperties(template) expression function. - * This expression will get all variables the template contains. - * - * @example missingProperties('${a} ${b}') - */ -export class MissingPropertiesFunction extends ExpressionEvaluator { - /** - * Function identifier name. - */ - public static readonly functionName = 'missingProperties'; // `name` is reserved in JavaScript. - - private static readonly generatorPath = 'dialogclass.generator'; - - private static dialogContext: DialogContext; - - /** - * Intializes a new instance of the [MissingProperties](xref:botbuilder-dialogs-adaptive.MissingProperties) class. - * - * @param context dialog context. - */ - public constructor(context: DialogContext) { - super( - MissingPropertiesFunction.functionName, - MissingPropertiesFunction.function, - ReturnType.Array, - FunctionUtils.validateUnaryString - ); - - MissingPropertiesFunction.dialogContext = context; - } - - private static function(expression: Expression, state: MemoryInterface, options: Options): ValueWithError { - const { args, error } = FunctionUtils.evaluateChildren(expression, state, options); - if (error != null) { - return { value: undefined, error }; - } - - const templateBody = args[0].toString(); - - const generator = (state as DialogStateManager).getValue(MissingPropertiesFunction.generatorPath); - if (generator) { - return { - value: generator.missingProperties( - MissingPropertiesFunction.dialogContext, - templateBody, - state, - options - ), - error: undefined, - }; - } - return { value: undefined, error: undefined }; - } -} diff --git a/libraries/botbuilder-dialogs-adaptive/src/generators/multiLanguageGeneratorBase.ts b/libraries/botbuilder-dialogs-adaptive/src/generators/multiLanguageGeneratorBase.ts index 7118079ed9..6b81d0b5b1 100644 --- a/libraries/botbuilder-dialogs-adaptive/src/generators/multiLanguageGeneratorBase.ts +++ b/libraries/botbuilder-dialogs-adaptive/src/generators/multiLanguageGeneratorBase.ts @@ -6,12 +6,10 @@ * Licensed under the MIT License. */ -import { Configurable, Converter, ConverterFactory, DialogContext, TurnPath } from 'botbuilder-dialogs'; +import { Configurable, Converter, ConverterFactory, DialogContext } from 'botbuilder-dialogs'; import { LanguageGenerator } from '../languageGenerator'; import { LanguagePolicy, LanguagePolicyConverter } from '../languagePolicy'; import { languagePolicyKey } from '../languageGeneratorExtensions'; -import { MemoryInterface, Options } from 'adaptive-expressions'; -import { TemplateEngineLanguageGenerator } from './templateEngineLanguageGenerator'; export interface MultiLanguageGeneratorBaseConfiguration { languagePolicy?: Record | LanguagePolicy; @@ -57,109 +55,33 @@ export abstract class MultiLanguageGeneratorBase< * @param data Data to bind to. */ public async generate(dialogContext: DialogContext, template: string, data: D): Promise { - const languagePolicy = this.getLanguagePolicy(dialogContext); - const targetLocale = this.getCurrentLocale(dialogContext); - const fallbackLocales = this.getFallbackLocales(languagePolicy, targetLocale); - const generators = this.getGenerators(dialogContext, fallbackLocales); - - if (generators.length === 0) { - throw Error(`No generator found for language ${targetLocale}`); - } - - const errors: string[] = []; - for (const generator of generators) { - try { - return await generator.generate(dialogContext, template, data); - } catch (e) { - errors.push(e); - } - } - - throw Error(errors.join(',\n')); - } - - public missingProperties( - dialogContext: DialogContext, - template: string, - state?: MemoryInterface, - options?: Options - ): string[] { - const currentLocale = this.getCurrentLocale(dialogContext, state, options); - const languagePolicy = this.getLanguagePolicy(dialogContext, state); - const fallbackLocales = this.getFallbackLocales(languagePolicy, currentLocale); - const generators = this.getGenerators(dialogContext, fallbackLocales); - - if (generators.length === 0) { - generators.push(new TemplateEngineLanguageGenerator()); - } - - for (const generator of generators) { - try { - return generator.missingProperties(dialogContext, template, state, options); - } catch { - // retry the next generator - } - } - - return []; - } - - private getLanguagePolicy(dialogContext: DialogContext, memory?: MemoryInterface): LanguagePolicy { // priority // 1. local policy - // 2. turn.languagePolicy // 2. shared policy in turnContext // 3. default policy - if (this.languagePolicy) { - return this.languagePolicy; - } - - if (memory) { - const lpInTurn = memory.getValue(TurnPath.languagePolicy); - if (lpInTurn != null) { - return lpInTurn; + if (!this.languagePolicy) { + this.languagePolicy = dialogContext.services.get(languagePolicyKey); + if (!this.languagePolicy) { + this.languagePolicy = new LanguagePolicy(); } } - const lpInDc = dialogContext.services.get(languagePolicyKey); - if (lpInDc) { - return lpInDc; - } - - return new LanguagePolicy(); - } - - private getCurrentLocale(dialogContext: DialogContext, memory?: MemoryInterface, options?: Options): string { - // order - // 1. turn.locale - // 2. options.locale - // 3. Context.Activity.Locale - // 4. Thread.CurrentThread.CurrentCulture.Name - if (memory) { - const localeInTurn = memory.getValue(TurnPath.locale); - if (localeInTurn) { - return localeInTurn.toString(); - } - } - - return options?.locale ?? dialogContext.getLocale(); - } - - private getFallbackLocales(languagePolicy: LanguagePolicy, targetLocale: string): string[] { + // see if we have any locales that match const fallbackLocales = []; - targetLocale = targetLocale.toLowerCase(); - if (languagePolicy.has(targetLocale)) { - fallbackLocales.push(...languagePolicy.get(targetLocale)); + const targetLocale = dialogContext.getLocale().toLowerCase(); + if (this.languagePolicy.has(targetLocale)) { + this.languagePolicy.get(targetLocale).forEach((u: string): number => fallbackLocales.push(u)); } // append empty as fallback to end - if (targetLocale !== '' && languagePolicy.has('')) { - fallbackLocales.push(...languagePolicy.get('')); + if (targetLocale !== '' && this.languagePolicy.has('')) { + this.languagePolicy.get('').forEach((u: string): number => fallbackLocales.push(u)); + } + + if (fallbackLocales.length === 0) { + throw Error(`No supported language found for ${targetLocale}`); } - return fallbackLocales; - } - private getGenerators(dialogContext: DialogContext, fallbackLocales: string[]): LanguageGenerator[] { const generators: LanguageGenerator[] = []; for (const locale of fallbackLocales) { const result = this.tryGetGenerator(dialogContext, locale); @@ -167,6 +89,20 @@ export abstract class MultiLanguageGeneratorBase< generators.push(result.result); } } - return generators; + + if (generators.length === 0) { + throw Error(`No generator found for language ${targetLocale}`); + } + + const errors: string[] = []; + for (const generator of generators) { + try { + return await generator.generate(dialogContext, template, data); + } catch (e) { + errors.push(e); + } + } + + throw Error(errors.join(',\n')); } } diff --git a/libraries/botbuilder-dialogs-adaptive/src/generators/templateEngineLanguageGenerator.ts b/libraries/botbuilder-dialogs-adaptive/src/generators/templateEngineLanguageGenerator.ts index 90d5e85794..d4eac54543 100644 --- a/libraries/botbuilder-dialogs-adaptive/src/generators/templateEngineLanguageGenerator.ts +++ b/libraries/botbuilder-dialogs-adaptive/src/generators/templateEngineLanguageGenerator.ts @@ -9,11 +9,9 @@ import { Configurable, DialogContext } from 'botbuilder-dialogs'; import { Resource } from 'botbuilder-dialogs-declarative'; import { Templates, LGResource, EvaluationOptions } from 'botbuilder-lg'; -import { MemoryInterface, Options } from 'adaptive-expressions'; import { LanguageGenerator } from '../languageGenerator'; import { LanguageResourceLoader } from '../languageResourceLoader'; import { LanguageGeneratorManager } from './languageGeneratorManager'; -import { v4 as uuidv4 } from 'uuid'; export interface TemplateEngineLanguageGeneratorConfiguration { id?: string; @@ -33,7 +31,7 @@ export class TemplateEngineLanguageGenerator> { * @returns Result of rendering template using data. */ generate(dialogContext: DialogContext, template: string, data: D): Promise; - - /** - * Method to get missing properties. - * - * @param dialogContext DialogContext. - * @param template Template. - * @param state Memory state. - * @param options Options. - * @returns Property list. - */ - missingProperties(dialogContext: DialogContext, template: string, state?: MemoryInterface, options?: Options): string[]; } diff --git a/libraries/botbuilder-dialogs-adaptive/src/languageGeneratorExtensions.ts b/libraries/botbuilder-dialogs-adaptive/src/languageGeneratorExtensions.ts index eafc314e17..ef3299b472 100644 --- a/libraries/botbuilder-dialogs-adaptive/src/languageGeneratorExtensions.ts +++ b/libraries/botbuilder-dialogs-adaptive/src/languageGeneratorExtensions.ts @@ -6,7 +6,7 @@ * Licensed under the MIT License. */ -import { DialogManager, TurnPath } from 'botbuilder-dialogs'; +import { DialogManager } from 'botbuilder-dialogs'; import { ResourceExplorer } from 'botbuilder-dialogs-declarative'; import { LanguageGeneratorManager, @@ -78,14 +78,6 @@ export class LanguageGeneratorExtensions { */ public static useLanguagePolicy(dialogManager: DialogManager, policy: LanguagePolicy): DialogManager { dialogManager.initialTurnState.set(languagePolicyKey, policy); - - const turnScope = dialogManager.initialTurnState.get('turn'); - if (turnScope) { - turnScope.languagePolicy = policy; - } else { - dialogManager.initialTurnState.set('turn', { languagePolicy: policy }); - } - return dialogManager; } } diff --git a/libraries/botbuilder-dialogs-adaptive/tests/LGGenerator.test.js b/libraries/botbuilder-dialogs-adaptive/tests/LGGenerator.test.js index f53c6f1f11..aeb50cce09 100644 --- a/libraries/botbuilder-dialogs-adaptive/tests/LGGenerator.test.js +++ b/libraries/botbuilder-dialogs-adaptive/tests/LGGenerator.test.js @@ -43,22 +43,22 @@ describe('LGLanguageGenerator', function() { it('assert empty locale', async () => { assert(lgResourceGroup.has('')); var resourceNames = lgResourceGroup.get('').map(u => u.id); - assert.equal(resourceNames.length, 8); - assert.deepStrictEqual(new Set(resourceNames), new Set(['properties.lg', 'a.lg', 'b.lg', 'c.lg', 'NormalStructuredLG.lg','root.lg', 'subDialog.lg', 'test.lg'])); + assert.equal(resourceNames.length, 7); + assert.deepStrictEqual(new Set(resourceNames), new Set(['a.lg', 'b.lg', 'c.lg', 'NormalStructuredLG.lg','root.lg', 'subDialog.lg', 'test.lg'])); }); it('assert en-us locale', async () => { assert(lgResourceGroup.has('en-us')); var resourceNames = lgResourceGroup.get('en-us').map(u => u.id); - assert.equal(resourceNames.length, 8); - assert.deepStrictEqual(new Set(resourceNames), new Set(['properties.lg', 'a.en-US.lg', 'b.en-us.lg', 'test.en-US.lg', 'c.en.lg', 'NormalStructuredLG.lg','root.lg', 'subDialog.lg'])); + assert.equal(resourceNames.length, 7); + assert.deepStrictEqual(new Set(resourceNames), new Set(['a.en-US.lg', 'b.en-us.lg', 'test.en-US.lg', 'c.en.lg', 'NormalStructuredLG.lg','root.lg', 'subDialog.lg'])); }); it('assert en locale', async () => { assert(lgResourceGroup.has('en')); var resourceNames = lgResourceGroup.get('en').map(u => u.id); - assert.equal(resourceNames.length, 8); - assert.deepStrictEqual(new Set(resourceNames), new Set(['properties.lg', 'c.en.lg', 'test.en.lg', 'a.lg', 'b.lg', 'NormalStructuredLG.lg','root.lg', 'subDialog.lg'])); + assert.equal(resourceNames.length, 7); + assert.deepStrictEqual(new Set(resourceNames), new Set(['c.en.lg', 'test.en.lg', 'a.lg', 'b.lg', 'NormalStructuredLG.lg','root.lg', 'subDialog.lg'])); }); }); @@ -86,11 +86,11 @@ describe('LGLanguageGenerator', function() { it('should throw for missing template: "${greeting()}", no data', async () => { assert.throws(() => {generator.generate(getDialogContext(), '${greeting()}', undefined);}); - }); + }); }); - - describe('Test Multi-Language Import with no locale', function() { - let generator; + + describe('Test Multi-Language Import with no locale', function() { + let generator; this.beforeAll(async function() { const resource = resourceExplorer.getResource('a.lg'); generator = new TemplateEngineLanguageGenerator(resource, lgResourceGroup); @@ -114,7 +114,7 @@ describe('LGLanguageGenerator', function() { it('"${greeting()}", no data', async () => { const result = await generator.generate(getDialogContext(), '${greeting()}', undefined); assert.strictEqual(result, 'hi'); - }); + }); }); }); @@ -125,22 +125,22 @@ describe('LGLanguageGenerator', function() { const multiLanguageResources = await LanguageResourceLoader.groupByLocale(resourceExplorer); //Should have a setup for the threadLocale here. - + let resource = resourceExplorer.getResource('test.lg'); lg.languageGenerators.set('', new TemplateEngineLanguageGenerator(resource, multiLanguageResources)); - + resource = resourceExplorer.getResource('test.de.lg'); lg.languageGenerators.set('de', new TemplateEngineLanguageGenerator(resource, multiLanguageResources)); - + resource = resourceExplorer.getResource('test.en.lg'); lg.languageGenerators.set('en', new TemplateEngineLanguageGenerator(resource, multiLanguageResources)); - + resource = resourceExplorer.getResource('test.en-US.lg'); lg.languageGenerators.set('en-us', new TemplateEngineLanguageGenerator(resource, multiLanguageResources)); - + resource = resourceExplorer.getResource('test.en-GB.lg'); lg.languageGenerators.set('en-gb', new TemplateEngineLanguageGenerator(resource, multiLanguageResources)); - + resource = resourceExplorer.getResource('test.fr.lg'); lg.languageGenerators.set('fr', new TemplateEngineLanguageGenerator(resource, multiLanguageResources)); }); @@ -255,31 +255,4 @@ describe('LGLanguageGenerator', function() { }); */ }); - - describe('TestMissingPropertiesInGenerator', () => { - let lgResourceGroup; - this.beforeAll(async function() { - lgResourceGroup = await LanguageResourceLoader.groupByLocale(resourceExplorer); - }); - - it('empty TemplateEngineLanguageGenerator', () => { - const generator = new TemplateEngineLanguageGenerator(); - const properties = generator.missingProperties(getDialogContext(''), '${user.name} and ${user.age}'); - assert.deepStrictEqual(properties, ['user.name', 'user.age']); - }); - - it('TemplateEngineLanguageGenerator', () => { - const resource = resourceExplorer.getResource('properties.lg'); - const generator = new TemplateEngineLanguageGenerator(resource, lgResourceGroup); - - const properties = generator.missingProperties(getDialogContext(''), '${nameAndAge()}'); - assert.deepStrictEqual(properties, ['user.name', 'user.age']); - }); - - it('ResourceMultiLanguageGenerator', () => { - const generator = new ResourceMultiLanguageGenerator('properties.lg'); - const properties = generator.missingProperties(getDialogContext(''), '${nameAndAge()}'); - assert.deepStrictEqual(properties, ['user.name', 'user.age']); - }); - }); -}); +}); \ No newline at end of file diff --git a/libraries/botbuilder-dialogs-adaptive/tests/lg/properties.lg b/libraries/botbuilder-dialogs-adaptive/tests/lg/properties.lg deleted file mode 100644 index 2c39bc9558..0000000000 --- a/libraries/botbuilder-dialogs-adaptive/tests/lg/properties.lg +++ /dev/null @@ -1,2 +0,0 @@ -# nameAndAge -- my name is ${user.name} and my age is ${user.age} \ No newline at end of file diff --git a/libraries/botbuilder-dialogs/etc/botbuilder-dialogs.api.md b/libraries/botbuilder-dialogs/etc/botbuilder-dialogs.api.md index 8705acb050..5eddc4ee4c 100644 --- a/libraries/botbuilder-dialogs/etc/botbuilder-dialogs.api.md +++ b/libraries/botbuilder-dialogs/etc/botbuilder-dialogs.api.md @@ -820,12 +820,8 @@ export class TurnPath { // (undocumented) static readonly interrupted = "turn.interrupted"; // (undocumented) - static readonly languagePolicy = "turn.languagePolicy"; - // (undocumented) static readonly lastResult = "turn.lastresult"; // (undocumented) - static readonly locale = "turn.locale"; - // (undocumented) static readonly recognized = "turn.recognized"; // (undocumented) static readonly recognizedEntities = "turn.recognizedEntities"; diff --git a/libraries/botbuilder-dialogs/src/dialogContext.ts b/libraries/botbuilder-dialogs/src/dialogContext.ts index 931eddf625..76356a9673 100644 --- a/libraries/botbuilder-dialogs/src/dialogContext.ts +++ b/libraries/botbuilder-dialogs/src/dialogContext.ts @@ -194,7 +194,9 @@ export class DialogContext { * @returns a locale string. */ public getLocale(): string { - const turnLocaleValue = this.state.getValue(TurnPath.locale); + const _turnLocaleProperty = 'turn.locale'; + + const turnLocaleValue = this.state.getValue(_turnLocaleProperty); if (turnLocaleValue) { return turnLocaleValue; } diff --git a/libraries/botbuilder-dialogs/src/memory/turnPath.ts b/libraries/botbuilder-dialogs/src/memory/turnPath.ts index c5af3ae5e2..bf7eaf40f3 100644 --- a/libraries/botbuilder-dialogs/src/memory/turnPath.ts +++ b/libraries/botbuilder-dialogs/src/memory/turnPath.ts @@ -45,10 +45,4 @@ export class TurnPath { /// This is a bool which if set means that the turncontext.activity has been consumed by some component in the system. public static readonly activityProcessed = 'turn.activityProcessed'; - - // Language Policy. - static readonly languagePolicy = "turn.languagePolicy"; - - /// Locale. - static readonly locale = "turn.locale"; }