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
Fundamentals
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.
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.
Foundation
📝 Syntax
General form of String.prototype.toLocaleLowerCase:
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).
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
Pass the same locale you use for formatting and sorting so case, collation, and display stay consistent for that language.
Applications
🎯 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.
Important
📝 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.
Compatibility
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.
UniversalWidely available
Google ChromeSupported · Desktop & Mobile
Full support
Mozilla FirefoxSupported · Desktop & Mobile
Full support
Apple SafariSupported · macOS & iOS
Full support
Microsoft EdgeSupported · Chromium
Full support
Internet ExplorerNo native support · Use a polyfill
Polyfill
OperaSupported · Modern versions
Full support
Samsung InternetSupported · Android
Full support
BunSupported · JavaScript runtime
Supported
DenoSupported · JavaScript runtime
Supported
Node.jsSupported · Server runtime
Supported
Android WebViewSupported · 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.
Wrap Up
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.
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
Summary
Key Takeaways
Knowledge Unlocked
Five things to remember about String.toLocaleLowerCase()
Locale-aware lowercase — first locale wins, original unchanged.
5
Core concepts
📝01
Returns
new string
API
🌐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.