From b9987f5a7fefe17ed5d581bb5248191d5cd57277 Mon Sep 17 00:00:00 2001 From: tracyboehrer Date: Wed, 10 Mar 2021 11:08:32 -0600 Subject: [PATCH 1/2] DialogContext.getLocale port from C# --- .../microsoft/bot/builder/TurnContext.java | 2 ++ .../bot/builder/TurnContextImpl.java | 2 -- .../microsoft/bot/dialogs/DialogContext.java | 19 +++++++++++++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/TurnContext.java b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/TurnContext.java index cea9ebbcf..7db509d7c 100644 --- a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/TurnContext.java +++ b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/TurnContext.java @@ -24,6 +24,8 @@ * {@link Bot} {@link Middleware} */ public interface TurnContext { + String STATE_TURN_LOCALE = "turn.locale"; + /** * Sends a trace activity to the {@link BotAdapter} for logging purposes. * diff --git a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/TurnContextImpl.java b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/TurnContextImpl.java index e64022c1c..3f3b3024c 100644 --- a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/TurnContextImpl.java +++ b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/TurnContextImpl.java @@ -67,8 +67,6 @@ public class TurnContextImpl implements TurnContext, AutoCloseable { */ private Boolean responded = false; - private static final String STATE_TURN_LOCALE = "turn.locale"; - /** * Creates a context object. * diff --git a/libraries/bot-dialogs/src/main/java/com/microsoft/bot/dialogs/DialogContext.java b/libraries/bot-dialogs/src/main/java/com/microsoft/bot/dialogs/DialogContext.java index 7416e814b..0c282e9c8 100644 --- a/libraries/bot-dialogs/src/main/java/com/microsoft/bot/dialogs/DialogContext.java +++ b/libraries/bot-dialogs/src/main/java/com/microsoft/bot/dialogs/DialogContext.java @@ -10,6 +10,7 @@ import com.microsoft.bot.connector.Async; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.concurrent.CompletableFuture; import org.apache.commons.lang3.StringUtils; @@ -529,13 +530,24 @@ public CompletableFuture emitEvent(String name, Object value, boolean b } /** - * Obtain the CultureInfo in DialogContext. + * Obtain the locale in DialogContext. * @return A String representing the current locale. */ public String getLocale() { - return getContext() != null ? getContext().getLocale() : null; - } + // turn.locale is the highest precedence. + String locale = (String) state.get(TurnContext.STATE_TURN_LOCALE); + if (!StringUtils.isEmpty(locale)) { + return locale; + } + + // If turn.locale was not populated, fall back to activity locale + locale = getContext().getActivity().getLocale(); + if (!StringUtils.isEmpty(locale)) { + return locale; + } + return Locale.getDefault().toString(); + } /** * @param reason @@ -545,7 +557,6 @@ private CompletableFuture endActiveDialog(DialogReason reason) { return endActiveDialog(reason, null); } - /** * @param reason * @param result From 8c3cbc6e6a6fe887dbf2e772421ad78ba661fce7 Mon Sep 17 00:00:00 2001 From: Lee Parrish <30470292+LeeParrishMSFT@users.noreply.github.com> Date: Tue, 23 Mar 2021 10:26:49 -0500 Subject: [PATCH 2/2] BotAdapter updates for locale. --- .../com/microsoft/bot/builder/BotAdapter.java | 4 ++++ .../bot/builder/BotAdapterTests.java | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/BotAdapter.java b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/BotAdapter.java index ecd5690a2..94cdf5662 100644 --- a/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/BotAdapter.java +++ b/libraries/bot-builder/src/main/java/com/microsoft/bot/builder/BotAdapter.java @@ -10,6 +10,7 @@ import com.microsoft.bot.schema.ResourceResponse; import java.util.List; +import java.util.Locale; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import org.apache.commons.lang3.NotImplementedException; @@ -196,6 +197,9 @@ protected CompletableFuture runPipeline( // Call any registered Middleware Components looking for ReceiveActivity() if (context.getActivity() != null) { if (!StringUtils.isEmpty(context.getActivity().getLocale())) { + + Locale.setDefault(Locale.forLanguageTag(context.getActivity().getLocale())); + context.setLocale(context.getActivity().getLocale()); } diff --git a/libraries/bot-builder/src/test/java/com/microsoft/bot/builder/BotAdapterTests.java b/libraries/bot-builder/src/test/java/com/microsoft/bot/builder/BotAdapterTests.java index c5293cb15..faf7084d4 100644 --- a/libraries/bot-builder/src/test/java/com/microsoft/bot/builder/BotAdapterTests.java +++ b/libraries/bot-builder/src/test/java/com/microsoft/bot/builder/BotAdapterTests.java @@ -47,6 +47,27 @@ public void PassResourceResponsesThrough() { ); } + @Test + public void GetLocaleFromActivity() { + Consumer> validateResponse = (activities) -> { + // no need to do anything. + }; + SimpleAdapter a = new SimpleAdapter(validateResponse); + TurnContextImpl c = new TurnContextImpl(a, new Activity(ActivityTypes.MESSAGE)); + + String activityId = UUID.randomUUID().toString(); + Activity activity = TestMessage.Message(); + activity.setId(activityId); + activity.setLocale("de-DE"); + BotCallbackHandler callback = (turnContext) -> { + Assert.assertEquals("de-DE", turnContext.getActivity().getLocale()); + return CompletableFuture.completedFuture(null); + }; + + a.processRequest(activity, callback).join(); + } + + @Test public void ContinueConversation_DirectMsgAsync() { boolean[] callbackInvoked = new boolean[] { false };