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调用,都以波浪线标出。 - 提取到资源:在 C#、Visual Basic 或 XAML 的字符串上按 Ctrl+.,即可将其移到 .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(文件未导入命名空间时会带上命名空间),在 XAML 中则替换为 {x:Static res:Strings.Key},并自动添加 xmlns。

设置
工具 → 选项 → SmithWorks → LocaleSmith。每个选项都有说明,顶部的预览会立即以所选语言显示值。
| 选项 | 默认值 |
|---|---|
| 在键旁边显示资源值 | 开 |
| 预览语言 | 默认资源 |
| 最大长度 | 80 |
| 问题:LOC001–LOC004 | 全部开启 |
| 在灯泡菜单中提供“提取到资源” | 开 |
设置保存在 %LocalAppData%\LocaleSmith 中。

常见问题
它会读取哪些 .resx 文件?
解决方案文件夹(包含 .sln 或 .slnx 文件的文件夹,或仓库根目录)下的所有 .resx 文件,但 bin、obj 和 node_modules 除外。图像和其他非文本资源会被跳过。
为什么键后面没有显示值?
该键必须存在于解决方案的某个 .resx 文件中,且类名必须与文件名一致(Strings.resx → Strings;与生成器一样,点会变成下划线)。打开解决方案后,文件读取完毕,值会稍后出现。
提取后,新属性下方出现了下划线,为什么?
如果项目使用自定义工具生成强类型类(Strings.Designer.cs),该类会立即重新生成;在生成过程中生成该类的项目,会在下次生成后才有这个属性。
XAML 中的 {x:Static} 找不到我的资源类。
x:Static 需要 public 类。请在资源设计器中将 .resx 文件的访问修饰符设为 Public,或使用一个 public 包装类。
它能与 LensSmith 一起使用吗?
可以。两者都在行尾显示内容,因此会共享这块空间:先显示键的值,再显示诊断消息。LocaleSmith 的问题会像其他警告一样显示在 LensSmith 中。
LocaleSmith 会发送任何数据吗?
不会。没有遥测,也不访问网络;你的资源文件始终留在你的计算机上。
在哪里报告问题或提出功能建议?
请在 GitHub 上的 Feedback 仓库中提交 issue——那里有用于报告错误和提出建议的表单(如有私密名称,请先替换)。也可以使用 Marketplace 上的 Q&A 选项卡。
更新日志
1.0.1
- 设置中新增“在 Marketplace 上评价”链接。
1.0.0
- 首个公开版本。