Browse Source

i18n: Misc fixes translation strings

Adds some translator comments to solve some questions raised on Weblate.
Rémi Verschelde 3 years ago
parent
commit
c8ce7e34e2

+ 1 - 1
core/math/expression.cpp

@@ -1245,7 +1245,7 @@ bool Expression::_execute(const Array &p_inputs, Object *p_instance, Expression:
 		case Expression::ENode::TYPE_INPUT: {
 		case Expression::ENode::TYPE_INPUT: {
 			const Expression::InputNode *in = static_cast<const Expression::InputNode *>(p_node);
 			const Expression::InputNode *in = static_cast<const Expression::InputNode *>(p_node);
 			if (in->index < 0 || in->index >= p_inputs.size()) {
 			if (in->index < 0 || in->index >= p_inputs.size()) {
-				r_error_str = vformat(RTR("Invalid input %i (not passed) in expression"), in->index);
+				r_error_str = vformat(RTR("Invalid input %d (not passed) in expression"), in->index);
 				return true;
 				return true;
 			}
 			}
 			r_ret = p_inputs[in->index];
 			r_ret = p_inputs[in->index];

+ 4 - 4
doc/classes/Color.xml

@@ -157,10 +157,10 @@
 				Constructs a color from an [url=https://en.wikipedia.org/wiki/HSL_and_HSV]HSV profile[/url]. [code]h[/code] (hue), [code]s[/code] (saturation), and [code]v[/code] (value) are typically between 0 and 1.
 				Constructs a color from an [url=https://en.wikipedia.org/wiki/HSL_and_HSV]HSV profile[/url]. [code]h[/code] (hue), [code]s[/code] (saturation), and [code]v[/code] (value) are typically between 0 and 1.
 				[codeblocks]
 				[codeblocks]
 				[gdscript]
 				[gdscript]
-				var c = Color.from_hsv(0.58, 0.5, 0.79, 0.8)
+				var color = Color.from_hsv(0.58, 0.5, 0.79, 0.8)
 				[/gdscript]
 				[/gdscript]
 				[csharp]
 				[csharp]
-				var c = Color.FromHsv(0.58f, 0.5f, 0.79f, 0.8f);
+				var color = Color.FromHsv(0.58f, 0.5f, 0.79f, 0.8f);
 				[/csharp]
 				[/csharp]
 				[/codeblocks]
 				[/codeblocks]
 			</description>
 			</description>
@@ -175,10 +175,10 @@
 				Constructs a color from an [url=https://bottosson.github.io/posts/colorpicker/]OK HSL profile[/url]. [code]h[/code] (hue), [code]s[/code] (saturation), and [code]v[/code] (value) are typically between 0 and 1.
 				Constructs a color from an [url=https://bottosson.github.io/posts/colorpicker/]OK HSL profile[/url]. [code]h[/code] (hue), [code]s[/code] (saturation), and [code]v[/code] (value) are typically between 0 and 1.
 				[codeblocks]
 				[codeblocks]
 				[gdscript]
 				[gdscript]
-				var c = Color.from_ok_hsl(0.58, 0.5, 0.79, 0.8)
+				var color = Color.from_ok_hsl(0.58, 0.5, 0.79, 0.8)
 				[/gdscript]
 				[/gdscript]
 				[csharp]
 				[csharp]
-				var c = Color.FromOkHsl(0.58f, 0.5f, 0.79f, 0.8f);
+				var color = Color.FromOkHsl(0.58f, 0.5f, 0.79f, 0.8f);
 				[/csharp]
 				[/csharp]
 				[/codeblocks]
 				[/codeblocks]
 			</description>
 			</description>

+ 1 - 1
doc/classes/EditorPlugin.xml

@@ -479,7 +479,7 @@
 		<method name="get_script_create_dialog">
 		<method name="get_script_create_dialog">
 			<return type="ScriptCreateDialog" />
 			<return type="ScriptCreateDialog" />
 			<description>
 			<description>
-				Gets the Editor's dialogue used for making scripts.
+				Gets the Editor's dialog used for making scripts.
 				[b]Note:[/b] Users can configure it before use.
 				[b]Note:[/b] Users can configure it before use.
 				[b]Warning:[/b] Removing and freeing this node will render a part of the editor useless and may cause a crash.
 				[b]Warning:[/b] Removing and freeing this node will render a part of the editor useless and may cause a crash.
 			</description>
 			</description>

+ 1 - 1
doc/classes/NodePath.xml

@@ -107,7 +107,7 @@
 			<return type="StringName" />
 			<return type="StringName" />
 			<argument index="0" name="idx" type="int" />
 			<argument index="0" name="idx" type="int" />
 			<description>
 			<description>
-				Gets the node name indicated by [code]idx[/code] (0 to [method get_name_count]).
+				Gets the node name indicated by [code]idx[/code] (0 to [method get_name_count] - 1).
 				[codeblocks]
 				[codeblocks]
 				[gdscript]
 				[gdscript]
 				var node_path = NodePath("Path2D/PathFollow2D/Sprite2D")
 				var node_path = NodePath("Path2D/PathFollow2D/Sprite2D")

+ 1 - 1
doc/classes/OS.xml

@@ -550,7 +550,7 @@
 				Requests the OS to open a resource with the most appropriate program. For example:
 				Requests the OS to open a resource with the most appropriate program. For example:
 				- [code]OS.shell_open("C:\\Users\name\Downloads")[/code] on Windows opens the file explorer at the user's Downloads folder.
 				- [code]OS.shell_open("C:\\Users\name\Downloads")[/code] on Windows opens the file explorer at the user's Downloads folder.
 				- [code]OS.shell_open("https://godotengine.org")[/code] opens the default web browser on the official Godot website.
 				- [code]OS.shell_open("https://godotengine.org")[/code] opens the default web browser on the official Godot website.
-				- [code]OS.shell_open("mailto:[email protected]")[/code] opens the default email client with the "To" field set to [code][email protected][/code]. See [url=https://blog.escapecreative.com/customizing-mailto-links/]Customizing [code]mailto:[/code] Links[/url] for a list of fields that can be added.
+				- [code]OS.shell_open("mailto:[email protected]")[/code] opens the default email client with the "To" field set to [code][email protected][/code]. See [url=https://datatracker.ietf.org/doc/html/rfc2368]RFC 2368 - The [code]mailto[/code] URL scheme[/url] for a list of fields that can be added.
 				Use [method ProjectSettings.globalize_path] to convert a [code]res://[/code] or [code]user://[/code] path into a system path for use with this method.
 				Use [method ProjectSettings.globalize_path] to convert a [code]res://[/code] or [code]user://[/code] path into a system path for use with this method.
 				[b]Note:[/b] This method is implemented on Android, iOS, HTML5, Linux, macOS and Windows.
 				[b]Note:[/b] This method is implemented on Android, iOS, HTML5, Linux, macOS and Windows.
 			</description>
 			</description>

+ 1 - 1
doc/classes/Range.xml

@@ -4,7 +4,7 @@
 		Abstract base class for range-based controls.
 		Abstract base class for range-based controls.
 	</brief_description>
 	</brief_description>
 	<description>
 	<description>
-		Range is a base class for [Control] nodes that change a floating-point [i]value[/i] between a [i]minimum[/i] and a [i]maximum[/i], using [i]step[/i] and [i]page[/i], for example a [ScrollBar].
+		Range is a base class for [Control] nodes that change a floating-point [member value] between a [member min_value] and [member max_value], using a configured [member step] and [member page] size. See e.g. [ScrollBar] and [Slider] for examples of higher level nodes using Range.
 	</description>
 	</description>
 	<tutorials>
 	<tutorials>
 	</tutorials>
 	</tutorials>

+ 1 - 1
doc/classes/RenderingServer.xml

@@ -3035,7 +3035,7 @@
 				    $Viewport.set_attach_to_screen_rect(Rect2(0, 0, 600, 600))
 				    $Viewport.set_attach_to_screen_rect(Rect2(0, 0, 600, 600))
 				[/gdscript]
 				[/gdscript]
 				[/codeblocks]
 				[/codeblocks]
-				Using this can result in significant optimization, especially on lower-end devices. However, it comes at the cost of having to manage your viewports manually. For a further optimization see, [method viewport_set_render_direct_to_screen].
+				Using this can result in significant optimization, especially on lower-end devices. However, it comes at the cost of having to manage your viewports manually. For further optimization, see [method viewport_set_render_direct_to_screen].
 			</description>
 			</description>
 		</method>
 		</method>
 		<method name="viewport_create">
 		<method name="viewport_create">

+ 1 - 1
doc/classes/SceneTreeTimer.xml

@@ -22,7 +22,7 @@
 		}
 		}
 		[/csharp]
 		[/csharp]
 		[/codeblocks]
 		[/codeblocks]
-		The timer will be automatically freed after its time elapses.
+		The timer will be automatically freed after its time elapses, so be aware that any reference you might have kept to it will become invalid.
 	</description>
 	</description>
 	<tutorials>
 	<tutorials>
 	</tutorials>
 	</tutorials>

+ 19 - 22
editor/animation_track_editor.cpp

@@ -2619,34 +2619,33 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const {
 		}
 		}
 
 
 		if (key_idx != -1) {
 		if (key_idx != -1) {
-			String text = TTR("Time (s): ") + rtos(animation->track_get_key_time(track, key_idx)) + "\n";
+			String text = TTR("Time (s):") + " " + rtos(animation->track_get_key_time(track, key_idx)) + "\n";
 			switch (animation->track_get_type(track)) {
 			switch (animation->track_get_type(track)) {
 				case Animation::TYPE_POSITION_3D: {
 				case Animation::TYPE_POSITION_3D: {
 					Vector3 t = animation->track_get_key_value(track, key_idx);
 					Vector3 t = animation->track_get_key_value(track, key_idx);
-					text += "Position: " + String(t) + "\n";
+					text += TTR("Position:") + " " + String(t) + "\n";
 				} break;
 				} break;
 				case Animation::TYPE_ROTATION_3D: {
 				case Animation::TYPE_ROTATION_3D: {
 					Quaternion t = animation->track_get_key_value(track, key_idx);
 					Quaternion t = animation->track_get_key_value(track, key_idx);
-					text += "Rotation: " + String(t) + "\n";
+					text += TTR("Rotation:") + " " + String(t) + "\n";
 				} break;
 				} break;
 				case Animation::TYPE_SCALE_3D: {
 				case Animation::TYPE_SCALE_3D: {
 					Vector3 t = animation->track_get_key_value(track, key_idx);
 					Vector3 t = animation->track_get_key_value(track, key_idx);
-					text += "Scale: " + String(t) + "\n";
+					text += TTR("Scale:") + " " + String(t) + "\n";
 				} break;
 				} break;
 				case Animation::TYPE_BLEND_SHAPE: {
 				case Animation::TYPE_BLEND_SHAPE: {
 					float t = animation->track_get_key_value(track, key_idx);
 					float t = animation->track_get_key_value(track, key_idx);
-					text += "Blend Shape: " + itos(t) + "\n";
+					text += TTR("Blend Shape:") + " " + itos(t) + "\n";
 				} break;
 				} break;
 				case Animation::TYPE_VALUE: {
 				case Animation::TYPE_VALUE: {
 					const Variant &v = animation->track_get_key_value(track, key_idx);
 					const Variant &v = animation->track_get_key_value(track, key_idx);
-					text += "Type: " + Variant::get_type_name(v.get_type()) + "\n";
+					text += TTR("Type:") + " " + Variant::get_type_name(v.get_type()) + "\n";
 					Variant::Type valid_type = Variant::NIL;
 					Variant::Type valid_type = Variant::NIL;
+					text += TTR("Value:") + " " + String(v);
 					if (!_is_value_key_valid(v, valid_type)) {
 					if (!_is_value_key_valid(v, valid_type)) {
-						text += "Value: " + String(v) + "  (Invalid, expected type: " + Variant::get_type_name(valid_type) + ")\n";
-					} else {
-						text += "Value: " + String(v) + "\n";
+						text += " " + vformat(TTR("(Invalid, expected type: %s)"), Variant::get_type_name(valid_type));
 					}
 					}
-					text += "Easing: " + rtos(animation->track_get_key_transition(track, key_idx));
+					text += "\n" + TTR("Easing:") + " " + rtos(animation->track_get_key_transition(track, key_idx));
 
 
 				} break;
 				} break;
 				case Animation::TYPE_METHOD: {
 				case Animation::TYPE_METHOD: {
@@ -2670,22 +2669,20 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const {
 				} break;
 				} break;
 				case Animation::TYPE_BEZIER: {
 				case Animation::TYPE_BEZIER: {
 					float h = animation->bezier_track_get_key_value(track, key_idx);
 					float h = animation->bezier_track_get_key_value(track, key_idx);
-					text += "Value: " + rtos(h) + "\n";
+					text += TTR("Value:") + " " + rtos(h) + "\n";
 					Vector2 ih = animation->bezier_track_get_key_in_handle(track, key_idx);
 					Vector2 ih = animation->bezier_track_get_key_in_handle(track, key_idx);
-					text += "In-Handle: " + ih + "\n";
+					text += TTR("In-Handle:") + " " + ih + "\n";
 					Vector2 oh = animation->bezier_track_get_key_out_handle(track, key_idx);
 					Vector2 oh = animation->bezier_track_get_key_out_handle(track, key_idx);
-					text += "Out-Handle: " + oh + "\n";
+					text += TTR("Out-Handle:") + " " + oh + "\n";
 					int hm = animation->bezier_track_get_key_handle_mode(track, key_idx);
 					int hm = animation->bezier_track_get_key_handle_mode(track, key_idx);
-					text += "Handle mode: ";
 					switch (hm) {
 					switch (hm) {
 						case Animation::HANDLE_MODE_FREE: {
 						case Animation::HANDLE_MODE_FREE: {
-							text += "Free";
+							text += TTR("Handle mode: Free\n");
 						} break;
 						} break;
 						case Animation::HANDLE_MODE_BALANCED: {
 						case Animation::HANDLE_MODE_BALANCED: {
-							text += "Balanced";
+							text += TTR("Handle mode: Balanced\n");
 						} break;
 						} break;
 					}
 					}
-					text += "\n";
 				} break;
 				} break;
 				case Animation::TYPE_AUDIO: {
 				case Animation::TYPE_AUDIO: {
 					String stream_name = "null";
 					String stream_name = "null";
@@ -2700,15 +2697,15 @@ String AnimationTrackEdit::get_tooltip(const Point2 &p_pos) const {
 						}
 						}
 					}
 					}
 
 
-					text += "Stream: " + stream_name + "\n";
+					text += TTR("Stream:") + " " + stream_name + "\n";
 					float so = animation->audio_track_get_key_start_offset(track, key_idx);
 					float so = animation->audio_track_get_key_start_offset(track, key_idx);
-					text += "Start (s): " + rtos(so) + "\n";
+					text += TTR("Start (s):") + " " + rtos(so) + "\n";
 					float eo = animation->audio_track_get_key_end_offset(track, key_idx);
 					float eo = animation->audio_track_get_key_end_offset(track, key_idx);
-					text += "End (s): " + rtos(eo) + "\n";
+					text += TTR("End (s):") + " " + rtos(eo) + "\n";
 				} break;
 				} break;
 				case Animation::TYPE_ANIMATION: {
 				case Animation::TYPE_ANIMATION: {
 					String name = animation->animation_track_get_key_animation(track, key_idx);
 					String name = animation->animation_track_get_key_animation(track, key_idx);
-					text += "Animation Clip: " + name + "\n";
+					text += TTR("Animation Clip:") + " " + name + "\n";
 				} break;
 				} break;
 			}
 			}
 			return text;
 			return text;
@@ -5073,7 +5070,7 @@ void AnimationTrackEditor::_add_method_key(const String &p_method) {
 		}
 		}
 	}
 	}
 
 
-	EditorNode::get_singleton()->show_warning(TTR("Method not found in object: ") + p_method);
+	EditorNode::get_singleton()->show_warning(TTR("Method not found in object:") + " " + p_method);
 }
 }
 
 
 void AnimationTrackEditor::_key_selected(int p_key, bool p_single, int p_track) {
 void AnimationTrackEditor::_key_selected(int p_key, bool p_single, int p_track) {

+ 1 - 1
editor/debugger/editor_debugger_inspector.cpp

@@ -68,7 +68,7 @@ void EditorDebuggerRemoteObject::_get_property_list(List<PropertyInfo> *p_list)
 
 
 String EditorDebuggerRemoteObject::get_title() {
 String EditorDebuggerRemoteObject::get_title() {
 	if (remote_object_id.is_valid()) {
 	if (remote_object_id.is_valid()) {
-		return TTR("Remote ") + String(type_name) + ": " + itos(remote_object_id);
+		return vformat(TTR("Remote %s:"), String(type_name)) + " " + itos(remote_object_id);
 	} else {
 	} else {
 		return "<null>";
 		return "<null>";
 	}
 	}

+ 1 - 1
editor/debugger/script_editor_debugger.cpp

@@ -1486,7 +1486,7 @@ void ScriptEditorDebugger::_breakpoints_item_rmb_selected(const Vector2 &p_pos,
 		breakpoints_menu->add_icon_item(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Delete Breakpoint"), ACTION_DELETE_BREAKPOINT);
 		breakpoints_menu->add_icon_item(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Delete Breakpoint"), ACTION_DELETE_BREAKPOINT);
 		file = selected->get_parent()->get_text(0);
 		file = selected->get_parent()->get_text(0);
 	}
 	}
-	breakpoints_menu->add_icon_item(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Delete All Breakpoints in: ") + file, ACTION_DELETE_BREAKPOINTS_IN_FILE);
+	breakpoints_menu->add_icon_item(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Delete All Breakpoints in:") + " " + file, ACTION_DELETE_BREAKPOINTS_IN_FILE);
 	breakpoints_menu->add_icon_item(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Delete All Breakpoints"), ACTION_DELETE_ALL_BREAKPOINTS);
 	breakpoints_menu->add_icon_item(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons")), TTR("Delete All Breakpoints"), ACTION_DELETE_ALL_BREAKPOINTS);
 
 
 	breakpoints_menu->set_position(breakpoints_tree->get_global_position() + p_pos);
 	breakpoints_menu->set_position(breakpoints_tree->get_global_position() + p_pos);

+ 4 - 4
editor/editor_audio_buses.cpp

@@ -1215,7 +1215,7 @@ void EditorAudioBuses::_load_default_layout() {
 	}
 	}
 
 
 	edited_path = layout_path;
 	edited_path = layout_path;
-	file->set_text(String(TTR("Layout")) + ": " + layout_path.get_file());
+	file->set_text(String(TTR("Layout:")) + " " + layout_path.get_file());
 	AudioServer::get_singleton()->set_bus_layout(state);
 	AudioServer::get_singleton()->set_bus_layout(state);
 	_update_buses();
 	_update_buses();
 	EditorNode::get_singleton()->get_undo_redo()->clear_history();
 	EditorNode::get_singleton()->get_undo_redo()->clear_history();
@@ -1231,7 +1231,7 @@ void EditorAudioBuses::_file_dialog_callback(const String &p_string) {
 		}
 		}
 
 
 		edited_path = p_string;
 		edited_path = p_string;
-		file->set_text(String(TTR("Layout")) + ": " + p_string.get_file());
+		file->set_text(String(TTR("Layout:")) + " " + p_string.get_file());
 		AudioServer::get_singleton()->set_bus_layout(state);
 		AudioServer::get_singleton()->set_bus_layout(state);
 		_update_buses();
 		_update_buses();
 		EditorNode::get_singleton()->get_undo_redo()->clear_history();
 		EditorNode::get_singleton()->get_undo_redo()->clear_history();
@@ -1252,7 +1252,7 @@ void EditorAudioBuses::_file_dialog_callback(const String &p_string) {
 		}
 		}
 
 
 		edited_path = p_string;
 		edited_path = p_string;
-		file->set_text(String(TTR("Layout")) + ": " + p_string.get_file());
+		file->set_text(String(TTR("Layout:")) + " " + p_string.get_file());
 		_update_buses();
 		_update_buses();
 		EditorNode::get_singleton()->get_undo_redo()->clear_history();
 		EditorNode::get_singleton()->get_undo_redo()->clear_history();
 		call_deferred(SNAME("_select_layout"));
 		call_deferred(SNAME("_select_layout"));
@@ -1272,7 +1272,7 @@ EditorAudioBuses::EditorAudioBuses() {
 
 
 	file = memnew(Label);
 	file = memnew(Label);
 	String layout_path = ProjectSettings::get_singleton()->get("audio/buses/default_bus_layout");
 	String layout_path = ProjectSettings::get_singleton()->get("audio/buses/default_bus_layout");
-	file->set_text(String(TTR("Layout")) + ": " + layout_path.get_file());
+	file->set_text(String(TTR("Layout:")) + " " + layout_path.get_file());
 	file->set_clip_text(true);
 	file->set_clip_text(true);
 	file->set_h_size_flags(SIZE_EXPAND_FILL);
 	file->set_h_size_flags(SIZE_EXPAND_FILL);
 	top_hb->add_child(file);
 	top_hb->add_child(file);

+ 1 - 1
editor/editor_properties_array_dict.cpp

@@ -249,7 +249,7 @@ void EditorPropertyArray::update_property() {
 			HBoxContainer *hbox = memnew(HBoxContainer);
 			HBoxContainer *hbox = memnew(HBoxContainer);
 			vbox->add_child(hbox);
 			vbox->add_child(hbox);
 
 
-			Label *label = memnew(Label(TTR("Size: ")));
+			Label *label = memnew(Label(TTR("Size:")));
 			label->set_h_size_flags(SIZE_EXPAND_FILL);
 			label->set_h_size_flags(SIZE_EXPAND_FILL);
 			hbox->add_child(label);
 			hbox->add_child(label);
 
 

+ 1 - 0
editor/editor_settings.cpp

@@ -723,6 +723,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
 
 
 	/* Extra config */
 	/* Extra config */
 
 
+	// TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects.
 	EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "project_manager/sorting_order", 0, "Last Edited,Name,Path")
 	EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "project_manager/sorting_order", 0, "Last Edited,Name,Path")
 
 
 	if (p_extra_config.is_valid()) {
 	if (p_extra_config.is_valid()) {

+ 2 - 2
editor/find_in_files.cpp

@@ -566,7 +566,7 @@ FindInFilesPanel::FindInFilesPanel() {
 		HBoxContainer *hbc = memnew(HBoxContainer);
 		HBoxContainer *hbc = memnew(HBoxContainer);
 
 
 		Label *find_label = memnew(Label);
 		Label *find_label = memnew(Label);
-		find_label->set_text(TTR("Find: "));
+		find_label->set_text(TTR("Find:"));
 		hbc->add_child(find_label);
 		hbc->add_child(find_label);
 
 
 		_search_text_label = memnew(Label);
 		_search_text_label = memnew(Label);
@@ -614,7 +614,7 @@ FindInFilesPanel::FindInFilesPanel() {
 		_replace_container = memnew(HBoxContainer);
 		_replace_container = memnew(HBoxContainer);
 
 
 		Label *replace_label = memnew(Label);
 		Label *replace_label = memnew(Label);
-		replace_label->set_text(TTR("Replace: "));
+		replace_label->set_text(TTR("Replace:"));
 		_replace_container->add_child(replace_label);
 		_replace_container->add_child(replace_label);
 
 
 		_replace_line_edit = memnew(LineEdit);
 		_replace_line_edit = memnew(LineEdit);

+ 6 - 6
editor/import/dynamic_font_import_settings.cpp

@@ -625,7 +625,7 @@ void DynamicFontImportSettings::_change_text_opts() {
 
 
 void DynamicFontImportSettings::_glyph_clear() {
 void DynamicFontImportSettings::_glyph_clear() {
 	selected_glyphs.clear();
 	selected_glyphs.clear();
-	label_glyphs->set_text(TTR("Preloaded glyphs: ") + itos(selected_glyphs.size()));
+	label_glyphs->set_text(TTR("Preloaded glyphs:") + " " + itos(selected_glyphs.size()));
 	_range_selected();
 	_range_selected();
 }
 }
 
 
@@ -654,7 +654,7 @@ void DynamicFontImportSettings::_glyph_text_selected() {
 			}
 			}
 		}
 		}
 		TS->free_rid(text_rid);
 		TS->free_rid(text_rid);
-		label_glyphs->set_text(TTR("Preloaded glyphs: ") + itos(selected_glyphs.size()));
+		label_glyphs->set_text(TTR("Preloaded glyphs:") + " " + itos(selected_glyphs.size()));
 	}
 	}
 	_range_selected();
 	_range_selected();
 }
 }
@@ -681,7 +681,7 @@ void DynamicFontImportSettings::_glyph_selected() {
 			item->clear_custom_bg_color(glyph_table->get_selected_column());
 			item->clear_custom_bg_color(glyph_table->get_selected_column());
 		}
 		}
 	}
 	}
-	label_glyphs->set_text(TTR("Preloaded glyphs: ") + itos(selected_glyphs.size()));
+	label_glyphs->set_text(TTR("Preloaded glyphs:") + " " + itos(selected_glyphs.size()));
 
 
 	item = glyph_tree->get_selected();
 	item = glyph_tree->get_selected();
 	ERR_FAIL_NULL(item);
 	ERR_FAIL_NULL(item);
@@ -769,7 +769,7 @@ void DynamicFontImportSettings::_edit_range(int32_t p_start, int32_t p_end) {
 			col = 0;
 			col = 0;
 		}
 		}
 	}
 	}
