LazowskiAnton · Extensions

LocaleSmith

Текст каждого ключа .resx прямо там, где ключ используется: значения после строки, все переводы при наведении, а отсутствующие переводы и неверные заполнители отмечены раньше, чем их увидят пользователи.

Бесплатно · Visual Studio 2022 и 2026 · 14 языков интерфейса · без телеметрии

Зачем LocaleSmith

Один и тот же код без LocaleSmith и с ним: ключи ресурсов и их тексты

Читаемый код

Strings.InvoiceSaved говорит мало, «Invoice {0} saved» — всё. Текст стоит после строки: неброско, курсивом.

Все языки под рукой

Наведите указатель на значение, чтобы увидеть все его переводы, или переключите весь редактор на немецкий или японский и посмотрите на свои экраны ещё до запуска приложения.

Ошибки — раньше пользователей

Отсутствующие переводы, {1}, которого нет в тексте по умолчанию, опечатка в ключе, string.Format с недостающими аргументами — всё подчёркнуто в коде.

Бесплатно и без подвохов

Без подписки, пробного периода, назойливых окон и телеметрии. Работает в Visual Studio 2022 и 2026, x64 и ARM64.

Возможности

Какие ключи распознаются

В кодеГде
Strings.Key, Properties.Resources.KeyC#, Visual Basic, F#
{x:Static res:Strings.Key}XAML (WPF, WinUI, MAUI, Avalonia)
localizer["Key"], @Localizer["Key"]ASP.NET Core и Blazor: IStringLocalizer, IViewLocalizer
GetString("Key")ResourceManager и локализаторы

Все переводы при наведении

Задержите указатель на значении: карточка покажет ключ на всех языках, отсутствующие — жёлтым. Щёлкните язык, чтобы открыть его .resx с выделенным значением, — останется просто ввести текст. Кнопки Открыть в .resx и Копировать ключ — вверху.

Всплывающая карточка с переводами ключа, двух из них нет

Проблемы

Проблемы подчёркиваются волнистой линией, как предупреждения компилятора, поэтому их показывает любой инструмент, который показывает предупреждения, — LensSmith пишет их в конце строки. Каждое правило можно отключить.

Волнистые подчёркивания на ключах с отсутствующим переводом и неверным числом аргументов форматирования
ПравилоЧто подчёркивается
LOC001Ключ, которого нет в части языковых файлов, со списком этих языков.
LOC002Перевод с другими заполнителями, чем в тексте по умолчанию; лишний заполнитель падает во время выполнения и считается ошибкой.
LOC003localizer["Key"] или GetString("Key") с ключом, которого нет ни в одном файле ресурсов, и подсказкой ближайшего существующего ключа.
LOC004string.Format(Strings.Key, …) с меньшим числом аргументов, чем нужно тексту (ошибка), или с большим, чем он использует (предупреждение).

Извлечение в ресурс

Поставьте курсор в строку и нажмите Ctrl+. — Извлечь в ресурс… предложит ключ по тексту и ближайший файл .resx. Если такой текст в файле уже есть, берётся его ключ. Строка заменяется на Strings.Key (с пространством имён, если файл его не импортирует) или на {x:Static res:Strings.Key} в XAML, где xmlns добавляется сам.

Диалог «Извлечь в ресурс» с предложенными ключом и файлом

Настройки

Средства → Параметры → SmithWorks → LocaleSmith. У каждого параметра есть описание, а предпросмотр вверху сразу показывает значения на выбранном языке.

ПараметрПо умолчанию
Показывать значения ресурсов рядом с ключамивкл.
Язык предпросмотраРесурсы по умолчанию
Максимальная длина80
Проблемы: LOC001–LOC004все вкл.
«Извлечь в ресурс» в меню лампочкивкл.

Настройки хранятся в %LocalAppData%\LocaleSmith.

Страница параметров LocaleSmith
Страница параметров с живым предпросмотром.

Вопросы и ответы

Какие файлы .resx читаются?

Все файлы .resx в папке решения (той, где лежит файл .sln или .slnx, или в корне репозитория), кроме bin, obj и node_modules. Изображения и другие нетекстовые ресурсы пропускаются.

Почему после ключа нет значения?

Ключ должен быть в файле .resx решения, а имя класса — совпадать с именем файла (Strings.resx → Strings; точки становятся подчёркиваниями, как у генератора). Значения появляются вскоре после открытия решения, когда файлы прочитаны.

После извлечения новое свойство подчёркнуто. Почему?

Строго типизированный класс (Strings.Designer.cs) перегенерируется сразу, если проект использует для него пользовательский инструмент; в проектах, которые создают его при сборке, свойство появится после следующей сборки.

{x:Static} не находит мой класс ресурсов в XAML.

x:Static нужен открытый класс. В конструкторе ресурсов задайте для файла .resx модификатор доступа Public или используйте открытую обёртку.

Работает ли вместе с LensSmith?

Да. Оба пишут в конце строк и делят это место: сначала значение ключа, за ним сообщение диагностики. Проблемы LocaleSmith появляются в LensSmith как любые другие предупреждения.

Отправляет ли LocaleSmith какие-нибудь данные?

Нет. Телеметрии нет, доступа к сети тоже; файлы ресурсов остаются на вашем компьютере.

Где сообщить о проблеме или предложить идею?

Создайте issue в репозитории Feedback на GitHub — там есть формы для ошибок и идей (конфиденциальные имена лучше изменить). Также можно воспользоваться вкладкой Q&A на Marketplace.

История изменений

1.0.1

1.0.0