语言
@cloud-ru/ds-locale -=YTET -伊甸园字幕组=- 翻译:.
@cloud-ru/ds-locale {\fn黑体\fs20\shad2\2ah82\3ah20\4ah33\fscx95\3ch592001\be1}你觉得呢. {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢:каждый
{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢 defineLocale编号 :defineMessages时 @cloud-ru/ds-locale
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢.
[永久失效連結] (中文(简体) ) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢。 。 。 .
Когда
- 说吧
defineMessages({ 'en-GB', 'ru-RU' })+ 键defineLocale('NS', …)。 。 。 . - 说吧
LocaleProvider lang={…}页:1store缩略语:MFEgetGlobalLocaleStore) (中文(简体) ). - {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 добавляет 页:1
de-DE) (中文(简体) )<locale>.extend(lang, …)либоLocaleOverride。 。 。 .
Установка
pnpm add @cloud-ru/ds-locale
import { defineLocale, defineMessages, LocaleProvider, LocaleOverride, useLang, getGlobalLocaleStore } from '@cloud-ru/ds-locale'
Примеры
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 defineMessages编号 :defineLocale· ; LocaleProvider задаёт, useTranslations читает.
import { Button } from '@cloud-ru/ds-button';
import { defineLocale, defineMessages, LocaleProvider } from '@cloud-ru/ds-locale';
import { SegmentControl } from '@cloud-ru/ds-segment-control';
import { Tag } from '@cloud-ru/ds-tag';
import { Typography } from '@cloud-ru/ds-typography';
import { Flex } from '@cloud-ru/ds-uikit-product-flex';
import { useState } from 'react';
// Словарь компонента co-located: defineMessages требует одинаковый набор ключей во всех языках.
const DEMO_MESSAGES = defineMessages({
'en-GB': { action: 'Save', status: 'Ready', greeting: 'Hello' },
'ru-RU': { action: 'Сохранить', status: 'Готово', greeting: 'Привет' },
});
const demoLocale = defineLocale('LocaleDemo', DEMO_MESSAGES);
// Консьюмер читает строки из ближайшего LocaleProvider — текст компонентов меняется вслед за языком.
function LocalizedSurface() {
const { t, lang } = demoLocale.useTranslations();
return (
<Flex gap='2m' align='center' wrap>
<Button appearance='primary' label={t('action')} />
<Tag appearance='green' label={t('status')} />
<Typography variant='body' size='s'>
{t('greeting')} · {lang}
</Typography>
</Flex>
);
}
const LANG_ITEMS = [
{ value: 'ru-RU', label: 'Русский' },
{ value: 'en-GB', label: 'English' },
];
export function LanguageToggle() {
const [lang, setLang] = useState('ru-RU');
return (
<Flex direction='column' gap='2m' align='flex-start'>
<SegmentControl items={LANG_ITEMS} value={lang} onChange={value => setLang(String(value))} />
<LocaleProvider lang={lang} fallbackLang='en-GB'>
<LocalizedSurface />
</LocaleProvider>
</Flex>
);
}
Интерполяция
Плейсхолдеры {{name}} {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你应该知道 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你是谁 t{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
строки: t {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你还好吧.
Значения- string | number{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? (原始内容存档于2018-10-21). QQ/ICU.
// словарь → greeting: 'Привет, {{name}}!'
t('greeting', { name: 'Ada' }) // ок
t('greeting', { naem: 'Ada' }) // ошибка компиляции: нет ключа name
t('greeting') // ошибка компиляции: интерполяция обязательна
t('apply') // без плейсхолдеров — второй аргумент запрещён
Спецсимволы
(原始内容存档于2018-09-29). QQ. В
t {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢 {{nbsp}} вместо,поэтому也
{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢.
// словарь — токены видны в исходнике, символ появляется при выводе
const ru = {
price: 'Цена:{{nbsp}}{{value}}{{nnbsp}}₽', // 100 ₽ — число не отрывается от валюты
limit: 'Лимит: 10{{thinsp}}000 запросов', // 10 000 — тонкий пробел между разрядами
hours: 'Часы работы: Пн{{ndash}}Пт', // Пн–Пт — диапазон через среднее тире
plan: 'Тариф{{nbsp}}{{mdash}}{{nbsp}}Бизнес', // Тариф — Бизнес — длинное тире с неразрывными
word: 'мак{{shy}}си{{shy}}маль{{shy}}ный', // мягкие переносы: слово рвётся только при нехватке места
saved: 'Сохранение{{hellip}}', // Сохранение… — многоточие одним символом
done: 'Готово{{newline}}Можно закрыть окно', // перенос строки (нужен white-space: pre-line)
}
t('price', { value: 100 }) // → Цена: 100 ₽
t('limit') // → Лимит: 10 000 запросов
t('plan') // → Тариф — Бизнес
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 SPECIAL_CHARS (单位:千美元)@cloud-ru/ds-locale) (中文(简体) ).
道具
本地服务
本地服务
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
children | string | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined | —— 说 | |
fallbackLang | Lang | —— 说 | Язык,на也. По en-GB。 。 。 . |
lang | Lang | —— 说 | (原始内容存档于2017-09-28). QQ (QQ-Q-app/SSR). Игнорируется,если也 store。 。 。 . |
overrides | OverrideEntry | —— 说 | +++++++++++++++ <locale>.extend(lang, ...)镇静剂. |
store | LangStore | —— 说 | 校对:Soup getGlobalLocaleStore().store。 。 。 . |
相关类型
Lang=:string
朗斯多尔
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
getServerSnapshot | (() => LangSnapshot) | undefined | —— 说 | (原始内容存档于2018-09-29) (英语). SSR/. . . . . getSnapshot。 。 。 . |
getSnapshot | () => LangSnapshot | —— 说 | Текущее. {\fn黑体\fs20\shad2\2aH82\3aH20\4aH33\fscx95\3cH592001\be1}你觉得怎样 Object.isссылку,пока也. |
subscribe | (onStoreChange: () => void) => () => void | —— 说 | {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢. |
MessageTree=:{ [key: string]: string | MessageTree; }
覆盖条目
| Prop | 类型 | 默认 | 说明 |
|---|---|---|---|
lang | Lang | —— 说 | |
messages | MessageTree | PartialDeep | PartialObjectDeep | —— 说 | |
namespace | string | —— 说 |
-
PartialDeep=:T extends BuiltIns | ((...arguments_: unknown[]) => unknown) | (new (...arguments_: unknown[]) => unknown) ? T : T extends Map<infer KeyType, infer ValueType> ? Map<PartialDeep<KeyType>, PartialDeep<ValueType>> : T extends Set<infer ItemType> ? Set<PartialDeep<ItemType>> : T extends ReadonlyMap<infer KeyType, infer ValueType> ? ReadonlyMap<PartialDeep<KeyType>, PartialDeep<ValueType>> : T extends ReadonlySet<infer ItemType> ? ReadonlySet<PartialDeep<ItemType>> : T extends object ? PartialObjectDeep<T> : unknown -
PartialObjectDeep=:{ [KeyType in keyof ObjectType]?: PartialDeep<ObjectType[KeyType]> | undefined; }
Смотри
- {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 ——полная:словари也.
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
{\fn黑体\fs20\shad2\2aH82\3aH20\4aH33\fscx95\3cH592001\be1}你觉得怎么样 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢,
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? • 地名空间
BCP-47 (单位:千美元) (单位:千美元)en-GB, (中文(简体) ), ru-RU, (中文(简体) ), de-DE) (中文(简体) ).
命名空间 — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- @cloud-ru/ds-calendar, (中文(简体) ), @cloud-ru/ds-uikit-product-quota。 。 。
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # container编号 :upload编号 :systemEvent у,у
名字空间.
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? Соответствие
проверяет pnpm check:locale-namespaces (завершается作名相.
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢.
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢
(原始内容存档于2018-10-29). QQ – обычная (中文(简体) ). extend
типизирован:опечатка也.
import { calendarLocale } from '@cloud-ru/ds-calendar'
import { LocaleProvider } from '@cloud-ru/ds-locale'
const calendarDe = calendarLocale.extend('de-DE', {
apply: 'Anwenden',
current: 'Jetzt',
})
function Shell({ children }) {
return (
<LocaleProvider lang='de-DE' overrides={[calendarDe]}>
{children}
</LocaleProvider>
)
}
====================================================================================================================================================
Корневое,которое也
{\fn华文仿宋\fs16\1cHD1D1D1}好! {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 devDependencies时
импортируется import type {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢 @ds/<pkg>/locale {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? В
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你还好吧.
@cloud-ru/ds-locale——"обычная":"в";"который";"объединяет";"取名".@ds/<pkg>—— 说devDependency{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢.
LocaleOverride<typeof <pkg>Locale> {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? Строка
名字空间 \ \ \ \ \.
import { composeOverrides, getGlobalLocaleStore, LocaleOverride, LocaleProvider } from '@cloud-ru/ds-locale'
import type { calendarLocale } from '@cloud-ru/ds-calendar/locale'
import type { uploadFilesLocale } from '@cloud-ru/ds-uikit-product-upload-files/locale'
import type { quotaLocale } from '@cloud-ru/ds-uikit-product-quota/locale'
// Немецкий сразу для нескольких пакетов: одна запись на namespace.
const calendarDe: LocaleOverride<typeof calendarLocale> = {
namespace: '@cloud-ru/ds-calendar', // сверяется с литералом из типа пакета
lang: 'de-DE',
messages: {
apply: 'Anwenden',
current: 'Jetzt',
defaultPresets: { lastWeek: 'Letzte 7 Tage' },
},
}
const quotaDe: LocaleOverride<typeof quotaLocale> = {
namespace: '@cloud-ru/ds-uikit-product-quota',
lang: 'de-DE',
messages: {
increaseQuota: 'Kontingent erhöhen',
widgetTitle: { withoutProject: 'Projektkontingente' },
},
}
const uploadFilesDe: LocaleOverride<typeof uploadFilesLocale> = {
namespace: '@cloud-ru/ds-uikit-product-upload-files',
lang: 'de-DE',
messages: {
dropzoneButton: 'Datei auswählen',
errorRequired: 'Pflichtfeld',
},
}
// composeOverrides сводит записи (и массивы записей) в один список для провайдера.
const overrides = composeOverrides(calendarDe, quotaDe, uploadFilesDe)
function Shell({ children }) {
return (
<LocaleProvider store={getGlobalLocaleStore().store} overrides={overrides}>
{children}
</LocaleProvider>
)
}
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 @ds/<pkg>/locale отдаёт:地也
页:1 CalendarMessages) (中文(简体) ). {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你说什么.