-	label_glyphs->set_text(TTR("Preloaded glyphs: ") + itos(selected_glyphs.size()));
+	label_glyphs->set_text(TTR("Preloaded glyphs:") + " " + itos(selected_glyphs.size()));
 }
 }
 
 
 bool DynamicFontImportSettings::_char_update(int32_t p_char) {
 bool DynamicFontImportSettings::_char_update(int32_t p_char) {
@@ -1292,7 +1292,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) {
 			}
 			}
 		}
 		}
 	}
 	}
-	label_glyphs->set_text(TTR("Preloaded glyphs: ") + itos(selected_glyphs.size()));
+	label_glyphs->set_text(TTR("Preloaded glyphs:") + " " + itos(selected_glyphs.size()));
 
 
 	import_settings_data->options = options_general;
 	import_settings_data->options = options_general;
 	inspector_general->edit(import_settings_data.ptr());
 	inspector_general->edit(import_settings_data.ptr());
@@ -1556,7 +1556,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() {
 
 
 	label_glyphs = memnew(Label);
 	label_glyphs = memnew(Label);
 	text_hb->add_child(label_glyphs);
 	text_hb->add_child(label_glyphs);
-	label_glyphs->set_text(TTR("Preloaded glyphs: ") + itos(0));
+	label_glyphs->set_text(TTR("Preloaded glyphs:") + " " + itos(0));
 	label_glyphs->set_custom_minimum_size(Size2(50 * EDSCALE, 0));
 	label_glyphs->set_custom_minimum_size(Size2(50 * EDSCALE, 0));
 
 
 	Button *btn_fill = memnew(Button);
 	Button *btn_fill = memnew(Button);

+ 1 - 1
editor/import/resource_importer_imagefont.cpp

@@ -107,7 +107,7 @@ Error ResourceImporterImageFont::import(const String &p_source_file, const Strin
 	Ref<Image> img;
 	Ref<Image> img;
 	img.instantiate();
 	img.instantiate();
 	Error err = ImageLoader::load_image(p_source_file, img);
 	Error err = ImageLoader::load_image(p_source_file, img);
-	ERR_FAIL_COND_V_MSG(err != OK, ERR_FILE_CANT_READ, TTR("Can't load font texture: ") + "\"" + p_source_file + "\".");
+	ERR_FAIL_COND_V_MSG(err != OK, ERR_FILE_CANT_READ, TTR("Can't load font texture:") + " \"" + p_source_file + "\".");
 	font->set_texture_image(0, Vector2i(base_size, 0), 0, img);
 	font->set_texture_image(0, Vector2i(base_size, 0), 0, img);
 
 
 	int count = columns * rows;
 	int count = columns * rows;

+ 1 - 1
editor/import/scene_import_settings.cpp

@@ -1354,7 +1354,7 @@ SceneImportSettings::SceneImportSettings() {
 	HBoxContainer *extension_hb = memnew(HBoxContainer);
 	HBoxContainer *extension_hb = memnew(HBoxContainer);
 	save_path->get_vbox()->add_child(extension_hb);
 	save_path->get_vbox()->add_child(extension_hb);
 	extension_hb->add_spacer();
 	extension_hb->add_spacer();
-	extension_hb->add_child(memnew(Label(TTR("Save Extension: "))));
+	extension_hb->add_child(memnew(Label(TTR("Save Extension:"))));
 	external_extension_type = memnew(OptionButton);
 	external_extension_type = memnew(OptionButton);
 	extension_hb->add_child(external_extension_type);
 	extension_hb->add_child(external_extension_type);
 	external_extension_type->add_item(TTR("Text: *.tres"));
 	external_extension_type->add_item(TTR("Text: *.tres"));

+ 2 - 0
editor/plugins/animation_player_editor_plugin.cpp

@@ -1639,8 +1639,10 @@ AnimationPlayerEditor::AnimationPlayerEditor(AnimationPlayerEditorPlugin *p_plug
 	onion_skinning = memnew(MenuButton);
 	onion_skinning = memnew(MenuButton);
 	onion_skinning->set_tooltip(TTR("Onion Skinning Options"));
 	onion_skinning->set_tooltip(TTR("Onion Skinning Options"));
 	onion_skinning->get_popup()->add_separator(TTR("Directions"));
 	onion_skinning->get_popup()->add_separator(TTR("Directions"));
+	// TRANSLATORS: Opposite of "Future", refers to a direction in animation onion skinning.
 	onion_skinning->get_popup()->add_check_item(TTR("Past"), ONION_SKINNING_PAST);
 	onion_skinning->get_popup()->add_check_item(TTR("Past"), ONION_SKINNING_PAST);
 	onion_skinning->get_popup()->set_item_checked(-1, true);
 	onion_skinning->get_popup()->set_item_checked(-1, true);
+	// TRANSLATORS: Opposite of "Past", refers to a direction in animation onion skinning.
 	onion_skinning->get_popup()->add_check_item(TTR("Future"), ONION_SKINNING_FUTURE);
 	onion_skinning->get_popup()->add_check_item(TTR("Future"), ONION_SKINNING_FUTURE);
 	onion_skinning->get_popup()->add_separator(TTR("Depth"));
 	onion_skinning->get_popup()->add_separator(TTR("Depth"));
 	onion_skinning->get_popup()->add_radio_check_item(TTR("1 step"), ONION_SKINNING_1_STEP);
 	onion_skinning->get_popup()->add_radio_check_item(TTR("1 step"), ONION_SKINNING_1_STEP);

+ 1 - 1
editor/plugins/animation_state_machine_editor.cpp

@@ -1943,7 +1943,7 @@ AnimationNodeStateMachineEditor::AnimationNodeStateMachineEditor() {
 	tool_erase_hb->add_child(tool_erase);
 	tool_erase_hb->add_child(tool_erase);
 
 
 	top_hb->add_child(memnew(VSeparator));
 	top_hb->add_child(memnew(VSeparator));
-	top_hb->add_child(memnew(Label(TTR("Transition: "))));
+	top_hb->add_child(memnew(Label(TTR("Transition:"))));
 	transition_mode = memnew(OptionButton);
 	transition_mode = memnew(OptionButton);
 	top_hb->add_child(transition_mode);
 	top_hb->add_child(transition_mode);
 
 

+ 3 - 2
editor/plugins/canvas_item_editor_plugin.cpp

@@ -5171,11 +5171,12 @@ CanvasItemEditor::CanvasItemEditor() {
 	hb->add_child(memnew(VSeparator));
 	hb->add_child(memnew(VSeparator));
 
 
 	view_menu = memnew(MenuButton);
 	view_menu = memnew(MenuButton);
-	view_menu->set_shortcut_context(this);
+	// TRANSLATORS: Noun, name of the 2D/3D View menus.
 	view_menu->set_text(TTR("View"));
 	view_menu->set_text(TTR("View"));
+	view_menu->set_switch_on_hover(true);
+	view_menu->set_shortcut_context(this);
 	hb->add_child(view_menu);
 	hb->add_child(view_menu);
 	view_menu->get_popup()->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
 	view_menu->get_popup()->connect("id_pressed", callable_mp(this, &CanvasItemEditor::_popup_callback));
-	view_menu->set_switch_on_hover(true);
 
 
 	p = view_menu->get_popup();
 	p = view_menu->get_popup();
 	p->set_hide_on_checkable_item_selection(false);
 	p->set_hide_on_checkable_item_selection(false);

+ 1 - 1
editor/plugins/gpu_particles_3d_editor_plugin.cpp

@@ -213,7 +213,7 @@ GPUParticles3DEditorBase::GPUParticles3DEditorBase() {
 	emission_fill->add_item(TTR("Surface Points"));
 	emission_fill->add_item(TTR("Surface Points"));
 	emission_fill->add_item(TTR("Surface Points+Normal (Directed)"));
 	emission_fill->add_item(TTR("Surface Points+Normal (Directed)"));
 	emission_fill->add_item(TTR("Volume"));
 	emission_fill->add_item(TTR("Volume"));
-	emd_vb->add_margin_child(TTR("Emission Source: "), emission_fill);
+	emd_vb->add_margin_child(TTR("Emission Source:"), emission_fill);
 
 
 	emission_dialog->get_ok_button()->set_text(TTR("Create"));
 	emission_dialog->get_ok_button()->set_text(TTR("Create"));
 	emission_dialog->connect("confirmed", callable_mp(this, &GPUParticles3DEditorBase::_generate_emission_points));
 	emission_dialog->connect("confirmed", callable_mp(this, &GPUParticles3DEditorBase::_generate_emission_points));

+ 5 - 2
editor/plugins/node_3d_editor_plugin.cpp

@@ -4167,7 +4167,8 @@ void Node3DEditorViewport::update_transform(Point2 p_mousepos, bool p_shift) {
 			Vector3 motion_snapped = motion;
 			Vector3 motion_snapped = motion;
 			motion_snapped.snap(Vector3(snap, snap, snap));
 			motion_snapped.snap(Vector3(snap, snap, snap));
 			// This might not be necessary anymore after issue #288 is solved (in 4.0?).
 			// This might not be necessary anymore after issue #288 is solved (in 4.0?).
-			set_message(TTR("Scaling: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " +
+			// TRANSLATORS: Refers to changing the scale of a node in the 3D editor.
+			set_message(TTR("Scaling:") + " (" + String::num(motion_snapped.x, snap_step_decimals) + ", " +
 					String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")");
 					String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")");
 			motion = _edit.original.basis.inverse().xform(motion);
 			motion = _edit.original.basis.inverse().xform(motion);
 
 
@@ -4267,7 +4268,8 @@ void Node3DEditorViewport::update_transform(Point2 p_mousepos, bool p_shift) {
 			}
 			}
 			Vector3 motion_snapped = motion;
 			Vector3 motion_snapped = motion;
 			motion_snapped.snap(Vector3(snap, snap, snap));
 			motion_snapped.snap(Vector3(snap, snap, snap));
-			set_message(TTR("Translating: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " +
+			// TRANSLATORS: Refers to changing the position of a node in the 3D editor.
+			set_message(TTR("Translating:") + " (" + String::num(motion_snapped.x, snap_step_decimals) + ", " +
 					String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")");
 					String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")");
 			motion = spatial_editor->get_gizmo_transform().basis.inverse().xform(motion);
 			motion = spatial_editor->get_gizmo_transform().basis.inverse().xform(motion);
 
 
@@ -7711,6 +7713,7 @@ Node3DEditor::Node3DEditor() {
 	p->connect("id_pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed));
 	p->connect("id_pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed));
 
 
 	view_menu = memnew(MenuButton);
 	view_menu = memnew(MenuButton);
+	// TRANSLATORS: Noun, name of the 2D/3D View menus.
 	view_menu->set_text(TTR("View"));
 	view_menu->set_text(TTR("View"));
 	view_menu->set_switch_on_hover(true);
 	view_menu->set_switch_on_hover(true);
 	view_menu->set_shortcut_context(this);
 	view_menu->set_shortcut_context(this);

+ 1 - 1
editor/plugins/occluder_instance_3d_editor_plugin.cpp

@@ -63,7 +63,7 @@ void OccluderInstance3DEditorPlugin::_bake_select_file(const String &p_file) {
 				break;
 				break;
 			}
 			}
 			case OccluderInstance3D::BAKE_ERROR_CANT_SAVE: {
 			case OccluderInstance3D::BAKE_ERROR_CANT_SAVE: {
-				EditorNode::get_singleton()->show_warning(TTR("Could not save the new occluder at the specified path: ") + p_file);
+				EditorNode::get_singleton()->show_warning(TTR("Could not save the new occluder at the specified path:") + " " + p_file);
 				break;
 				break;
 			}
 			}
 			default: {
 			default: {

+ 1 - 4
editor/plugins/resource_preloader_editor_plugin.cpp

@@ -420,11 +420,8 @@ ResourcePreloaderEditorPlugin::ResourcePreloaderEditorPlugin() {
 	preloader_editor = memnew(ResourcePreloaderEditor);
 	preloader_editor = memnew(ResourcePreloaderEditor);
 	preloader_editor->set_custom_minimum_size(Size2(0, 250) * EDSCALE);
 	preloader_editor->set_custom_minimum_size(Size2(0, 250) * EDSCALE);
 
 
-	button = EditorNode::get_singleton()->add_bottom_panel_item(TTR("ResourcePreloader"), preloader_editor);
+	button = EditorNode::get_singleton()->add_bottom_panel_item("ResourcePreloader", preloader_editor);
 	button->hide();
 	button->hide();
-
-	//preloader_editor->set_anchor( MARGIN_TOP, Control::ANCHOR_END);
-	//preloader_editor->set_margin( MARGIN_TOP, 120 );
 }
 }
 
 
 ResourcePreloaderEditorPlugin::~ResourcePreloaderEditorPlugin() {
 ResourcePreloaderEditorPlugin::~ResourcePreloaderEditorPlugin() {

+ 3 - 3
editor/plugins/sprite_2d_editor_plugin.cpp

@@ -546,7 +546,7 @@ Sprite2DEditor::Sprite2DEditor() {
 	debug_uv_dialog->connect("confirmed", callable_mp(this, &Sprite2DEditor::_create_node));
 	debug_uv_dialog->connect("confirmed", callable_mp(this, &Sprite2DEditor::_create_node));
 
 
 	HBoxContainer *hb = memnew(HBoxContainer);
 	HBoxContainer *hb = memnew(HBoxContainer);
-	hb->add_child(memnew(Label(TTR("Simplification: "))));
+	hb->add_child(memnew(Label(TTR("Simplification:"))));
 	simplification = memnew(SpinBox);
 	simplification = memnew(SpinBox);
 	simplification->set_min(0.01);
 	simplification->set_min(0.01);
 	simplification->set_max(10.00);
 	simplification->set_max(10.00);
@@ -554,7 +554,7 @@ Sprite2DEditor::Sprite2DEditor() {
 	simplification->set_value(2);
 	simplification->set_value(2);
 	hb->add_child(simplification);
 	hb->add_child(simplification);
 	hb->add_spacer();
 	hb->add_spacer();
-	hb->add_child(memnew(Label(TTR("Shrink (Pixels): "))));
+	hb->add_child(memnew(Label(TTR("Shrink (Pixels):"))));
 	shrink_pixels = memnew(SpinBox);
 	shrink_pixels = memnew(SpinBox);
 	shrink_pixels->set_min(0);
 	shrink_pixels->set_min(0);
 	shrink_pixels->set_max(10);
 	shrink_pixels->set_max(10);
@@ -562,7 +562,7 @@ Sprite2DEditor::Sprite2DEditor() {
 	shrink_pixels->set_value(0);
 	shrink_pixels->set_value(0);
 	hb->add_child(shrink_pixels);
 	hb->add_child(shrink_pixels);
 	hb->add_spacer();
 	hb->add_spacer();
-	hb->add_child(memnew(Label(TTR("Grow (Pixels): "))));
+	hb->add_child(memnew(Label(TTR("Grow (Pixels):"))));
 	grow_pixels = memnew(SpinBox);
 	grow_pixels = memnew(SpinBox);
 	grow_pixels->set_min(0);
 	grow_pixels->set_min(0);
 	grow_pixels->set_max(10);
 	grow_pixels->set_max(10);

+ 2 - 2
modules/visual_script/visual_script.cpp

@@ -1528,7 +1528,7 @@ Variant VisualScriptInstance::_call_internal(const StringName &p_method, void *p
 			// If no exit bit was set, and has sequence outputs, guess next node.
 			// If no exit bit was set, and has sequence outputs, guess next node.
 			if (output >= node->sequence_output_count) {
 			if (output >= node->sequence_output_count) {
 				r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
 				r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
-				error_str = RTR("Node returned an invalid sequence output: ") + itos(output);
+				error_str = RTR("Node returned an invalid sequence output:") + " " + itos(output);
 				error = true;
 				error = true;
 				break;
 				break;
 			}
 			}
@@ -1594,7 +1594,7 @@ Variant VisualScriptInstance::_call_internal(const StringName &p_method, void *p
 					// Check for stack overflow.
 					// Check for stack overflow.
 					if (flow_stack_pos + 1 >= flow_max) {
 					if (flow_stack_pos + 1 >= flow_max) {
 						r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
 						r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
-						error_str = RTR("Stack overflow with stack depth: ") + itos(output);
+						error_str = RTR("Stack overflow with stack depth:") + " " + itos(output);
 						error = true;
 						error = true;
 						break;
 						break;
 					}
 					}

+ 2 - 2
modules/visual_script/visual_script_flow_control.cpp

@@ -391,7 +391,7 @@ public:
 
 
 			if (!valid) {
 			if (!valid) {
 				r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
 				r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
-				r_error_str = RTR("Input type not iterable: ") + Variant::get_type_name(p_inputs[0]->get_type());
+				r_error_str = RTR("Input type not iterable:") + " " + Variant::get_type_name(p_inputs[0]->get_type());
 				return 0;
 				return 0;
 			}
 			}
 
 
@@ -414,7 +414,7 @@ public:
 
 
 			if (!valid) {
 			if (!valid) {
 				r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
 				r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
-				r_error_str = RTR("Iterator became invalid: ") + Variant::get_type_name(p_inputs[0]->get_type());
+				r_error_str = RTR("Iterator became invalid:") + " " + Variant::get_type_name(p_inputs[0]->get_type());
 				return 0;
 				return 0;
 			}
 			}
 
 

+ 4 - 4
modules/visual_script/visual_script_nodes.cpp

@@ -1116,9 +1116,9 @@ public:
 				r_error_str = *p_outputs[0];
 				r_error_str = *p_outputs[0];
 			} else {
 			} else {
 				if (unary) {
 				if (unary) {
-					r_error_str = String(Variant::get_operator_name(op)) + RTR(": Invalid argument of type: ") + Variant::get_type_name(p_inputs[0]->get_type());
+					r_error_str = String(Variant::get_operator_name(op)) + ": " + RTR("Invalid argument of type:") + " " + Variant::get_type_name(p_inputs[0]->get_type());
 				} else {
 				} else {
-					r_error_str = String(Variant::get_operator_name(op)) + RTR(": Invalid arguments: ") + "A: " + Variant::get_type_name(p_inputs[0]->get_type()) + "  B: " + Variant::get_type_name(p_inputs[1]->get_type());
+					r_error_str = String(Variant::get_operator_name(op)) + ": " + RTR("Invalid arguments:") + " A: " + Variant::get_type_name(p_inputs[0]->get_type()) + ", B: " + Variant::get_type_name(p_inputs[1]->get_type());
 				}
 				}
 			}
 			}
 		}
 		}
@@ -1335,7 +1335,7 @@ public:
 	virtual int step(const Variant **p_inputs, Variant **p_outputs, StartMode p_start_mode, Variant *p_working_mem, Callable::CallError &r_error, String &r_error_str) override {
 	virtual int step(const Variant **p_inputs, Variant **p_outputs, StartMode p_start_mode, Variant *p_working_mem, Callable::CallError &r_error, String &r_error_str) override {
 		if (!instance->get_variable(variable, p_outputs[0])) {
 		if (!instance->get_variable(variable, p_outputs[0])) {
 			r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
 			r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
-			r_error_str = RTR("VariableGet not found in script: ") + "'" + String(variable) + "'";
+			r_error_str = RTR("VariableGet not found in script:") + " '" + String(variable) + "'";
 			return 0;
 			return 0;
 		}
 		}
 		return 0;
 		return 0;
@@ -1447,7 +1447,7 @@ public:
 	virtual int step(const Variant **p_inputs, Variant **p_outputs, StartMode p_start_mode, Variant *p_working_mem, Callable::CallError &r_error, String &r_error_str) override {
 	virtual int step(const Variant **p_inputs, Variant **p_outputs, StartMode p_start_mode, Variant *p_working_mem, Callable::CallError &r_error, String &r_error_str) override {
 		if (!instance->set_variable(variable, *p_inputs[0])) {
 		if (!instance->set_variable(variable, *p_inputs[0])) {
 			r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
 			r_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD;
-			r_error_str = RTR("VariableSet not found in script: ") + "'" + String(variable) + "'";
+			r_error_str = RTR("VariableSet not found in script:") + " '" + String(variable) + "'";
 		}
 		}
 
 
 		return 0;
 		return 0;