LocaleSmith
Текст каждого ключа .resx прямо там, где ключ используется: значения после строки, все переводы при наведении, а отсутствующие переводы и неверные заполнители отмечены раньше, чем их увидят пользователи.
Бесплатно · Visual Studio 2022 и 2026 · 14 языков интерфейса · без телеметрии
Зачем LocaleSmith

Читаемый код
Strings.InvoiceSaved говорит мало, «Invoice {0} saved» — всё. Текст стоит после строки: неброско, курсивом.
Все языки под рукой
Наведите указатель на значение, чтобы увидеть все его переводы, или переключите весь редактор на немецкий или японский и посмотрите на свои экраны ещё до запуска приложения.
Ошибки — раньше пользователей
Отсутствующие переводы, {1}, которого нет в тексте по умолчанию, опечатка в ключе, string.Format с недостающими аргументами — всё подчёркнуто в коде.
Бесплатно и без подвохов
Без подписки, пробного периода, назойливых окон и телеметрии. Работает в Visual Studio 2022 и 2026, x64 и ARM64.
Возможности
- Значения рядом с ключами: текст каждого ключа после его строки, в кавычках; заполнители вроде
{0}выделены цветом, переводы строк показаны как ↵. - Язык предпросмотра: значения на любом языке ваших ресурсов; значение, которое .NET взял бы из ресурсов по умолчанию, — жёлтое, с ⚠.
- Все переводы при наведении: карточка со всеми языками ключа; щелчок открывает .resx этого языка прямо на значении, а если значения нет, оно добавляется само.
- Проблемы в коде: отсутствующие переводы, несовпадающие заполнители, неизвестные ключи и вызовы
string.Formatс неверным числом аргументов подчёркиваются волнистой линией. - Извлечение в ресурс: Ctrl+. на строковом литерале в C#, Visual Basic или XAML переносит его в файл .resx и ставит на его место ключ.
- Всегда актуально: файлы .resx решения читаются в фоне и отслеживаются; сохранённое изменение видно сразу.
- Тёмная и светлая темы: цвета следуют теме Visual Studio.
Какие ключи распознаются
| В коде | Где |
|---|---|
Strings.Key, Properties.Resources.Key | C#, 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 | Перевод с другими заполнителями, чем в тексте по умолчанию; лишний заполнитель падает во время выполнения и считается ошибкой. |
| LOC003 | localizer["Key"] или GetString("Key") с ключом, которого нет ни в одном файле ресурсов, и подсказкой ближайшего существующего ключа. |
| LOC004 | string.Format(Strings.Key, …) с меньшим числом аргументов, чем нужно тексту (ошибка), или с большим, чем он использует (предупреждение). |
Извлечение в ресурс
Поставьте курсор в строку и нажмите Ctrl+. — Извлечь в ресурс… предложит ключ по тексту и ближайший файл .resx. Если такой текст в файле уже есть, берётся его ключ. Строка заменяется на Strings.Key (с пространством имён, если файл его не импортирует) или на {x:Static res:Strings.Key} в XAML, где xmlns добавляется сам.

Настройки
Средства → Параметры → SmithWorks → LocaleSmith. У каждого параметра есть описание, а предпросмотр вверху сразу показывает значения на выбранном языке.
| Параметр | По умолчанию |
|---|---|
| Показывать значения ресурсов рядом с ключами | вкл. |
| Язык предпросмотра | Ресурсы по умолчанию |
| Максимальная длина | 80 |
| Проблемы: LOC001–LOC004 | все вкл. |
| «Извлечь в ресурс» в меню лампочки | вкл. |
Настройки хранятся в %LocalAppData%\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
- Ссылка «Оценить на Marketplace» в настройках.
1.0.0
- Первый публичный выпуск.