Неиспользуемые строки в файле ресурсов (C # / silverlight) - PullRequest
4 голосов
/ 04 октября 2010

У нас есть проект Silverlight; все текстовые сообщения находятся в файле ресурсов .resx. Поскольку проект имеет долгую историю и было много изменений, многие строки потеряли (больше не используются).

Теперь мы собираемся перевести проект на несколько языков, и я не хочу тратить деньги на неиспользованный перевод текста.

Есть ли простой способ найти и удалить неиспользованные строковые ресурсы?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 08 октября 2010

Я автор сценария.Как уже упоминалось, если вы используете C #, вам нужно отредактировать вызов FINDSTR в командном файле, чтобы он соответствовал тому, как вы обращаетесь к ресурсам.Сценарий создаст выходной текстовый файл, сообщающий вам, какие ресурсы он считает не используемыми, но не удалит эти ресурсы автоматически.Кроме того, он не будет работать должным образом, если ресурсы содержат символы Юникода, из-за ограничения FINDSTR.

2 голосов
/ 04 октября 2010

Существует сценарий , который сделает это за вас.

1 голос
/ 14 февраля 2013

У меня была похожая проблема.Несколько тысяч строк ресурсов, которые я создал для таблицы перевода, многие из которых больше не требуются или не ссылаются на код.Имея около 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
0 голосов
/ 20 ноября 2013

https://resxutils.codeplex.com/

Это инструмент, который мы разработали для той же цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...