import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/ru/functional/Classes/GeoIntlRef - Реактивное форматирование чисел и дат'/>

# Класс GeoIntlRef

Реактивный класс для управления форматированием чисел, дат, валют и относительного времени. Обеспечивает автоматическое обновление форматированных строк при изменении локали.

## Ключевые особенности

- **Реактивность** — автоматическое обновление форматированных строк при изменении `Ref` локали.
- **Интернационализация** — полная поддержка стандартов `Intl` для чисел, дат, валют и единиц измерения.
- **Относительное время** — удобные методы для вывода времени в формате «2 дня назад» с поддержкой лимитов.
- **Списки и сортировка** — встроенные методы для получения названий месяцев, дней недели и локалезависимой сортировки.

## Инициализация

### `constructor`

Создает новый экземпляр `GeoIntlRef` для реактивного управления форматированием. Класс является оберткой над `GeoIntl` и обеспечивает автоматическое обновление всех вычисляемых значений при изменении кода локали.

**Параметры:**
- `code?: RefOrNormal<string>` — код локали (например, `'ru-RU'`, `'en-US'`). Может быть обычной строкой или реактивным объектом `ref`. Если значение не передано, используется текущий язык из `GeoRef`.

```typescript
import { GeoIntlRef } from '@dxtmisha/functional'
import { ref } from 'vue'

// 1. Инициализация с реактивной локалью
const code = ref('ru-RU')
const geoIntl = new GeoIntlRef(code)

// 2. Использование реактивного форматирования
const price = geoIntl.currency(1000, 'USD') // ComputedRef: '$1,000.00' (на англ) или '1 000,00 $' (на рус)

// 3. Автоматическое обновление
code.value = 'en-US' // price обновится автоматически
```

## Отображаемые имена

### `display`
Возвращает переведенное название языка, региона или скрипта.

**Параметры:**
- `value?: RefOrNormal<string>` — код для перевода (например, 'en-US').
- `typeOptions?: Intl.DisplayNamesOptions['type'] | Intl.DisplayNamesOptions` — тип отображаемого имени.

**Возвращает:** `ComputedRef<string>`

### `languageName`
Возвращает отображаемое имя языка.

**Параметры:**
- `value?: RefOrNormal<string>` — код языка.
- `style?: Intl.RelativeTimeFormatStyle` — стиль форматирования.

**Возвращает:** `ComputedRef<string>`

### `countryName`
Возвращает отображаемое имя региона (страны).

**Параметры:**
- `value?: RefOrNormal<string>` — код страны.
- `style?: Intl.RelativeTimeFormatStyle` — стиль форматирования.

**Возвращает:** `ComputedRef<string>`

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

### `number`
Форматирует число в соответствии с правилами локали.

**Параметры:**
- `value: RefOrNormal<NumberOrString>` — число для форматирования.
- `options?: Intl.NumberFormatOptions` — опции форматирования.

**Возвращает:** `ComputedRef<string>`

### `decimal`
Возвращает символ десятичного разделителя для текущей локали.

**Возвращает:** `ComputedRef<string>`

### `percent`
Форматирует число как процент.

**Параметры:**
- `value: RefOrNormal<NumberOrString>` — число (0.25 -> 25%).
- `options?: Intl.NumberFormatOptions` — опции форматирования.

**Возвращает:** `ComputedRef<string>`

### `percentBy100`
Форматирует число как процент, предварительно разделив на 100.

**Параметры:**
- `value: RefOrNormal<NumberOrString>` — число (25 -> 25%).
- `options?: Intl.NumberFormatOptions` — опции форматирования.

**Возвращает:** `ComputedRef<string>`

### `plural`
Выбирает форму множественного числа для слова.

**Параметры:**
- `value: RefOrNormal<NumberOrString>` — число.
- `words: string` — список слов через разделитель `|` (например, 'яблоко|яблока|яблок').
- `options?: Intl.PluralRulesOptions` — опции правил.
- `optionsNumber?: Intl.NumberFormatOptions` — опции форматирования числа.

**Возвращает:** `ComputedRef<string>`

## Валюта и единицы измерения

### `currency`
Форматирует число как денежную сумму.

**Параметры:**
- `value: RefOrNormal<NumberOrString>` — сумма.
- `currencyOptions?: RefOrNormal<string | Intl.NumberFormatOptions>` — код валюты или опции.
- `numberOnly?: boolean` — если `true`, возвращает только число без символа валюты.

