다음을 통해 공유


Azure Active Directory B2C의 언어 사용자 지정

중요합니다

2025년 5월 1일부터 새 고객을 위해 Azure AD B2C를 더 이상 구매할 수 없습니다. FAQ에서 자세히 알아보세요.

시작하기 전에 이 페이지의 맨 위에 있는 정책 유형 선택기를 사용하여 설정하려는 정책 유형을 선택합니다. Azure Active Directory B2C는 미리 정의된 사용자 흐름 또는 완전히 구성 가능한 사용자 지정 정책을 통해 사용자가 애플리케이션과 상호 작용하는 방법을 정의하는 두 가지 방법을 제공합니다. 이 문서에서 필요한 단계는 각 방법마다 다릅니다.

Azure AD B2C(Azure Active Directory B2C)의 언어 사용자 지정을 사용하면 사용자 흐름이 고객의 요구에 맞게 다양한 언어를 수용할 수 있습니다. Microsoft는 36개 언어에 대한 번역을 제공하지만 모든 언어에 고유한 번역을 제공할 수도 있습니다. 단일 언어에 대해서만 환경이 제공되더라도 페이지의 텍스트를 사용자 지정할 수 있습니다.

언어 사용자 지정이 작동하는 방식

언어 사용자 지정을 사용하여 사용자 흐름을 사용할 수 있는 언어를 선택합니다. 기능을 사용하도록 설정한 후 애플리케이션에서 쿼리 문자열 매개 변수 ui_locales를 제공할 수 있습니다. Azure AD B2C를 호출하면 페이지가 사용자가 지정한 로캘로 변환됩니다. 이 유형의 구성은 사용자 흐름의 언어를 완벽하게 제어하고 고객 브라우저의 언어 설정을 무시합니다.

고객이 보는 언어에 대한 제어 수준이 필요하지 않을 수 있습니다. 매개 변수를 ui_locales 제공하지 않으면 고객의 환경은 브라우저 설정에 따라 결정됩니다. 지원되는 언어로 추가하여 사용자 흐름이 번역되는 언어를 제어할 수 있습니다. 고객 브라우저가 지원하지 않으려는 언어를 표시하도록 설정된 경우 지원되는 문화권에서 기본값으로 선택한 언어가 대신 표시됩니다.

  • ui-locales 지정된 언어: 언어 사용자 지정을 사용하도록 설정하면 사용자 흐름이 여기에 지정된 언어로 번역됩니다.
  • 브라우저 요청 언어: 매개 변수가 지정되지 않은 ui_locales 경우 언어가 지원되는 경우 사용자 흐름이 브라우저 요청 언어로 변환됩니다.
  • 정책 기본 언어: 브라우저에서 언어를 지정하지 않거나 지원되지 않는 언어를 지정하는 경우 사용자 흐름은 사용자 흐름 기본 언어로 변환됩니다.

비고

사용자 지정 사용자 특성을 사용하는 경우 고유한 번역을 제공해야 합니다. 자세한 내용은 문자열 사용자 지정을 참조하세요.

Azure AD B2C를 사용하여 언어를 지역화하거나 사용자 지정하는 방법을 알아보려면 이 비디오를 시청하세요.

지역화에는 다음 세 단계가 필요합니다.

  1. 지원되는 언어의 명시적 목록 설정
  2. 언어별 문자열 및 컬렉션 제공
  3. 페이지의 콘텐츠 정의를 편집합니다.

필수 조건

ui_locales 대해 요청된 언어 지원

언어 사용자 지정의 일반 공급 전에 만들어진 정책은 먼저 이 기능을 사용하도록 설정해야 합니다. 이후에 만들어진 정책 및 사용자 흐름은 기본적으로 언어 사용자 지정을 사용하도록 설정됩니다.

사용자 흐름에서 언어 사용자 지정을 사용하도록 설정하면 매개 변수를 추가하여 사용자 흐름의 언어를 제어할 ui_locales 수 있습니다.

  1. Azure AD B2C 테넌트에서 사용자 흐름을 선택합니다.
  2. 번역에 사용할 사용자 흐름을 클릭합니다.
  3. 언어를 선택합니다.
  4. 언어 사용자 지정 사용을 선택합니다.

사용자 흐름에서 활성화된 언어 선택

매개 변수 없이 ui_locales 브라우저에서 요청할 때 사용자 흐름에 대한 언어 집합을 번역할 수 있도록 설정합니다.

  1. 사용자 흐름에 이전 지침에서 언어 사용자 지정이 사용하도록 설정되어 있는지 확인합니다.
  2. 사용자 흐름의 언어 페이지에서 지원하려는 언어를 선택합니다.
  3. 속성 창에서 [사용]을[예]로 변경합니다.
  4. 속성 창의 맨 위에서 저장 을 선택합니다.

비고

매개 변수가 ui_locales 제공되지 않으면 페이지가 설정된 경우에만 고객의 브라우저 언어로 변환됩니다.

문자열 사용자 지정

언어 사용자 지정을 통해 사용자 흐름의 모든 문자열을 사용자 지정할 수 있습니다.

  1. 사용자 흐름이 이전 지침에서 언어 사용자 지정을 사용하도록 설정되어 있는지 확인합니다.
  2. 사용자 흐름에 대한 언어 페이지에서 사용자 지정하려는 언어를 선택합니다.
  3. 페이지 수준 리소스 파일에서 편집할 페이지를 선택합니다.
  4. 다운로드 기본값을 선택합니다(또는 이전에 이 언어를 편집한 경우 다운로드 재정의를 선택합니다).

이러한 단계는 문자열 편집을 시작하는 데 사용할 수 있는 JSON 파일을 제공합니다.

페이지에서 문자열 변경

  1. 이전 지침에서 다운로드한 JSON 파일을 JSON 편집기에서 엽니다.
  2. 변경할 요소를 찾습니다. 찾으려는 문자열의 StringId를 찾거나 변경할 Value 특성을 찾을 수 있습니다.
  3. Value 특성을 표시하기를 원하는 항목으로 업데이트합니다.
  4. 변경할 모든 문자열의 Overridetrue로 변경합니다.
  5. 파일을 저장하고 변경 내용을 업로드합니다. (JSON 파일을 다운로드한 위치와 동일한 위치에서 업로드 컨트롤을 찾을 수 있습니다.)

중요합니다

문자열을 재정의해야 하는 경우 Override 값을 true로 설정해야 합니다. 값이 변경되지 않으면 항목이 무시됩니다.

확장 특성 변경

사용자 지정 사용자 특성의 문자열을 변경하려는 경우 또는 JSON에 문자열을 추가하려는 경우 다음 형식을 사용합니다.

{
  "LocalizedStrings": [
    {
      "ElementType": "ClaimType",
      "ElementId": "extension_<ExtensionAttribute>",
      "StringId": "DisplayName",
      "Override": true,
      "Value": "<ExtensionAttributeValue>"
    }
    [...]
  ]
}

<ExtensionAttribute>를 사용자 지정 사용자 특성 이름으로 바꿉니다.

<ExtensionAttributeValue>를 표시할 새 문자열로 바꿉니다.

LocalizedCollections를 사용하여 값 목록을 제공합니다.

응답에 대한 값 목록 집합을 제공하려면 LocalizedCollections 특성을 만들어야 합니다. LocalizedCollectionsNameValue 쌍의 배열입니다. 항목의 순서는 표시되는 순서입니다. LocalizedCollections를 추가하려면 다음 형식을 사용하세요.

{
  "LocalizedStrings": [...],
  "LocalizedCollections": [
    {
      "ElementType":"ClaimType",
      "ElementId":"<UserAttribute>",
      "TargetCollection":"Restriction",
      "Override": true,
      "Items":[
        {
          "Name":"<Response1>",
          "Value":"<Value1>"
        },
        {
          "Name":"<Response2>",
          "Value":"<Value2>"
        }
      ]
    }
  ]
}
  • ElementId는 이 LocalizedCollections 특성이 응답인 사용자 특성입니다.
  • Name 는 사용자에게 표시되는 값입니다.
  • Value는 이 옵션이 선택될 때 클레임에 반환된 항목입니다.

변경 내용 업로드

  1. JSON 파일의 변경 내용을 완료한 후 B2C 테넌트로 돌아갑니다.
  2. 사용자 흐름을 선택하고 번역에 사용하도록 설정할 사용자 흐름을 클릭합니다.
  3. 언어를 선택합니다.
  4. 번역하려는 언어를 선택합니다.
  5. 번역을 제공할 페이지를 선택합니다.
  6. 폴더 아이콘을 선택하고 업로드할 JSON 파일을 선택합니다.

변경 내용이 자동으로 사용자 흐름에 저장됩니다.

언어 사용자 지정을 사용하여 페이지 UI 사용자 지정

