【问题标题】:Count distinct strings in C# code在 C# 代码中计算不同的字符串
【发布时间】:2011-04-08 21:52:28
【问题描述】:

我需要估算旧项目所需的本地化工作量。我正在寻找一种可以指向目录的工具,它会:

  • 解析目录结构中的所有*.cs文件
  • 从代码中提取所有 C# 字符串文字
  • 统计字符串出现的总次数

你知道有什么工具可以做到这一点吗?写起来很简单,但如果可以节省一些时间,那为什么不节省呢?

【问题讨论】:

  • 对于 DirectoryInfo.GetFiles("*.cs",Recursive) 中的每个文件对于文件中的每一行,检查文本字符串或“...”似乎不应该花费超过 8 小时构建。
  • 编写工具 = 8h。问一个问题 = 5 分钟。使用工具 = 5 分钟 ;)
  • 您必须小心使用 cmets。是否要提取 cmets 中的字符串?还是要先消除cmets?此外,@"..." 与 "..." 不同,因为前者可以包含换行符。还必须处理转义字符(例如 \" 不能算作终止字符串)。它并不像看起来那么简单。

标签: c# string localization


【解决方案1】:

使用 ILDASM 反编译您的 .DLL / .EXE。

我只是使用选项来转储所有,你会得到一个带有“用户字符串”部分的 .il 文件:

User Strings
-------------------------------------------------------
70000001 : (14) L"Starting up..."
7000001f : (12) L"progressBar1"
70000039 : (21) L"$this.BackgroundImage"
70000065 : (10) L"$this.Icon"
7000007b : ( 6) L"Splash"

现在如果你想知道某个字符串被使用了多少次。像这样搜索“ldstr”:

IL_003c:  /* 72   | (70)000001       */ ldstr      "Starting up..." /* 70000001 */

我认为这将更容易解析为 C#。

【讨论】:

  • 好主意!无论如何,我最终自己编写了一个 C# 字符串解析器,它以一种快速而肮脏的方式完成了这项工作。
【解决方案2】:

通过快速搜索,我发现以下工具可能对您有用,也可能没用。

http://www.devincook.com/goldparser/

我还发现另一个 SO 用户正在尝试做类似的事情。

Regex to parse C# source code to find all strings

【讨论】:

    【解决方案3】:

    好吧,如果你有硬编码的字符串,你首先需要知道你的 i18n 工作是什么(取消硬编码可能会很痛苦)。另一个问题:您需要计算可翻译的单词而不是不同的字符串,这是翻译提供者的输入。即使字符串可能看起来重复,它也可以根据上下文以不同的方式翻译,所以你不需要关心“distninct”,你只需要计算所有单词......这就是我的本地化工作方式经验。

    【讨论】:

    • 谢谢帕维尔。我需要的工具仅用于粗略的估算工作。我有一些假设可以使用,并且必须手动检查每个字符串的出现。
    • 我很乐意为您提供一些工具的名称,但不幸的是,我所知道的唯一工具是我公司内部的一些工具。对此感到抱歉。
    【解决方案4】:

    在最常见的开发中,您应该将字符串保留在程序源代码之外。在您的情况下,您能否不遗余力地将字符串提取到资源文件中?

    如果是这样,那么您可以使用 .NET 中的默认本地化解决方案,即

    resource.resx,

    resource.fr.resx,

    resources.es.resx

    存储不同语言环境的字符串。

    更新:

    实际实现取决于您的项目架构/技术,资源文件不是执行此操作的最佳方式,但它是 .NET 中最简单且推荐的方式。

    Like in this article

    A few more tutorials A few more tutorials

    【讨论】:

    • 当然这是我打算做的。我知道这应该如何正确完成。不过谢谢你的回答
    • 刚刚更新了一个链接,在此期间您可以谷歌“使用.NET中的资源文件进行本地化”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 2019-02-21
    • 1970-01-01
    相关资源
    最近更新 更多