Ver código fonte

Merge pull request #69165 from timothyqiu/capitalization

Improve editor property capitalization
Rémi Verschelde 2 anos atrás
pai
commit
5b3d07cc02

+ 4 - 2
editor/editor_property_name_processor.cpp

@@ -64,8 +64,8 @@ String EditorPropertyNameProcessor::_capitalize_name(const String &p_name) const
 
 	Vector<String> parts = p_name.split("_", false);
 	for (int i = 0; i < parts.size(); i++) {
-		// Articles/conjunctions/prepositions which should only be capitalized if first word.
-		if (i != 0 && stop_words.find(parts[i]) != -1) {
+		// Articles/conjunctions/prepositions which should only be capitalized when not at beginning and end.
+		if (i > 0 && i + 1 < parts.size() && stop_words.find(parts[i]) != -1) {
 			continue;
 		}
 		HashMap<String, String>::ConstIterator remap = capitalize_string_remaps.find(parts[i]);
@@ -260,6 +260,8 @@ EditorPropertyNameProcessor::EditorPropertyNameProcessor() {
 	capitalize_string_remaps["yz"] = "YZ";
 
 	// Articles, conjunctions, prepositions.
+	// The following initialization is parsed in `editor/translations/extract.py` with a regex.
+	// The word definition format should be kept synced with the regex.
 	stop_words = LocalVector<String>({
 			"a",
 			"an",

+ 21 - 5
editor/translations/extract.py

@@ -71,11 +71,24 @@ matches.sort()
 
 remaps = {}
 remap_re = re.compile(r'^\t*capitalize_string_remaps\["(?P<from>.+)"\] = (String::utf8\()?"(?P<to>.+)"')
+stop_words = set()
+stop_words_re = re.compile(r'^\t*"(?P<word>.+)",')
+is_inside_stop_words = False
 with open("editor/editor_property_name_processor.cpp") as f:
     for line in f:
-        m = remap_re.search(line)
-        if m:
-            remaps[m.group("from")] = m.group("to")
+        if is_inside_stop_words:
+            m = stop_words_re.search(line)
+            if m:
+                stop_words.add(m.group("word"))
+            else:
+                is_inside_stop_words = False
+        else:
+            m = remap_re.search(line)
+            if m:
+                remaps[m.group("from")] = m.group("to")
+
+        if not is_inside_stop_words and not stop_words:
+            is_inside_stop_words = "stop_words = " in line
 
 
 main_po = """
@@ -147,9 +160,12 @@ capitalize_re = re.compile(r"(?<=\D)(?=\d)|(?<=\d)(?=\D([a-z]|\d))")
 def _process_editor_string(name):
     # See EditorPropertyNameProcessor::process_string().
     capitalized_parts = []
-    for segment in name.split("_"):
-        if not segment:
+    parts = list(filter(bool, name.split("_")))  # Non-empty only.
+    for i, segment in enumerate(parts):
+        if i > 0 and i + 1 < len(parts) and segment in stop_words:
+            capitalized_parts.append(segment)
             continue
+
         remapped = remaps.get(segment)
         if remapped:
             capitalized_parts.append(remapped)