docs(i18n): improved docs

This commit is contained in:
teidesu 2022-09-12 15:01:43 +03:00
parent 4847523cc1
commit b7d0b85a15
5 changed files with 65 additions and 1 deletions

View file

@ -2,4 +2,4 @@
This package implements utility for i18n functionality in `@mtcute/client` based apps.
Documentation is TBA.
Learn more in the [Guide](/guide/topics/i18n).

View file

@ -1,5 +1,8 @@
import { I18nValue, I18nValueDynamic } from "../types";
/**
* Get an English ordinal suffix (st/nd/rd/th) for a given number.
*/
export function ordinalSuffixEnglish(n: number): string {
const v = n % 100
if (v > 3 && v < 21) return 'th'
@ -15,10 +18,23 @@ export function ordinalSuffixEnglish(n: number): string {
}
}
/**
* Pluralize a value by English rules
*
* @param n Number of items
* @param one Value for "one" (1 item)
* @param many Value for "many" (0 items, 2 items, many items)
*/
export function pluralizeEnglish<T>(n: number, one: T, many: T): T {
return n === 1 ? one : many
}
/**
* Create a complex English pluralized value
*
* @param one Value for "one" (1 item)
* @param many Value for "many" (0 items, 2 items, many items)
*/
export function createPluralEnglish<Args extends any[] = []>(
one: I18nValue<[number, ...Args]>,
many: I18nValue<[number, ...Args]>

View file

@ -1,5 +1,13 @@
import { I18nValue, I18nValueDynamic } from '../types'
/**
* Pluralize a value by Russian rules
*
* @param n Number of items
* @param one Value for "one" (1 стол, 21 стол)
* @param few Value for "few" (2 стола, 42 стола)
* @param many Value for "many" (5 столов, 100 столов, 0 столов, нет столов)
*/
export function pluralizeRussian<T>(
n: number,
one: T,
@ -20,6 +28,13 @@ export function pluralizeRussian<T>(
return many
}
/**
* Create a complex Russian pluralized value
*
* @param one Value for "one" (1 стол, 21 стол)
* @param few Value for "few" (2 стола, 42 стола)
* @param many Value for "many" (5 столов, 100 столов, 0 столов, нет столов)
*/
export function createPluralRussian<Args extends any[] = []>(
one: I18nValue<[number, ...Args]>,
few: I18nValue<[number, ...Args]>,

View file

@ -3,11 +3,21 @@ import type { FormattedString } from '@mtcute/client'
type Values<T> = T[keyof T]
type SafeGet<T, K extends string> = T extends Record<K, any> ? T[K] : never
/**
* Literal translated value, represented by (optionally formatted) string
*/
export type I18nValueLiteral = string | FormattedString<any>
/**
* Dynamic translated value, represented by a
* function resolving to a literal one
*/
export type I18nValueDynamic<Args extends any[] = any[]> = (
...args: Args
) => I18nValueLiteral
/**
* Translated value. Can either be actual value or a function resolving to one
*/
export type I18nValue<Args extends any[] = any[]> =
| I18nValueLiteral
| I18nValueDynamic<Args>
@ -29,8 +39,16 @@ type ExtractParameter<Strings, K extends string> = GetValueNested<
? R
: []
/**
* Translation "adapter".
*
* Used to extract language from `Input` object.
*/
export type MtcuteI18nAdapter<Input> = (obj: Input) => string | null | undefined
/**
* Translation function.
*/
export type MtcuteI18nFunction<Strings, Input> = <
K extends NestedKeysDelimited<Strings>
>(
@ -39,6 +57,10 @@ export type MtcuteI18nFunction<Strings, Input> = <
...params: ExtractParameter<Strings, K>
) => string | FormattedString<any>
/**
* Wrapper type for i18n object containing strings for a language
* other than the primary one. Used to provide type safety.
*/
export type OtherLanguageWrap<Strings> = {
[key in keyof Strings]?: Strings[key] extends I18nValue
? I18nValue

View file

@ -6,6 +6,11 @@ try {
client = require('@mtcute/client')
} catch (e) {}
/**
* Create an index of i18n strings delimited by "."
*
* @param strings Strings object
*/
export function createI18nStringsIndex(
strings: Record<string, any>
): Record<string, I18nValue> {
@ -28,6 +33,12 @@ export function createI18nStringsIndex(
return ret
}
/**
* Extract language from `@mtcute/client` update. Can be used for customized
* adapters or external i18n libraries.
*
* @param update Update to extract language from
*/
export function extractLanguageFromUpdate(
update: ParsedUpdate['data']
): string | null | undefined {