Translator Teams Cross-Language Channel Bridge
When a message is posted in a multilingual Teams channel, the flow detects its language and posts an inline translation into each configured target language (or a single lingua-franca), keeping a translation log in Dataverse. Lets distributed teams collaborate in one channel without a language barrier.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This flow turns a single Microsoft Teams channel into a multilingual collaboration space. It polls the channel for new messages, detects each message's source language, translates it into a configurable set of target languages with Microsoft Translator V3, posts the combined translations back into the channel as a single reply, and writes an audit row to Dataverse for every translation. Distributed teams otherwise fragment into language-specific channels or copy-paste into external translators; an automatic in-channel bridge keeps the whole team in one conversation, in the language each member reads.
Use Case
A team with members across regions shares one Teams channel. When anyone posts a message, the flow detects the language and replies with translations into the configured target languages (e.g. Spanish, French, German), so everyone reads the discussion without leaving the channel. Each translation is logged in Dataverse for usage tracking and audit.
Flow Architecture
When a new channel message is added
Teams - OnNewChannelMessagePolling trigger (5 min, splitOn) fires per new message in the configured channel.
Initialize Variables
Initialize variableCaptures message text, sender, message id; loads the marker, target-language array, correlation id; seeds the translations accumulator and detected-language default.
Check If Translatable
ConditionLoop-guard: skips empty messages and any message already containing the translation marker (the flow's own posts).
Idempotency Check
Dataverse - ListRecordsLooks up this message id in the translation log and proceeds only when no row exists.
Detect Language
HTTP - Translator /detectBuilt-in HTTP POST detects the source language (fallback en); the V3 connector has no Detect op.
For Each Target Language
Apply to eachTranslates the original into each configured target language with Microsoft Translator V3 and appends each translation (HTML paragraph) to the combined string.
Post Translation To Teams
Teams - PostMessageToConversationPosts the combined translations back to the channel, marker-prefixed.
Create Translation Log
Dataverse - CreateRecordWrites the translation audit record (message id, original/translated text, detected language, targets, channel, correlation id).
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_TeamsGroupId | String | <your-team-id> | The Team that owns the bridged channel. |
| flowlibs_TeamsChannelId | String | <your-channel-id> | The channel to monitor and post translations into. |
| flowlibs_TranslatorTextEndpoint | String | https://api.cognitive.microsofttranslator.com | Azure AI Translator endpoint (used by the detect HTTP call). |
| flowlibs_TranslatorTextKey | String | <configure> | Translator resource key for the detect HTTP call. |
| flowlibs_TranslatorTextRegion | String | global | Translator resource region. |
| flowlibs_BridgeTargetLanguages | String | es,fr,de | Comma-separated target language codes to translate each message into. |
| flowlibs_TranslationMarker | String | [Auto-Translation] | Marker prefixed onto the flow's posts; used as the loop guard. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Microsoft Teams | shared_teams | OnNewChannelMessage PostMessageToConversation |
| Microsoft Translator | shared_microsofttranslatorv | Translate |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords CreateRecord |
| HTTP (built-in) | http | HTTP - Detect language |
All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- Target languages
- Edit flowlibs_BridgeTargetLanguages (e.g. es,fr,de,ja). The flow loops over every code automatically.
- Lingua-franca mode
- Set a single code (e.g. en) to translate everything into one common language instead of many.
- Per-member languages
- Extend the loop to read each member's preferred language from Dataverse and translate per reader.
- Skip code/links/short messages
- Add a Filter or extra Condition before the loop to skip code blocks, URLs, or messages below a length threshold (cost control).
- Reply threading
- Switch PostMessageToConversation to a reply op and pass the original replyToId to thread the translation under the source message.
- Polling cadence
- Adjust the trigger recurrence (default Minute/5) for faster delivery vs. fewer API calls.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01Loop guard
Skips empties and the flow's own marked posts.
EXPR.02Idempotency gate
Proceeds only when not yet logged.
EXPR.03Detected language
Detect result with en fallback.
EXPR.04Per-language append
Builds the combined HTML reply.
Customize & download
Generate a ready-to-import copy of this solution with your environment-variable values baked in — available on Base, Pro, or Team.
Upgrade to customize
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.