查找代码的中文插件

< 最近项目做国际化,虽然在文字内容设计上,做了配表,来帮助实现以后要的国际化。但是还是不可避免有些写在代码中的中文文字。

一.使用vs和正则表达式查找

Ctrl+shift+F,打开查找和替换。查找选项中,勾上使用正则表达式,查找的内容为(“.[\u4E00-\u9FA5]+)|([\u4E00-\u9FA5]+.”) ,可以排除注释中的代码,但是Unity的Deg和或者自定义的Deg代码没办法排除。xml和cs的格式全都找到了。

二.写Unity插件查找

可设置查找路径,排除指定名称的代码,针对个性话Debug筛选。在Console看到所有的查找结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;
using System.Text;
public class FindChineseTool : MonoBehaviour
{
    [MenuItem("Tools/查找代码中文")]
    public static void Pack()
    {
        Rect wr = new Rect(300, 400, 400, 100);
        FindChineseWindow window = (FindChineseWindow)EditorWindow.GetWindowWithRect(typeof(FindChineseWindow), wr, true, "查找项目中的中文字符");
        window.Show();
    }
}
public class FindChineseWindow : EditorWindow
{
    private ArrayList csList = new ArrayList();
    private int eachFrameFind = 4;
    private int currentIndex = 0;
    private bool isBeginUpdate = false;
    private string outputText;
    public string filePath = "/Script";
    private string strForShader= "";
    private void Awake()
    {
        
    }
    private void GetAllFIle(DirectoryInfo dir)
    {
        FileInfo[] allFile = dir.GetFiles();
        foreach (FileInfo fi in allFile)
        {
            //if (fi.DirectoryName.IndexOf("\\Assets\\Develop") == -1)//排除指定路径下的代码
            //    continue;
            if(fi.DirectoryName.Contains("FindChineseTool"))//排除指定名称的代码
                continue;
            if (fi.FullName.IndexOf(".meta") == -1 && fi.FullName.IndexOf(".cs") != -1)
            {
                csList.Add(fi.DirectoryName + "/" + fi.Name);
            }
        }
        DirectoryInfo[] allDir = dir.GetDirectories();
        foreach (DirectoryInfo d in allDir)
        {
            GetAllFIle(d);
        }
    }
    public void OnGUI()
    {
        EditorGUILayout.BeginHorizontal();
        strForShader = GUILayout.TextArea(filePath, GUIStyle.none);
        //Debug.Log("&& 图片名字:"+ str);
        if (GUILayout.Button("粘贴", GUILayout.Width(100)))
        {
            TextEditor te = new TextEditor();
            te.Paste();
            strForShader = te.content.text;
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();
        GUILayout.Label(outputText, EditorStyles.boldLabel);
        if (GUILayout.Button("开始遍历项目"))
        {
            csList.Clear();
            DirectoryInfo d = new DirectoryInfo(Application.dataPath + filePath);
            GetAllFIle(d);
            GetAllFIle(d);
            outputText = "游戏内代码文件的数量:" + csList.Count;
            isBeginUpdate = true;
            outputText = "开始遍历项目";
        }
        EditorGUILayout.EndHorizontal();
    }
    void Update()
    {
        if (isBeginUpdate && currentIndex < csList.Count)
        {
            int count = (csList.Count - currentIndex) > eachFrameFind ? eachFrameFind : (csList.Count - currentIndex);
            for (int i = 0; i < count; i++)
            {
                string url = csList[currentIndex].ToString();
                currentIndex = currentIndex + 1;
                url = url.Replace("\\", "/");
                printChinese(url);
            }
            if (currentIndex >= csList.Count)
            {
                isBeginUpdate = false;
                currentIndex = 0;
                outputText = "遍历结束,总共" + csList.Count;
            }
        }
    }
    private bool HasChinese(string str)
    {
        return Regex.IsMatch(str, @"[\u4e00-\u9fa5]");
    }
    private Regex regex = new Regex("\"[^\"]*\"");
    private void printChinese(string path)
    {
        if (File.Exists(path))
        {
            string[] fileContents = File.ReadAllLines(path, Encoding.Default);
            int count = fileContents.Length;
            for (int i = 0; i < count; i++)
            {
                string printStr = fileContents[i].Trim();
                if (printStr.IndexOf("//") == 0)  //说明是注释
                    continue;
                if (printStr.IndexOf("Debug.Log") == 0)  //说明是注释
                    continue;
                //if (printStr.IndexOf("ALog.Log") == 0)  //说明是注释
                //    continue;
                MatchCollection matches = regex.Matches(printStr);
                foreach (Match match in matches)
                {
                    if (HasChinese(match.Value))
                    {
                        Debug.Log("路径:" + path + " 行数:" + i + " 内容:" + printStr);
                        break;
                    }
                }
            }
            fileContents = null;
        }
    }
}

在找出所有带中文的代码后,然后就可以处理了。

  • 大概思路是把路径和文字内容以及生成数字编号,以分号分隔生成txt文本
  • 把txt文本导入xlsx中,以文本分隔为”,”。导入后把简体中文转换为繁体中文(中间具体内容项目原因不方便透露)
  • 有转换后的表格的id。再通过替换,把简体中文替换为id。
文章目录
  1. 1. 一.使用vs和正则表达式查找
  2. 2. 二.写Unity插件查找
|