JavaScript String toLocaleLowerCase() Method

Beginner
⏱️ 9 min read
📚 Updated: Jul 2026
🎯 5 Examples
🚀 5 Try-it labs
Instance method

What You’ll Learn

String.prototype.toLocaleLowerCase() returns a new lowercased string using locale-specific case rules (same API as MDN String.prototype.toLocaleLowerCase()). Learn the optional locales argument, why Turkish İ differs from English, how it compares to toLowerCase(), five examples, and try-it labs.

01

Kind

Instance method

02

Returns

New string

03

Locale

Optional BCP 47

04

vs toLowerCase

Locale-aware

05

Mutates?

No

06

Baseline

Widely available

Introduction

Need lowercase text that respects a language’s alphabet rules — not only English Unicode defaults? toLocaleLowerCase() applies locale-specific case mappings.

For everyday English or ASCII, the result usually matches toLowerCase(). For languages like Turkish, the dotted/dotless i family differs, so passing the right locales tag matters for display and comparisons.

💡
Beginner tip

Pass the UI language when casing user-facing text: title.toLocaleLowerCase("tr"). Use plain toLowerCase() only when locale rules are irrelevant.

This page is part of JavaScript String Methods. Related topics include localeCompare() and repeat().

Understanding the toLocaleLowerCase() Method

str.toLocaleLowerCase(locales?) builds a new string where each character is lowercased according to the chosen locale’s rules (or the host default when you omit locales).

  • Returns a new string — the original is unchanged.
  • Optional locales: one BCP 47 tag or an array of tags.
  • Unlike Intl.Collator, there is no locale matching — the first tag wins.
  • Most locales match toLowerCase(); Turkish is the classic exception.

📝 Syntax

General form of String.prototype.toLocaleLowerCase:

JavaScript
str.toLocaleLowerCase()
str.toLocaleLowerCase(locales)

Parameters

  • locales (optional) — a BCP 47 language tag (e.g. "en-US", "tr") or an array of tags. After validation, only the first locale is used (or the default locale if the list is empty). There is no fallback matching like other Intl APIs.

Return value

A new string representing the calling string converted to lower case according to locale-specific case mappings.

Exceptions

RangeError if a locale identifier is structurally invalid (same family of checks as other Intl locale arguments).

Common patterns

JavaScript
"ALPHABET".toLocaleLowerCase();           // "alphabet"
"İstanbul".toLocaleLowerCase("en-US");    // "i̇stanbul" (i + combining dot)
"İstanbul".toLocaleLowerCase("tr");       // "istanbul"
"\u0130".toLocaleLowerCase("tr") === "i"; // true
"HELLO".toLocaleLowerCase() === "HELLO".toLowerCase(); // usually true

⚡ Quick Reference

GoalCode
Lowercase (host locale)str.toLocaleLowerCase()
Lowercase for a languagestr.toLocaleLowerCase("tr")
Prefer first of a liststr.toLocaleLowerCase(["tr", "en"])
Unicode default mappingstr.toLowerCase()
Locale-aware uppercasestr.toLocaleUpperCase(locales)

🔍 At a Glance

Four facts to remember about String.toLocaleLowerCase().

Returns
string

New lowercased text

Locales
first wins

No locale matching

vs toLowerCase
usually =

Differs for some langs

Mutates
no

Immutable string

📋 toLocaleLowerCase() vs toLowerCase()

toLocaleLowerCase()toLowerCase()
Case rulesLocale-specific mappingsUnicode default mappings
Optional arglocales (BCP 47)None
English / ASCIISame result usuallySame result usually
Turkish İCorrect with "tr"May differ from Turkish UI
Best forUser-facing text in a languageSimple / locale-agnostic code

Examples Gallery

Examples follow MDN String.toLocaleLowerCase() patterns. Use View Output or Try It Yourself for each case.

📚 Getting Started

Default lowercasing and the classic Turkish city demo.

Example 1 — Basic toLocaleLowerCase()

MDN-style demo: lowercase a simple ASCII word with the host locale.

JavaScript
"ALPHABET".toLocaleLowerCase();
// "alphabet"
Try It Yourself

How It Works

With no locales argument, the engine uses the default locale. For Latin letters like these, the result matches toLowerCase().

Example 2 — İstanbul in English vs Turkish

MDN Try it demo: the same city name lowercases differently by locale.

JavaScript
const dotted = "İstanbul";

console.log(`EN-US: ${dotted.toLocaleLowerCase("en-US")}`);
// Expected output: "i̇stanbul"

console.log(`TR: ${dotted.toLocaleLowerCase("tr")}`);
// Expected output: "istanbul"
Try It Yourself

How It Works