**Возвращает:** `ComputedRef<string>`

### `currencySymbol`
Возвращает символ указанной валюты.

**Параметры:**
- `currency: RefOrNormal<string>` — код валюты (например, 'USD').
- `currencyDisplay?: keyof Intl.NumberFormatOptionsCurrencyDisplayRegistry` — способ отображения.

**Возвращает:** `ComputedRef<string>`

### `unit`
Форматирует число с единицами измерения.

**Параметры:**
- `value: RefOrNormal<NumberOrString>` — число.
- `unitOptions?: string | Intl.NumberFormatOptions` — единица измерения или опции.

**Возвращает:** `ComputedRef<string>`

### `sizeFile`
Форматирует размер файла в человекочитаемый вид (байты, КБ, МБ и т.д.).

**Параметры:**
- `value: RefOrNormal<NumberOrString>` — размер в байтах.
- `unitOptions?: string | Intl.NumberFormatOptions` — начальная единица или опции.

**Возвращает:** `ComputedRef<string>`

## Даты и время

### `date`
Форматирует дату.

**Параметры:**
- `value: RefOrNormal<NumberOrStringOrDate>` — дата.
- `type?: GeoDate` — тип формата ('date', 'time', 'datetime' и др.).
- `styleOptions?: Intl.DateTimeFormatOptions['month'] | Intl.DateTimeFormatOptions` — стиль отображения.
- `hour24?: boolean` — использовать ли 24-часовой формат.

**Возвращает:** `ComputedRef<string>`

### `time`
Форматирует время.

**Параметры:**
- `value: RefOrNormal<NumberOrStringOrDate>` — дата/время.

**Возвращает:** `ComputedRef<string>`

### `month`
Возвращает название месяца.

**Параметры:**
- `value?: RefOrNormal<NumberOrStringOrDate>` — дата.
- `style?: Intl.DateTimeFormatOptions['month']` — стиль (long, short, narrow).

**Возвращает:** `ComputedRef<string>`

### `months`
Возвращает список всех месяцев.

**Параметры:**
- `style?: Intl.DateTimeFormatOptions['month']` — стиль отображения.

**Возвращает:** `ComputedRef<ItemValue<number | undefined>[]>`

### `weekday`
Возвращает название дня недели.

**Параметры:**
- `value?: RefOrNormal<NumberOrStringOrDate>` — дата.
- `style?: Intl.DateTimeFormatOptions['weekday']` — стиль.

**Возвращает:** `ComputedRef<string>`

### `weekdays`
Возвращает список дней недели.

**Параметры:**
- `style?: Intl.DateTimeFormatOptions['weekday']` — стиль.

**Возвращает:** `ComputedRef<ItemValue<number | undefined>[]>`

## Относительное время

### `relative`
Форматирует относительное время (например, «2 дня назад»).

**Параметры:**
- `value: RefOrNormal<NumberOrStringOrDate>` — дата.
- `styleOptions?: Intl.RelativeTimeFormatStyle | Intl.RelativeTimeFormatOptions` — стиль.
- `todayValue?: Date` — дата, относительно которой считать.

**Возвращает:** `ComputedRef<string>`

### `relativeLimit`
Форматирует относительное время, но переключается на обычную дату, если лимит превышен.

**Параметры:**
- `value: RefOrNormal<NumberOrStringOrDate>` — дата.
- `limit: number` — лимит в днях.
- `todayValue?: Date` — дата «сегодня».
- `relativeOptions?: Intl.RelativeTimeFormatStyle | Intl.RelativeTimeFormatOptions` — опции относительного времени.
- `dateOptions?: Intl.DateTimeFormatOptions` — опции даты.

**Возвращает:** `ComputedRef<string>`

### `relativeByValue`
Форматирует относительный интервал по числовому значению.

**Параметры:**
- `value: RefOrNormal<NumberOrString>` — количество единиц.
- `unit: Intl.RelativeTimeFormatUnit` — единица (day, month, year и др.).
- `styleOptions?: Intl.RelativeTimeFormatStyle | Intl.RelativeTimeFormatOptions` — стиль.

**Возвращает:** `ComputedRef<string>`

## Списки и сортировка

### `sort`
Сортирует массив строк в соответствии с правилами локали.

**Параметры:**
- `data: RefOrNormal<T[]>` — массив данных.
- `compareFn?: (a: T, b: T) => [string, string]` — функция для получения строк сравнения.

**Возвращает:** `ComputedRef<T[]>`
