Как работать с локализацией для Сербии (регион RS) в Java?

Ответ

В Java для корректной обработки региональных форматов (даты, числа, валюты, текста) для Сербии используется класс java.util.Locale.

1. Создание локали для Сербии:

// Код страны - RS (Сербия), язык - sr (сербский)
Locale serbianLocale = new Locale("sr", "RS");

// Можно также использовать константу, если доступна
// Locale serbianLocale = Locale.forLanguageTag("sr-RS");

System.out.println(serbianLocale.getDisplayCountry()); // "Сербия" (или "Serbia" в зависимости от локали системы)
System.out.println(serbianLocale.getCountry()); // "RS"
System.out.println(serbianLocale.getLanguage()); // "sr"

2. Применение локали в форматировании:

Форматирование чисел и валют:

import java.text.NumberFormat;
import java.util.Locale;

Locale localeRS = new Locale("sr", "RS");
double number = 1234567.89;

NumberFormat numFormat = NumberFormat.getInstance(localeRS);
System.out.println(numFormat.format(number)); // "1.234.567,89" (разделитель тысяч - точка, дробная часть - запятая)

NumberFormat currFormat = NumberFormat.getCurrencyInstance(localeRS);
System.out.println(currFormat.format(number)); // "1.234.567,89 RSD" (сербский динар)

Форматирование дат и времени:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

Locale localeRS = new Locale("sr", "RS");
LocalDate date = LocalDate.now();

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("dd. MMMM yyyy.", localeRS); // Паттерн с полным названием месяца

String formattedDate = date.format(formatter);
System.out.println(formattedDate); // Например, "15. април 2024."
// Месяц будет выведен на сербском языке (кириллица).

3. Важные замечания:

  • Сербия использует кириллический (ћирлица) и латинский (latinica) алфавиты. В IT-системах чаще применяется латиница (sr-Latn-RS). Уточните требуемую кодировку.
  • Для правильной сортировки строк используйте Collator.getInstance(serbianLocale).
  • Убедитесь, что JVM имеет данные о локали sr-RS, или используйте библиотеки, такие как ICU4J, для расширенной поддержки.

Ответ 18+ 🔞

А, ну это же про Сербию, блядь! Ну что, погнали разбираться, как там у них с этими вашими форматами, чтобы не вышло как всегда — криво и косо, а потом охуевать, почему у пользователя дата выглядит, будто её марсианин писал.

Так, слушай сюда. В Java, если тебе надо всё сделать по-сербски — даты, числа, деньги, текст — тебе в помощь старый добрый java.util.Locale. Без него — нихуя не получится, всё будет на твоём родном, а сербу покажется, что его ебёт медведь.

1. Создаём эту самую локаль для Сербии:

// Страна — RS (Сербия), язык — sr (сербский). Всё просто, как три копейки.
Locale serbianLocale = new Locale("sr", "RS");

// Или вот так можно, если ты любитель констант и красивых тегов
// Locale serbianLocale = Locale.forLanguageTag("sr-RS");

System.out.println(serbianLocale.getDisplayCountry()); // Напечатает "Сербия" (или "Serbia", смотря в какой ты сам локали сидишь)
System.out.println(serbianLocale.getCountry()); // "RS" — код, ёпта
System.out.println(serbianLocale.getLanguage()); // "sr" — язык

Вот и вся магия. Создали объектик, теперь он наш проводник в мир сербских точек, запятых и кириллицы.

2. А теперь применяем эту хуйню на практике:

Числа и валюта — чтобы динары считали красиво:

import java.text.NumberFormat;
import java.util.Locale;

Locale localeRS = new Locale("sr", "RS");
double number = 1234567.89; // Допустим, столько у нас динаров

NumberFormat numFormat = NumberFormat.getInstance(localeRS);
System.out.println(numFormat.format(number)); // Выведет "1.234.567,89"
// Видишь? Тысячи разделены точкой, а дробная часть — запятой. Не как у нас, блядь. У них так.

NumberFormat currFormat = NumberFormat.getCurrencyInstance(localeRS);
System.out.println(currFormat.format(number)); // Выведет "1.234.567,89 RSD"
// Красота! И сумма, и подпись, что это сербские динары. Уже не стыдно показывать.

Даты и время — чтобы не путать апрель с априлом:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

Locale localeRS = new Locale("sr", "RS");
LocalDate date = LocalDate.now(); // Сегодняшняя дата, например

DateTimeFormatter formatter = DateTimeFormatter
    .ofPattern("dd. MMMM yyyy.", localeRS); // Паттерн с полным названием месяца, да ещё и с точкой в конце, затейники

String formattedDate = date.format(formatter);
System.out.println(formattedDate); // Например, "15. април 2024."
// Смотри-ка, месяц на сербском! "април", а не "april". Кириллица, сука! Душевно.

3. Важные нюансы, на которых можно обосраться:

  • В Сербии, блядь, два алфавита — кириллица (ћирлица) и латиница (latinica). В IT-мире чаще таки используют латиницу, типа sr-Latn-RS. Так что уточни у заказчика, какого хуя он хочет, а то потом переделывать. Самый надёжный способ — спросить: «Чирилица или латиница, ёпта?».
  • Если нужно сортировать строки по-сербски (а не как бог на душу положит), используй Collator.getInstance(serbianLocale). Он знает их алфавитный порядок, а ты — нет.
  • И последнее, блядь: убедись, что твоя JVM вообще в курсе про локаль sr-RS. А то может оказаться, что данных нет, и форматирование сработает как попало. Если что, тащи библиотеку ICU4J — она, эта мартышлюшка, знает про все локали на свете.

Вот и весь сказ. Создал локаль, применил её в форматтерах — и сидишь, довольный, как слон. Пользователь в Белграде видит всё как родное, а ты не получаешь по шапке за кривой интерфейс. Идеально, ёпта!