# react-native: Общие строки
URL: https://generaltranslation.com/ru/docs/react-native/guides/shared-strings.mdx
---
title: Общие строки
description: Как интернационализировать строки, используемые в нескольких компонентах и файлах
---
{/* СГЕНЕРИРОВАНО АВТОМАТИЧЕСКИ: не редактируйте напрямую. Вместо этого измените шаблон в content/docs-templates/. */}
Общие строки — это текстовые значения, которые используются в нескольких местах приложения, например в метках навигации, сообщениях форм или данных конфигурации. Вместо того чтобы дублировать логику перевода везде, используйте [`msg`](/docs/react-native/api/strings/msg), чтобы пометить строки для перевода, и [`useMessages`](/docs/react-native/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-native/api/strings/msg) решает эту проблему: она позволяет помечать строки для перевода прямо в коде, а затем декодировать их при необходимости.
## Быстрый старт
Используйте [`msg`](/docs/react-native/api/strings/msg), чтобы пометить строки, и [`useMessages`](/docs/react-native/api/strings/use-messages), чтобы декодировать их:
```tsx
// navData.ts - Пометить строки для перевода
import { msg } from 'gt-react-native';
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-native';
import { navData } from './navData';
function Navigation() {
const m = useMessages();
return (
);
}
```
## Как работают общие строки
Система общих строк состоит из двух этапов:
1. **Этап маркировки**: [`msg`](/docs/react-native/api/strings/msg) кодирует строки с метаданными перевода
2. **Этап декодирования**: [`useMessages`](/docs/react-native/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-native/api/strings/msg), нельзя использовать напрямую — их необходимо декодировать через [`useMessages`](/docs/react-native/api/strings/use-messages).
## Компоненты
Используйте хук [`useMessages`](/docs/react-native/api/strings/use-messages):
```tsx
import { useMessages } from 'gt-react-native';
const encodedString = msg('Hello, world!');
function MyComponent() {
const m = useMessages();
return
{m(encodedString)}
;
}
```
## Получение исходных строк с помощью decodeMsg
Иногда нужно получить доступ к исходной строке без перевода — например, для логирования, отладки или сравнения. Используйте [`decodeMsg`](/docs/react-native/api/strings/msg), чтобы извлечь исходный текст:
```tsx
import { decodeMsg } from 'gt-react-native';
const encoded = msg('Hello, world!');
const original = decodeMsg(encoded); // "Hello, world!" (оригинал)
const translated = m(encoded); // "Hello, world!" (на языке пользователя)
// Полезно для логирования или отладки
console.log('Original string:', decodeMsg(encoded));
console.log('Translated string:', 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 (
);
}
```
## Частые проблемы
### Прямое использование закодированных строк
Никогда не используйте результат [`msg`](/docs/react-native/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-native/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-native/guides/dictionaries) — Организуйте переводы с помощью структурированных данных
* [Руководство по языкам](/docs/react-native/guides/languages) — Настройте поддерживаемые языки
* Справочник API:
* [Функция `msg`](/docs/react-native/api/strings/msg)