Многоязычная поддержка: автоматическое переключение между китайским и английским языками
Что вы научитесь делать
- Поймите, как mystatus автоматически определяет системный язык
- Знайте, как переключить системный язык для изменения языка вывода
- Поймите приоритет и механизм отката определения языка
- Овладейте принципом работы Intl API и переменных окружения
Ваша текущая проблема
Вы могли заметить, что многоязычная поддержка mystatus иногда на китайском, иногда на английском:
# Китайский вывод
3小时限额
████████████████████████████ 剩余 85%
重置: 2小时30分钟后
# Английский вывод
3-hour limit
████████████████████████████ 85% remaining
Resets in: 2h 30mНо вы не знаете:
- Как плагин узнает, какой язык использовать?
- Можно ли вручную переключить на китайский или английский?
- Что делать, если определение неверно?
Этот урок поможет вам разобраться в механизме определения языка.
Основная идея
Многоязычная поддержка автоматически выбирает китайский или английский вывод на основе языковой среды системы, без необходимости ручной настройки. Приоритет определения: Intl API → переменные окружения → по умолчанию английский.
Приоритет определения (от высокого к низкому):
- Intl API (рекомендуется) →
Intl.DateTimeFormat().resolvedOptions().locale - Переменные окружения (откат) →
LANG、LC_ALL、LANGUAGE - По умолчанию английский (откат) →
"en"
Зачем не нужна ручная настройка?
Поскольку определение языка основано на системной среде, плагин автоматически распознаёт при запуске, пользователю не нужно изменять какие-либо конфигурационные файлы.
Поддерживаемые языки:
| Язык | Код | Условие определения |
|---|---|---|
| Китайский | zh | locale начинается с zh (например, zh-CN、zh-TW) |
| Английский | en | Другие случаи |
Покрытие перевода:
- Единицы времени (день、час、минута)
- Связанное с лимитами (оставшийся процент、время сброса)
- Сообщения об ошибках (сбой аутентификации、ошибка API、тайм-аут)
- Заголовки платформ (OpenAI、智谱 AI、Z.ai、Google Cloud、GitHub Copilot)
Следуйте за мной
Шаг 1: Посмотрите текущий системный язык
Сначала подтвердите настройки системного языка:
echo $LANGGet-ChildItem Env:LANGЧто вы должны увидеть:
- Китайская система:
zh_CN.UTF-8、zh_TW.UTF-8или похоже - Английская система:
en_US.UTF-8、en_GB.UTF-8или похоже
Шаг 2: Проверка определения языка
Выполните команду /mystatus, наблюдайте за языком вывода:
/mystatusЧто вы должны увидеть:
- Если системный язык китайский → вывод на китайском (например,
3小时限额、重置: 2小时30分钟后) - Если системный язык английский → вывод на английском (например,
3-hour limit、Resets in: 2h 30m)
Шаг 3: Временное переключение системного языка (для тестирования)
Если вы хотите протестировать эффект вывода на разных языках, можно временно изменить переменную окружения:
LANG=en_US.UTF-8 /mystatus$env:LANG="en_US.UTF-8"; /mystatusЧто вы должны увидеть:
Даже если ваша система китайская, вывод станет английским форматом.
WARNING
Это только временное тестирование, не изменит системный язык навсегда. После закрытия терминала настройки восстанавливаются.
Шаг 4: Понимание механизма определения Intl API
Intl API — это стандартный интерфейс интернационализации, предоставляемый браузером и Node.js. Плагин сначала использует его для определения языка:
Код определения (упрощённый):
// 1. Сначала используем Intl API
const intlLocale = Intl.DateTimeFormat().resolvedOptions().locale;
if (intlLocale.startsWith("zh")) {
return "zh"; // китайский
}
// 2. Откат к переменным окружения
const lang = process.env.LANG || process.env.LC_ALL || "";
if (lang.startsWith("zh")) {
return "zh";
}
// 3. По умолчанию английский
return "en";Преимущества Intl API:
- Надёжнее, основан на фактических настройках системы
- Поддерживает браузер и среду Node.js
- Предоставляет полную информацию о locale (например,
zh-CN、en-US)
Переменные окружения как откат:
- Совместим с средами, не поддерживающими Intl API
- Предоставляет способ ручного управления языком (через изменение переменных окружения)
Шаг 5: Постоянное переключение системного языка (если нужно)
Если вы хотите, чтобы mystatus всегда использовал определённый язык, можно изменить настройки системного языка:
INFO
Изменение системного языка повлияет на все приложения, не только mystatus.
macOS:
- Откройте「Системные настройки」→「Общие」→「Язык и регион」
- Добавьте нужный язык и перетащите в начало
- Перезапустите OpenCode
Linux:
# Измените ~/.bashrc или ~/.zshrc
export LANG=zh_CN.UTF-8
# Перезагрузите конфигурацию
source ~/.bashrcWindows:
- Откройте「Параметры」→「Время и язык」→«Язык и регион»
- Добавьте нужный язык и установите по умолчанию
- Перезапустите OpenCode
Контрольная точка ✅
Проверьте правильность определения языка:
| Тестовый элемент | Действие | Ожидаемый результат |
|---|---|---|
| Китайская система | Выполните /mystatus | Вывод на китайском (например, 3小时限额) |
| Английская система | Выполните /mystatus | Вывод на английском (например, 3-hour limit) |
| Временное переключение | После изменения переменной LANG выполните команду | Язык вывода меняется вместе с ней |
Предупреждения о ловушках
Частые проблемы
| Проблема | Причина | Решение |
|---|---|---|
| Язык вывода не соответствует ожиданиям | Неправильная настройка системного языка | Проверьте переменную окружения LANG или настройку системного языка |
| Intl API недоступен | Слишком старая версия Node.js или среда не поддерживает | Плагин автоматически откатится к определению переменных окружения |
| Китайская система отображает английский | Переменная окружения LANG не установлена на zh_* | Установите правильное значение LANG (например, zh_CN.UTF-8) |
Описание логики определения
Когда использовать Intl API:
- Node.js ≥ 0.12 (поддерживает Intl API)
- Среда браузера (все современные браузеры)
Когда откатиться к переменным окружения:
- Intl API вызывает исключение
- Среда не поддерживает Intl API
Когда использовать английский по умолчанию:
- Переменные окружения не установлены
- Переменные окружения не начинаются с
zh
TIP
Плагин определяет язык только один раз при загрузке модуля. После изменения системного языка нужно перезапустить OpenCode, чтобы изменения вступили в силу.
Итог урока
- Автоматическое определение: mystatus автоматически определяет системный язык, без ручной настройки
- Приоритет определения: Intl API → переменные окружения → по умолчанию английский
- Поддерживаемые языки: китайский (zh) и английский (en)
- Покрытие перевода: единицы времени、связанное с лимитами、сообщения об ошибках、заголовки платформ
- Переключение языка: измените настройки системного языка、перезапустите OpenCode
Предварительный обзор следующего урока
На следующем уроке мы изучим Частые вопросы: невозможность запроса квоты、истечение срока действия Token、проблемы с правами.
Вы узнаете:
- Как устранить проблему невозможности чтения файлов аутентификации
- Решение проблемы истечения срока действия Token
- Рекомендации по настройке при недостаточности прав
Приложение: справочник по исходному коду
Нажмите для просмотра местоположения исходного кода
Время обновления: 2026-01-23
| Функция | Путь к файлу | Номер строки |
|---|---|---|
| Функция определения языка | plugin/lib/i18n.ts | 24-40 |
| Определение китайского перевода | plugin/lib/i18n.ts | 46-124 |
| Определение английского перевода | plugin/lib/i18n.ts | 125-203 |
| Экспорт текущего языка | plugin/lib/i18n.ts | 210 |
| Экспорт функции перевода | plugin/lib/i18n.ts | 213 |
Ключевые функции:
detectLanguage(): определяет системный язык пользователя, сначала использует Intl API, откатывается к переменным окружения, по умолчанию английскийcurrentLang: текущий язык (определяется один раз при загрузке модуля)t: функция перевода, возвращает соответствующий переведённый контент на основе текущего языка
Ключевые константы:
translations: словарь перевода, содержащий два языковых пакетаzhиen- Поддерживаемые типы перевода: единицы времени (days、hours、minutes)、связанное с лимитами (hourLimit、dayLimit、remaining、resetIn)、сообщения об ошибках (authError、apiError、timeoutError)、заголовки платформ (openaiTitle、zhipuTitle、googleTitle、copilotTitle)
Логика определения:
- Сначала используйте
Intl.DateTimeFormat().resolvedOptions().localeдля определения языка - Если Intl API недоступен, откатитесь к переменным окружения
LANG、LC_ALL、LANGUAGE - Если переменные окружения также не существуют или не начинаются с
zh, по умолчанию английский