У каждого экземпляра Lingo есть набор методов форматирования для активной локали. Это тонкие обертки над нативными API Intl.* — без лишнего веса в бандле и без навязанных значений по умолчанию, кроме строки локали, которую вы уже передали в LingoProvider.
Все методы чистые: одинаковые входные данные и локаль дают одинаковый результат. Их можно безопасно вызывать прямо в render без мемоизации.
Числа#
l.num(value, options?)#
Форматирует число с учетом локали: правильно расставляет разделители разрядов и десятичные знаки.
l.num(1234567); // "1,234,567" (en) / "1.234.567" (de) / "1 234 567" (fr)
l.num(3.14159, { maximumFractionDigits: 2 }); // "3.14" (en) / "3,14" (de)options проксируется в Intl.NumberFormat.
l.currency(value, code, options?)#
l.currency(29.99, "USD"); // "$29.99" (en) / "29,99 $US" (fr)
l.currency(29.99, "EUR"); // "€29.99" (en) / "29,99 €" (de)l.percent(value, options?)#
Передавайте десятичную дробь (0.156, а не 15.6).
l.percent(0.156); // "16%" (en) / "16 %" (fr)
l.percent(0.156, { maximumFractionDigits: 1 }); // "15.6%"l.unit(value, unit, options?)#
unit — это название единицы измерения, которое распознает Intl (celsius, kilometer-per-hour, megabyte и т. д.).
l.unit(32, "celsius"); // "32°C" (en) / "32 °C" (de)
l.unit(120, "kilometer-per-hour"); // "120 km/h"l.compact(value, options?)#
l.compact(1234567); // "1.2M" (en) / "123万" (ja) / "1,2 Mio." (de)
l.compact(950); // "950"Даты и время#
l.date(value, options?) / l.time / l.datetime#
Принимает Date или время в миллисекундах Unix epoch.
l.date(new Date()); // "3/16/2026" (en) / "16.03.2026" (de)
l.time(new Date()); // "3:45 PM" (en) / "15:45" (de)
l.datetime(new Date()); // "3/16/2026, 3:45 PM" (en)
l.date(now, { dateStyle: "long" }); // "March 16, 2026"
l.date(now, { weekday: "short", month: "short", day: "numeric" }); // "Mon, Mar 16"l.relative(value, unit, options?)#
Смещение со знаком: отрицательное для прошлого, положительное для будущего.
l.relative(-3, "day"); // "3 days ago" (en) / "vor 3 Tagen" (de)
l.relative(2, "hour"); // "in 2 hours"
l.relative(0, "second", { numeric: "auto" }); // "now"Списки#
l.list(items, options?)#
Соединяет элементы списка с учетом локали. По умолчанию используется стиль long и тип conjunction ("и").
l.list(["apples", "oranges", "pears"]); // "apples, oranges, and pears" (en)
// "apples, oranges y pears" (es)
l.list(["red", "blue"], { type: "disjunction" }); // "red or blue"Размеры файлов#
l.fileSize(bytes)#
Удобная обертка: сама подбирает подходящую единицу измерения (B, KB, MB, GB, TB, PB) и форматирует результат с учетом локали и десятичных знаков.
l.fileSize(1024); // "1 KB"
l.fileSize(1073741824); // "1 GB" (en) / "1 Go" (fr)
l.fileSize(1536); // "1.5 KB"Отображаемые названия#
l.displayName(code, type)#
Преобразует код языка, региона, письменности или валюты в локализованное название.
l.displayName("en", "language"); // "English" (en) / "Englisch" (de) / "Английский" (ru)
l.displayName("US", "region"); // "United States" / "Vereinigte Staaten"
l.displayName("USD", "currency"); // "US Dollar" / "US-Dollar"
l.displayName("Cyrl", "script"); // "Cyrillic" / "Kyrillisch"Возвращает undefined, если код не распознан для запрошенного типа.
Сравнение и сортировка#
l.sort(items, options?)#
Возвращает новый отсортированный массив — исходный не изменяется.
l.sort(["ä", "z", "a"]); // de: ["a", "ä", "z"] sv: ["a", "z", "ä"]
l.sort(["File 10", "File 2"], { numeric: true }); // ["File 2", "File 10"]Сегментация#
l.segment(text, granularity?)#
Разбивает текст на графемы, слова или предложения с учетом локали. Особенно важно для CJK-языков, где слова не отделяются пробелами.
l.segment("Hello world", "word"); // ["Hello", " ", "world"]
l.segment("こんにちは世界", "word"); // ["こんにちは", "世界"] (ja)
l.segment("café", "grapheme"); // ["c", "a", "f", "é"]По умолчанию используется granularity "grapheme".
Зачем нужны тонкие обертки?#
Каждый метод делегирует работу нативному форматтеру Intl — без парсинга, числовых библиотек и лишних зависимостей. Это помогает держать бандл компактным и позволяет платформе самой работать с данными локалей. А значит, новые локали, добавленные в таблицы ICU для V8 / SpiderMonkey, начинают поддерживаться автоматически.
Единственное, что здесь добавлено поверх чистого Intl, — строка локали: вы задаете ее один раз через <LingoProvider locale="...">, и все форматтеры берут ее оттуда. Если вам ближе чистый Intl (для кода вне React), createLingo(locale) вернет тот же объект, но без провайдера.
Куда дальше#
- useLingo — перевод строк через
l.textиl.rich. - Множественные формы и select — выбор формы по числу или категории.
