Localization element
Note
In Azure Active Directory B2C, custom policies are designed primarily to address complex scenarios. For most scenarios, we recommend that you use built-in user flows. If you've not done so, learn about custom policy starter pack in Get started with custom policies in Active Directory B2C.
The Localization element allows you to support multiple locales or languages in the policy for the user journeys. The localization support in policies allows you to:
- Set up the explicit list of the supported languages in a policy and pick a default language.
- Provide language-specific strings and collections.
<Localization Enabled="true">
<SupportedLanguages DefaultLanguage="en" MergeBehavior="ReplaceAll">
<SupportedLanguage>en</SupportedLanguage>
<SupportedLanguage>es</SupportedLanguage>
</SupportedLanguages>
<LocalizedResources Id="api.localaccountsignup.en">
<LocalizedResources Id="api.localaccountsignup.es">
...
The Localization element contains the following attributes:
Attribute | Required | Description |
---|---|---|
Enabled | No | Possible values: true or false . |
The Localization element contains following XML elements
Element | Occurrences | Description |
---|---|---|
SupportedLanguages | 1:n | List of supported languages. |
LocalizedResources | 0:n | List of localized resources. |
SupportedLanguages
The SupportedLanguages element contains the following attributes:
Attribute | Required | Description |
---|---|---|
DefaultLanguage | Yes | The language to be used as the default for localized resources. |
MergeBehavior | No | An enumeration values of values that are merged together with any ClaimType present in a parent policy with the same identifier. Use this attribute when you overwrite a claim specified in base policy. Possible values: Append , Prepend , or ReplaceAll . The Append value specifies that the collection of data present should be appended to the end of the collection specified in the parent policy. The Prepend value specifies that the collection of data present should be added before the collection specified in the parent policy. The ReplaceAll value specifies that the collection of data defined in the parent policy should be ignored, using instead the data defined in the current policy. |
SupportedLanguages
The SupportedLanguages element contains the following elements:
Element | Occurrences | Description |
---|---|---|
SupportedLanguage | 1:n | Displays content that conforms to a language tag per RFC 5646 - Tags for Identifying Languages. |
LocalizedResources
The LocalizedResources element contains the following attributes:
Attribute | Required | Description |
---|---|---|
Id | Yes | An identifier that is used to uniquely identify localized resources. |
The LocalizedResources element contains the following elements:
Element | Occurrences | Description |
---|---|---|
LocalizedCollections | 0:n | Defines entire collections in various cultures. A collection can have different number of items and different strings for various cultures. Examples of collections include the enumerations that appear in claim types. For example, a country/region list is shown to the user in a drop-down list. |
LocalizedStrings | 0:n | Defines all of the strings, except those strings that appear in collections, in various cultures. |
LocalizedCollections
The LocalizedCollections element contains the following elements:
Element | Occurrences | Description |
---|---|---|
LocalizedCollection | 1:n | List of supported languages. |
LocalizedCollection
The LocalizedCollection element contains the following attributes:
Attribute | Required | Description |
---|---|---|
ElementType | Yes | References a ClaimType element or a user interface element in the policy file. |
ElementId | Yes | A string that contains a reference to a claim type already defined in the ClaimsSchema section that is used if ElementType is set to a ClaimType. |
TargetCollection | Yes | The target collection. |
The LocalizedCollection element contains the following elements:
Element | Occurrences | Description |
---|---|---|
Item | 0:n | Defines an available option for the user to select for a claim in the user interface, such as a value in a dropdown. |
The Item element contains the following attributes:
Attribute | Required | Description |
---|---|---|
Text | Yes | The user-friendly display string that should be shown to the user in the user interface for this option. |
Value | Yes | The string claim value associated with selecting this option. |
SelectByDefault | No | Indicates whether or not this option should be selected by default in the UI. Possible values: True or False. |
The following example shows the use of the LocalizedCollections element. It contains two LocalizedCollection elements, one for English and another one for Spanish. Both set the Restriction collection of the claim Gender
with a list of items for English and Spanish. For more samples, check out the Claim restriction enumeration live demo.
<LocalizedResources Id="api.selfasserted.en">
<LocalizedCollections>
<LocalizedCollection ElementType="ClaimType" ElementId="Gender" TargetCollection="Restriction">
<Item Text="Female" Value="F" />
<Item Text="Male" Value="M" />
</LocalizedCollection>
</LocalizedCollections>
</LocalizedResources>
<LocalizedResources Id="api.selfasserted.es">
<LocalizedCollections>
<LocalizedCollection ElementType="ClaimType" ElementId="Gender" TargetCollection="Restriction">
<Item Text="Femenino" Value="F" />
<Item Text="Masculino" Value="M" />
</LocalizedCollection>
</LocalizedCollections>
</LocalizedResources>
LocalizedStrings
The LocalizedStrings element contains the following elements:
Element | Occurrences | Description |
---|---|---|
LocalizedString | 1:n | A localized string. |
The LocalizedString element contains the following attributes:
Attribute | Required | Description |
---|---|---|
ElementType | Yes | Possible values: ClaimsProvider, ClaimType, ErrorMessage, GetLocalizedStringsTransformationClaimType, FormatLocalizedStringTransformationClaimType, Predicate, PredicateValidation, or UxElement. |
ElementId | Yes | If ElementType is set to ClaimType , Predicate , or PredicateValidation , this element contains a reference to a claim type already defined in the ClaimsSchema section. |
StringId | Yes | If ElementType is set to ClaimType , this element contains a reference to an attribute of a claim type. Possible values: DisplayName , AdminHelpText , or PatternHelpText . The DisplayName value is used to set the claim display name. The AdminHelpText value is used to set the help text name of the claim user. The PatternHelpText value is used to set the claim pattern help text. If ElementType is set to UxElement , this element contains a reference to an attribute of a user interface element. If ElementType is set to ErrorMessage , this element specifies the identifier of an error message. See Localization string IDs for a complete list of the UxElement identifiers. |
ElementType
The ElementType reference to a claim type, a claim transformation, or a user interface element in the policy to be localized.
Element to localize | ElementType | ElementId | StringId |
---|---|---|---|
Identity provider name | ClaimsProvider |
The ID of the ClaimsExchange element | |
Claim type attributes | ClaimType |
Name of the claim type | The attribute of the claim to be localized. Possible values: AdminHelpText , DisplayName , PatternHelpText , and UserHelpText . |
Error message | ErrorMessage |
The ID of the error message | |
Copies localized strings into claims | GetLocalizedStringsTra nsformationClaimType |
The name of the output claim | |
Predicate user message | Predicate |
The name of the predicate | The attribute of the predicate to be localized. Possible values: HelpText . |
Predicate group user message | PredicateValidation |
The ID of the PredicateValidation element. | The ID of the PredicateGroup element. The predicate group must be a child of the predicate validation element as defined in the ElementId. |
User interface elements | UxElement |
The ID of the user interface element to be localized. | |
Display Control | DisplayControl |
The ID of the display control. | The ID of the user interface element to be localized. |
Examples
ClaimsProvider
The ClaimsProvider value is used to localize one of the claim providers display name.
<OrchestrationStep Order="2" Type="ClaimsExchange">
...
<ClaimsExchanges>
<ClaimsExchange Id="FacebookExchange" TechnicalProfileReferenceId="Facebook-OAUTH" />
<ClaimsExchange Id="GoogleExchange" TechnicalProfileReferenceId="Google-OAUTH" />
<ClaimsExchange Id="LinkedInExchange" TechnicalProfileReferenceId="LinkedIn-OAUTH" />
</ClaimsExchanges>
</OrchestrationStep>
The following example shows how to localize claim providers' display name.
<LocalizedString ElementType="ClaimsProvider" StringId="FacebookExchange">Facebook</LocalizedString>
<LocalizedString ElementType="ClaimsProvider" StringId="GoogleExchange">Google</LocalizedString>
<LocalizedString ElementType="ClaimsProvider" StringId="LinkedInExchange">LinkedIn</LocalizedString>
ClaimType
The ClaimType value is used to localize one of the claim attributes.
<ClaimType Id="email">
<DisplayName>Email Address</DisplayName>
<DataType>string</DataType>
<UserHelpText>Email address that can be used to contact you.</UserHelpText>
<UserInputType>TextBox</UserInputType>
</ClaimType>
The following example shows how to localize the DisplayName, UserHelpText, and PatternHelpText attributes of the email claim type.
<LocalizedString ElementType="ClaimType" ElementId="email" StringId="DisplayName">Email</LocalizedString>
<LocalizedString ElementType="ClaimType" ElementId="email" StringId="UserHelpText">Please enter your email</LocalizedString>
<LocalizedString ElementType="ClaimType" ElementId="email" StringId="PatternHelpText">Please enter a valid email address</LocalizedString>
ErrorMessage
The ErrorMessage value is used to localize one of the system error messages.
<TechnicalProfile Id="AAD-UserWriteUsingAlternativeSecurityId">
<Metadata>
<Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">true</Item>
<Item Key="UserMessageIfClaimsPrincipalAlreadyExists">You are already registered, please press the back button and sign in instead.</Item>
</Metadata>
...
</TechnicalProfile>
The following example shows how to localize the UserMessageIfClaimsPrincipalAlreadyExists error message.
<LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfClaimsPrincipalAlreadyExists">The account you are trying to create already exists, please sign-in.</LocalizedString>
FormatLocalizedStringTransformationClaimType
The FormatLocalizedStringTransformationClaimType value is used to format claims into a localized string. For more information, see FormatLocalizedString claims transformation
<ClaimsTransformation Id="SetResponseMessageForEmailAlreadyExists" TransformationMethod="FormatLocalizedString">
<InputClaims>
<InputClaim ClaimTypeReferenceId="email" />
</InputClaims>
<InputParameters>
<InputParameter Id="stringFormatId" DataType="string" Value="ResponseMessge_EmailExists" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="responseMsg" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
The following example shows how to localize string format of the FormatLocalizedStringTransformationClaimType claims transformation.
<LocalizedString ElementType="FormatLocalizedStringTransformationClaimType" StringId="ResponseMessge_EmailExists">The email '{0}' is already an account in this organization. Click Next to sign in with that account.</LocalizedString>
GetLocalizedStringsTransformationClaimType
The GetLocalizedStringsTransformationClaimType value is used to copy localized strings into claims. For more information, see GetLocalizedStringsTransformation claims transformation
<ClaimsTransformation Id="GetLocalizedStringsForEmail" TransformationMethod="GetLocalizedStringsTransformation">
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="subject" TransformationClaimType="email_subject" />
<OutputClaim ClaimTypeReferenceId="message" TransformationClaimType="email_message" />
<OutputClaim ClaimTypeReferenceId="codeIntro" TransformationClaimType="email_code" />
<OutputClaim ClaimTypeReferenceId="signature" TransformationClaimType="email_signature" />
</OutputClaims>
</ClaimsTransformation>
The following example shows how to localize output claims of the GetLocalizedStringsTransformation claims transformation.
<LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_subject">Contoso account email verification code</LocalizedString>
<LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_message">Thanks for verifying your account!</LocalizedString>
<LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_code">Your code is</LocalizedString>
<LocalizedString ElementType="GetLocalizedStringsTransformationClaimType" StringId="email_signature">Sincerely</LocalizedString>
Predicate
The Predicate value is used to localize one of the Predicate error messages.
<Predicates>
<Predicate Id="LengthRange" Method="IsLengthRange" HelpText="The password must be between 6 and 64 characters.">
<Parameters>
<Parameter Id="Minimum">6</Parameter>
<Parameter Id="Maximum">64</Parameter>
</Parameters>
</Predicate>
<Predicate Id="Lowercase" Method="IncludesCharacters" HelpText="a lowercase letter">
<Parameters>
<Parameter Id="CharacterSet">a-z</Parameter>
</Parameters>
</Predicate>
<Predicate Id="Uppercase" Method="IncludesCharacters" HelpText="an uppercase letter">
<Parameters>
<Parameter Id="CharacterSet">A-Z</Parameter>
</Parameters>
</Predicate>
</Predicates>
The following example shows how to localize predicates help text.
<LocalizedString ElementType="Predicate" ElementId="LengthRange" StringId="HelpText">The password must be between 6 and 64 characters.</LocalizedString>
<LocalizedString ElementType="Predicate" ElementId="Lowercase" StringId="HelpText">a lowercase letter</LocalizedString>
<LocalizedString ElementType="Predicate" ElementId="Uppercase" StringId="HelpText">an uppercase letter</LocalizedString>
PredicateValidation
The PredicateValidation value is used to localize one of the PredicateValidation group error messages.
<PredicateValidations>
<PredicateValidation Id="CustomPassword">
<PredicateGroups>
<PredicateGroup Id="LengthGroup">
<PredicateReferences MatchAtLeast="1">
<PredicateReference Id="LengthRange" />
</PredicateReferences>
</PredicateGroup>
<PredicateGroup Id="CharacterClasses">
<UserHelpText>The password must have at least 3 of the following:</UserHelpText>
<PredicateReferences MatchAtLeast="3">
<PredicateReference Id="Lowercase" />
<PredicateReference Id="Uppercase" />
<PredicateReference Id="Number" />
<PredicateReference Id="Symbol" />
</PredicateReferences>
</PredicateGroup>
</PredicateGroups>
</PredicateValidation>
</PredicateValidations>
The following example shows how to localize a predicate validation group help text.
<LocalizedString ElementType="PredicateValidation" ElementId="CustomPassword" StringId="CharacterClasses">The password must have at least 3 of the following:</LocalizedString>
UxElement
The UxElement value is used to localize one of the user interface elements. The following example shows how to localize the continue and cancel buttons.
<LocalizedString ElementType="UxElement" StringId="button_continue">Create new account</LocalizedString>
<LocalizedString ElementType="UxElement" StringId="button_cancel">Cancel</LocalizedString>
DisplayControl
The DisplayControl value is used to localize one of the display Control user interface elements. When enabled, the display control localizedStrings takes the precedence over some of the UxElement StringIDs like ver_but_send, ver_but_edit, ver_but_resend and ver_but_verify. The following example shows how to localize the send and verify buttons.
<LocalizedString ElementType="DisplayControl" ElementId="emailVerificationControl" StringId="but_send_code">Send verification code</LocalizedString>
<LocalizedString ElementType="DisplayControl" ElementId="emailVerificationControl" StringId="but_verify_code">Verify code</LocalizedString>
In the Metadata section of a self-asserted technical profile, the referenced ContentDefinition needs to have DataUri set to page layout version 2.1.0 or higher. For example:
<ContentDefinition Id="api.selfasserted">
<DataUri>urn:com:microsoft:aad:b2c:elements:selfasserted:2.1.0</DataUri>
...
Next steps
See the following articles for localization examples: