Locale Converter

Convert locale formats online between BCP 47, POSIX, HTML lang, and Accept-Language styles while previewing real Intl output

Popular Locales

Try Common Inputs

Browser Support

Enter a locale identifier to see parsing results and formatting previews...

How to Use

  1. 1

    Paste Any Locale String

    Start with browser locales, POSIX values like en_US.UTF-8, script tags like zh_Hans_CN, or an Accept-Language header.

  2. 2

    Normalize The Tag

    The tool canonicalizes the value into a BCP 47 locale and shows matching POSIX, HTML lang, and Intl snippets.

  3. 3

    Copy The Right Format

    Use the output block that fits your use case: web markup, JavaScript Intl, environment variables, or QA docs.

  4. 4

    Compare Output Differences

    Switch to compare mode to inspect how two locales differ for numbers, currency, dates, and collation behavior.

Why Use Be Converter?

Browser Native

Powered by built-in Intl APIs. No server calls, no external dependencies. Works offline and respects your privacy.

Real-time Preview

Instantly see how numbers, dates, currencies, and lists are formatted in any locale as you type.

Normalize Real Inputs

Paste POSIX locales, ICU-style underscores, or Accept-Language headers and turn them into clean BCP 47 and HTML-ready locale strings.

Comprehensive Analysis

Parse locale components, show display names in multiple languages, and compare two locales side by side.

Perfect For

Convert en_US.UTF-8 to en-US Prepare HTML lang attributes Normalize Accept-Language headers QA locale fallback chains Check Intl resolved locales Document i18n implementation details

Frequently Asked Questions

What is a locale identifier?
A locale identifier is a short string that identifies a specific combination of language, region, script, and other preferences. Common formats include BCP 47 tags (en-US, zh-Hans-CN) and POSIX identifiers (en_US.UTF-8). They determine how text, numbers, dates, and currencies are displayed.
What is the difference between BCP 47 and POSIX locale formats?
BCP 47 uses hyphens to separate components (en-US, zh-Hans-CN) and is the standard for web technologies. POSIX uses underscores (en_US, zh_Hans_CN.UTF-8) and is common in Unix/Linux systems. Both identify the same locale but use different syntax conventions.
How does this tool work without a server?
This tool uses the browser's built-in Intl API family (Intl.Locale, Intl.NumberFormat, Intl.DateTimeFormat, Intl.DisplayNames, etc.) to parse locale identifiers and generate formatting previews. All processing happens in your browser — no data is sent to any server.
Why do some locales show different results across browsers?
The Intl API implementation and locale data vary between browsers and operating systems. Chrome, Firefox, and Safari may use different Unicode CLDR data versions, leading to subtle differences in formatting. The resolved locale shown in the results reflects what your browser actually uses.
What does "resolved locale" mean?
When you request a locale like "en", the browser may resolve it to a more specific locale like "en-US" or "en-Latn-US" depending on its available data. The resolved locale is the actual locale the browser uses for formatting, which may differ from your input.

Common Locale Conversion Examples

These are the most common locale-string cleanup tasks developers and localization teams search for when they need a locale converter online.

Input
en_US.UTF-8
Output
en-US

Convert Unix-style locale environment values into a BCP 47 tag you can use in frontend code.

Input
zh_Hans_CN
Output
zh-Hans-CN

Normalize script subtags with the casing web platforms expect.

Input
sr_RS@latin
Output
sr-Latn-RS

Translate a POSIX modifier into a script-aware locale tag for product localization.

Input
Accept-Language: fr-CA,fr;q=0.9
Output
fr-CA

Extract the preferred locale from a browser header before routing or formatting content.

Understanding Locale Identifiers

BCP 47 Structure

A BCP 47 language tag consists of subtags separated by hyphens: language (required, 2-3 letters), script (optional, 4 letters), region (optional, 2 letters or 3 digits), and variants (optional). Examples:

  • Language only en, zh, ar
  • Language + Region en-US, zh-CN, pt-BR
  • Language + Script zh-Hans, sr-Latn
  • Full tag zh-Hans-CN, en-Latn-US

Intl API in Practice

The JavaScript Intl API family provides locale-aware formatting for numbers, dates, lists, relative time, and more. Use Intl.Locale to parse identifiers, Intl.DisplayNames to get human-readable names, and Intl.NumberFormat/DateTimeFormat for formatting.

  • Intl.getCanonicalLocales(["pt-br"]) - canonicalize
  • new Intl.Locale("zh-Hans-CN") — parse
  • Intl.DisplayNames — display names
  • Intl.NumberFormat — numbers
  • Intl.DateTimeFormat — dates

Best Practice: Always use the most specific locale tag that fits your needs. For web applications, use the user's preferred language from navigator.language and fall back gracefully. Test with multiple locales early in development.

Copied to clipboard!