资源文件中未使用的字符串(C#/ silverlight)

时间:2010-10-04 18:04:59

标签: c# string resources

我们有一个银光项目;所有短信都位于.resx资源文件中。由于该项目历史悠久且有很多变化,因此许多字符串都是孤立的(不再使用)。

现在我们要将项目翻译成多种语言,我不想在未使用的文本翻译上浪费钱。

有没有简单的方法来查找和删除未使用的字符串资源?

谢谢!

5 个答案:

答案 0 :(得分:2)

有一个script会为你做这件事。

答案 1 :(得分:2)

我是剧本的作者。如上所述,如果您使用的是C#,则需要在批处理文件中编辑对FINDSTR的调用,以匹配您访问资源的方式。该脚本将创建一个输出文本文件,告诉您它认为哪些资源未被使用,但不会自动从您那里删除资源。此外,由于FINDSTR的限制,如果资源包含Unicode字符,它将无法正常工作。

答案 2 :(得分:1)

我有类似的问题。我为翻译表创建了数千个资源字符串,其中许多不再需要或通过代码引用。有大约180个依赖代码文件,我无法手动浏览每个资源字符串。

以下代码(在vb.net中)将通过您的项目查找孤立资源。我的项目花了大约1分钟。可以对其进行修改以查找字符串,图像或任何其他资源类型。

总结一下;

  • 1)使用解决方案项目文件收集所有包含的代码 模块并将它们附加到单个字符串变量中;
  • 2)遍历所有资源对象,并创建一个列表(在我的例子中)是字符串的列表;
  • 3)字符串搜索是否在组合项目文本变量中查找资源字符串代码;
  • 4)报告未引用的资源对象。

该函数返回Windows剪贴板上的对象名称,以便在电子表格中粘贴或作为资源名称的列表数组。

'project file is the vbproj file for my solution
Public Function GetUnusedResources(projectFile As String, useClipboard As Boolean, strict As Boolean) As List(Of String)


    Dim myProjectFiles As New List(Of String)
    Dim baseFolder = System.IO.Path.GetDirectoryName(projectFile) + "\"

    'get list of project files 
    Dim reader As XmlTextReader = New XmlTextReader(projectFile)
    Do While (reader.Read())
        Select Case reader.NodeType
            Case XmlNodeType.Element 'Display beginning of element.
                If reader.Name.ToLowerInvariant() = "compile" Then ' only get compile included files
                    If reader.HasAttributes Then 'If attributes exist
                        While reader.MoveToNextAttribute()
                            If reader.Name.ToLowerInvariant() = "include" Then myProjectFiles.Add((reader.Value))
                        End While
                    End If
                End If
        End Select
    Loop

    'now collect files into a single string
    Dim fileText As New System.Text.StringBuilder
    For Each fileItem As String In myProjectFiles
        Dim textFileStream As System.IO.TextReader
        textFileStream = System.IO.File.OpenText(baseFolder + fileItem)
        fileText.Append(textFileStream.ReadToEnd)
        textFileStream.Close()
    Next

    ' Create a ResXResourceReader for the file items.resx.
    Dim rsxr As New System.Resources.ResXResourceReader(baseFolder + "My Project\Resources.resx")
    rsxr.BasePath = baseFolder + "Resources"
    Dim resourceList As New List(Of String)
    ' Iterate through the resources and display the contents to the console.
    For Each resourceValue As DictionaryEntry In rsxr
        If TypeOf resourceValue.Value Is String Then ' or bitmap or other type if required
            resourceList.Add(resourceValue.Key.ToString())
        End If
    Next
    rsxr.Close()  'Close the reader.

    'finally search file string for occurances of each resource string
    Dim unusedResources As New List(Of String)
    Dim clipBoardText As New System.Text.StringBuilder
    Dim searchText = fileText.ToString()
    For Each resourceString As String In resourceList
        Dim resourceCall = "My.Resources." + resourceString ' find code reference to the resource name
        Dim resourceAttribute = "(""" + resourceString + """)" ' find attribute reference to the resource name
        Dim searchResult As Boolean = False
        searchResult = searchResult Or searchText.Contains(resourceCall)
        searchResult = searchResult Or searchText.Contains(resourceAttribute)
        If Not strict Then searchResult = searchResult Or searchText.Contains(resourceString)
        If Not searchResult Then ' resource name no found so add to list
            unusedResources.Add(resourceString)
            clipBoardText.Append(resourceString + vbCrLf)
        End If
    Next

    'make clipboard object
    If useClipboard Then
        Dim dataObject As New DataObject ' Make a DataObject clipboard
        dataObject.SetData(DataFormats.Text, clipBoardText.ToString())        ' Add the data in string format.
        Clipboard.SetDataObject(dataObject) ' Copy data to the clipboard.
    End If

    Return unusedResources

End Function

答案 3 :(得分:0)

https://resxutils.codeplex.com/

这是我们为同一目的而开发的工具。

答案 4 :(得分:0)

这是一个快速且...的解决方案,它使我的 C# 生活更轻松: FindUnused.sln

它从 RESOURCES.RESX 获取要检查的字符串,并计算字符串在 .cs 和 .xaml 文件中使用的次数。 因为我使用本地化,.cs 文件使用带引号的字符串(“hello_world”),但 .xaml 文件不使用引号。所以我在单独的目录中处理扩展。

资源字符串的提炼有点......嗯嗯......看看。这个对我有用。如果你有更整洁的东西,请告诉我。