HTML 콘텐츠를 지역화하는 방법에는 두 가지가 있습니다. 한 가지 방법은 언어 사용자 지정을 설정하는 것입니다. 이 기능을 사용하면 Azure AD B2C가 OpenID Connect 매개 변수 ui-locales를 엔드포인트로 전달할 수 있습니다. 콘텐츠 서버는 이 매개 변수를 사용하여 언어별 사용자 지정된 HTML 페이지를 제공할 수 있습니다.

또는 사용되는 로캘에 따라 다른 위치에서 콘텐츠를 끌어올 수 있습니다. CORS 사용 엔드포인트에서 특정 언어에 대한 콘텐츠를 호스트하도록 폴더 구조를 설정할 수 있습니다. 와일드카드 값을 사용하는 경우 올바른 값을 호출합니다 {Culture:RFC5646}. 예를 들어 사용자 지정 페이지 URI라고 가정합니다.

https://wingtiptoysb2c.blob.core.windows.net/{Culture:RFC5646}/wingtip/unified.html

페이지를 fr에서 로드할 수 있습니다. 페이지가 HTML 및 CSS 콘텐츠를 끌어오면 다음에서 가져옵니다.

https://wingtiptoysb2c.blob.core.windows.net/fr/wingtip/unified.html

사용자 지정 언어 추가

Microsoft에서 현재 번역을 제공하지 않는 언어를 추가할 수도 있습니다. 사용자 흐름의 모든 문자열에 대한 번역을 제공해야 합니다. 언어 및 로캘 코드는 ISO 639-1 표준의 코드로 제한됩니다. 로캘 코드 형식은 "ISO_639-1_code"-"CountryCode"여야 합니다. 예를 들면 다음과 같습니다 en-GB. 자세한 내용은 로캘 ID 형식을 참조하세요.

  1. Azure AD B2C 테넌트에서 사용자 흐름을 선택합니다.
  2. 사용자 지정 언어를 추가할 사용자 흐름을 클릭한 다음 언어를 클릭합니다.
  3. 페이지 위쪽에서 사용자 지정 언어 추가 를 선택합니다.
  4. 열리는 컨텍스트 창에서 유효한 로캘 코드를 입력하여 번역을 제공하는 언어를 식별합니다.
  5. 각 페이지마다 영어용 재정의 세트를 다운로드하고 번역할 수 있습니다.
  6. JSON 파일을 완료한 후 각 페이지에 대해 업로드할 수 있습니다.
  7. [사용]을 선택하면 사용자 흐름에서 사용자에 대해 이 언어를 표시할 수 있습니다.
  8. 언어를 저장합니다.

중요합니다

저장하려면 사용자 지정 언어를 활성화하거나 해당 언어에 대한 재정의 파일을 업로드해야 합니다.

지원되는 언어 목록 설정

정책의 확장 파일을 엽니다. 예: SocialAndLocalAccounts/TrustFrameworkExtensions.xml.

  1. BuildingBlocks 요소를 검색합니다. 요소가 없으면 추가합니다.
  2. Localization 지원되는 언어인 영어(기본값) 및 스페인어로 요소를 추가합니다.
<Localization Enabled="true">
  <SupportedLanguages DefaultLanguage="en" MergeBehavior="ReplaceAll">
    <SupportedLanguage>en</SupportedLanguage>
    <SupportedLanguage>es</SupportedLanguage>
  </SupportedLanguages>
</Localization>

언어별 레이블 제공

요소의 Localization에는 지역화된 문자열 목록이 포함됩니다. 지역화된 리소스 요소에는 지역화된 리소스를 고유하게 식별하는 데 사용되는 식별자가 있습니다. 이 식별자는 콘텐츠 정의 요소의 뒷부분에서 사용됩니다.

콘텐츠 정의 및 지원하려는 언어에 대해 지역화된 리소스 요소를 구성합니다. 영어 및 스페인어에 대한 통합 등록 또는 로그인 페이지를 사용자 지정하려면 요소를 닫은 후 다음 LocalizedResources 요소를 추가합니다 </SupportedLanguages> .

비고

다음 샘플에서는 각 줄의 시작 부분에 파운드 # 기호를 추가했으므로 화면에서 지역화된 레이블을 쉽게 찾을 수 있습니다.

<!--Local account sign-up or sign-in page English-->
<Localization Enabled="true">
  ...
 <LocalizedResources Id="api.signuporsignin.en">
        <LocalizedStrings>
          <LocalizedString ElementType="ClaimType" ElementId="signInName" StringId="DisplayName">Email Address</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="heading">Sign in</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="social_intro">Sign in with your social account</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="local_intro_generic">Sign in with your {0}</LocalizedString>
          <LocalizedString ElementType="ClaimType" ElementId="password" StringId="DisplayName">Password</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="requiredField_password">Please enter your password</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="requiredField_generic">Please enter your {0}</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="invalid_generic">Please enter a valid {0}</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="createaccount_one_link">Sign up now</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="createaccount_two_links">Sign up with {0} or {1}</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="createaccount_three_links">Sign up with {0}, {1}, or {2}</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="forgotpassword_link">Forgot your password?</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="button_signin">Sign in</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="divider_title">OR</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="createaccount_intro">Don't have an account?</LocalizedString>
          <LocalizedString ElementType="UxElement" StringId="unknown_error">We are having trouble signing you in. Please try again later.</LocalizedString>
          <!-- Uncomment the remember_me only if the keep me signed in is activated. 
          <LocalizedString ElementType="UxElement" StringId="remember_me">Keep me signed in</LocalizedString> -->
          <LocalizedString ElementType="ClaimsProvider" StringId="FacebookExchange">Facebook</LocalizedString>
          <LocalizedString ElementType="ErrorMessage" StringId="ResourceOwnerFlowInvalidCredentials">Your password is incorrect.</LocalizedString>
          <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfInvalidPassword">Your password is incorrect.</LocalizedString>
          <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfPasswordExpired">Your password has expired.</LocalizedString>
          <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfClaimsPrincipalDoesNotExist">We can't seem to find your account.</LocalizedString>
          <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfOldPasswordUsed">Looks like you used an old password.</LocalizedString>
          <LocalizedString ElementType="ErrorMessage" StringId="DefaultMessage">Invalid username or password.</LocalizedString>
          <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfUserAccountDisabled">Your account has been locked. Contact your support person to unlock it, then try again.</LocalizedString>
          <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfUserAccountLocked">Your account is temporarily locked to prevent unauthorized use. Try again later.</LocalizedString>
          <LocalizedString ElementType="ErrorMessage" StringId="AADRequestsThrottled">There are too many requests at this moment. Please wait for some time and try again.</LocalizedString>
        </LocalizedStrings>
      </LocalizedResources>
  <!--Local account sign-up or sign-in page Spanish-->
  <LocalizedResources Id="api.signuporsignin.es">
    <LocalizedStrings>
      <LocalizedString ElementType="UxElement" StringId="logonIdentifier_email">#Correo electrónico</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="requiredField_email">#Este campo es obligatorio</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="logonIdentifier_username">#Nombre de usuario</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="password">#Contraseña</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="createaccount_link">#Registrarse ahora</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="requiredField_username">#Escriba su nombre de usuario</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="createaccount_intro">#¿No tiene una cuenta?</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="forgotpassword_link">#¿Olvidó su contraseña?</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="divider_title">#O</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="cancel_message">#El usuario ha olvidado su contraseña</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="button_signin">#Iniciar sesión</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="social_intro">#Iniciar sesión con su cuenta de redes sociales</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="requiredField_password">#Escriba su contraseña</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="invalid_password">#La contraseña que ha escrito no está en el formato esperado.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="local_intro_username">#Iniciar sesión con su nombre de usuario</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="local_intro_email">#Iniciar sesión con su cuenta existente</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="invalid_email">#Escriba una dirección de correo electrónico válida</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="unknown_error">#Tenemos problemas para iniciar su sesión. Vuelva a intentarlo más tarde.  </LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="email_pattern">^[a-zA-Z0-9.!#$%&amp;'^_`\{\}~\-]+@[a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*$</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfInvalidPassword">#Su contraseña es incorrecta.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfClaimsPrincipalDoesNotExist">#Parece que no podemos encontrar su cuenta.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfOldPasswordUsed">#Parece que ha usado una contraseña antigua.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="DefaultMessage">#El nombre de usuario o la contraseña no son válidos.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfUserAccountDisabled">#Se bloqueó su cuenta. Póngase en contacto con la persona responsable de soporte técnico para desbloquearla y vuelva a intentarlo.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfUserAccountLocked">#Su cuenta se bloqueó temporalmente para impedir un uso no autorizado. Vuelva a intentarlo más tarde.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="AADRequestsThrottled">#Hay demasiadas solicitudes en este momento. Espere un momento y vuelva a intentarlo.</LocalizedString>
    </LocalizedStrings>
  </LocalizedResources>
  <!--Local account sign-up page English-->
  <LocalizedResources Id="api.localaccountsignup.en">
    <LocalizedStrings>
      <LocalizedString ElementType="ClaimType" ElementId="email" StringId="DisplayName">#Email Address</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="email" StringId="UserHelpText">#Email address that can be used to contact you.</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="email" StringId="PatternHelpText">#Please enter a valid email address.</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="newPassword" StringId="DisplayName">#New Password</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="newPassword" StringId="UserHelpText">#Enter new password</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="newPassword" StringId="PatternHelpText">#8-16 characters, containing 3 out of 4 of the following: Lowercase characters, uppercase characters, digits (0-9), and one or more of the following symbols: @ # $ % ^ &amp; * - _ + = [ ] { } | \ : ' , ? / ` ~ " ( ) ; .</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="reenterPassword" StringId="DisplayName">#Confirm New Password</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="reenterPassword" StringId="UserHelpText">#Confirm new password</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="reenterPassword" StringId="PatternHelpText">#8-16 characters, containing 3 out of 4 of the following: Lowercase characters, uppercase characters, digits (0-9), and one or more of the following symbols: @ # $ % ^ &amp; * - _ + = [ ] { } | \ : ' , ? / ` ~ " ( ) ; .</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="displayName" StringId="DisplayName">#Display Name</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="displayName" StringId="UserHelpText">#Your display name.</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="surname" StringId="DisplayName">#Surname</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="surname" StringId="UserHelpText">#Your surname (also known as family name or last name).  </LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="givenName" StringId="DisplayName">#Given Name</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="givenName" StringId="UserHelpText">#Your given name (also known as first name).</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="button_continue">#Create</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="error_fieldIncorrect">#One or more fields are filled out incorrectly. Please check your entries and try again.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="error_passwordEntryMismatch">#The password entry fields do not match. Please enter the same password in both fields and try again.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="error_requiredFieldMissing">#A required field is missing. Please fill out all required fields and try again.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="helplink_text">#What is this?</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="initial_intro">#Please provide the following details.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="preloader_alt">#Please wait</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="required_field">#This information is required.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_but_edit">#Change e-mail</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_but_resend">#Send new code</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_but_send">#Send verification code</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_but_verify">#Verify code</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_fail_code_expired">#That code is expired. Please request a new code.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_fail_no_retry">#You've made too many incorrect attempts. Please try again later.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_fail_retry">#That code is incorrect. Please try again.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_fail_server">#We are having trouble verifying your email address. Please enter a valid email address and try again.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_fail_throttled">#There have been too many requests to verify this email address. Please wait a while, then try again.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_info_msg">#Verification code has been sent to your inbox. Please copy it to the input box below.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_input">#Verification code</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_intro_msg">#Verification is necessary. Please click Send button.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_success_msg">#E-mail address verified. You can now continue.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="ServiceThrottled">#There are too many requests at this moment. Please wait for some time and try again.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfClaimNotVerified">#Claim not verified: {0}</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfClaimsPrincipalAlreadyExists">#A user with the specified ID already exists. Please choose a different one.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfIncorrectPattern">#Incorrect pattern for: {0}</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfInvalidInput">#{0} has invalid input.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfMissingRequiredElement">#Missing required element: {0}</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfValidationError">#Error in validation by: {0}</LocalizedString>
    </LocalizedStrings>
  </LocalizedResources>
  <!--Local account sign-up page Spanish-->
  <LocalizedResources Id="api.localaccountsignup.es">
    <LocalizedStrings>
      <LocalizedString ElementType="ClaimType" ElementId="email" StringId="DisplayName">#Dirección de correo electrónico</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="email" StringId="UserHelpText">#Dirección de correo electrónico que puede usarse para ponerse en contacto con usted.</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="email" StringId="PatternHelpText">#Introduzca una dirección de correo electrónico válida.  </LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="newPassword" StringId="DisplayName">#Nueva contraseña</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="newPassword" StringId="UserHelpText">#Escriba la contraseña nueva</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="newPassword" StringId="PatternHelpText">#De 8 a 16 caracteres, que contengan 3 de los 4 tipos siguientes: caracteres en minúsculas, caracteres en mayúsculas, dígitos (0-9) y uno o más de los siguientes símbolos: @ # $ % ^ &amp; * - _ + = [ ] { } | \\ : ' , ? / ` ~ \" ( ) ; .</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="reenterPassword" StringId="DisplayName">#Confirmar nueva contraseña</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="reenterPassword" StringId="UserHelpText">#Confirmar nueva contraseña</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="reenterPassword" StringId="PatternHelpText">#8 a 16 caracteres, que contengan 3 de los 4 tipos siguientes: caracteres en minúsculas, caracteres en mayúsculas, dígitos (0-9) y uno o más de los siguientes símbolos: @ # $ % ^ &amp; * - _ + = [ ] { } | \\ : ' , ? / ` ~ \" ( ) ; .</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="displayName" StringId="DisplayName">#Nombre para mostrar</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="displayName" StringId="UserHelpText">#Su nombre para mostrar.</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="surname" StringId="DisplayName">#Apellido</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="surname" StringId="UserHelpText">#Su apellido.</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="givenName" StringId="DisplayName">#Nombre</LocalizedString>
      <LocalizedString ElementType="ClaimType" ElementId="givenName" StringId="UserHelpText">#Su nombre (también conocido como nombre de pila).</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="button_continue">#Crear</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="error_fieldIncorrect">#Hay uno o varios campos rellenados de forma incorrecta. Compruebe las entradas y vuelva a intentarlo.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="error_passwordEntryMismatch">#Los campos de entrada de contraseña no coinciden. Escriba la misma contraseña en ambos campos y vuelva a intentarlo.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="error_requiredFieldMissing">#Falta un campo obligatorio. Rellene todos los campos necesarios y vuelva a intentarlo.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="helplink_text">#¿Qué es esto?</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="initial_intro">#Proporcione los siguientes detalles.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="preloader_alt">#Espere</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="required_field">#Esta información es obligatoria.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_but_edit">#Cambiar correo electrónico</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_but_resend">#Enviar nuevo código</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_but_send">#Enviar código de comprobación</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_but_verify">#Comprobar código</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_fail_code_expired">#El código ha expirado. Solicite otro nuevo.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_fail_no_retry">#Ha realizado demasiados intentos incorrectos. Vuelva a intentarlo más tarde.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_fail_retry">#Ese código es incorrecto. Inténtelo de nuevo.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_fail_server">#Tenemos problemas para comprobar la dirección de correo electrónico. Escriba una dirección de correo electrónico válida y vuelva a intentarlo.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_fail_throttled">#Ha habido demasiadas solicitudes para comprobar esta dirección de correo electrónico. Espere un poco y vuelva a intentarlo.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_info_msg">#Se ha enviado el código de verificación a su Bandeja de entrada. Cópielo en el siguiente cuadro de entrada.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_input">#Código de verificación</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_intro_msg">#La comprobación es obligatoria. Haga clic en el botón Enviar.</LocalizedString>
      <LocalizedString ElementType="UxElement" StringId="ver_success_msg">#Dirección de correo electrónico comprobada. Puede continuar.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="ServiceThrottled">#Hay demasiadas solicitudes en este momento. Espere un momento y vuelva a intentarlo.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfClaimNotVerified">#Reclamación no comprobada: {0}</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfClaimsPrincipalAlreadyExists">#Ya existe un usuario con el id. especificado. Elija otro diferente.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfIncorrectPattern">#Patrón incorrecto para: {0}</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfInvalidInput">#{0} tiene una entrada no válida.</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfMissingRequiredElement">#Falta un elemento obligatorio: {0}</LocalizedString>
      <LocalizedString ElementType="ErrorMessage" StringId="UserMessageIfValidationError">#Error en la validación de: {0}</LocalizedString>
    </LocalizedStrings>
  </LocalizedResources>
</Localization>

지역화를 사용하여 콘텐츠 정의 편집

BuildingBlocks 요소의 자식으로 복사한 ContentDefinitions 요소의 전체 내용을 붙여넣습니다.

다음 예제에서는 영어(en) 및 스페인어(es) 사용자 지정 문자열이 등록 또는 로그인 페이지와 로컬 계정 등록 페이지에 추가됩니다. 각 LocalizedResourcesReference에 대한 LocalizedResourcesReferenceId는 해당 로캘과 동일하지만 모든 문자열을 식별자로 사용할 수 있습니다. 각 언어 및 페이지 조합에 대해 이전에 만든 해당 LocalizedResources를 가리킵니다.

<ContentDefinitions>
  <ContentDefinition Id="api.signuporsignin">
    <LocalizedResourcesReferences MergeBehavior="Prepend">
        <LocalizedResourcesReference Language="en" LocalizedResourcesReferenceId="api.signuporsignin.en" />
        <LocalizedResourcesReference Language="es" LocalizedResourcesReferenceId="api.signuporsignin.es" />
    </LocalizedResourcesReferences>
  </ContentDefinition>

  <ContentDefinition Id="api.localaccountsignup">
    <LocalizedResourcesReferences MergeBehavior="Prepend">
        <LocalizedResourcesReference Language="en" LocalizedResourcesReferenceId="api.localaccountsignup.en" />
        <LocalizedResourcesReference Language="es" LocalizedResourcesReferenceId="api.localaccountsignup.es" />
    </LocalizedResourcesReferences>
  </ContentDefinition>
</ContentDefinitions>

업데이트된 사용자 지정 정책 업로드 및 테스트

사용자 지정 정책 업로드

  1. 확장 파일을 저장합니다.
  2. 여러 테넌트에 액세스할 수 있는 경우 상단 메뉴의 설정 아이콘을 선택하여 디렉터리 + 구독 메뉴에서 Azure AD B2C 테넌트로 전환합니다.
  3. Azure AD B2C를 검색하고 선택합니다.
  4. 정책에서 ID 환경 프레임워크를 선택합니다.
  5. 사용자 지정 정책 업로드를 선택합니다.
  6. 이전에 변경한 확장 파일을 업로드합니다.

지금 실행을 사용하여 사용자 지정 정책 테스트

  1. 업로드한 정책을 선택한 다음 지금 실행을 선택합니다.
  2. 지역화된 등록 또는 로그인 페이지를 볼 수 있어야 합니다.
  3. 등록 링크를 클릭하면 지역화된 등록 페이지를 볼 수 있습니다.
  4. 브라우저 기본 언어를 스페인어로 전환합니다. 또는 권한 부여 요청에 쿼리 문자열 매개 변수 ui_locales 를 추가할 수 있습니다. 다음은 그 예입니다.
https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/B2C_1A_signup_signin/oauth2/v2.0/authorize&client_id=00001111-aaaa-2222-bbbb-3333cccc4444&nonce=defaultNonce&redirect_uri=https%3A%2F%2Fjwt.ms&scope=openid&response_type=id_token&prompt=login&ui_locales=es

