Files
Tom Moor 49d5052a51 feat: RTL layout (#12107)
* First pass

* Remove prop drilling, fix comment layout

* Revert dev:watch to use dev:backend

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-18 15:12:57 -04:00

33 lines
1.0 KiB
TypeScript

const ltrChars =
"A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF\u2C00-\uFB1C\uFDFE-\uFE6F\uFEFD-\uFFFF";
const rtlChars = "\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC";
// oxlint-disable-next-line no-misleading-character-class
const rtlDirCheck = new RegExp("^[^" + ltrChars + "]*[" + rtlChars + "]");
const rtlLanguageCodes = new Set(["ar", "fa", "he", "ps", "ur", "yi"]);
/**
* Returns true if the text is likely written in an RTL language.
*
* @param text The text to check
* @returns True if the text is RTL
*/
export function isRTL(text: string) {
return rtlDirCheck.test(text);
}
/**
* Returns true if the given locale is an RTL language. Accepts both CLDR
* (`he_IL`) and BCP47 (`he-IL`, `he`) formats.
*
* @param locale The locale to check
* @returns True if the locale is RTL
*/
export function isRTLLanguage(locale: string | null | undefined) {
if (!locale) {
return false;
}
const code = locale.toLowerCase().split(/[-_]/)[0];
return rtlLanguageCodes.has(code);
}