├── Assets ├── Test.unity ├── Test.unity.meta ├── LocalizeTool.meta └── LocalizeTool │ ├── Editor.meta │ ├── ClientString.cs.meta │ ├── ClientString.cs │ ├── Editor │ ├── JpUtil.cs.meta │ ├── JpCharCheckerWindow.cs.meta │ ├── LocalizationTextEditor.cs.meta │ ├── JpUtil.cs │ ├── LocalizationTextEditor.cs │ └── JpCharCheckerWindow.cs │ ├── LocalizationText.cs.meta │ └── LocalizationText.cs ├── ProjectSettings ├── ProjectVersion.txt ├── TagManager.asset ├── AudioManager.asset ├── InputManager.asset ├── NavMeshAreas.asset ├── TimeManager.asset ├── DynamicsManager.asset ├── EditorSettings.asset ├── NetworkManager.asset ├── ProjectSettings.asset ├── QualitySettings.asset ├── GraphicsSettings.asset ├── Physics2DSettings.asset ├── UnityAdsSettings.asset ├── ClusterInputManager.asset ├── EditorBuildSettings.asset └── UnityConnectSettings.asset ├── .gitattributes ├── README.md └── .gitignore /Assets/Test.unity: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/Assets/Test.unity -------------------------------------------------------------------------------- /ProjectSettings/ProjectVersion.txt: -------------------------------------------------------------------------------- 1 | m_EditorVersion: 5.3.4f1 2 | m_StandardAssetsVersion: 0 3 | -------------------------------------------------------------------------------- /ProjectSettings/TagManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/TagManager.asset -------------------------------------------------------------------------------- /ProjectSettings/AudioManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/AudioManager.asset -------------------------------------------------------------------------------- /ProjectSettings/InputManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/InputManager.asset -------------------------------------------------------------------------------- /ProjectSettings/NavMeshAreas.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/NavMeshAreas.asset -------------------------------------------------------------------------------- /ProjectSettings/TimeManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/TimeManager.asset -------------------------------------------------------------------------------- /ProjectSettings/DynamicsManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/DynamicsManager.asset -------------------------------------------------------------------------------- /ProjectSettings/EditorSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/EditorSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/NetworkManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/NetworkManager.asset -------------------------------------------------------------------------------- /ProjectSettings/ProjectSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/ProjectSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/QualitySettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/QualitySettings.asset -------------------------------------------------------------------------------- /ProjectSettings/GraphicsSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/GraphicsSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/Physics2DSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/Physics2DSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/UnityAdsSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/UnityAdsSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/ClusterInputManager.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/ClusterInputManager.asset -------------------------------------------------------------------------------- /ProjectSettings/EditorBuildSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/EditorBuildSettings.asset -------------------------------------------------------------------------------- /ProjectSettings/UnityConnectSettings.asset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OhZero/LocalizationTextTool/HEAD/ProjectSettings/UnityConnectSettings.asset -------------------------------------------------------------------------------- /Assets/Test.unity.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 695fecf413d111f4fb8a5b2395ad36d5 3 | timeCreated: 1527598329 4 | licenseType: Pro 5 | DefaultImporter: 6 | userData: 7 | assetBundleName: 8 | assetBundleVariant: 9 | -------------------------------------------------------------------------------- /Assets/LocalizeTool.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 5584375537bfe7d44b3f571a581da711 3 | folderAsset: yes 4 | timeCreated: 1527596775 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/LocalizeTool/Editor.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: cb01dd13e7a7e7c47a3e0ed16917802a 3 | folderAsset: yes 4 | timeCreated: 1526625156 5 | licenseType: Pro 6 | DefaultImporter: 7 | userData: 8 | assetBundleName: 9 | assetBundleVariant: 10 | -------------------------------------------------------------------------------- /Assets/LocalizeTool/ClientString.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 8ab6ad525730a7e4d95c5092f36bce3b 3 | timeCreated: 1527596963 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/LocalizeTool/ClientString.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | 5 | public class ClientString { 6 | 7 | public static Dictionary LocalizationDict = new Dictionary() 8 | { 9 | {"Help", "帮助"}, 10 | {"Like", "点赞"} 11 | }; 12 | } 13 | -------------------------------------------------------------------------------- /Assets/LocalizeTool/Editor/JpUtil.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 2f1f93c6ddf48ab488b6658f6b95bbac 3 | timeCreated: 1513249948 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/LocalizeTool/LocalizationText.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 86d91f724295eaf40b1f6551526f00f6 3 | timeCreated: 1526624157 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/LocalizeTool/Editor/JpCharCheckerWindow.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 9612f62333c1cd24594eee8ea7bf8535 3 | timeCreated: 1513251107 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /Assets/LocalizeTool/Editor/LocalizationTextEditor.cs.meta: -------------------------------------------------------------------------------- 1 | fileFormatVersion: 2 2 | guid: 71a5ffa95f7ddc54da58c713512cc58b 3 | timeCreated: 1526886201 4 | licenseType: Pro 5 | MonoImporter: 6 | serializedVersion: 2 7 | defaultReferences: [] 8 | executionOrder: 0 9 | icon: {instanceID: 0} 10 | userData: 11 | assetBundleName: 12 | assetBundleVariant: 13 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LocalizationTextTool 2 | A tool helps you find out the japanese or chinese chars in your project.And transform them to *Localization Text*. 3 | 4 | - 1.You can find the files(scene\prefab) which contains japanese/chinese chars. 5 | - 2.You can upgrade the component in the files from *Text* To *Localization Text*. 6 | - 3.You can auto set the *localization key* in the component by the tool. 7 | - 4.You can get a output file which contains the Japanese/Chinese char. 8 | -------------------------------------------------------------------------------- /Assets/LocalizeTool/Editor/JpUtil.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text.RegularExpressions; 5 | using UnityEngine; 6 | 7 | /// 8 | /// util class used to check jp files. 9 | /// 10 | public class JpUtil { 11 | 12 | private static IEnumerable GetCharsInRange(string text, int min, int max) 13 | { 14 | return text.Where(e => e >= min && e <= max); 15 | } 16 | 17 | public static bool IsContainsJapanese(string text) 18 | { 19 | var hiragana = GetCharsInRange(text, 0x3040, 0x309F).Any(); //平仮名 20 | var katakana = GetCharsInRange(text, 0x30A0, 0x30FF).Any(); //片仮名 21 | var kanji = GetCharsInRange(text, 0x4E00, 0x9FBF).Any(); 22 | return hiragana || katakana || kanji; 23 | } 24 | 25 | public static bool PlainText_IsContainsJapanese(string text) 26 | { 27 | text = Regex.Unescape(text); 28 | return IsContainsJapanese(text); 29 | } 30 | 31 | /// 32 | /// Clean comments in text assets. 33 | /// 34 | /// 35 | /// 36 | public static string CleanCommentLines(string text) 37 | { 38 | var blockComments = @"/\*(.*?)\*/"; 39 | var lineComments = @"//(.*?)\r?\n"; 40 | 41 | string noComments = Regex.Replace(text, 42 | blockComments + "|" + lineComments , "", RegexOptions.Singleline); 43 | 44 | return noComments; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /[Ll]ibrary/ 2 | /[Tt]emp/ 3 | /[Oo]bj/ 4 | /[Bb]uild/ 5 | /[Bb]uilds/ 6 | /Assets/AssetStoreTools* 7 | 8 | # Autogenerated VS/MD solution and project files 9 | ExportedObj/ 10 | *.csproj 11 | *.unityproj 12 | *.sln 13 | *.suo 14 | *.tmp 15 | *.user 16 | *.userprefs 17 | *.pidb 18 | *.booproj 19 | *.svd 20 | 21 | 22 | # Unity3D generated meta files 23 | *.pidb.meta 24 | 25 | # Unity3D Generated File On Crash Reports 26 | sysinfo.txt 27 | 28 | # Builds 29 | *.apk 30 | *.unitypackage 31 | 32 | # ========================= 33 | # Operating System Files 34 | # ========================= 35 | 36 | # OSX 37 | # ========================= 38 | 39 | .DS_Store 40 | .AppleDouble 41 | .LSOverride 42 | 43 | # Thumbnails 44 | ._* 45 | 46 | # Files that might appear in the root of a volume 47 | .DocumentRevisions-V100 48 | .fseventsd 49 | .Spotlight-V100 50 | .TemporaryItems 51 | .Trashes 52 | .VolumeIcon.icns 53 | 54 | # Directories potentially created on remote AFP share 55 | .AppleDB 56 | .AppleDesktop 57 | Network Trash Folder 58 | Temporary Items 59 | .apdisk 60 | 61 | # Windows 62 | # ========================= 63 | 64 | # Windows image file caches 65 | Thumbs.db 66 | ehthumbs.db 67 | 68 | # Folder config file 69 | Desktop.ini 70 | 71 | # Recycle Bin used on file shares 72 | $RECYCLE.BIN/ 73 | 74 | # Windows Installer files 75 | *.cab 76 | *.msi 77 | *.msm 78 | *.msp 79 | 80 | # Windows shortcuts 81 | *.lnk 82 | -------------------------------------------------------------------------------- /Assets/LocalizeTool/LocalizationText.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using UnityEngine.UI; 3 | using UnityEngine; 4 | /// 5 | /// Custom Text Control used for localization text. 6 | /// Author: yaojianlun 7 | /// 8 | namespace Localization 9 | { 10 | public class LocalizationText : Text 11 | { 12 | #region Param 13 | 14 | 15 | [Header("Localization")] 16 | [SerializeField] 17 | protected string m_KeyString; 18 | 19 | public string keyString { 20 | get {return this.m_KeyString; } 21 | set { this.m_KeyString = value; } 22 | } 23 | #endregion 24 | 25 | #region Override Part 26 | public override string text 27 | { 28 | get 29 | { 30 | if (!ClientString.LocalizationDict.ContainsKey(keyString)) 31 | { 32 | m_Text = string.Format("[{0}]",m_KeyString); 33 | } 34 | else 35 | { 36 | m_Text = ClientString.LocalizationDict[keyString]; 37 | } 38 | return m_Text; 39 | } 40 | set 41 | { 42 | if (String.IsNullOrEmpty(value)) 43 | { 44 | if (String.IsNullOrEmpty(m_Text)) 45 | return; 46 | m_Text = ""; 47 | SetVerticesDirty(); 48 | } 49 | else if (m_Text != value) 50 | { 51 | m_Text = value; 52 | SetVerticesDirty(); 53 | SetLayoutDirty(); 54 | } 55 | } 56 | } 57 | #endregion 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /Assets/LocalizeTool/Editor/LocalizationTextEditor.cs: -------------------------------------------------------------------------------- 1 | using UnityEngine; 2 | using UnityEngine.UI; 3 | using Localization; 4 | using System.IO; 5 | using System.Text.RegularExpressions; 6 | using System.Collections.Generic; 7 | using System.Reflection; 8 | using System; 9 | 10 | namespace UnityEditor.UI 11 | { 12 | /// 13 | /// Editor class used to edit Localization UI Labels. 14 | /// Author:yaojianlun 15 | /// 16 | 17 | [CustomEditor(typeof(LocalizationText), true)] 18 | [CanEditMultipleObjects] 19 | public class LocalizationTextEditor : GraphicEditor 20 | { 21 | SerializedProperty m_Text; 22 | SerializedProperty m_LocalizationKey; 23 | SerializedProperty m_FontData; 24 | SerializedProperty m_KeyString; 25 | LocalizationText targetComp; 26 | 27 | static string guidReplacePattern = "guid.+.,"; 28 | 29 | protected override void OnEnable() 30 | { 31 | base.OnEnable(); 32 | m_Text = serializedObject.FindProperty("m_Text"); 33 | m_LocalizationKey = serializedObject.FindProperty("m_LocalizationKey"); 34 | m_FontData = serializedObject.FindProperty("m_FontData"); 35 | m_KeyString = serializedObject.FindProperty("m_KeyString"); 36 | 37 | targetComp = target as LocalizationText; 38 | } 39 | 40 | public override void OnInspectorGUI() 41 | { 42 | serializedObject.Update(); 43 | 44 | 45 | EditorGUI.BeginChangeCheck(); //减少通过反射获取值的频率 KeyString变化时才获取 46 | EditorGUILayout.PropertyField(m_KeyString); 47 | if(EditorGUI.EndChangeCheck()) { 48 | //EditorGUILayout.PropertyField(m_LocalizationKey); 49 | 50 | serializedObject.ApplyModifiedProperties(); 51 | serializedObject.Update(); 52 | } 53 | 54 | EditorGUILayout.BeginHorizontal(); 55 | EditorGUILayout.PropertyField(m_Text); 56 | EditorGUILayout.EndHorizontal(); 57 | 58 | EditorGUILayout.PropertyField(m_FontData); 59 | AppearanceControlsGUI(); 60 | RaycastControlsGUI(); 61 | serializedObject.ApplyModifiedProperties(); 62 | } 63 | 64 | public static void UpgradeToLocalizationText(string assetPath, string textCompGUID, string textCompFileID, string localizeCompGUID, string localizeCompFileID, List jpTextList) 65 | { 66 | ClearConsole(); 67 | string formatedGUID = string.Format("guid: {0},", localizeCompGUID); 68 | string fullPath = Path.Combine(Application.dataPath.Substring(0, Application.dataPath.LastIndexOf('/')), assetPath); 69 | string[] lines = System.IO.File.ReadAllLines(fullPath); 70 | string fullText = System.IO.File.ReadAllText(fullPath); 71 | 72 | for (int i = 0; i < lines.Length; i++) 73 | { 74 | if(lines[i].Contains(textCompFileID)) { 75 | int scriptLineIdx = i; //往下遍历直到找到m_Text 76 | while(i < lines.Length) { 77 | 78 | if(lines[i].Contains("--- !u!")) //发现下一个控件时跳出 79 | break; 80 | 81 | if (JpUtil.PlainText_IsContainsJapanese(lines[i])) 82 | { 83 | string jpText = Regex.Unescape(lines[i].Split('\"')[1]).Replace("\n", "\\n"); 84 | jpTextList.Add(jpText); 85 | 86 | //发现了FileID相同 但GUID不同的情况,所以直接把FileID后面的GUID替换 87 | lines[scriptLineIdx] = Regex.Replace(lines[scriptLineIdx], guidReplacePattern, formatedGUID); 88 | lines[scriptLineIdx] = lines[scriptLineIdx].Replace(textCompFileID, localizeCompFileID); 89 | break; 90 | } 91 | i++; 92 | } 93 | } 94 | } 95 | string text = string.Join("\n", lines); 96 | System.IO.File.WriteAllText(fullPath, text); 97 | AssetDatabase.Refresh(); 98 | } 99 | 100 | public static void SetLocalizationKey(string assetPath, string localizeCompGUID, string localizeCompFileID) { 101 | ClearConsole(); 102 | string formatedGUID = string.Format("guid: {0},", localizeCompGUID); 103 | string fullPath = Path.Combine(Application.dataPath.Substring(0, Application.dataPath.LastIndexOf('/')), assetPath); 104 | string[] lines = System.IO.File.ReadAllLines(fullPath); 105 | string fullText = System.IO.File.ReadAllText(fullPath); 106 | 107 | for (int i = 0; i < lines.Length; i++) 108 | { 109 | if (lines[i].Contains(localizeCompFileID) && lines[i].Contains(localizeCompGUID)) 110 | { 111 | while (i < lines.Length) 112 | { 113 | 114 | if (lines[i].Contains("--- !u!")) //发现下一个控件时跳出 115 | break; 116 | 117 | if(lines[i].Contains("m_Text:") && lines[i].Contains("\"")) { 118 | string mTextValue = Regex.Unescape(lines[i].Split('\"')[1]); 119 | JpCharCheckerWindow.LocalizeDataPair dataPair = JpCharCheckerWindow.GetDataPair(mTextValue); 120 | if(dataPair.key != -1) { 121 | Debug.LogError("Find : " + dataPair.keyString); 122 | //删除掉可能LocalizationKey 123 | if(lines[i+1].Contains("m_LocalizationKey:")) lines[i+1] = string.Empty; 124 | if(lines[i+2].Contains("m_KeyString:")) lines[i+2] = string.Empty; 125 | string localizationDataFormat = "\n m_LocalizationKey: {0}\n m_KeyString: {1}"; 126 | string localizationDataString = string.Format(localizationDataFormat, dataPair.key, Regex.Escape(dataPair.keyString)); 127 | lines[i] = lines[i].Insert(lines[i].Length, localizationDataString); 128 | } 129 | else { 130 | Debug.LogErrorFormat("The string [{0}] cannot find the key:", mTextValue); 131 | } 132 | } 133 | i++; 134 | } 135 | } 136 | } 137 | string text = string.Join("\n", lines); 138 | System.IO.File.WriteAllText(fullPath, text); 139 | AssetDatabase.Refresh(); 140 | } 141 | 142 | #region Menu Options 143 | public static class MenuOptions 144 | { 145 | 146 | } 147 | 148 | /// 149 | /// util func to clear the console 150 | /// 151 | public static void ClearConsole() 152 | { 153 | // This simply does "LogEntries.Clear()" the long way: 154 | var logEntries = System.Type.GetType("UnityEditorInternal.LogEntries,UnityEditor.dll"); 155 | var clearMethod = logEntries.GetMethod("Clear", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); 156 | clearMethod.Invoke(null, null); 157 | } 158 | #endregion 159 | } 160 | } -------------------------------------------------------------------------------- /Assets/LocalizeTool/Editor/JpCharCheckerWindow.cs: -------------------------------------------------------------------------------- 1 | using UnityEditor; 2 | using UnityEngine; 3 | using UnityEditor.UI; 4 | using System.Collections.Generic; 5 | using System.IO; 6 | using System.Linq; 7 | using System; 8 | 9 | /// 10 | /// Tool used to check out the files contains Japanese chars. 11 | /// 12 | public class JpCharCheckerWindow : EditorWindow { 13 | enum SourceType 14 | { 15 | Script, 16 | Prefab, 17 | All, 18 | } 19 | private List m_OutputString = new List(); 20 | private SourceType m_SourceType = SourceType.Script; 21 | private string m_FilteredString = string.Empty; 22 | private List m_FilteredPathList = new List(); 23 | private Vector2 m_ScrollPosition; 24 | 25 | private string m_TextCompGUID = "f70555f144d8491a825f0804e09c671c"; 26 | private string m_TextCompFileID = "708705254"; 27 | private string m_LocalizationCompGUID = "86d91f724295eaf40b1f6551526f00f6"; 28 | private string m_LocalizationCompFileID = "11500000"; 29 | 30 | public struct LocalizeDataPair { 31 | public int key; 32 | public string keyString; 33 | } 34 | private static Dictionary cacheClientStringDict = new Dictionary(); 35 | private static LocalizeDataPair emptyDataPair = new LocalizeDataPair {key=-1, keyString = string.Empty }; 36 | 37 | [MenuItem("Tools/Tool Box/Open Jp Checker Window")] 38 | static void Init() 39 | { 40 | JpCharCheckerWindow jpCharCheckerWindow = (JpCharCheckerWindow)GetWindow(); 41 | jpCharCheckerWindow.Show(); 42 | initCachedDict(); 43 | } 44 | 45 | static void initCachedDict() { 46 | cacheClientStringDict.Clear(); 47 | string fileName = "ClientString_jpn"; 48 | TextAsset text = Resources.Load("Common/" + fileName); 49 | System.IO.StringReader stringReader = new System.IO.StringReader(text.text); 50 | int index = 0; string[] temp; string line; 51 | while (stringReader.Peek() > -1) 52 | { 53 | line = stringReader.ReadLine(); 54 | if ("" != line) 55 | { 56 | temp = line.Split(",".ToCharArray(), 2); 57 | var dataPair = new LocalizeDataPair(); 58 | dataPair.key = index; 59 | dataPair.keyString = temp[0]; 60 | cacheClientStringDict[temp[1].Replace("\\n", "\n")] = dataPair; 61 | index++; 62 | } 63 | } 64 | } 65 | 66 | public static LocalizeDataPair GetDataPair(string str) { 67 | if(cacheClientStringDict.ContainsKey(str)) 68 | return cacheClientStringDict[str]; 69 | return emptyDataPair; 70 | } 71 | 72 | private void OnGUI() 73 | { 74 | EditorGUILayout.BeginVertical(); 75 | { 76 | EditorGUILayout.BeginVertical(); 77 | { 78 | EditorGUILayout.BeginHorizontal(); 79 | EditorGUILayout.LabelField("Text Comp File ID:"); 80 | m_TextCompFileID = EditorGUILayout.TextField(m_TextCompFileID); 81 | EditorGUILayout.EndHorizontal(); 82 | 83 | EditorGUILayout.BeginHorizontal(); 84 | EditorGUILayout.LabelField("Text Comp GUID:"); 85 | m_TextCompGUID = EditorGUILayout.TextField(m_TextCompGUID); 86 | EditorGUILayout.EndHorizontal(); 87 | 88 | EditorGUILayout.BeginHorizontal(); 89 | EditorGUILayout.LabelField("Localization Comp File ID:"); 90 | m_LocalizationCompFileID = EditorGUILayout.TextField(m_LocalizationCompFileID); 91 | EditorGUILayout.EndHorizontal(); 92 | 93 | EditorGUILayout.BeginHorizontal(); 94 | EditorGUILayout.LabelField("Localization Comp GUID:"); 95 | m_LocalizationCompGUID = EditorGUILayout.TextField(m_LocalizationCompGUID); 96 | EditorGUILayout.EndHorizontal(); 97 | } 98 | EditorGUILayout.EndVertical(); 99 | 100 | EditorGUILayout.BeginHorizontal(); 101 | { 102 | //m_SourceType = (SourceType)EditorGUILayout.EnumPopup("Select: ",m_SourceType); 103 | m_FilteredString = EditorGUILayout.TextField(m_FilteredString, GUILayout.MinWidth(100), GUILayout.ExpandHeight(false)); 104 | //Check Button 105 | if (GUILayout.Button("Check", GUILayout.MinWidth(50), GUILayout.MaxWidth(50))) 106 | { 107 | OnCheckButtonCB(); 108 | } 109 | //if (GUILayout.Button("Calculate Lines", GUILayout.MinWidth(100), GUILayout.MaxWidth(150))) 110 | //{ 111 | // OnCalculateButtonCB(); 112 | //} 113 | ////Upgrade Text Button 114 | if (GUILayout.Button("Upgrade Text", GUILayout.MinWidth(100), GUILayout.MaxWidth(100))) 115 | { 116 | if(string.IsNullOrEmpty(m_TextCompFileID) || string.IsNullOrEmpty(m_TextCompGUID) || string.IsNullOrEmpty(m_LocalizationCompFileID) || string.IsNullOrEmpty(m_LocalizationCompGUID)) { 117 | EditorUtility.DisplayDialog("错误", "文本组件ID不能为空", "好的"); 118 | return; 119 | } 120 | OnUpgradeButtonCB(); 121 | } 122 | if(GUILayout.Button("Set Localization Key", GUILayout.MinWidth(100))) 123 | { 124 | OnSetKeyButtonCB(); 125 | } 126 | if(GUILayout.Button("Ouput Folder", GUILayout.Width(100))) 127 | { 128 | OpenOutputFileFolder(); 129 | } 130 | if(GUILayout.Button("*", GUILayout.Width(20))) 131 | { 132 | RefreshDictData(); 133 | } 134 | } 135 | EditorGUILayout.EndHorizontal(); 136 | } 137 | EditorGUILayout.EndVertical(); 138 | m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition, GUILayout.ExpandHeight(true)); 139 | for (int i = 0; i < m_FilteredPathList.Count; i++) 140 | { 141 | string path = m_FilteredPathList[i]; 142 | 143 | EditorGUILayout.BeginHorizontal(); 144 | if(GUILayout.Button(path, GUILayout.MinWidth(100))) //select the file 145 | { 146 | Selection.activeObject = AssetDatabase.LoadAssetAtPath(path, typeof(UnityEngine.Object)); 147 | } 148 | if(GUILayout.Button("x", GUILayout.MaxWidth(20))) { 149 | m_FilteredPathList.Remove(path); 150 | } 151 | EditorGUILayout.EndHorizontal(); 152 | } 153 | GUILayout.EndScrollView(); 154 | } 155 | 156 | private void OnDestroy() { 157 | cacheClientStringDict.Clear(); 158 | } 159 | 160 | #region Button Call Back 161 | private void OnCheckButtonCB() 162 | { 163 | CheckFiles(m_FilteredString); 164 | } 165 | 166 | private void OnCalculateButtonCB() { 167 | CalculateFileLines(m_FilteredString); 168 | } 169 | 170 | private void OnUpgradeButtonCB() { 171 | System.Action updateProgress = (text, now, max) => { 172 | EditorUtility.DisplayProgressBar("Upgrade...", text, (float)now / (float)max); 173 | }; 174 | List jpTextList = new List(); 175 | for (int i = 0; i < m_FilteredPathList.Count; i++) 176 | { 177 | string assetPath = m_FilteredPathList[i]; 178 | LocalizationTextEditor.UpgradeToLocalizationText(assetPath, m_TextCompGUID, m_TextCompFileID, m_LocalizationCompGUID, m_LocalizationCompFileID, jpTextList); 179 | updateProgress(assetPath, i+1, m_FilteredPathList.Count); 180 | } 181 | EditorUtility.ClearProgressBar(); 182 | 183 | string outputFilePath = Path.Combine(Application.dataPath.Substring(0, Application.dataPath.LastIndexOf('/')), "output.txt"); 184 | jpTextList = jpTextList.Distinct().ToList(); 185 | System.Text.StringBuilder sb = new System.Text.StringBuilder(); 186 | foreach (var str in jpTextList) 187 | { 188 | sb.AppendLine(str); 189 | } 190 | System.IO.File.AppendAllText(outputFilePath, sb.ToString()); 191 | } 192 | 193 | private void OnSetKeyButtonCB() 194 | { 195 | System.Action updateProgress = (text, now, max) => { 196 | EditorUtility.DisplayProgressBar("Upgrade...", text, (float)now / (float)max); 197 | }; 198 | int length = m_FilteredPathList.Count; 199 | for (int i = 0; i < length; i++) 200 | { 201 | string assetPath = m_FilteredPathList[i]; 202 | LocalizationTextEditor.SetLocalizationKey(assetPath, m_LocalizationCompGUID, m_LocalizationCompFileID); 203 | updateProgress(assetPath, i+1, length); 204 | } 205 | EditorUtility.ClearProgressBar(); 206 | } 207 | 208 | private void OpenOutputFileFolder() { 209 | EditorUtility.OpenFilePanel("Jp Text Output File Folder", Application.dataPath.Substring(0, Application.dataPath.LastIndexOf('/')), "txt"); 210 | } 211 | 212 | private void RefreshDictData() { 213 | initCachedDict(); 214 | } 215 | 216 | private void CheckFiles(string filteredStr) 217 | { 218 | System.Action updateProgress = (text, now, max) => { 219 | EditorUtility.DisplayProgressBar("Check", text, (float)now / (float)max); 220 | }; 221 | m_FilteredPathList.Clear(); 222 | string[] guids = AssetDatabase.FindAssets(filteredStr); 223 | int length = guids.Length; 224 | for (int i = 0; i{0} files", m_FilteredPathList.Count); 255 | EditorUtility.ClearProgressBar(); 256 | } 257 | 258 | /// 259 | /// 统计需要本地化的行数 260 | /// 261 | /// 262 | private void CalculateFileLines(string filteredStr) { 263 | long lineCount = 0; 264 | m_FilteredPathList.Clear(); 265 | string[] guids = AssetDatabase.FindAssets(filteredStr); 266 | foreach (var guid in guids) 267 | { 268 | string path = AssetDatabase.GUIDToAssetPath(guid); 269 | if (true) 270 | { 271 | string fullPath = Path.Combine(System.Environment.CurrentDirectory, path); 272 | string text = System.IO.File.ReadAllText(fullPath); 273 | if (!string.IsNullOrEmpty(text)) 274 | { 275 | if (fullPath.EndsWith("prefab") || fullPath.EndsWith("unity")) 276 | { 277 | foreach (var line in text.Split('\n')) 278 | { 279 | if (JpUtil.PlainText_IsContainsJapanese(line)) 280 | lineCount++; 281 | } 282 | } 283 | else //text or script 284 | { 285 | //clear the comment lines 286 | text = JpUtil.CleanCommentLines(text); 287 | foreach (var line in text.Split('\n')) 288 | { 289 | if (JpUtil.IsContainsJapanese(line)) 290 | lineCount++; 291 | } 292 | } 293 | } 294 | } 295 | } 296 | //UnityEditor.UI.LocalizationTextEditor.ClearConsole(); 297 | Debug.LogFormat("Total :{0} lines", lineCount); 298 | } 299 | #endregion 300 | } 301 | --------------------------------------------------------------------------------