# gt-react: General Translation React SDK: Общие строки URL: https://generaltranslation.com/ru/docs/react/guides/shared-strings.mdx --- title: Общие строки description: Как интернационализировать строки, используемые в разных компонентах и файлах --- {/* АВТОМАТИЧЕСКИ СГЕНЕРИРОВАНО: Не редактируйте напрямую. Отредактируйте шаблон в content/docs-templates/. */} Общие строки — это текстовые значения, которые используются в нескольких местах приложения, например в метках навигации, сообщениях форм или данных конфигурации. Вместо того чтобы дублировать логику перевода везде, используйте [`msg`](/docs/react/api/strings/msg), чтобы пометить строки для перевода, и [`useMessages`](/docs/react/api/strings/use-messages), чтобы декодировать их. ## Проблема с общим содержимым Рассмотрим эту конфигурацию навигации, которая используется во всём приложении: ```tsx // navData.ts export const navData = [ { label: 'Home', description: 'The home page', href: '/' }, { label: 'About', description: 'Information about the company', href: '/about' } ]; ``` Чтобы интернационализировать это, обычно приходится: 1. Преобразовать это в функцию, принимающую функцию перевода 2. Обновить все места использования, чтобы передавать в функцию `t` 3. Управлять возросшей сложностью по всей кодовой базе Это усложняет сопровождение и делает код менее читаемым. Функция [`msg`](/docs/react/api/strings/msg) решает эту проблему: она позволяет помечать строки для перевода прямо в коде, а затем декодировать их при необходимости. ## Быстрый старт Используйте [`msg`](/docs/react/api/strings/msg), чтобы помечать строки, и [`useMessages`](/docs/react/api/strings/use-messages), чтобы декодировать их: ```tsx // navData.ts - Пометить строки для перевода import { msg } from 'gt-react'; export const navData = [ { label: msg('Home'), description: msg('The home page'), href: '/' }, { label: msg('About'), description: msg('Information about the company'), href: '/about' } ]; ``` ```tsx // Использование компонента — декодирование помеченных строк import { useMessages } from 'gt-react'; import { navData } from './navData'; function Navigation() { const m = useMessages(); return ( ); } ``` ## Как работают общие строки Система общих строк работает в два этапа: 1. **Этап маркировки**: [`msg`](/docs/react/api/strings/msg) кодирует строки метаданными перевода 2. **Этап декодирования**: [`useMessages`](/docs/react/api/strings/use-messages) декодирует и переводит строки ```tsx // msg() кодирует строку с метаданными const encoded = msg('Hello, world!'); console.log(encoded); // "Hello, world!:eyIkX2hhc2giOiJkMjA3MDliZGExNjNlZmM2In0=" // useMessages() декодирует и переводит const m = useMessages(); const translated = m(encoded); // "Hello, world!" на языке пользователя ``` Закодированные строки из [`msg`](/docs/react/api/strings/msg) нельзя использовать напрямую — сначала их нужно декодировать с помощью [`useMessages`](/docs/react/api/strings/use-messages). ## Компоненты Используйте хук [`useMessages`](/docs/react/api/strings/use-messages): ```tsx import { useMessages } from 'gt-react'; const encodedString = msg('Hello, world!'); function MyComponent() { const m = useMessages(); return
{m(encodedString)}
; } ``` ## Получение исходных строк через decodeMsg Иногда нужно обратиться к исходной строке без перевода — например, для логирования, отладки или сравнений. Используйте [`decodeMsg`](/docs/react/api/strings/msg), чтобы извлечь исходный текст: ```tsx import { decodeMsg } from 'gt-react'; const encoded = msg('Hello, world!'); const original = decodeMsg(encoded); // "Hello, world!" (оригинал) const translated = m(encoded); // "Hello, world!" (на языке пользователя) // Полезно для логирования или отладки console.log('Исходная строка:', decodeMsg(encoded)); console.log('Переведённая строка:', m(encoded)); ``` ### Сценарии использования decodeMsg * **Разработка & отладка**: Выводите исходные строки в лог для отладки * **Резервный вариант**: Используйте исходный текст, если перевод не удалось получить * **Сравнение строк**: Сравнивайте с известными исходными значениями * **Аналитика**: Отслеживайте использование исходных строк ```tsx // Пример: обработка запасного варианта function getDisplayText(encodedStr) { const m = useMessages(); try { return m(encodedStr); } catch (error) { console.warn('Перевод не удался, используется оригинал:', decodeMsg(encodedStr)); return decodeMsg(encodedStr); } } ``` ## Использование переменных Для строк с динамическим содержимым используйте заполнители и передавайте переменные: ```tsx // Отметить строку с переменными const items = 100; export const pricing = [ { name: 'Basic', price: 100, description: msg('The basic plan includes {items} items', { items }) } ]; ``` ```tsx // Использование в компоненте function PricingCard() { const m = useMessages(); return (