추가 정보

재정의로 페이지 UI 사용자 지정 레이블

언어 사용자 지정을 사용하도록 설정하면 페이지 UI 사용자 지정을 사용한 레이블에 대한 이전 편집이 영어(en)용 JSON 파일에서 유지됩니다. 언어 사용자 지정에서 언어 리소스를 업로드하여 레이블 및 기타 문자열을 계속해서 변경할 수 있습니다.

최신 번역

Microsoft는 사용자가 사용할 수 있는 가장 최신의 번역을 제공하기 위해 최선을 다하고 있습니다. Microsoft는 지속적으로 번역을 개선하고 사용자에 맞게 유지할 예정입니다. Microsoft는 글로벌 용어의 버그 및 변경 내용을 식별하고 사용자 흐름에서 원활하게 작동하는 업데이트를 수행합니다.

오른쪽에서 왼쪽 언어 지원

Microsoft는 현재 오른쪽에서 왼쪽 언어를 지원하지 않습니다. 사용자 지정 로캘을 사용하고 CSS를 사용하여 문자열이 표시되는 방식을 변경하여 이 작업을 수행할 수 있습니다. 이 기능이 필요한 경우 Azure 피드백에 투표하세요.

소셜 ID 공급자 변환

Microsoft는 소셜 로그인에 대한 ui_locales OIDC 매개 변수를 제공합니다. 하지만 Facebook과 Google을 포함한 일부 소셜 ID 공급자는 이러한 매개 변수를 인식하지 않습니다.

브라우저 동작

설정된 언어에 대한 Microsoft Edge, Chrome 및 Firefox 요청입니다. 지원되는 언어인 경우 기본값 앞에 표시됩니다.

지원되는 언어

Azure AD B2C에는 ISO 639-1 코드를 사용하여 다음 언어에 대한 지원이 포함되어 있습니다. 사용자 흐름 언어는 Azure AD B2C에서 제공됩니다. 다단계 인증 알림 언어는 Microsoft Entra 다단계 인증에서 제공됩니다.