English mapping often yields i plus a combining dot (U+0307. Turkish mapping yields a plain i, which is what Turkish readers expect.

🔧 Locale Details

Single-character checks and locale arrays.

Example 3 — Capital İ (\u0130)

MDN demo: compare the dotted capital I under Turkish and English.

JavaScript
"\u0130".toLocaleLowerCase("tr") === "i";
// true

"\u0130".toLocaleLowerCase("en-US") === "i";
// false
Try It Yourself

How It Works

\u0130 is Latin capital letter I with dot above. Under "tr" it becomes a single "i". Under "en-US" the result is not equal to plain "i".

Example 4 — Array of Locales (First Wins)

MDN demo: pass several Turkish tags — only the first is used.

JavaScript
const locales = ["tr", "TR", "tr-TR", "tr-u-co-search", "tr-x-turkish"];

"\u0130".toLocaleLowerCase(locales) === "i";
// true
Try It Yourself

How It Works

Unlike localeCompare, this method does not pick the best supported tag from the list. After validating the argument, it always uses the first entry — here "tr".

Example 5 — Normalize Labels for a Locale

Practical pattern: lowercase product labels with the shop’s language.

JavaScript
function displayLabel(text, locale) {
  return text.toLocaleLowerCase(locale);
}

const title = "İSTANBUL GUIDE";
const en = displayLabel(title, "en-US");
const tr = displayLabel(title, "tr");

console.log(en === tr);           // false — different mappings
console.log(tr.includes("istan")); // true
console.log("MIXED".toLocaleLowerCase() === "MIXED".toLowerCase()); // true
Try It Yourself

How It Works

Pass the same locale you use for formatting and sorting so case, collation, and display stay consistent for that language.

🎯 Common Use Cases

  • Localized UI copy — headings and labels in the user’s language.
  • Search / filter prep — normalize case before comparing Turkish (or similar) text.
  • Multilingual apps — pair with localeCompare and the same locale tag.
  • Not always needed — for ASCII-only codes and IDs, toLowerCase() is fine.
  • Not for sorting — use localeCompare / Intl.Collator for order.

🧠 How toLocaleLowerCase() Works

1

Resolve locales

Validate tags; take the first locale or the host default.

Input
2

Apply case mappings

Map each character using that locale’s lowercase rules.

Transform
3

Build a new string

Length may change when one character maps to several code points.

Result
4

Return the new string

The original string is never modified.

📝 Notes

  • In most cases the result equals toLowerCase() — locale differences show up for specific languages.
  • Locale arrays do not fall back: the first tag is always chosen after validation.
  • Case conversion can change string length (one code point → multiple).
  • For case-insensitive equality across locales, normalize both sides with the same locale.
  • Pair with toLocaleUpperCase() when you need the matching uppercase path.

Browser & Runtime Support

String.prototype.toLocaleLowerCase() is Baseline Widely available — supported across modern browsers since July 2015.

Baseline · Widely available

String.toLocaleLowerCase()

Safe for production in browsers and runtimes (Node.js, Deno, Bun). Pass locales when language-specific casing matters.

Universal Widely available
Google Chrome Supported · Desktop & Mobile
Full support
Mozilla Firefox Supported · Desktop & Mobile
Full support
Apple Safari Supported · macOS & iOS
Full support
Microsoft Edge Supported · Chromium
Full support
Internet Explorer No native support · Use a polyfill
Polyfill
Opera Supported · Modern versions
Full support
Samsung Internet Supported · Android
Full support
Bun Supported · JavaScript runtime
Supported
Deno Supported · JavaScript runtime
Supported
Node.js Supported · Server runtime
Supported
Android WebView Supported · Modern WebView
Full support
toLocaleLowerCase() Excellent

Bottom line: Use String.toLocaleLowerCase() for locale-aware lowercasing. Remember the first locale in a list wins, and prefer toLowerCase() only when locale rules do not matter.

Conclusion

String.prototype.toLocaleLowerCase() is the right tool when lowercasing must follow a language’s alphabet — especially Turkish dotted/dotless i. For simple ASCII, toLowerCase() remains fine.

Continue with localeCompare(), replace(), or the String methods hub.

💡 Best Practices

✅ Do

  • Pass the UI language when casing user-facing text
  • Use the same locale for compare and case normalize
  • Prefer this over toLowerCase for Turkish and similar
  • Keep ASCII IDs / codes on toLowerCase if locale is irrelevant
  • Treat the result as a new string (immutability)

❌ Don’t

  • Expect locale array fallback / matching
  • Assume English and Turkish always match
  • Use case methods to sort — use localeCompare
  • Mutate expectations — original string stays unchanged
  • Forget invalid locale tags can throw RangeError

Key Takeaways

Knowledge Unlocked

Five things to remember about String.toLocaleLowerCase()

Locale-aware lowercase — first locale wins, original unchanged.

5
Core concepts
🌐 02

Locales

optional BCP 47

Arg
🔢 03

Array

first wins

Rule
🇺🇸 04

Turkish

İ differs

Classic
05

Mutates

no

Immutable

❓ Frequently Asked Questions

String.prototype.toLocaleLowerCase(locales?) returns a new string with characters lowercased using locale-specific case mappings. Without locales, the host default locale is used.
For most Latin text they match. toLocaleLowerCase respects language rules (for example Turkish dotted/dotless i). Prefer toLocaleLowerCase when the UI language can change case mapping.
A BCP 47 language tag such as "tr" or "en-US", or an array of tags. Unlike Intl.Collator, toLocaleLowerCase does not do locale matching — it uses the first locale in the list (or the default if the list is empty).
In Turkish, uppercase İ (U+0130) lowercases to plain i, while English often produces i plus a combining dot. Passing "tr" gives the Turkish mapping.
No. Strings are immutable. The method returns a new lowercased string.
Use toLowerCase for simple ASCII or when you intentionally want the Unicode default mapping and do not care about locale. Use toLocaleLowerCase for user-facing text in a known language.
Did you know?

toLocaleLowerCase and toLocaleUpperCase intentionally skip Intl-style locale matching. After checking validity, they always use the first locale you pass — so put your preferred language first in the array.

More String Methods

Return to the hub for slice, trim, replace, and more.

String methods hub →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

8 people found this page helpful