You’ve hit a current limitation of Copilot Studio.
User.Language is a system variable that’s set:
- when the conversation starts (based on the channel / locale), and
- when you change it yourself with Set variable value in a topic.
The locale dropdown in the UI does not push its change back into User.Language once the conversation is already running, so the two can get out of sync. That’s why:
- Your topic can switch User.Language ✔️
- But when the user later changes the language from the dropdown, User.Language stays on the old value ❌
- Right now there’s no event or hook to “listen” for that dropdown change and update the variable.
Workaround pattern
Instead of relying on User.Language directly everywhere, create your own variable and treat it as the single source of truth:
Create a variable, e.g. Global.PreferredLanguage.
At the start of the conversation (or in a common system/topic), sync it once from User.Language:
If(
IsBlank(Global.PreferredLanguage),
Set(Global.PreferredLanguage, User.Language)
)
In your language-switcher topic, update both:
Set(Global.PreferredLanguage, "fr-FR");
Set(User.Language, "fr-FR");
Use Global.PreferredLanguage for all branching / translations in your topics.
If you really need the dropdown to be honored, the only reliable option today is to ask the user to start a new conversation after changing the locale, so User.Language is initialized with the new value.