언어 언어 코드 사용자 흐름 MFA 알림
아랍어 아칸소 아니요를 나타내는 X입니다. 녹색 확인 표시.
불가리아어 BG (영어) 아니요를 나타내는 X입니다. 녹색 확인 표시.
벵골어 증권 시세 표시기 녹색 확인 표시. 아니요를 나타내는 X입니다.
카탈로니아어 해당 번역은 지정된 맥락이 없이 'ca'를 그대로 두었습니다. 명확한 의미가 지정되면 좀 더 적절한 번역을 할 수 있습니다. 아니요를 나타내는 X입니다. 녹색 확인 표시.
체코어 CS (CS) 녹색 확인 표시. 녹색 확인 표시.
덴마크어 녹색 확인 표시. 녹색 확인 표시.
독일어 녹색 확인 표시. 녹색 확인 표시.
그리스어 녹색 확인 표시. 녹색 확인 표시.
영어 en 녹색 확인 표시. 녹색 확인 표시.
스페인어 에스 녹색 확인 표시. 녹색 확인 표시.
에스토니아어 아니요를 나타내는 X입니다. 녹색 확인 표시.
바스크어 유럽 연합 아니요를 나타내는 X입니다. 녹색 확인 표시.
핀란드어 에프아이 녹색 확인 표시. 녹색 확인 표시.
프랑스어 프랑스어 녹색 확인 표시. 녹색 확인 표시.
갈리시아어 gl (gl) 아니요를 나타내는 X입니다. 녹색 확인 표시.
구자라트어 녹색 확인 표시. 아니요를 나타내는 X입니다.
히브리어 아니요를 나타내는 X입니다. 녹색 확인 표시.
힌디어 안녕 녹색 확인 표시. 녹색 확인 표시.
크로아티아어 시간 녹색 확인 표시. 녹색 확인 표시.
헝가리어 녹색 확인 표시. 녹색 확인 표시.
인도네시아어 아이디 아니요를 나타내는 X입니다. 녹색 확인 표시.
이탈리아어 그것 녹색 확인 표시. 녹색 확인 표시.
일본어 JA 녹색 확인 표시. 녹색 확인 표시.
카자흐어 kk (kk) 아니요를 나타내는 X입니다. 녹색 확인 표시.
칸나다어 kn 녹색 확인 표시. 아니요를 나타내는 X입니다.
한국어 녹색 확인 표시. 녹색 확인 표시.
리투아니아어 리터 아니요를 나타내는 X입니다. 녹색 확인 표시.
라트비아어 레바 아니요를 나타내는 X입니다. 녹색 확인 표시.
말라얄람어 밀리리터 녹색 확인 표시. 아니요를 나타내는 X입니다.
마라티어 녹색 확인 표시. 아니요를 나타내는 X입니다.
말레이어 밀리초(ms) 녹색 확인 표시. 녹색 확인 표시.
노르웨이어 복말 nb 녹색 확인 표시. 아니요를 나타내는 X입니다.
네덜란드어 네덜란드어 녹색 확인 표시. 녹색 확인 표시.
노르웨이어 아니요 아니요를 나타내는 X입니다. 녹색 확인 표시.
펀잡어 pa 녹색 확인 표시. 아니요를 나타내는 X입니다.
폴란드어 PL 녹색 확인 표시. 녹색 확인 표시.
포르투갈어 - 브라질 pt-br 녹색 확인 표시. 녹색 확인 표시.
포르투갈어 - 포르투갈 pt-pt 녹색 확인 표시. 녹색 확인 표시.
루마니아어 ro (1) 녹색 확인 표시. 녹색 확인 표시.
러시아어 러시아 녹색 확인 표시. 녹색 확인 표시.
슬로바키아어 SK (한국어) 녹색 확인 표시. 녹색 확인 표시.
슬로베니아어 SL 아니요를 나타내는 X입니다. 녹색 확인 표시.
세르비아어 - 키릴 문자 세르비아어-키릴-체스 아니요를 나타내는 X입니다. 녹색 확인 표시.
세르비아어 - 라틴 문자 세르비아어-라틴어-체코어 아니요를 나타내는 X입니다. 녹색 확인 표시.
스웨덴어 스웨덴 녹색 확인 표시. 녹색 확인 표시.
타밀어 고맙습니다 녹색 확인 표시. 아니요를 나타내는 X입니다.
텔루구어 te 녹색 확인 표시. 아니요를 나타내는 X입니다.
태국어 번째 녹색 확인 표시. 녹색 확인 표시.
터키어 tr 녹색 확인 표시. 녹색 확인 표시.
우크라이나어 영국 아니요를 나타내는 X입니다. 녹색 확인 표시.
베트남어 vi 아니요를 나타내는 X입니다. 녹색 확인 표시.
웨일스어 씨와이 아니요를 나타내는 X입니다. 아니요를 나타내는 X입니다.
중국어 - 간체 ZH-한스 녹색 확인 표시. 녹색 확인 표시.
중국어 - 번체 zh-한트 녹색 확인 표시. 녹색 확인 표시.

다음 단계

  • IEF 참조의 지역화 요소에 대해 자세히 알아봅니다.
  • Azure AD B2C에서 사용할 수 있는 지역화 문자열 ID 목록을 참조하세요.