{pricing[0].name}

{m(pricing[0].description)}

); } ``` ### Формат сообщений ICU Для более сложного форматирования используйте синтаксис ICU: ```tsx const count = 10; const message = msg('There are {count, plural, =0 {no items} =1 {one item} other {{count} items}} in the cart', { count }); ``` Подробнее о формате сообщений ICU см. в [документации Unicode](https://unicode-org.github.io/icu/userguide/format_parse/messages/). ## Примеры ### Конфигурация навигации ```tsx // config/navigation.ts import { msg } from 'gt-react'; export const mainNav = [ { label: msg('Home'), href: '/', icon: 'home' }, { label: msg('Products'), href: '/products', icon: 'package' }, { label: msg('About Us'), href: '/about', icon: 'info' } ]; export const footerLinks = [ { title: msg('Company'), links: [ { label: msg('About'), href: '/about' }, { label: msg('Careers'), href: '/careers' }, { label: msg('Contact'), href: '/contact' } ] }, { title: msg('Support'), links: [ { label: msg('Help Center'), href: '/help' }, { label: msg('Documentation'), href: '/docs' }, { label: msg('API Reference'), href: '/api' } ] } ]; ``` ```tsx // components/Navigation.tsx import { useMessages } from 'gt-react'; import { mainNav } from '../config/navigation'; function Navigation() { const m = useMessages(); return ( ); } ``` ### Конфигурация формы ```tsx // config/forms.ts import { msg } from 'gt-react'; export const formMessages = { placeholders: { email: msg('Enter your email address'), password: msg('Enter your password'), message: msg('Type your message here...') }, actions: { send: msg('Send Message'), save: msg('Save Changes'), cancel: msg('Cancel') }, validation: { required: msg('This field is required'), email: msg('Please enter a valid email address'), minLength: msg('Must be at least {min} characters', { min: 8 }), maxLength: msg('Cannot exceed {max} characters', { max: 100 }) }, success: { saved: msg('Changes saved successfully'), sent: msg('Message sent successfully'), updated: msg('Profile updated') }, errors: { network: msg('Network error - please try again'), server: msg('Server error - please contact support'), timeout: msg('Request timed out - please try again') } }; ``` ```tsx // components/ContactForm.tsx import { useMessages } from 'gt-react'; import { formMessages } from '../config/forms'; function ContactForm() { const m = useMessages(); const [errors, setErrors] = useState({}); return (
{errors.email && {m(formMessages.validation.email)}}
); } ``` ### Генерация динамического контента ```tsx // utils/productData.ts import { msg } from 'gt-react'; function mockProducts() { return [ { name: 'iPhone 15', company: 'Apple', category: 'Electronics' }, { name: 'Galaxy S24', company: 'Samsung', category: 'Electronics' } ]; } export function getProductData() { const products = mockProducts(); return products.map(product => ({ ...product, description: msg('{name} is a {category} product by {company}', { name: product.name, category: product.category, company: product.company }) })); } ``` ```tsx // components/ProductList.tsx import { useMessages } from 'gt-react'; import { getProductData } from '../utils/productData'; function ProductList() { const m = useMessages(); const products = getProductData(); return (
{products.map(product => (

{product.name}

{m(product.description)}

))}
); } ``` ## Частые проблемы ### Использование закодированных строк напрямую Никогда не используйте результат [`msg`](/docs/react/api/strings/msg) напрямую: ```tsx // ❌ Неверно — закодированная строка используется напрямую const encoded = msg('Hello, world!'); return
{encoded}
; // Отображает закодированную строку, а не перевод // ✅ Верно — сначала декодируйте строку const encoded = msg('Hello, world!'); const m = useMessages(); return
{m(encoded)}
; // Отображает корректный перевод ``` ### Динамический контент в msg() Строки должны быть известны на этапе сборки: ```tsx // ❌ Неверно — динамический шаблонный литерал const name = 'John'; const message = msg(`Hello, ${name}`); // Ошибка на этапе сборки // ✅ Верно — используйте переменные const name = 'John'; const message = msg('Hello, {name}', { name }); ``` ### Если забыть декодировать Каждую строку [`msg`](/docs/react/api/strings/msg) нужно декодировать: ```tsx // ❌ Отсутствует декодирование const config = { title: msg('Dashboard'), subtitle: msg('Welcome back') }; // Позже в компоненте — забыли декодировать return

{config.title}

; // Отображает закодированную строку // ✅ Правильно — декодируем при использовании const m = useMessages(); return

{m(config.title)}

; // Отображает переведённый заголовок ``` ## Что дальше * [Руководство по словарям](/docs/react/guides/dictionaries) — Организуйте переводы с помощью структурированных данных * [Руководство по языкам](/docs/react/guides/languages) — Настройте поддерживаемые языки * Справочник по API: * [Функция `msg`](/docs/react/api/strings/msg)