first Prototype
97
addons/localization_editor/LocalizationEditor.gd
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
# LocalizationEditor : MIT License
|
||||
# @author Vladimir Petrenko
|
||||
@tool
|
||||
extends Control
|
||||
|
||||
var _editor: EditorPlugin
|
||||
var _data:= LocalizationData.new()
|
||||
|
||||
@onready var _save_ui = $VBox/Margin/HBox/Save
|
||||
@onready var _open_ui = $VBox/Margin/HBox/Open
|
||||
@onready var _file_ui = $VBox/Margin/HBox/File
|
||||
@onready var _tabs_ui = $VBox/Tabs as TabContainer
|
||||
@onready var _locales_ui = $VBox/Tabs/Locales
|
||||
@onready var _remaps_ui = $VBox/Tabs/Remaps
|
||||
@onready var _placeholders_ui = $VBox/Tabs/Placeholders
|
||||
@onready var _translations_ui = $VBox/Tabs/Translations
|
||||
@onready var _auto_translate_ui = $VBox/Tabs/AutoTranslate
|
||||
|
||||
const IconResourceTranslations = preload("res://addons/localization_editor/icons/Localization.svg")
|
||||
const IconResourceRemaps = preload("res://addons/localization_editor/icons/Remaps.svg")
|
||||
const IconResourceLocales = preload("res://addons/localization_editor/icons/Locales.svg")
|
||||
const IconResourcePlaceholders = preload("res://addons/localization_editor/icons/Placeholders.svg")
|
||||
const IconResourcePseudolocalization = preload("res://addons/localization_editor/icons/Pseudolocalization.svg")
|
||||
const IconResourceTranslation = preload("res://addons/localization_editor/icons/Translation.svg")
|
||||
|
||||
const LocalizationEditorDialogFile = preload("res://addons/localization_editor/LocalizationEditorDialogFile.tscn")
|
||||
|
||||
var thread
|
||||
|
||||
func _ready() -> void:
|
||||
_tabs_ui.set_tab_icon(0, IconResourceTranslations)
|
||||
_tabs_ui.set_tab_icon(1, IconResourceRemaps)
|
||||
_tabs_ui.set_tab_icon(2, IconResourceLocales)
|
||||
_tabs_ui.set_tab_icon(3, IconResourcePlaceholders)
|
||||
_tabs_ui.set_tab_icon(4, IconResourcePseudolocalization)
|
||||
_tabs_ui.set_tab_icon(5, IconResourceTranslation)
|
||||
_tabs_ui.connect("tab_changed", _on_tab_changed)
|
||||
|
||||
func _on_tab_changed(idx: int) -> void:
|
||||
if idx == 3:
|
||||
_data.init_data_placeholders()
|
||||
_data.emit_signal_data_changed()
|
||||
|
||||
func set_editor(editor: EditorPlugin) -> void:
|
||||
_editor = editor
|
||||
_init_connections()
|
||||
_load_data()
|
||||
_data.set_editor(editor)
|
||||
_data_to_childs()
|
||||
_update_view()
|
||||
|
||||
func _init_connections() -> void:
|
||||
if not _data.is_connected("settings_changed", _update_view):
|
||||
assert(_data.connect("settings_changed", _update_view) == OK)
|
||||
if not _save_ui.is_connected("pressed", _on_save_data):
|
||||
assert(_save_ui.connect("pressed", _on_save_data) == OK)
|
||||
if not _open_ui.is_connected("pressed", _open_file):
|
||||
assert(_open_ui.connect("pressed", _open_file) == OK)
|
||||
|
||||
func get_data() -> LocalizationData:
|
||||
return _data
|
||||
|
||||
func _load_data() -> void:
|
||||
_data.init_data_translations()
|
||||
_data.init_data_remaps()
|
||||
_data.init_data_placeholders()
|
||||
|
||||
func _data_to_childs() -> void:
|
||||
_translations_ui.set_data(_data)
|
||||
_remaps_ui.set_data(_data)
|
||||
_locales_ui.set_data(_data)
|
||||
_placeholders_ui.set_data(_data)
|
||||
_auto_translate_ui.set_data(_data)
|
||||
|
||||
func _update_view() -> void:
|
||||
_file_ui.text = _data.setting_path_to_file()
|
||||
|
||||
func _on_save_data() -> void:
|
||||
save_data(true)
|
||||
|
||||
func save_data(update_script_classes = false) -> void:
|
||||
_data.save_data_translations(update_script_classes)
|
||||
_data.save_data_remaps()
|
||||
|
||||
func _open_file() -> void:
|
||||
var file_dialog: FileDialog = LocalizationEditorDialogFile.instantiate()
|
||||
var root = get_tree().get_root()
|
||||
root.add_child(file_dialog)
|
||||
assert(file_dialog.file_selected.connect(_path_to_file_changed) == OK)
|
||||
file_dialog.popup_centered()
|
||||
|
||||
func _path_to_file_changed(new_path) -> void:
|
||||
_data.setting_path_to_file_put(new_path)
|
||||
if FileAccess.file_exists(new_path):
|
||||
_load_data()
|
||||
_data_to_childs()
|
||||
_update_view()
|
||||
1
addons/localization_editor/LocalizationEditor.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://by486bsbrrtsx
|
||||
81
addons/localization_editor/LocalizationEditor.tscn
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
[gd_scene load_steps=10 format=3 uid="uid://doq4l8bl41mfl"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/localization_editor/LocalizationEditor.gd" id="1_8fvc6"]
|
||||
[ext_resource type="Texture2D" uid="uid://drjyfbi5n382s" path="res://addons/localization_editor/icons/Save.svg" id="1_c7hr8"]
|
||||
[ext_resource type="Texture2D" uid="uid://crjkaavcu17ry" path="res://addons/localization_editor/icons/File.svg" id="2_4pkbj"]
|
||||
[ext_resource type="PackedScene" uid="uid://bchlj4dnjh8j5" path="res://addons/localization_editor/scenes/translations/LocalizationTranslationsEditorView.tscn" id="4_kmfo1"]
|
||||
[ext_resource type="PackedScene" uid="uid://bikmkc3ntiugr" path="res://addons/localization_editor/scenes/locales/LocalizationLocalesEditorView.tscn" id="4_mauhd"]
|
||||
[ext_resource type="PackedScene" path="res://addons/localization_editor/scenes/remaps/LocalizationRemapsEditorView.tscn" id="8_orcd3"]
|
||||
[ext_resource type="PackedScene" uid="uid://2e10hsy4f7ak" path="res://addons/localization_editor/scenes/auto_translate/LocalizationAutoTranslateEditorView.tscn" id="10_3m4id"]
|
||||
[ext_resource type="PackedScene" path="res://addons/localization_editor/scenes/placeholders/LocalizationPlaceholdersEditorView.tscn" id="12_tkjln"]
|
||||
[ext_resource type="PackedScene" uid="uid://bt0r11jd8rtq6" path="res://addons/localization_editor/scenes/pseudolocalization/LocalizationPseudolocalizationEditorView.tscn" id="12_w0ry5"]
|
||||
|
||||
[node name="Control" type="Control"]
|
||||
layout_mode = 3
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
script = ExtResource("1_8fvc6")
|
||||
|
||||
[node name="VBox" type="VBoxContainer" parent="."]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="Margin" type="MarginContainer" parent="VBox"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
|
||||
[node name="HBox" type="HBoxContainer" parent="VBox/Margin"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="Save" type="Button" parent="VBox/Margin/HBox"]
|
||||
layout_mode = 2
|
||||
icon = ExtResource("1_c7hr8")
|
||||
|
||||
[node name="Open" type="Button" parent="VBox/Margin/HBox"]
|
||||
layout_mode = 2
|
||||
icon = ExtResource("2_4pkbj")
|
||||
|
||||
[node name="File" type="Label" parent="VBox/Margin/HBox"]
|
||||
layout_mode = 2
|
||||
text = "Path:"
|
||||
|
||||
[node name="Tabs" type="TabContainer" parent="VBox"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="Translations" parent="VBox/Tabs" instance=ExtResource("4_kmfo1")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Remaps" parent="VBox/Tabs" instance=ExtResource("8_orcd3")]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Locales" parent="VBox/Tabs" instance=ExtResource("4_mauhd")]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Placeholders" parent="VBox/Tabs" instance=ExtResource("12_tkjln")]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Pseudolocalization" parent="VBox/Tabs" instance=ExtResource("12_w0ry5")]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
|
||||
[node name="AutoTranslate" parent="VBox/Tabs" instance=ExtResource("10_3m4id")]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
10
addons/localization_editor/LocalizationEditorDialogFile.tscn
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
[gd_scene format=2]
|
||||
|
||||
[node name="LocalizationEditorDialogFile" type="FileDialog"]
|
||||
margin_right = 600.0
|
||||
margin_bottom = 300.0
|
||||
rect_min_size = Vector2( 600, 300 )
|
||||
window_title = "Open a File"
|
||||
resizable = true
|
||||
mode = 0
|
||||
filters = PoolStringArray( "*.csv" )
|
||||
122
addons/localization_editor/LocalizationManager.gd
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
# LocalizationManager for usege with placeholders: MIT License
|
||||
# @author Vladimir Petrenko
|
||||
extends Node
|
||||
|
||||
signal translation_changed
|
||||
|
||||
const _pseudolocalization_control: String = "internationalization/pseudolocalization/use_pseudolocalization_control"
|
||||
const _pseudolocalization_ui = preload("res://addons/localization_editor/scenes/pseudolocalization/ui/LocalizationPseudolocalizationForUI.tscn")
|
||||
|
||||
var _path_to_save = "user://localization.tres"
|
||||
var _keys_with_placeholder: Dictionary = {}
|
||||
var _placeholders_default: Dictionary = {}
|
||||
var _placeholders: Dictionary = {}
|
||||
var _data_remaps: Dictionary = {}
|
||||
|
||||
func _ready() -> void:
|
||||
_load_pseudolocalization_control()
|
||||
_load_localization()
|
||||
_load_placeholders_default()
|
||||
_load_localization_keys()
|
||||
_load_data_remaps()
|
||||
|
||||
func _load_pseudolocalization_control() -> void:
|
||||
if ProjectSettings.has_setting(_pseudolocalization_control) and ProjectSettings.get_setting(_pseudolocalization_control) == true:
|
||||
var root_node = get_tree().get_root()
|
||||
root_node.call_deferred("add_child", _pseudolocalization_ui.instantiate())
|
||||
|
||||
func _load_placeholders_default() -> void:
|
||||
if FileAccess.file_exists(LocalizationData.default_path_to_placeholders):
|
||||
var resource = ResourceLoader.load(LocalizationData.default_path_to_placeholders)
|
||||
if resource and resource.placeholders and not resource.placeholders.size() <= 0:
|
||||
_placeholders_default = resource.placeholders
|
||||
|
||||
func _load_localization_keys() -> void:
|
||||
var regex = RegEx.new()
|
||||
regex.compile("{{(.+?)}}")
|
||||
for _localization_key in LocalizationKeys.KEYS:
|
||||
var results = regex.search_all(tr(_localization_key))
|
||||
for result in results:
|
||||
var name = result.get_string()
|
||||
var clean_name = name.replace("{{", "");
|
||||
clean_name = clean_name.replace("}}", "");
|
||||
_add_placeholder(_localization_key, clean_name)
|
||||
|
||||
func _add_placeholder(key: String, placeholder_key: String) -> void:
|
||||
if not _keys_with_placeholder.has(key):
|
||||
_keys_with_placeholder[key] = []
|
||||
var placeholder_keys = _keys_with_placeholder[key] as Array
|
||||
if not placeholder_keys.has(placeholder_key):
|
||||
placeholder_keys.append(placeholder_key)
|
||||
|
||||
func set_placeholder(name: String, value: String, locale: String = "", profile: String = "DEFAULT") -> void:
|
||||
var loc = locale
|
||||
if loc.length() <= 0:
|
||||
loc = TranslationServer.get_locale()
|
||||
if not _placeholders.has(profile):
|
||||
_placeholders[profile] = {}
|
||||
if not _placeholders[profile].has(name):
|
||||
_placeholders[profile][name] = {}
|
||||
_placeholders[profile][name][loc] = value
|
||||
emit_signal("translation_changed")
|
||||
|
||||
func _load_data_remaps() -> void:
|
||||
var internationalization_path = "internationalization/locale/translation_remaps"
|
||||
_data_remaps.remapkeys = []
|
||||
if ProjectSettings.has_setting(internationalization_path):
|
||||
var settings_remaps = ProjectSettings.get_setting(internationalization_path)
|
||||
if settings_remaps.size():
|
||||
var keys = settings_remaps.keys();
|
||||
for key in keys:
|
||||
var remaps = []
|
||||
for remap in settings_remaps[key]:
|
||||
var index = remap.rfind(":")
|
||||
var locale = remap.substr(index + 1)
|
||||
var value = remap.substr(0, index)
|
||||
var remap_new = {"locale": locale, "value": value }
|
||||
remaps.append(remap_new)
|
||||
var filename = key.get_file()
|
||||
_data_remaps[filename.replace(".", "_").to_upper()] = remaps
|
||||
|
||||
func tr_remap(key: String) -> String:
|
||||
for remap in _data_remaps[key]:
|
||||
if remap["locale"] == TranslationServer.get_locale():
|
||||
return remap["value"]
|
||||
return ""
|
||||
|
||||
func tr(name: StringName, context: StringName = StringName("")) -> String:
|
||||
var tr_text = super.tr(name, context)
|
||||
if _keys_with_placeholder.has(name):
|
||||
for placeholder in _keys_with_placeholder[name]:
|
||||
tr_text = tr_text.replace("{{" + placeholder + "}}", _placeholder_by_key(placeholder))
|
||||
return tr_text
|
||||
|
||||
func _placeholder_by_key(key: String, profile: String = "DEFAULT") -> String:
|
||||
var value = ""
|
||||
if value.length() <= 0 and _placeholders.has(profile) and _placeholders[profile].has(key) and _placeholders[profile][key].has(TranslationServer.get_locale()):
|
||||
value = _placeholders[profile][key][TranslationServer.get_locale()]
|
||||
if value.length() <= 0 and _placeholders_default.has(key) and _placeholders_default[key].has(TranslationServer.get_locale()):
|
||||
value = _placeholders_default[key][TranslationServer.get_locale()]
|
||||
return value
|
||||
|
||||
func _notification(what):
|
||||
match what:
|
||||
MainLoop.NOTIFICATION_TRANSLATION_CHANGED:
|
||||
_save_localization()
|
||||
emit_signal("translation_changed")
|
||||
|
||||
func _load_localization():
|
||||
if FileAccess.file_exists(_path_to_save):
|
||||
var loaded_data = load(_path_to_save) as LocalizationSave
|
||||
if loaded_data:
|
||||
if loaded_data.placeholders and not loaded_data.placeholders.is_empty():
|
||||
for key in loaded_data.placeholders.keys():
|
||||
_placeholders[key] = loaded_data.placeholders[key]
|
||||
if loaded_data.locale and not loaded_data.locale.is_empty():
|
||||
TranslationServer.set_locale(loaded_data.locale)
|
||||
|
||||
func _save_localization() -> void:
|
||||
var save_data = LocalizationSave.new()
|
||||
save_data.locale = TranslationServer.get_locale()
|
||||
save_data.placeholders = _placeholders
|
||||
assert(ResourceSaver.save(save_data, _path_to_save) == OK)
|
||||
1
addons/localization_editor/LocalizationManager.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://dvetkrd55c44g
|
||||
BIN
addons/localization_editor/icons/Add.png~
Normal file
|
After Width: | Height: | Size: 509 B |
76
addons/localization_editor/icons/Add.svg
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Add.svg"
|
||||
enable-background="new">
|
||||
<defs
|
||||
id="defs820">
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter824">
|
||||
<feBlend
|
||||
inkscape:collect="always"
|
||||
mode="darken"
|
||||
in2="BackgroundImage"
|
||||
id="feBlend826" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="6.6998844"
|
||||
inkscape:cy="7.036163"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true" />
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
style="filter:url(#filter824)">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 15.51737,5.994694 H 10.021389 V 0.48337327 c 0,-0.27669335 -0.2237127,-0.50102916 -0.4996352,-0.50102916 h -2.997808 c -0.2759231,0 -0.4996348,0.22433581 -0.4996348,0.50102916 V 5.994694 H 0.52832841 c -0.27592322,0 -0.4996347,0.2243358 -0.4996347,0.5010292 v 3.006175 c 0,0.2766935 0.22371148,0.5010288 0.4996347,0.5010288 H 6.024311 v 5.51132 c 0,0.276694 0.2237117,0.501031 0.4996348,0.501031 h 2.997808 c 0.2759225,0 0.4996352,-0.224337 0.4996352,-0.501031 v -5.51132 h 5.495981 c 0.275925,0 0.499635,-0.2243353 0.499635,-0.5010288 v -3.006175 c 0,-0.2766934 -0.22371,-0.5010292 -0.499635,-0.5010292 z"
|
||||
id="path5"
|
||||
style="stroke-width:0.03127072;opacity:0.99;fill:#ffffff;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
37
addons/localization_editor/icons/Add.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dgb1opv4dr50n"
|
||||
path="res://.godot/imported/Add.svg-9e8a81d71e7735c07f3c11939fefef80.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Add.svg"
|
||||
dest_files=["res://.godot/imported/Add.svg-9e8a81d71e7735c07f3c11939fefef80.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Amazon.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
34
addons/localization_editor/icons/Amazon.png.import
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cfu2uuf8hh0c"
|
||||
path="res://.godot/imported/Amazon.png-eab5b224273d7dcbce68a6400fcb16e2.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Amazon.png"
|
||||
dest_files=["res://.godot/imported/Amazon.png-eab5b224273d7dcbce68a6400fcb16e2.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
64
addons/localization_editor/icons/Audio.svg
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Audio.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="4.2126349"
|
||||
inkscape:cy="3.5606775"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true" />
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
style="opacity:1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 15.016264,0.00497181 H 16.01713 V 11.499053 c 0,1.380009 -1.568389,2.498714 -3.503033,2.498714 -1.934644,0 -3.5030321,-1.118705 -3.5030321,-2.498714 0,-1.380039 1.5683881,-2.498713 3.5030321,-2.498713 0.980287,0 1.866335,0.2873521 2.502167,0.7502388 V 4.0029133 L 7.0093318,5.7797795 v 7.7182445 c 0,1.38001 -1.5683577,2.498715 -3.5030327,2.498715 -1.934675,0 -3.50303266,-1.118705 -3.50303266,-2.498715 0,-1.38004 1.56835766,-2.498713 3.50303266,-2.498713 0.9802862,0 1.8663345,0.287352 2.5021662,0.750239 V 2.0039426 Z"
|
||||
id="path5"
|
||||
style="stroke-width:0.03125548;fill:#ffffff;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
37
addons/localization_editor/icons/Audio.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bkeugb6vucegl"
|
||||
path="res://.godot/imported/Audio.svg-2ca038934a743054d471feac0628292e.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Audio.svg"
|
||||
dest_files=["res://.godot/imported/Audio.svg-2ca038934a743054d471feac0628292e.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Cancel.png~
Normal file
|
After Width: | Height: | Size: 502 B |
63
addons/localization_editor/icons/Cancel.svg
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Cancel.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="4.2126349"
|
||||
inkscape:cy="7.5511398"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true" />
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 15.893561,12.896603 c -6.1e-5,-6.2e-5 -1.24e-4,-1.24e-4 -1.86e-4,-1.56e-4 L 11.04876,8.045035 15.893375,3.1936229 c 6.2e-5,-6.26e-5 1.25e-4,-9.38e-5 1.86e-4,-1.563e-4 0.05215,-0.052254 0.08986,-0.1132844 0.114034,-0.1782836 0.06622,-0.1776575 0.02838,-0.385458 -0.11422,-0.5283221 L 13.604813,0.19513298 c -0.142666,-0.14283283 -0.350116,-0.1806259 -0.527561,-0.11431625 -0.06488,0.02420628 -0.125853,0.06196816 -0.178067,0.11416007 0,6.248e-5 -6.3e-5,9.369e-5 -1.25e-4,1.5618e-4 L 8.0543834,5.0465765 3.2097072,0.1951642 c -6.24e-5,-6.246e-5 -9.36e-5,-9.371e-5 -1.56e-4,-1.5616e-4 C 3.1573691,0.14281612 3.0964224,0.10505428 3.0315453,0.08084797 2.8540699,0.01450708 2.64662,0.05233138 2.5039534,0.1951642 L 0.21536133,2.4869237 c -0.1426666,0.1428639 -0.18040745,0.3506321 -0.11418944,0.5282908 0.0242039,0.064967 0.0619137,0.1260588 0.11403348,0.1782835 6.24e-5,3.11e-5 9.359e-5,9.35e-5 1.5596e-4,1.56e-4 L 5.0600689,8.045035 0.21536133,12.896479 c -3.119e-5,6.2e-5 -9.356e-5,9.3e-5 -1.2478e-4,1.55e-4 -0.0521198,0.05225 -0.0898294,0.113285 -0.11406466,0.178252 -0.0662492,0.177661 -0.02847716,0.385459 0.11418944,0.528323 l 2.28859207,2.291727 c 0.1426981,0.142864 0.3501477,0.180658 0.5275919,0.114348 0.064876,-0.02423 0.125854,-0.062 0.1780377,-0.11419 3.11e-5,-6.3e-5 9.35e-5,-9.4e-5 1.559e-4,-1.57e-4 l 4.8446757,-4.851412 4.8446764,4.851411 c 6.3e-5,3.3e-5 1.25e-4,9.5e-5 1.88e-4,1.26e-4 0.05222,0.05222 0.113127,0.08999 0.178003,0.114222 0.177445,0.06631 0.384958,0.02852 0.527561,-0.114348 l 2.288563,-2.291758 c 0.142667,-0.142864 0.180438,-0.350664 0.11422,-0.528322 -0.02434,-0.06497 -0.06191,-0.125998 -0.114065,-0.178253 z"
|
||||
id="path5"
|
||||
style="stroke-width:0.03121235;fill:#ffffff;fill-opacity:0.95754719" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
37
addons/localization_editor/icons/Cancel.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://n1yxscibler4"
|
||||
path="res://.godot/imported/Cancel.svg-b829fd8e410a44ae828f70365531397d.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Cancel.svg"
|
||||
dest_files=["res://.godot/imported/Cancel.svg-b829fd8e410a44ae828f70365531397d.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Close.png~
Normal file
|
After Width: | Height: | Size: 515 B |
68
addons/localization_editor/icons/Close.svg
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Close.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="4.3440304"
|
||||
inkscape:cy="5.8417715"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true" />
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 14.794728,0.24463899 c -0.293565,-0.31246293 -0.769476,-0.31246293 -1.063041,0 L 10.565776,3.6147178 C 9.7524203,3.3520981 8.8909571,3.2109364 7.9991448,3.2109364 c -3.4971862,0 -6.5284214,2.1678033 -8.01798049,5.3344077 C 0.62513969,9.9143532 1.5573239,11.096525 2.6907092,11.997639 L 0.20134557,14.64754 c -0.29356457,0.312496 -0.29356457,0.819098 0,1.131595 0.14676664,0.156264 0.33913553,0.23438 0.53150441,0.23438 0.19236889,0 0.38473782,-0.07812 0.53153572,-0.234348 L 14.794728,1.376267 c 0.293533,-0.3124964 0.293533,-0.81913174 0,-1.13162801 z M 6.4957735,5.3446994 c 0.6614834,0 1.2227733,0.4549917 1.4238179,1.0868189 L 6.0133791,8.4606603 C 5.4198294,8.2466507 4.9924021,7.6491636 4.9924021,6.9450217 c 0,-0.8838446 0.6730718,-1.6003223 1.5033714,-1.6003223 z M 1.7055939,8.5453441 C 2.3052512,7.5364075 3.1036352,6.6795684 4.045748,6.0399062 4.1071043,5.9982311 4.169087,5.9578564 4.2315083,5.918215 4.0755023,6.3737734 3.9901545,6.8654391 3.9901545,7.3784424 c 0,0.9150176 0.2707008,1.762655 0.7313276,2.4574617 L 3.767405,10.851509 C 2.9460944,10.237351 2.2452102,9.4531936 1.7055939,8.5453441 Z"
|
||||
id="path5"
|
||||
style="stroke-width:0.03231437;fill:#ffffff;fill-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 12.97947,4.8441654 -1.086218,1.1562661 c 0.01973,0.013099 0.03962,0.026139 0.05929,0.039474 0.942144,0.6396955 1.740496,1.4965347 2.340153,2.505438 -0.599657,1.0089031 -1.39804,1.8657425 -2.340184,2.5054375 -1.183811,0.803796 -2.550877,1.228648 -3.9533658,1.228648 -0.6054829,0 -1.2042945,-0.07935 -1.7846585,-0.234047 l -1.2041684,1.281825 c 0.9351909,0.357773 1.9410716,0.552545 2.9888275,0.552545 3.4970612,0 6.5283282,-2.167803 8.0179802,-5.3344079 C 15.312076,7.0464423 14.261345,5.7715188 12.97947,4.8441654 Z"
|
||||
id="path9"
|
||||
style="stroke-width:0.03231437;fill:#ffffff;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
37
addons/localization_editor/icons/Close.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bfdnrjesbrqed"
|
||||
path="res://.godot/imported/Close.svg-f351e4fd560004c1853e63f0f5d5e701.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Close.svg"
|
||||
dest_files=["res://.godot/imported/Close.svg-f351e4fd560004c1853e63f0f5d5e701.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/DeepL.png
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
34
addons/localization_editor/icons/DeepL.png.import
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://c24qna6n2q27l"
|
||||
path="res://.godot/imported/DeepL.png-2041fb99b2785d0daa5bdc817b4c7693.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/DeepL.png"
|
||||
dest_files=["res://.godot/imported/DeepL.png-2041fb99b2785d0daa5bdc817b4c7693.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
addons/localization_editor/icons/Del.png~
Normal file
|
After Width: | Height: | Size: 502 B |
71
addons/localization_editor/icons/Del.svg
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Del.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="2.6774157"
|
||||
inkscape:cy="8.360782"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<sodipodi:guide
|
||||
position="6.4965436,7.9991455"
|
||||
orientation="0,1"
|
||||
id="guide1600"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 0.00325984,7.0009613 v 1.9875146 c 0,0.1829342 0.22406899,0.3312524 0.50043325,0.3312524 H 15.51669 c 0.276365,0 0.500434,-0.1483182 0.500434,-0.3312524 V 7.0009613 c 0,-0.182934 -0.224069,-0.3312524 -0.500434,-0.3312524 H 0.50369309 c -0.27636426,0 -0.50043325,0.1483184 -0.50043325,0.3312524 z"
|
||||
id="path5"
|
||||
style="stroke-width:0.02544677;fill:#fffffe;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
37
addons/localization_editor/icons/Del.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cnb7fnm4kvekf"
|
||||
path="res://.godot/imported/Del.svg-c73ff4a44bc97a401436752f4616d6d2.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Del.svg"
|
||||
dest_files=["res://.godot/imported/Del.svg-c73ff4a44bc97a401436752f4616d6d2.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Down.png~
Normal file
|
After Width: | Height: | Size: 518 B |
BIN
addons/localization_editor/icons/Export.png~
Normal file
|
After Width: | Height: | Size: 525 B |
71
addons/localization_editor/icons/Export.svg
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Export.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="8.0138622"
|
||||
inkscape:cy="5.1567044"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<sodipodi:guide
|
||||
position="6.4965436,7.9991455"
|
||||
orientation="0,1"
|
||||
id="guide1600"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 9.0207294,2.4796942 7.0217586,0.02093401 H 0.02536058 V 16.002875 H 16.017127 V 2.4796942 Z M 8.021244,6.7825246 11.519443,11.085355 H 9.0207294 v 4.91752 H 7.0217586 v -4.91752 H 4.523045 Z"
|
||||
id="path5"
|
||||
style="stroke-width:0.03464027;fill:#ffffff;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
37
addons/localization_editor/icons/Export.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dhx3806wkl557"
|
||||
path="res://.godot/imported/Export.svg-595ebdcd149e74e06552b42e5abf0d25.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Export.svg"
|
||||
dest_files=["res://.godot/imported/Export.svg-595ebdcd149e74e06552b42e5abf0d25.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/File.png~
Normal file
|
After Width: | Height: | Size: 518 B |
63
addons/localization_editor/icons/File.svg
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="File.svg">
|
||||
<defs
|
||||
id="defs816" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="7.8758433"
|
||||
inkscape:cy="8.0527587"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true" />
|
||||
<metadata
|
||||
id="metadata819">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 13.015545,16.045632 16.018756,6.1851633 H 3.0048409 L 0.00162978,16.045632 Z M 2.0037705,4.9526047 0.00162978,16.045632 V 0.02237036 H 4.5064464 L 6.5085873,2.4874875 h 6.5069577 v 2.4651172 z"
|
||||
id="path5"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.03471252" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2 KiB |
37
addons/localization_editor/icons/File.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://crjkaavcu17ry"
|
||||
path="res://.godot/imported/File.svg-a217cdf7a73106ed9395c6e9c00dd946.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/File.svg"
|
||||
dest_files=["res://.godot/imported/File.svg-a217cdf7a73106ed9395c6e9c00dd946.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Google.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
34
addons/localization_editor/icons/Google.png.import
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://byv22srd37niw"
|
||||
path="res://.godot/imported/Google.png-4a13485f7f5c818bffe254e6bc18a986.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Google.png"
|
||||
dest_files=["res://.godot/imported/Google.png-4a13485f7f5c818bffe254e6bc18a986.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
addons/localization_editor/icons/Image.png~
Normal file
|
After Width: | Height: | Size: 498 B |
73
addons/localization_editor/icons/Image.svg
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Image.svg">
|
||||
<defs
|
||||
id="defs816" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="3.7768337"
|
||||
inkscape:cy="7.9643704"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true" />
|
||||
<metadata
|
||||
id="metadata819">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 15.01444,1.1563611 c 6.26e-4,6.06e-4 0.0013,0.00135 0.0019,0.00207 V 14.843316 c -5.31e-4,7.14e-4 -0.0012,0.0015 -0.0019,0.0021 H 1.0059065 c -6.255e-4,-6.07e-4 -0.00128,-0.0014 -0.00178,-0.0021 V 1.1583931 c 5.317e-4,-7.13e-4 0.00119,-0.00146 0.00178,-0.00203 z m 0.0019,-1.14074891 H 1.0041237 c -0.55047654,0 -1.00086647,0.51333702 -1.00086647,1.14074891 V 14.845349 c 0,0.627412 0.45038993,1.140748 1.00086647,1.140748 H 15.016254 c 0.550477,0 1.000867,-0.513336 1.000867,-1.140748 V 1.1563611 c 0,-0.62741189 -0.45039,-1.14074891 -1.000867,-1.14074891 z"
|
||||
id="path5"
|
||||
style="fill:#ffffff;fill-opacity:0.98113248;stroke-width:0.03339129" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 13.014522,4.0082334 c 0,0.9450393 -0.672145,1.7111234 -1.5013,1.7111234 -0.829155,0 -1.5013,-0.7660841 -1.5013,-1.7111234 0,-0.9450391 0.672145,-1.7111234 1.5013,-1.7111234 0.829155,0 1.5013,0.7660843 1.5013,1.7111234 z"
|
||||
id="path7"
|
||||
style="fill:#ffffff;fill-opacity:0.98113248;stroke-width:0.03339129" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 14.015388,13.7046 H 2.0049902 v -2.281498 l 3.5030327,-6.844494 4.003466,5.703745 h 1.0008661 l 3.503033,-3.4222472 z"
|
||||
id="path9"
|
||||
style="fill:#ffffff;fill-opacity:0.98113248;stroke-width:0.03339129" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3 KiB |
37
addons/localization_editor/icons/Image.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dl6cg75c815d8"
|
||||
path="res://.godot/imported/Image.svg-be940a3cbeae1918264bdb8c20e813d1.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Image.svg"
|
||||
dest_files=["res://.godot/imported/Image.svg-be940a3cbeae1918264bdb8c20e813d1.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Key.png~
Normal file
|
After Width: | Height: | Size: 504 B |
BIN
addons/localization_editor/icons/Locales.png~
Normal file
|
After Width: | Height: | Size: 566 B |
72
addons/localization_editor/icons/Locales.svg
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Locales.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="-1.4215939"
|
||||
inkscape:cy="8.2723937"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<sodipodi:guide
|
||||
position="6.4965436,7.9991455"
|
||||
orientation="0,1"
|
||||
id="guide1600"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
style="opacity:1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 15.09764,14.092151 c 0,0.707853 0.360297,1.320932 0.88593,1.620813 v 0.247951 c -0.147092,0.02271 -0.297229,0.0346 -0.449886,0.0346 -0.941413,0 -1.790522,-0.443816 -2.390934,-1.155341 -0.362983,0.108621 -0.747532,0.167271 -1.145869,0.167271 -2.2017873,0 -3.986689,-1.783105 -3.986689,-3.982646 0,-2.1995409 1.7849017,-3.9826463 3.986689,-3.9826463 2.201788,0 3.986689,1.7831054 3.986689,3.9826463 0,0.861061 -0.273586,1.658274 -0.738589,2.309717 -0.09446,0.23062 -0.147341,0.487128 -0.147341,0.757635 z M 3.2300131,3.5135582 C 2.3134344,4.3505051 1.8086752,5.4268464 1.8086752,6.5443209 c 0,0.6269246 0.1548719,1.2349004 0.4602965,1.8069702 0.3149485,0.5899295 0.7887832,1.1292358 1.3702585,1.5596417 0.4202081,0.3110202 0.7029308,0.8081662 0.7776259,1.3673852 0.024917,0.186438 0.040531,0.374742 0.04665,0.561989 0.1034047,-0.09636 0.2041794,-0.199848 0.3028776,-0.310771 0.3343559,-0.375738 0.7859869,-0.58324 1.2527894,-0.58324 0.074307,0 0.1489748,0.0053 0.2236422,0.01587 0.2899763,0.04141 0.5861541,0.06248 0.8803108,0.06254 v 1.991323 c -0.375524,-3.1e-5 -0.7440989,-0.02707 -1.1038422,-0.07844 -1.5223893,1.710951 -3.3395445,2.017771 -5.0965394,2.062824 v -0.418737 c 0.9487213,-0.522381 1.7718619,-1.473891 1.7718619,-2.561278 0,-0.151745 -0.010493,-0.300721 -0.029955,-0.446429 -1.602926,-1.186456 -2.62783734,-2.9987153 -2.62783734,-5.0297093 0,-3.5742695 3.17315554,-6.47180017 7.08744764,-6.47180017 3.8546033,0 6.9904383,2.80985027 7.0851773,6.30876057 C 13.64056,6.0963354 13.021184,5.923557 12.378579,5.8744585 12.218973,5.0021967 11.750094,4.1815849 11.018509,3.5135582 10.529558,3.0670973 9.953786,2.7140732 9.3071672,2.4643177 8.6191034,2.1986005 7.8846943,2.0638439 7.124261,2.0638439 c -0.7604333,0 -1.4948423,0.1347566 -2.1829061,0.4004738 C 4.294736,2.7140732 3.718964,3.0670662 3.2300131,3.5135582 Z"
|
||||
id="path5"
|
||||
style="stroke-width:0.02934984;fill:#ffffff;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
37
addons/localization_editor/icons/Locales.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://qd4ukmjjrqhm"
|
||||
path="res://.godot/imported/Locales.svg-c42ca34b34b5efb78d3c4d7520a73237.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Locales.svg"
|
||||
dest_files=["res://.godot/imported/Locales.svg-c42ca34b34b5efb78d3c4d7520a73237.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Localization.png~
Normal file
|
After Width: | Height: | Size: 637 B |
71
addons/localization_editor/icons/Localization.svg
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Localization.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="2.6774157"
|
||||
inkscape:cy="8.360782"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<sodipodi:guide
|
||||
position="6.4965436,7.9991455"
|
||||
orientation="0,1"
|
||||
id="guide1600"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 15.132005,14.076143 c 0,0.710802 0.361295,1.326435 0.888386,1.627565 v 0.248984 c -0.147499,0.0228 -0.298054,0.03475 -0.451134,0.03475 -0.944021,0 -1.795484,-0.445666 -2.39756,-1.160155 -0.363988,0.109073 -0.749603,0.167968 -1.149043,0.167968 -2.2078903,0 -3.9977386,-1.790534 -3.9977386,-3.999237 0,-2.2087041 1.7898483,-3.9992378 3.9977386,-3.9992378 2.207889,0 3.997737,1.7905337 3.997737,3.9992378 0,0.864647 -0.274345,1.665182 -0.740637,2.319339 -0.09472,0.231581 -0.147749,0.489157 -0.147749,0.760792 z M 7.1365293,-0.00189164 c 3.8652847,0 7.0098117,2.82155584 7.1048127,6.33504244 -0.682696,-0.3424348 -1.43788,-0.5236502 -2.218688,-0.5236502 -1.326472,0 -2.579319,0.5224941 -3.527699,1.4712508 -0.9834157,0.9837499 -1.5249982,2.3032171 -1.5249982,3.7152606 0,0.697866 0.1324806,1.372988 0.3850044,1.996307 -0.072571,0.002 -0.1453066,0.0033 -0.2184319,0.0033 -0.3769534,0 -0.7469385,-0.02709 -1.1080397,-0.07879 -1.5266084,1.718079 -3.3487994,2.026176 -5.11066363,2.071418 V 14.567769 C 1.8691765,14.043212 2.6945984,13.087738 2.6945984,11.995821 c 0,-0.152378 -0.010522,-0.301974 -0.030039,-0.44829 C 1.0571911,10.356134 0.02943929,8.5363245 0.02943929,6.4968695 c 0,-3.5891596 3.18194941,-6.49876114 7.10709001,-6.49876114 z"
|
||||
id="path5"
|
||||
style="stroke-width:0.02945165;fill:#ffffff;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.2 KiB |
37
addons/localization_editor/icons/Localization.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://clg02fkdtojbl"
|
||||
path="res://.godot/imported/Localization.svg-09927188701e584c73c7d36976561499.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Localization.svg"
|
||||
dest_files=["res://.godot/imported/Localization.svg-09927188701e584c73c7d36976561499.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Microsoft.png
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
34
addons/localization_editor/icons/Microsoft.png.import
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dekewvpr4ic2c"
|
||||
path="res://.godot/imported/Microsoft.png-019b5f5d5880dc619456a7451b962568.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Microsoft.png"
|
||||
dest_files=["res://.godot/imported/Microsoft.png-019b5f5d5880dc619456a7451b962568.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
addons/localization_editor/icons/Open.png~
Normal file
|
After Width: | Height: | Size: 520 B |
68
addons/localization_editor/icons/Open.svg
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Open.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="2.6774157"
|
||||
inkscape:cy="5.7091316"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true" />
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 12.97947,4.8441654 -1.086218,1.1562661 c 0.01973,0.013099 0.03962,0.026139 0.05929,0.039474 0.942144,0.6396955 1.740496,1.4965347 2.340153,2.505438 -0.599657,1.0089031 -1.39804,1.8657425 -2.340184,2.5054375 -1.183811,0.803796 -2.550877,1.228648 -3.9533658,1.228648 -0.6054829,0 -1.2042945,-0.07935 -1.7846585,-0.234047 l -1.2041684,1.281825 c 0.9351909,0.357773 1.9410716,0.552545 2.9888275,0.552545 3.4970612,0 6.5283282,-2.167803 8.0179802,-5.3344079 C 15.312076,7.0464423 14.261345,5.7715188 12.97947,4.8441654 Z"
|
||||
id="path9"
|
||||
style="stroke-width:0.03231437;fill:#ffffff;fill-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 8.0078172,3.2109366 c -3.5020053,0 -6.5374175,2.1678036 -8.02902921,5.3344075 1.49161171,3.1666039 4.52702391,5.3344079 8.02902921,5.3344079 3.5019118,0 6.5373218,-2.167804 8.0290288,-5.3344079 C 14.545265,5.3787402 11.509729,3.2109366 8.0078172,3.2109366 Z m 3.9588438,2.8289702 c 0.943443,0.6396953 1.742896,1.4965345 2.34338,2.5054373 -0.600484,1.0089035 -1.399968,1.8657439 -2.343411,2.5054389 -1.185442,0.803793 -2.5543913,1.228647 -3.9588128,1.228647 -1.4044528,0 -2.7734337,-0.424854 -3.9588759,-1.228647 C 3.1055617,10.411121 2.3061087,9.5542813 1.7055939,8.5453441 2.3060774,7.5364081 3.1055617,6.6795688 4.0489726,6.0399068 4.1104136,5.9982316 4.1724817,5.957857 4.2349576,5.9182154 4.0787679,6.3737739 3.9933025,6.8654396 3.9933025,7.3784429 c 0,2.3568405 1.7973736,4.2675261 4.0145147,4.2675261 2.2171418,0 4.0145148,-1.9106856 4.0145148,-4.2675261 0,-0.5130033 -0.0855,-1.004669 -0.241624,-1.4602608 0.06238,0.039642 0.124483,0.08005 0.185953,0.1217247 z M 8.0078172,6.9450224 c 0,0.8838445 -0.6739993,1.6003217 -1.5054429,1.6003217 -0.8314437,0 -1.505443,-0.7164772 -1.505443,-1.6003217 0,-0.8838446 0.6739993,-1.6003224 1.505443,-1.6003224 0.8314436,0 1.5054429,0.7165111 1.5054429,1.6003224 z"
|
||||
id="path5-3"
|
||||
style="stroke-width:0.03233662;fill:#ffffff;fill-opacity:1;opacity:0.99" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.6 KiB |
37
addons/localization_editor/icons/Open.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cjfgah3watau4"
|
||||
path="res://.godot/imported/Open.svg-f6776ec38e2e97e0e3cfda36e50b55b4.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Open.svg"
|
||||
dest_files=["res://.godot/imported/Open.svg-f6776ec38e2e97e0e3cfda36e50b55b4.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Placeholders.png~
Normal file
|
After Width: | Height: | Size: 526 B |
71
addons/localization_editor/icons/Placeholders.svg
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Placeholders.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="2.6774157"
|
||||
inkscape:cy="8.360782"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<sodipodi:guide
|
||||
position="6.4965436,7.9991455"
|
||||
orientation="0,1"
|
||||
id="guide1600"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 14.015388,8.0008545 H 11.513222 L 8.0101892,11.993477 4.5071565,8.0008545 H 2.0049903 L 0.00325731,12.563852 v 1.140749 H 16.017121 V 12.563852 Z M 0.00325731,14.84535 H 16.017121 V 15.9861 H 0.00325731 Z M 9.011056,4.5786065 V 0.01560935 H 7.009323 V 4.5786065 H 3.50629 l 4.5038992,5.133372 4.5038988,-5.133372 z"
|
||||
id="path5"
|
||||
style="stroke-width:0.03339129;fill:#ffffff;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
37
addons/localization_editor/icons/Placeholders.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://buvf2n266m3jc"
|
||||
path="res://.godot/imported/Placeholders.svg-6ad403fcc17e13a0813169b055c598b7.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Placeholders.svg"
|
||||
dest_files=["res://.godot/imported/Placeholders.svg-6ad403fcc17e13a0813169b055c598b7.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Play.png~
Normal file
|
After Width: | Height: | Size: 527 B |
76
addons/localization_editor/icons/Pseudolocalization.svg
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="at.svg"
|
||||
enable-background="new">
|
||||
<defs
|
||||
id="defs820">
|
||||
<filter
|
||||
inkscape:collect="always"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter824">
|
||||
<feBlend
|
||||
inkscape:collect="always"
|
||||
mode="darken"
|
||||
in2="BackgroundImage"
|
||||
id="feBlend826" />
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="2.6008748"
|
||||
inkscape:cy="6.9477747"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1043"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true" />
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
style="filter:url(#filter824);opacity:1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 8.0101947,0.02706915 c -4.402638,0 -7.98483432,3.58219645 -7.98483432,7.98483455 0,4.4026383 3.58219632,7.9848353 7.98483432,7.9848353 1.6129365,0 3.1659863,-0.478092 4.4904713,-1.381376 0.455135,-0.311409 0.572912,-0.932231 0.262501,-1.387366 -0.31041,-0.456134 -0.930233,-0.570916 -1.387365,-0.262502 -0.992115,0.677713 -2.155905,1.035035 -3.3656073,1.035035 -3.3027271,0 -5.9886258,-2.685899 -5.9886258,-5.9886263 0,-3.3027272 2.6858987,-5.9886259 5.9886258,-5.9886259 3.3027273,0 5.9886253,2.6858987 5.9886253,5.9886259 v 0.4990522 c 0,0.5509534 -0.44715,0.9981042 -0.998104,0.9981042 -0.550954,0 -0.998104,-0.4471508 -0.998104,-0.9981042 v -2.994313 c 0,-0.5519517 -0.446153,-0.9981043 -0.998104,-0.9981043 -0.440164,0 -0.803474,0.2894503 -0.936222,0.6866957 C 9.4893852,4.7790437 8.7817293,4.5185386 8.0101947,4.5185386 c -1.9263413,0 -3.493365,1.5670237 -3.493365,3.4933651 0,1.9263413 1.5670237,3.4933653 3.493365,3.4933653 1.0430189,0 1.9712559,-0.469109 2.6110403,-1.196727 0.546962,0.721629 1.405331,1.196727 2.379481,1.196727 1.650866,0 2.994315,-1.343449 2.994315,-2.9943131 V 8.0119037 c 0,-4.4026381 -3.582198,-7.98483455 -7.9848363,-7.98483455 z m 0,9.48199095 c -0.8254323,0 -1.4971564,-0.6717241 -1.4971564,-1.4971564 0,-0.8254323 0.6717241,-1.4971565 1.4971564,-1.4971565 0.8254322,0 1.4971564,0.6717242 1.4971564,1.4971565 0,0.8254323 -0.6717242,1.4971564 -1.4971564,1.4971564 z"
|
||||
id="path5-3"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.03119076" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b6trurx65v5k8"
|
||||
path="res://.godot/imported/Pseudolocalization.svg-2e6bb74d60c4d5a7d7fcd47b4487afaf.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Pseudolocalization.svg"
|
||||
dest_files=["res://.godot/imported/Pseudolocalization.svg-2e6bb74d60c4d5a7d7fcd47b4487afaf.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Put.png~
Normal file
|
After Width: | Height: | Size: 535 B |
71
addons/localization_editor/icons/Put.svg
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Put.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="2.6774157"
|
||||
inkscape:cy="8.360782"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<sodipodi:guide
|
||||
position="6.4965436,7.9991455"
|
||||
orientation="0,1"
|
||||
id="guide1600"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 12.282872,6.8790437 8.0212389,11.454666 3.7596053,6.8790437 h 2.663521 V 0.01560971 H 9.6193515 V 6.8790437 Z M 8.0212389,11.454666 H 0.03067592 v 4.575623 H 16.011802 v -4.575623 z m 6.9251541,2.287812 h -2.130816 v -1.143906 h 2.130816 z"
|
||||
id="path5"
|
||||
style="stroke-width:0.03449874;fill:#fffffe;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
37
addons/localization_editor/icons/Put.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://w65ag0ox36ji"
|
||||
path="res://.godot/imported/Put.svg-7dd4cc3529f701294192866bf058aa82.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Put.svg"
|
||||
dest_files=["res://.godot/imported/Put.svg-7dd4cc3529f701294192866bf058aa82.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Remaps.png~
Normal file
|
After Width: | Height: | Size: 502 B |
73
addons/localization_editor/icons/Remaps.svg
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Remaps.svg"
|
||||
enable-background="new">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="2.6774157"
|
||||
inkscape:cy="8.360782"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<sodipodi:guide
|
||||
position="6.4965436,7.9991455"
|
||||
orientation="0,1"
|
||||
id="guide1600"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
style="">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 12.427791,10.852728 h -1.64007 L 8.2021334,8.0008545 10.787721,5.1489809 h 1.64007 V 8.0008545 L 16.047613,4.0082315 12.427791,0.01560853 V 2.8674821 h -2.06847 c -0.274299,0 -0.5373496,0.1202065 -0.7313009,0.3341327 L 6.7394991,6.3875853 3.850978,3.2015791 C 3.6570589,2.9876886 3.3939754,2.8674821 3.1196771,2.8674821 H 0.01697244 V 5.1489809 H 2.6912777 L 5.2768646,8.0008545 2.6912777,10.852728 H 0.01697244 v 2.281499 H 3.1196771 c 0.2742984,0 0.5373495,-0.120171 0.7313009,-0.334133 l 2.8885211,-3.1859703 2.888521,3.1859703 c 0.1939513,0.213962 0.4570019,0.334133 0.7313009,0.334133 h 2.06847 v 2.851874 l 3.619822,-3.992623 -3.619822,-3.9926235 z"
|
||||
id="path5"
|
||||
style="stroke-width:0.03394336;fill:#ffffff;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
37
addons/localization_editor/icons/Remaps.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://c7yf5nsn3kcsk"
|
||||
path="res://.godot/imported/Remaps.svg-e587b65fce326a6c6f24b4f174e8e8ed.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Remaps.svg"
|
||||
dest_files=["res://.godot/imported/Remaps.svg-e587b65fce326a6c6f24b4f174e8e8ed.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Save.png~
Normal file
|
After Width: | Height: | Size: 526 B |
63
addons/localization_editor/icons/Save.svg
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Save.svg">
|
||||
<defs
|
||||
id="defs816" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="7.8758433"
|
||||
inkscape:cy="8.0527587"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true" />
|
||||
<metadata
|
||||
id="metadata819">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 14.026245,-0.00590526 H 0.03059479 V 16.011221 H 16.025624 V 1.9962355 Z M 8.0281093,1.9962355 H 10.027488 V 6.000517 H 8.0281093 Z M 14.026245,14.00908 H 2.0299734 V 1.9962355 H 3.0296627 V 7.0015872 H 12.026866 V 1.9962355 h 1.171168 l 0.828211,0.829293 z"
|
||||
id="path5"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke-width:0.03126186" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2 KiB |
37
addons/localization_editor/icons/Save.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://drjyfbi5n382s"
|
||||
path="res://.godot/imported/Save.svg-2fa13384d35ab37a9884d3cef8173037.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Save.svg"
|
||||
dest_files=["res://.godot/imported/Save.svg-2fa13384d35ab37a9884d3cef8173037.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Text.png~
Normal file
|
After Width: | Height: | Size: 507 B |
BIN
addons/localization_editor/icons/Translate.png~
Normal file
|
After Width: | Height: | Size: 531 B |
BIN
addons/localization_editor/icons/Translation.png~
Normal file
|
After Width: | Height: | Size: 610 B |
71
addons/localization_editor/icons/Translation.svg
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Translation.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="2.6774157"
|
||||
inkscape:cy="8.360782"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<sodipodi:guide
|
||||
position="6.4965436,7.9991455"
|
||||
orientation="0,1"
|
||||
id="guide1600"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 8.0212431,0.00497579 c -4.4160077,0 -7.99588326,3.58482231 -7.99588326,8.00693191 0,4.4221093 3.57987556,8.0069323 7.99588326,8.0069323 4.4160079,0 7.9958839,-3.584823 7.9958839,-8.0069323 0,-4.4221096 -3.579876,-8.00693191 -7.9958839,-8.00693191 z m 0,15.01302821 c -0.9832125,0 -1.918887,-0.203488 -2.7677937,-0.570056 l 3.6410629,-4.101832 c 0.081302,-0.09161 0.1262163,-0.2099 0.1262163,-0.332475 v -1.5013 c 0,-0.2763956 -0.2237286,-0.5004333 -0.4997427,-0.5004333 -1.7645603,0 -3.6263206,-1.836934 -3.6445924,-1.8551373 C 4.7826917,6.0629079 4.6555697,6.0101748 4.5230441,6.0101748 H 2.5240734 c -0.2759829,0 -0.4997427,0.2240689 -0.4997427,0.5004332 v 3.0025995 c 0,0.1895703 0.1069449,0.3628454 0.276264,0.4476062 l 1.7227067,0.8625593 v 2.938263 C 2.2109221,12.495602 1.0248453,10.392594 1.0248453,8.0119077 c 0,-1.0745865 0.2419067,-2.0925303 0.6736844,-3.0025994 h 1.825029 c 0.1325568,0 0.2596476,-0.052733 0.3533806,-0.1465644 L 5.8759101,2.8610109 C 5.9696119,2.7671484 6.0222723,2.6398819 6.0222723,2.507142 V 1.2965314 C 6.6557274,1.1077117 7.3265695,1.0058423 8.0212431,1.0058423 c 1.0995277,0 2.1395859,0.2542826 3.0653279,0.7068619 -0.06472,0.054766 -0.127684,0.1120345 -0.188122,0.172587 -0.566364,0.5671159 -0.878235,1.3211125 -0.878235,2.1231506 0,0.8020381 0.311871,1.5560346 0.878235,2.1231506 0.568989,0.5697432 1.330846,0.8798867 2.118191,0.8798242 0.04944,0 0.09904,-0.00125 0.148642,-0.00369 0.215733,0.8101076 0.605189,2.9190271 -0.131245,5.8227604 -0.0069,0.02727 -0.01093,0.05455 -0.01312,0.08169 C 11.750883,14.211427 9.980295,15.018 8.0212724,15.018 Z"
|
||||
id="path5"
|
||||
style="stroke-width:0.03125549;fill:#ffffff;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.5 KiB |
37
addons/localization_editor/icons/Translation.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cvuknftmrxe5d"
|
||||
path="res://.godot/imported/Translation.svg-9f5ec28f107710bd150b4822f6a76196.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Translation.svg"
|
||||
dest_files=["res://.godot/imported/Translation.svg-9f5ec28f107710bd150b4822f6a76196.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Trash.png~
Normal file
|
After Width: | Height: | Size: 504 B |
BIN
addons/localization_editor/icons/Up.png~
Normal file
|
After Width: | Height: | Size: 512 B |
71
addons/localization_editor/icons/Video.svg
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="16px"
|
||||
height="16px"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="SVGRoot"
|
||||
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||
sodipodi:docname="Video.svg">
|
||||
<defs
|
||||
id="defs820" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="45.254834"
|
||||
inkscape:cx="2.6774157"
|
||||
inkscape:cy="5.7091315"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
<sodipodi:guide
|
||||
position="6.4965436,7.9991455"
|
||||
orientation="0,1"
|
||||
id="guide1600"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata823">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="M 0.02536228,2.240853 V 13.760854 H 16.017129 V 2.240853 Z M 3.0238187,12.800856 h -1.998971 v -1.920001 h 1.998971 z m 0,-3.8400012 H 1.0248477 V 7.0408542 h 1.998971 z m 0,-3.8400011 H 1.0248477 V 3.2008533 h 1.998971 z M 12.019187,12.800856 H 4.0233041 V 3.2008533 h 7.9958829 z m 2.998456,0 h -1.99897 v -1.920001 h 1.99897 z m 0,-3.8400012 h -1.99897 V 7.0408542 h 1.99897 z m 0,-3.8400011 h -1.99897 V 3.2008533 h 1.99897 z m -8.9953681,0 V 10.880855 L 10.020216,8.0008545 Z"
|
||||
id="path5"
|
||||
style="stroke-width:0.1;stroke-miterlimit:4;stroke-dasharray:none;fill:#ffffff;fill-opacity:0.96226418" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
37
addons/localization_editor/icons/Video.svg.import
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://oxmydroedm6f"
|
||||
path="res://.godot/imported/Video.svg-189a93107ba78c30682280af0f6afe60.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Video.svg"
|
||||
dest_files=["res://.godot/imported/Video.svg-189a93107ba78c30682280af0f6afe60.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
BIN
addons/localization_editor/icons/Yandex.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
34
addons/localization_editor/icons/Yandex.png.import
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://chlw8bdg84q1m"
|
||||
path="res://.godot/imported/Yandex.png-1d69d5125cb5731efa2a1f87a01017ad.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/localization_editor/icons/Yandex.png"
|
||||
dest_files=["res://.godot/imported/Yandex.png-1d69d5125cb5731efa2a1f87a01017ad.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
BIN
addons/localization_editor/icons/yandex.png~
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
844
addons/localization_editor/model/LocalizationData.gd
Normal file
|
|
@ -0,0 +1,844 @@
|
|||
# Localization data for LocalizationEditor : MIT License
|
||||
# @author Vladimir Petrenko
|
||||
extends Resource
|
||||
class_name LocalizationData
|
||||
|
||||
signal data_changed
|
||||
|
||||
var _editor
|
||||
var _undo_redo
|
||||
|
||||
@export var data: Dictionary = {"locales": [], "keys": []}
|
||||
var data_filter: Dictionary = {}
|
||||
|
||||
var _locales_filter: String
|
||||
|
||||
func locales_filter() -> String:
|
||||
return _locales_filter
|
||||
|
||||
func set_locales_filter(text):
|
||||
_locales_filter = text
|
||||
emit_signal("data_changed")
|
||||
|
||||
var _locales_selected: bool
|
||||
|
||||
func locales_selected() -> bool:
|
||||
return _locales_selected
|
||||
|
||||
func set_locales_selected(value):
|
||||
_locales_selected = value
|
||||
emit_signal("data_changed")
|
||||
|
||||
var data_remaps: Dictionary = {"remapkeys": []}
|
||||
var data_filter_remaps: Dictionary = {}
|
||||
|
||||
var data_placeholders: Dictionary = {}
|
||||
var data_filter_placeholders: Dictionary = {}
|
||||
|
||||
const uuid_gen = preload("res://addons/localization_editor/uuid/uuid.gd")
|
||||
|
||||
const default_path = "res://localization/"
|
||||
const default_path_to_file = default_path + "localizations.csv"
|
||||
const default_path_to_placeholders = default_path + "Placeholders.tres"
|
||||
const AUTHOR = "# @author Vladimir Petrenko\n"
|
||||
const SETTINGS_PATH_TO_FILE = "localization_editor/locales_path_to_file"
|
||||
const SETTINGS_LOCALES_VISIBILITY = "localization_editor/locales_visibility"
|
||||
const SETTINGS_TRANSLATIONS_SPLIT_OFFSET = "localization_editor/translations_split_offset"
|
||||
const SETTINGS_PLACEHOLDERS_SPLIT_OFFSET = "localization_editor/placeholders_split_offset"
|
||||
|
||||
func set_editor(editor) -> void:
|
||||
_editor = editor
|
||||
if _editor:
|
||||
_undo_redo = _editor.get_undo_redo()
|
||||
|
||||
func editor():
|
||||
return _editor
|
||||
|
||||
func undo_redo():
|
||||
return _undo_redo
|
||||
|
||||
func emit_signal_data_changed() -> void:
|
||||
emit_signal("data_changed")
|
||||
|
||||
func init_data_translations() -> void:
|
||||
_init_data_translations_csv()
|
||||
|
||||
func _init_data_translations_csv() -> void:
|
||||
var path = setting_path_to_file()
|
||||
if FileAccess.file_exists(path):
|
||||
var file = FileAccess.open(path, FileAccess.READ)
|
||||
var locales_line = file.get_csv_line()
|
||||
var size = locales_line.size()
|
||||
if size > 1:
|
||||
for index in range(1, size):
|
||||
add_locale(locales_line[index])
|
||||
data.keys.clear()
|
||||
while !file.eof_reached():
|
||||
var values_line = file.get_csv_line()
|
||||
if values_line.size() > 1:
|
||||
var key = {"uuid": uuid(), "value": values_line[0], "translations": []}
|
||||
for index in range(1, values_line.size()):
|
||||
var translation = {"locale": locales_line[index], "value": values_line[index]}
|
||||
key.translations.append(translation)
|
||||
data.keys.append(key)
|
||||
|
||||
func save_data_translations(update_script_classes = false) -> void:
|
||||
_save_data_translations_csv()
|
||||
_save_data_translations_keys()
|
||||
_save_data_translations_placeholders()
|
||||
_save_data_placeholders()
|
||||
_save_data_translations_to_project_settings()
|
||||
_save_data_remaps_keys()
|
||||
ProjectSettings.save()
|
||||
if update_script_classes:
|
||||
_editor.get_editor_interface().get_resource_filesystem().scan()
|
||||
|
||||
func _save_data_translations_csv() -> void:
|
||||
var path = setting_path_to_file()
|
||||
var path_directory = file_path(path)
|
||||
var directory:= DirAccess.open(path_directory)
|
||||
if not directory:
|
||||
directory.make_dir(path_directory)
|
||||
var file = FileAccess.open(setting_path_to_file(), FileAccess.WRITE)
|
||||
var locales_line: Array = ["keys"]
|
||||
var locales = data.locales
|
||||
if locales.size() <= 0:
|
||||
add_locale(OS.get_locale())
|
||||
data.keys[0].value = "KEY"
|
||||
locales_line.append_array(data.locales)
|
||||
file.store_csv_line(locales_line)
|
||||
for key in data.keys:
|
||||
var values_line: Array[String] = [key.value]
|
||||
for translation in key.translations:
|
||||
values_line.append(translation.value)
|
||||
file.store_csv_line(values_line)
|
||||
|
||||
func _save_data_translations_keys() -> void:
|
||||
var file = FileAccess.open(default_path + "LocalizationKeys.gd", FileAccess.WRITE)
|
||||
var source_code = "# Keys for LocalizationManger to use in source code: MIT License\n"
|
||||
source_code += AUTHOR
|
||||
source_code += "@tool\n"
|
||||
source_code += "class_name LocalizationKeys\n\n"
|
||||
for key in data.keys:
|
||||
source_code += "const " + key.value.replace(" ", "_") + " = \"" + key.value +"\"\n"
|
||||
source_code += "\nconst KEYS = [\n"
|
||||
for index in range(data.keys.size()):
|
||||
source_code += " \"" + data.keys[index].value + "\",\n"
|
||||
source_code = source_code.substr(0, source_code.rfind(",\n"))
|
||||
source_code += "\n]"
|
||||
file.store_string(source_code)
|
||||
|
||||
func _save_data_translations_placeholders() -> void:
|
||||
var placeholders = {}
|
||||
var regex = RegEx.new()
|
||||
regex.compile("{{(.+?)}}")
|
||||
for key in data.keys:
|
||||
var results = regex.search_all(key.translations[0].value)
|
||||
for result in results:
|
||||
var name = result.get_string()
|
||||
var clean_name = name.replace("{{", "");
|
||||
clean_name = clean_name.replace("}}", "");
|
||||
if not placeholders.has(clean_name):
|
||||
placeholders[clean_name] = name
|
||||
var file = FileAccess.open(default_path + "LocalizationPlaceholders.gd", FileAccess.WRITE)
|
||||
var source_code = "# Placeholders for LocalizationManger to use in source code: MIT License\n"
|
||||
source_code += AUTHOR
|
||||
source_code += "@tool\n"
|
||||
source_code += "class_name LocalizationPlaceholders\n\n"
|
||||
for placeholder_key in placeholders.keys():
|
||||
source_code += "const " + placeholder_key + " = \"" + placeholders[placeholder_key] +"\"\n"
|
||||
source_code += "\nconst PLACEHOLDERS = [\n"
|
||||
var count = 0
|
||||
for placeholder_key in placeholders.keys():
|
||||
source_code += " \"" + placeholder_key + "\""
|
||||
if count != placeholders.size() - 1:
|
||||
source_code += ",\n"
|
||||
count += 1
|
||||
source_code += "\n]"
|
||||
file.store_string(source_code)
|
||||
|
||||
func _save_data_placeholders() -> void:
|
||||
var placeholders_data = LocalizationPlaceholdersData.new()
|
||||
placeholders_data.placeholders = data_placeholders
|
||||
ResourceSaver.save(placeholders_data, default_path_to_placeholders)
|
||||
|
||||
func _save_data_translations_to_project_settings() -> void:
|
||||
var file = setting_path_to_file()
|
||||
file = file_path_without_extension(file)
|
||||
var translations: PackedStringArray = []
|
||||
for locale in data.locales:
|
||||
var entry = file + "." + locale + ".translation"
|
||||
translations.append(entry)
|
||||
ProjectSettings.set_setting("internationalization/locale/translations", translations)
|
||||
|
||||
func _save_data_remaps_keys() -> void:
|
||||
var internationalization_path = "internationalization/locale/translation_remaps"
|
||||
var file = FileAccess.open(default_path + "LocalizationRemaps.gd", FileAccess.WRITE)
|
||||
var source_code = "# Remapkeys for LocalizationManger to use in source code: MIT License\n"
|
||||
source_code += AUTHOR
|
||||
source_code += "@tool\n"
|
||||
source_code += "class_name LocalizationRemaps\n\n"
|
||||
if ProjectSettings.has_setting(internationalization_path):
|
||||
var settings_remaps = ProjectSettings.get_setting(internationalization_path)
|
||||
if settings_remaps.size():
|
||||
var keys = settings_remaps.keys();
|
||||
for key in keys:
|
||||
var filename = key.get_file()
|
||||
source_code += "const " + filename.replace(".", "_").to_upper() + " = \"" + filename.replace(".", "_").to_upper() +"\"\n"
|
||||
file.store_string(source_code)
|
||||
|
||||
# ***** UUID ****
|
||||
static func uuid() -> String:
|
||||
return uuid_gen.v4()
|
||||
|
||||
# ***** LOCALES *****
|
||||
func locales() -> Array:
|
||||
return data.locales
|
||||
|
||||
func check_locale(locale: String) -> void:
|
||||
if find_locale(locale) != null:
|
||||
add_locale(locale)
|
||||
|
||||
func find_locale(code: String) -> Variant:
|
||||
if data.has("locales"):
|
||||
for locale in data.locales:
|
||||
if locale == code:
|
||||
return locale
|
||||
return null
|
||||
|
||||
func add_locale(locale: String, sendSignal = true) -> void:
|
||||
if not data.locales.has(locale):
|
||||
if _undo_redo != null:
|
||||
_undo_redo.create_action("Add locale " + locale)
|
||||
_undo_redo.add_do_method(self, "_add_locale", locale, sendSignal)
|
||||
_undo_redo.add_undo_method(self, "_del_locale", locale)
|
||||
_undo_redo.commit_action()
|
||||
else:
|
||||
_add_locale(locale, sendSignal)
|
||||
|
||||
func _add_locale(locale, sendSignal: bool) -> void:
|
||||
data.locales.append(locale)
|
||||
if data.keys.size() <= 0:
|
||||
_add_key(uuid())
|
||||
for key in data.keys:
|
||||
if not key_has_locale(key, locale):
|
||||
key.translations.append({"locale": locale, "value": ""})
|
||||
if data_remaps.remapkeys.size() <= 0:
|
||||
_add_remapkey(uuid())
|
||||
for remapkey in data_remaps.remapkeys:
|
||||
if not remapkey_has_locale(remapkey, locale):
|
||||
remapkey.remaps.append({"locale": locale, "value": ""})
|
||||
if sendSignal:
|
||||
emit_signal("data_changed")
|
||||
|
||||
func del_locale(locale: String) -> void:
|
||||
if data.locales.has(locale):
|
||||
if _undo_redo != null:
|
||||
_undo_redo.create_action("Del locale " + locale)
|
||||
_undo_redo.add_do_method(self, "_del_locale", locale)
|
||||
_undo_redo.add_undo_method(self, "_add_locale", locale)
|
||||
_undo_redo.commit_action()
|
||||
else:
|
||||
_del_locale(locale)
|
||||
|
||||
func _del_locale(locale: String) -> void:
|
||||
data.locales.erase(locale)
|
||||
setting_locales_visibility_del(locale)
|
||||
for key in data.keys:
|
||||
for translation in key.translations:
|
||||
if translation.locale == locale:
|
||||
var t = key.translations.find(translation)
|
||||
key.translations.remove_at(t)
|
||||
break
|
||||
for remapkey in data_remaps.remapkeys:
|
||||
for remap in remapkey.remaps:
|
||||
if remap.locale == locale:
|
||||
var r = remapkey.remaps.find(remap)
|
||||
remapkey.remaps.remove_at(r)
|
||||
break
|
||||
emit_signal("data_changed")
|
||||
|
||||
# ***** KEYS *****
|
||||
signal data_key_value_changed
|
||||
|
||||
func emit_data_key_value_changed() -> void:
|
||||
emit_signal("data_key_value_changed")
|
||||
|
||||
func keys() -> Array:
|
||||
return data.keys
|
||||
|
||||
func keys_filtered() -> Array:
|
||||
var keys = _filter_by_keys()
|
||||
for filter_key in data_filter.keys():
|
||||
if filter_key != "keys":
|
||||
keys = _key_filter_by_translations(keys, filter_key)
|
||||
return keys
|
||||
|
||||
func _filter_by_keys() -> Array:
|
||||
var keys = []
|
||||
for key in data.keys:
|
||||
if not data_filter.has("keys") or data_filter["keys"] == "" or key.value == null or key.value == "" or data_filter["keys"] in key.value:
|
||||
keys.append(key)
|
||||
return keys
|
||||
|
||||
func _key_filter_by_translations(keys, locale) -> Array:
|
||||
var new_keys = []
|
||||
for key in keys:
|
||||
var value = translation_value_by_locale(key, locale)
|
||||
if data_filter[locale] == "" or value == null or value == "" or data_filter[locale] in value:
|
||||
new_keys.append(key)
|
||||
return new_keys
|
||||
|
||||
func translation_value_by_locale(key, locale) -> String:
|
||||
var translation = translation_by_locale(key, locale)
|
||||
if translation != null and translation.value != null:
|
||||
return translation.value
|
||||
return ""
|
||||
|
||||
func translation_by_locale(key, locale):
|
||||
for translation in key.translations:
|
||||
if translation.locale == locale:
|
||||
return translation
|
||||
return null
|
||||
|
||||
func add_key_object(key) -> void:
|
||||
data.keys.append(key)
|
||||
|
||||
func _add_key(uuid: String, emitSignal = true) -> void:
|
||||
data.keys.append(_create_key(uuid))
|
||||
if emitSignal:
|
||||
emit_signal("data_changed")
|
||||
|
||||
func add_key_new_after_uuid(after_uuid: String, uuid = uuid()) -> void:
|
||||
if _undo_redo != null:
|
||||
_undo_redo.create_action("Add new key " + uuid + " after " + after_uuid)
|
||||
_undo_redo.add_do_method(self, "_add_key_new_after_uuid", after_uuid, uuid)
|
||||
_undo_redo.add_undo_method(self, "_del_key", uuid)
|
||||
_undo_redo.commit_action()
|
||||
else:
|
||||
_add_key_new_after_uuid(after_uuid, uuid)
|
||||
|
||||
func _add_key_after_uuid(after_uuid: String, key) -> void:
|
||||
var position = _key_position(after_uuid)
|
||||
if position != -1 and position < data.keys.size():
|
||||
data.keys.insert(position + 1, key)
|
||||
emit_signal("data_changed")
|
||||
else:
|
||||
data.keys.append(key)
|
||||
|
||||
func _add_key_new_after_uuid(after_uuid: String, uuid = uuid()) -> void:
|
||||
var position = _key_position(after_uuid)
|
||||
if position != -1 and position < data.keys.size():
|
||||
var key = _create_key(uuid)
|
||||
data.keys.insert(position + 1, key)
|
||||
emit_signal("data_changed")
|
||||
else:
|
||||
_add_key(uuid)
|
||||
|
||||
func _create_key(uuid: String):
|
||||
var key = {"uuid": uuid, "value": "", "translations": []}
|
||||
for locale in data.locales:
|
||||
var translation = {"locale": locale, "value": ""}
|
||||
key.translations.append(translation)
|
||||
return key
|
||||
|
||||
func del_key(uuid: String, emitSignal = true) -> void:
|
||||
if _undo_redo != null:
|
||||
var before_uuid = before_uuid(uuid)
|
||||
var key = key(uuid)
|
||||
_undo_redo.create_action("Del key " + uuid)
|
||||
_undo_redo.add_do_method(self, "_del_key", uuid)
|
||||
_undo_redo.add_undo_method(self, "_add_key_after_uuid", before_uuid, key)
|
||||
_undo_redo.commit_action()
|
||||
else:
|
||||
_del_key(uuid)
|
||||
|
||||
func _del_key(uuid: String, emitSignal = true) -> void:
|
||||
data.keys.remove_at(_key_position(uuid))
|
||||
if emitSignal:
|
||||
emit_signal("data_changed")
|
||||
|
||||
func after_uuid(uuid: String):
|
||||
var position = _key_position(uuid)
|
||||
if position != -1 and position < data.keys.size():
|
||||
return data.keys[position + 1].uuid
|
||||
else:
|
||||
return null
|
||||
|
||||
func before_uuid(uuid: String):
|
||||
var position = _key_position(uuid)
|
||||
if position > 0:
|
||||
return data.keys[position - 1].uuid
|
||||
else:
|
||||
return null
|
||||
|
||||
func _key_position(uuid: String) -> int:
|
||||
for index in range(data.keys.size()):
|
||||
if data.keys[index].uuid == uuid:
|
||||
return index
|
||||
return -1
|
||||
|
||||
func key_has_locale(key, locale: String) -> bool:
|
||||
for translation in key.translations:
|
||||
if translation.locale == locale:
|
||||
return true
|
||||
return false
|
||||
|
||||
func key_value(uuid: String):
|
||||
var key = key(uuid)
|
||||
if key != FAILED:
|
||||
return key.value
|
||||
else:
|
||||
return ""
|
||||
|
||||
func key_value_change(key, key_value: String):
|
||||
if _undo_redo != null:
|
||||
_undo_redo.create_action("Change key value ")
|
||||
_undo_redo.add_do_method(self, "_key_value_change", key, key_value)
|
||||
_undo_redo.add_undo_method(self, "_key_value_change", key, "" + key.value)
|
||||
_undo_redo.commit_action()
|
||||
else:
|
||||
_key_value_change(key, key_value)
|
||||
|
||||
func _key_value_change(key, key_value: String):
|
||||
key.value = key_value
|
||||
emit_data_key_value_changed()
|
||||
|
||||
func key(uuid: String):
|
||||
for key in data.keys:
|
||||
if key.uuid == uuid:
|
||||
return key
|
||||
return FAILED
|
||||
|
||||
func is_key_value_double(value: String) -> bool:
|
||||
var count = 0
|
||||
for key in data.keys:
|
||||
if key.value != null and !key.value.length() <= 0 and key.value == value:
|
||||
count = count + 1
|
||||
if count > 1:
|
||||
return true
|
||||
return false
|
||||
|
||||
# ***** TRANSLATIONS *****
|
||||
func get_translations_by_locale(locale: String) -> Array:
|
||||
var translations = []
|
||||
for key in data.keys:
|
||||
for translation in key.translations:
|
||||
if translation.locale == locale:
|
||||
translations.append(translation)
|
||||
break
|
||||
return translations
|
||||
|
||||
func key_by_translation(translation):
|
||||
for key in data.keys:
|
||||
for translation_obj in key.translations:
|
||||
if translation == translation_obj:
|
||||
return key
|
||||
return null
|
||||
|
||||
func get_translations() -> Array:
|
||||
var translations = {}
|
||||
for locale in data.locales:
|
||||
var translation_for_server = Translation.new()
|
||||
translation_for_server.set_locale(locale)
|
||||
translations[locale] = translation_for_server
|
||||
for key in data.keys:
|
||||
for translation in key.translations:
|
||||
translations[translation.locale].add_message(key.value, str(translation.value))
|
||||
return translations.values()
|
||||
|
||||
# ***** VALUE *****
|
||||
func value_by_locale_key(locale_value: String, key_value: String) -> String:
|
||||
for key in data.keys:
|
||||
if key.value == key_value:
|
||||
for translation in key.translations:
|
||||
if translation.locale == locale_value:
|
||||
return translation.value
|
||||
return key_value
|
||||
|
||||
# ***** FILTER *****
|
||||
func data_filter_by_type(type: String) -> String:
|
||||
return data_filter[type] if data_filter.has(type) else ""
|
||||
|
||||
func data_filter_put(type: String, filter: String) -> void:
|
||||
data_filter[type] = filter
|
||||
emit_signal("data_changed")
|
||||
|
||||
func data_filter_remaps_by_type(type: String) -> String:
|
||||
return data_filter_remaps[type] if data_filter_remaps.has(type) else ""
|
||||
|
||||
func data_filter_remaps_put(type: String, filter: String) -> void:
|
||||
data_filter_remaps[type] = filter
|
||||
emit_signal("data_changed")
|
||||
|
||||
func data_filter_placeholders_by_type(type: String) -> String:
|
||||
return data_filter_placeholders[type] if data_filter_remaps.has(type) else ""
|
||||
|
||||
func data_filter_placeholders_put(type: String, filter: String) -> void:
|
||||
data_filter_placeholders[type] = filter
|
||||
emit_signal("data_changed")
|
||||
|
||||
# ***** REMAPS *****
|
||||
func remaps() -> Array:
|
||||
return data_remaps.remapkeys
|
||||
|
||||
func init_data_remaps() -> void:
|
||||
var internationalization_path = "internationalization/locale/translation_remaps"
|
||||
data_remaps.remapkeys = []
|
||||
if ProjectSettings.has_setting(internationalization_path):
|
||||
var settings_remaps = ProjectSettings.get_setting(internationalization_path)
|
||||
if settings_remaps.size():
|
||||
var keys = settings_remaps.keys();
|
||||
for key in keys:
|
||||
var remaps = []
|
||||
for remap in settings_remaps[key]:
|
||||
var index = remap.rfind(":")
|
||||
var locale = remap.substr(index + 1)
|
||||
check_locale(locale)
|
||||
var value = remap.substr(0, index)
|
||||
var remap_new = {"locale": locale, "value": value }
|
||||
remaps.append(remap_new)
|
||||
data_remaps.remapkeys.append({"uuid": uuid(), "remaps": remaps})
|
||||
_check_remapkeys()
|
||||
return
|
||||
var remap = _create_remapkey(uuid())
|
||||
data_remaps.remapkeys.append(remap)
|
||||
|
||||
func _check_remapkeys() -> void:
|
||||
for locale in locales():
|
||||
for remapkey in data_remaps.remapkeys:
|
||||
if not remapkey_has_locale(remapkey, locale):
|
||||
remapkey.remaps.append({"locale": locale, "value": ""})
|
||||
|
||||
func save_data_remaps() -> void:
|
||||
var remapkeys = data_remaps.remapkeys.size() > 1 or data_remaps.remapkeys.size() == 1
|
||||
if remapkeys:
|
||||
if data_remaps.remapkeys[0].remaps.size() > 1 and data_remaps.remapkeys[0].remaps[0].value.length() > 0:
|
||||
_save_data_remaps()
|
||||
|
||||
func _save_data_remaps() -> void:
|
||||
var remaps = {}
|
||||
for remapkey in data_remaps.remapkeys:
|
||||
if remapkey.remaps.size() > 0:
|
||||
var key = remapkey.remaps[0].value
|
||||
remaps[key] = []
|
||||
for index in range(0, remapkey.remaps.size()):
|
||||
var remap = remapkey.remaps[index]
|
||||
var value = remap.value + ":" + remap.locale
|
||||
remaps[key].append(value)
|
||||
ProjectSettings.set_setting("internationalization/locale/translation_remaps", remaps)
|
||||
|
||||
signal data_remapkey_value_changed
|
||||
|
||||
func emit_data_remapkey_value_changed() -> void:
|
||||
emit_signal("data_remapkey_value_changed")
|
||||
|
||||
func remapkeys_filtered() -> Array:
|
||||
var remapkeys = _filter_by_remapkeys()
|
||||
for filter_remapkey in data_filter_remaps.keys():
|
||||
if filter_remapkey != "remapkeys":
|
||||
remapkeys = _remapkey_filter_by_remaps(remapkeys, filter_remapkey)
|
||||
return remapkeys
|
||||
|
||||
func _filter_by_remapkeys() -> Array:
|
||||
var remapkeys = []
|
||||
for remapkey in data_remaps.remapkeys:
|
||||
if _remapkey_allow_by_filter(remapkey):
|
||||
remapkeys.append(remapkey)
|
||||
return remapkeys
|
||||
|
||||
func _remapkey_allow_by_filter(remapkey) -> bool:
|
||||
if data_filter_remaps.has("remapkeys"):
|
||||
if data_filter_remaps.remapkeys.length() <= 0:
|
||||
return true
|
||||
else:
|
||||
for remap in remapkey.remaps:
|
||||
if remap_type(remap) in data_filter_remaps.remapkeys:
|
||||
return true
|
||||
return false
|
||||
else:
|
||||
return true
|
||||
|
||||
func _remapkey_filter_by_remaps(remapkeys, locale) -> Array:
|
||||
var new_remapkeys = []
|
||||
for remapkey in remapkeys:
|
||||
var value = _remap_value_by_locale(remapkey, locale)
|
||||
if data_filter_remaps[locale] == "" or value == null or value == "" or data_filter_remaps[locale] in value:
|
||||
new_remapkeys.append(remapkey)
|
||||
return new_remapkeys
|
||||
|
||||
func _remap_value_by_locale(remapkey, locale):
|
||||
for remap in remapkey.remaps:
|
||||
if remap.locale == locale:
|
||||
if remap.value != null:
|
||||
return remap.value
|
||||
return ""
|
||||
|
||||
func add_remapkey_object(remapkey) -> void:
|
||||
data_remaps.remapkeys.append(remapkey)
|
||||
|
||||
func _add_remapkey(uuid: String, emitSignal = true) -> void:
|
||||
data_remaps.remapkeys.append(_create_remapkey(uuid))
|
||||
if emitSignal:
|
||||
emit_signal("data_changed")
|
||||
|
||||
func add_remapkey_new_after_uuid_remap(after_uuid_remap: String, uuid = uuid()) -> void:
|
||||
if _undo_redo != null:
|
||||
_undo_redo.create_action("Add new remapkey " + uuid + " after " + after_uuid_remap)
|
||||
_undo_redo.add_do_method(self, "_add_remapkey_new_after_uuid_remap", after_uuid_remap, uuid)
|
||||
_undo_redo.add_undo_method(self, "_del_remapkey", uuid)
|
||||
_undo_redo.commit_action()
|
||||
else:
|
||||
_add_remapkey_new_after_uuid_remap(after_uuid_remap, uuid)
|
||||
|
||||
func _add_remapkey_after_uuid_remap(after_uuid_remap: String, remapkey) -> void:
|
||||
var position = _remapkey_position(after_uuid_remap)
|
||||
if position != -1 and position < data_remaps.remapkeys.size():
|
||||
data_remaps.remapkeys.insert(position + 1, remapkey)
|
||||
emit_signal("data_changed")
|
||||
else:
|
||||
data_remaps.remapkeys.append(remapkey)
|
||||
|
||||
func _add_remapkey_new_after_uuid_remap(after_uuid_remap: String, uuid = uuid()) -> void:
|
||||
var position = _remapkey_position(after_uuid_remap)
|
||||
if position != -1 and position < data_remaps.remapkeys.size():
|
||||
var remapkey = _create_remapkey(uuid)
|
||||
data_remaps.remapkeys.insert(position + 1, remapkey)
|
||||
emit_signal("data_changed")
|
||||
else:
|
||||
_add_remapkey(uuid)
|
||||
|
||||
func _create_remapkey(uuid: String):
|
||||
var remapkey = {"uuid": uuid, "remaps": []}
|
||||
for locale in data.locales:
|
||||
var remap = {"locale": locale, "value": ""}
|
||||
remapkey.remaps.append(remap)
|
||||
return remapkey
|
||||
|
||||
func del_remapkey(uuid: String, emitSignal = true) -> void:
|
||||
if _undo_redo != null:
|
||||
var before_uuid_remap = before_uuid_remap(uuid)
|
||||
var remapkey = remapkey(uuid)
|
||||
_undo_redo.create_action("Del remapkey " + uuid)
|
||||
_undo_redo.add_do_method(self, "_del_remapkey", uuid)
|
||||
_undo_redo.add_undo_method(self, "_add_remapkey_after_uuid_remap", before_uuid_remap, remapkey)
|
||||
_undo_redo.commit_action()
|
||||
else:
|
||||
_del_remapkey(uuid)
|
||||
|
||||
func _del_remapkey(uuid: String, emitSignal = true) -> void:
|
||||
data_remaps.remapkeys.remove_at(_remapkey_position(uuid))
|
||||
if emitSignal:
|
||||
emit_signal("data_changed")
|
||||
|
||||
func after_uuid_remap(uuid: String):
|
||||
var position = _remapkey_position(uuid)
|
||||
if position != -1 and position < data_remaps.remapkeys.size():
|
||||
return data_remaps.remapkeys[position + 1].uuid
|
||||
else:
|
||||
return null
|
||||
|
||||
func before_uuid_remap(uuid: String):
|
||||
var position = _remapkey_position(uuid)
|
||||
if position > 0:
|
||||
return data_remaps.remapkeys[position - 1].uuid
|
||||
else:
|
||||
return null
|
||||
|
||||
func _remapkey_position(uuid: String) -> int:
|
||||
for index in range(data_remaps.remapkeys.size()):
|
||||
if data_remaps.remapkeys[index].uuid == uuid:
|
||||
return index
|
||||
return -1
|
||||
|
||||
func remapkey_has_locale(remapkey, locale: String) -> bool:
|
||||
for remap in remapkey.remaps:
|
||||
if remap.locale == locale:
|
||||
return true
|
||||
return false
|
||||
|
||||
func remapkey_value(uuid: String):
|
||||
var remapkey = remapkey(uuid)
|
||||
if remapkey != FAILED:
|
||||
return remapkey.value
|
||||
else:
|
||||
return ""
|
||||
|
||||
func remapkey_value_change(remapkey, remapkey_value: String):
|
||||
if _undo_redo != null:
|
||||
_undo_redo.create_action("Change remapkey value ")
|
||||
_undo_redo.add_do_method(self, "_remapkey_value_change", remapkey, remapkey_value)
|
||||
_undo_redo.add_undo_method(self, "_remapkey_value_change", remapkey, "" + remapkey.value)
|
||||
_undo_redo.commit_action()
|
||||
else:
|
||||
_remapkey_value_change(remapkey, remapkey_value)
|
||||
|
||||
func _remapkey_value_change(remapkey, remapkey_value: String):
|
||||
remapkey.value = remapkey_value
|
||||
emit_data_remapkey_value_changed()
|
||||
|
||||
func remapkey(uuid: String):
|
||||
for remapkey in data_remaps.remapkeys:
|
||||
if remapkey.uuid == uuid:
|
||||
return remapkey
|
||||
return FAILED
|
||||
|
||||
func remap_type(remap) -> String:
|
||||
match file_extension(remap.value):
|
||||
"ogg", "wav", "mp3":
|
||||
return "audio"
|
||||
"bmp", "dds", "exr", "hdr", "jpg", "jpeg", "png", "tga", "svg", "svgz", "webp":
|
||||
return "image"
|
||||
"webm", "o", "ogv":
|
||||
return "video"
|
||||
_:
|
||||
return "undefined"
|
||||
|
||||
func supported_file_extensions() -> Array:
|
||||
return ["ogg", "ogv", "wav", "mp3", "bmp", "dds", "exr", "hdr", "jpg", "jpeg", "png", "tga", "svg", "svgz", "webp", "webm", "o"]
|
||||
|
||||
# ***** PLACEHOLDERS *****
|
||||
func init_data_placeholders() -> void:
|
||||
var placeholders = calc_placeholders()
|
||||
for key in placeholders.keys():
|
||||
if not data_placeholders.has(key):
|
||||
data_placeholders[key] = placeholders[key]
|
||||
if FileAccess.file_exists(default_path_to_placeholders):
|
||||
var resource = ResourceLoader.load(default_path_to_placeholders)
|
||||
if resource and resource.placeholders and not resource.placeholders.size() <= 0:
|
||||
for key in resource.placeholders.keys():
|
||||
data_placeholders[key] = resource.placeholders[key]
|
||||
|
||||
func calc_placeholders() -> Dictionary:
|
||||
var placeholders = {}
|
||||
var regex = RegEx.new()
|
||||
regex.compile("{{(.+?)}}")
|
||||
for key in data.keys:
|
||||
for index in range(key.translations.size()):
|
||||
var results = regex.search_all(key.translations[index].value)
|
||||
for result in results:
|
||||
var name = result.get_string()
|
||||
var clean_name = name.replace("{{", "");
|
||||
clean_name = clean_name.replace("}}", "");
|
||||
if not placeholders.has(name):
|
||||
var placeholder = {}
|
||||
for locale in data.locales:
|
||||
placeholder[locale] = ""
|
||||
placeholders[clean_name] = placeholder
|
||||
return placeholders
|
||||
|
||||
func placeholders_filtered() -> Dictionary:
|
||||
var placeholders = _filter_by_placeholderkeys()
|
||||
for filter_placeholderkey in data_filter_placeholders.keys():
|
||||
if filter_placeholderkey != "placeholderkeys":
|
||||
placeholders = _key_filter_by_placeholders(placeholders, filter_placeholderkey)
|
||||
return placeholders
|
||||
|
||||
func _key_filter_by_placeholders(placeholders, locale) -> Dictionary:
|
||||
var new_placeholders = {}
|
||||
for placeholderkey in placeholders.keys():
|
||||
var value = placeholders[placeholderkey][locale]
|
||||
if data_filter_placeholders[locale] == "" or data_filter_placeholders[locale] in value:
|
||||
new_placeholders[placeholderkey] = placeholders[placeholderkey]
|
||||
return new_placeholders
|
||||
|
||||
func _filter_by_placeholderkeys() -> Dictionary:
|
||||
var placeholders = {}
|
||||
for placeholderkey in data_placeholders.keys():
|
||||
if not data_filter_placeholders.has("placeholderkeys") or data_filter_placeholders["placeholderkeys"] == "" or placeholderkey == null or placeholderkey == "" or data_filter_placeholders["placeholderkeys"] in placeholderkey:
|
||||
placeholders[placeholderkey] = data_placeholders[placeholderkey]
|
||||
return placeholders
|
||||
|
||||
func del_placeholder(key: String, emitSignal = true) -> void:
|
||||
if _undo_redo != null:
|
||||
var placeholder = data_placeholders[key]
|
||||
_undo_redo.create_action("Del _del_placeholder " + key)
|
||||
_undo_redo.add_do_method(self, "_del_placeholder", key)
|
||||
_undo_redo.add_undo_method(self, "_add_placeholder", key, placeholder)
|
||||
_undo_redo.commit_action()
|
||||
else:
|
||||
_del_placeholder(key)
|
||||
|
||||
func _del_placeholder(key: String, emitSignal = true) -> void:
|
||||
data_placeholders.erase(key)
|
||||
if emitSignal:
|
||||
emit_signal("data_changed")
|
||||
|
||||
func _add_placeholder(key: String, placeholder, emitSignal = true):
|
||||
data_placeholders[key] = placeholder
|
||||
if emitSignal:
|
||||
emit_signal("data_changed")
|
||||
|
||||
# ***** EDITOR SETTINGS *****
|
||||
signal settings_changed
|
||||
|
||||
func setting_path_to_file() -> String:
|
||||
var path = default_path_to_file
|
||||
if ProjectSettings.has_setting(SETTINGS_PATH_TO_FILE):
|
||||
path = ProjectSettings.get_setting(SETTINGS_PATH_TO_FILE)
|
||||
return path
|
||||
|
||||
func setting_path_to_file_put(path: String) -> void:
|
||||
ProjectSettings.set_setting(SETTINGS_PATH_TO_FILE, path)
|
||||
emit_signal("settings_changed")
|
||||
|
||||
func is_locale_visible(locale: String) -> bool:
|
||||
if not ProjectSettings.has_setting(SETTINGS_LOCALES_VISIBILITY):
|
||||
return true
|
||||
var locales = ProjectSettings.get_setting(SETTINGS_LOCALES_VISIBILITY)
|
||||
return not locales.has(locale)
|
||||
|
||||
func setting_locales_visibility_put(locale: String) -> void:
|
||||
var locales = []
|
||||
if ProjectSettings.has_setting(SETTINGS_LOCALES_VISIBILITY):
|
||||
locales = ProjectSettings.get_setting(SETTINGS_LOCALES_VISIBILITY)
|
||||
if not locales.has(locale):
|
||||
locales.append(locale)
|
||||
ProjectSettings.set_setting(SETTINGS_LOCALES_VISIBILITY, locales)
|
||||
emit_signal("data_changed")
|
||||
|
||||
func setting_locales_visibility_del(locale: String, emitSignal = true) -> void:
|
||||
if ProjectSettings.has_setting(SETTINGS_LOCALES_VISIBILITY):
|
||||
var locales = ProjectSettings.get_setting(SETTINGS_LOCALES_VISIBILITY)
|
||||
if locales.has(locale):
|
||||
locales.erase(locale)
|
||||
ProjectSettings.set_setting(SETTINGS_LOCALES_VISIBILITY, locales)
|
||||
if emitSignal:
|
||||
emit_signal("data_changed")
|
||||
|
||||
func setting_translations_split_offset() -> int:
|
||||
var offset = 350
|
||||
if ProjectSettings.has_setting(SETTINGS_TRANSLATIONS_SPLIT_OFFSET):
|
||||
offset = ProjectSettings.get_setting(SETTINGS_TRANSLATIONS_SPLIT_OFFSET)
|
||||
return offset
|
||||
|
||||
func setting_translations_split_offset_put(offset: int) -> void:
|
||||
ProjectSettings.set_setting(SETTINGS_TRANSLATIONS_SPLIT_OFFSET, offset)
|
||||
|
||||
func setting_placeholders_split_offset() -> int:
|
||||
var offset = 350
|
||||
if ProjectSettings.has_setting(SETTINGS_PLACEHOLDERS_SPLIT_OFFSET):
|
||||
offset = ProjectSettings.get_setting(SETTINGS_PLACEHOLDERS_SPLIT_OFFSET)
|
||||
return offset
|
||||
|
||||
func setting_placeholders_split_offset_put(offset: int) -> void:
|
||||
ProjectSettings.set_setting(SETTINGS_PLACEHOLDERS_SPLIT_OFFSET, offset)
|
||||
|
||||
# ***** UTILS *****
|
||||
func filename(value: String) -> String:
|
||||
var index = value.rfind("/")
|
||||
return value.substr(index + 1)
|
||||
|
||||
func file_path_without_extension(value: String) -> String:
|
||||
var index = value.rfind(".")
|
||||
return value.substr(0, index)
|
||||
|
||||
func file_path(value: String) -> String:
|
||||
var index = value.rfind("/")
|
||||
return value.substr(0, index)
|
||||
|
||||
func file_extension(value: String):
|
||||
var index = value.rfind(".")
|
||||
if index == -1:
|
||||
return null
|
||||
return value.substr(index + 1)
|
||||
1
addons/localization_editor/model/LocalizationData.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://c03rmaflcsi65
|
||||
11
addons/localization_editor/model/LocalizationLocaleSingle.gd
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
# Single locale for LocalizationEditor : MIT License
|
||||
# @author Vladimir Petrenko
|
||||
extends Object
|
||||
class_name LocalizationLocaleSingle
|
||||
|
||||
var code: String
|
||||
var name: String
|
||||
|
||||
func _init(pcode: String, pname: String):
|
||||
code = pcode
|
||||
name = pname
|
||||
|
|
@ -0,0 +1 @@
|
|||
uid://r4m5ptsa4hpa
|
||||
383
addons/localization_editor/model/LocalizationLocalesList.gd
Normal file
|
|
@ -0,0 +1,383 @@
|
|||
# List of locales for LocalizationEditor : MIT License
|
||||
# @author Vladimir Petrenko
|
||||
class_name LocalizationLocalesList
|
||||
|
||||
const LOCALES = {
|
||||
"aa": "Afar",
|
||||
"aa_DJ": "Afar (Djibouti)",
|
||||
"aa_ER": "Afar (Eritrea)",
|
||||
"aa_ET": "Afar (Ethiopia)",
|
||||
"af": "Afrikaans",
|
||||
"af_ZA": "Afrikaans (South Africa)",
|
||||
"agr_PE": "Aguaruna (Peru)",
|
||||
"ak_GH": "Akan (Ghana)",
|
||||
"am_ET": "Amharic (Ethiopia)",
|
||||
"an_ES": "Aragonese (Spain)",
|
||||
"anp_IN": "Angika (India)",
|
||||
"ar": "Arabic",
|
||||
"ar_AE": "Arabic (United Arab Emirates)",
|
||||
"ar_BH": "Arabic (Bahrain)",
|
||||
"ar_DZ": "Arabic (Algeria)",
|
||||
"ar_EG": "Arabic (Egypt)",
|
||||
"ar_IN": "Arabic (India)",
|
||||
"ar_IQ": "Arabic (Iraq)",
|
||||
"ar_JO": "Arabic (Jordan)",
|
||||
"ar_KW": "Arabic (Kuwait)",
|
||||
"ar_LB": "Arabic (Lebanon)",
|
||||
"ar_LY": "Arabic (Libya)",
|
||||
"ar_MA": "Arabic (Morocco)",
|
||||
"ar_OM": "Arabic (Oman)",
|
||||
"ar_QA": "Arabic (Qatar)",
|
||||
"ar_SA": "Arabic (Saudi Arabia)",
|
||||
"ar_SD": "Arabic (Sudan)",
|
||||
"ar_SS": "Arabic (South Soudan)",
|
||||
"ar_SY": "Arabic (Syria)",
|
||||
"ar_TN": "Arabic (Tunisia)",
|
||||
"ar_YE": "Arabic (Yemen)",
|
||||
"as_IN": "Assamese (India)",
|
||||
"ast_ES": "Asturian (Spain)",
|
||||
"ayc_PE": "Southern Aymara (Peru)",
|
||||
"ay_PE": "Aymara (Peru)",
|
||||
"az_AZ": "Azerbaijani (Azerbaijan)",
|
||||
"be": "Belarusian",
|
||||
"be_BY": "Belarusian (Belarus)",
|
||||
"bem_ZM": "Bemba (Zambia)",
|
||||
"ber_DZ": "Berber languages (Algeria)",
|
||||
"ber_MA": "Berber languages (Morocco)",
|
||||
"bg": "Bulgarian",
|
||||
"bg_BG": "Bulgarian (Bulgaria)",
|
||||
"bhb_IN": "Bhili (India)",
|
||||
"bho_IN": "Bhojpuri (India)",
|
||||
"bi_TV": "Bislama (Tuvalu)",
|
||||
"bn": "Bengali",
|
||||
"bn_BD": "Bengali (Bangladesh)",
|
||||
"bn_IN": "Bengali (India)",
|
||||
"bo": "Tibetan",
|
||||
"bo_CN": "Tibetan (China)",
|
||||
"bo_IN": "Tibetan (India)",
|
||||
"br_FR": "Breton (France)",
|
||||
"brx_IN": "Bodo (India)",
|
||||
"bs_BA": "Bosnian (Bosnia and Herzegovina)",
|
||||
"byn_ER": "Bilin (Eritrea)",
|
||||
"ca": "Catalan",
|
||||
"ca_AD": "Catalan (Andorra)",
|
||||
"ca_ES": "Catalan (Spain)",
|
||||
"ca_FR": "Catalan (France)",
|
||||
"ca_IT": "Catalan (Italy)",
|
||||
"ce_RU": "Chechen (Russia)",
|
||||
"chr_US": "Cherokee (United States)",
|
||||
"cmn_TW": "Mandarin Chinese (Taiwan)",
|
||||
"crh_UA": "Crimean Tatar (Ukraine)",
|
||||
"csb_PL": "Kashubian (Poland)",
|
||||
"cs": "Czech",
|
||||
"cs_CZ": "Czech (Czech Republic)",
|
||||
"cv_RU": "Chuvash (Russia)",
|
||||
"cy_GB": "Welsh (United Kingdom)",
|
||||
"da": "Danish",
|
||||
"da_DK": "Danish (Denmark)",
|
||||
"de": "German",
|
||||
"de_AT": "German (Austria)",
|
||||
"de_BE": "German (Belgium)",
|
||||
"de_CH": "German (Switzerland)",
|
||||
"de_DE": "German (Germany)",
|
||||
"de_IT": "German (Italy)",
|
||||
"de_LU": "German (Luxembourg)",
|
||||
"doi_IN": "Dogri (India)",
|
||||
"dv_MV": "Dhivehi (Maldives)",
|
||||
"dz_BT": "Dzongkha (Bhutan)",
|
||||
"el": "Greek",
|
||||
"el_CY": "Greek (Cyprus)",
|
||||
"el_GR": "Greek (Greece)",
|
||||
"en": "English",
|
||||
"en_AG": "English (Antigua and Barbuda)",
|
||||
"en_AU": "English (Australia)",
|
||||
"en_BW": "English (Botswana)",
|
||||
"en_CA": "English (Canada)",
|
||||
"en_DK": "English (Denmark)",
|
||||
"en_GB": "English (United Kingdom)",
|
||||
"en_HK": "English (Hong Kong)",
|
||||
"en_IE": "English (Ireland)",
|
||||
"en_IL": "English (Israel)",
|
||||
"en_IN": "English (India)",
|
||||
"en_NG": "English (Nigeria)",
|
||||
"en_NZ": "English (New Zealand)",
|
||||
"en_PH": "English (Philippines)",
|
||||
"en_SG": "English (Singapore)",
|
||||
"en_US": "English (United States)",
|
||||
"en_ZA": "English (South Africa)",
|
||||
"en_ZM": "English (Zambia)",
|
||||
"en_ZW": "English (Zimbabwe)",
|
||||
"eo": "Esperanto",
|
||||
"es": "Spanish",
|
||||
"es_AR": "Spanish (Argentina)",
|
||||
"es_BO": "Spanish (Bolivia)",
|
||||
"es_CL": "Spanish (Chile)",
|
||||
"es_CO": "Spanish (Colombia)",
|
||||
"es_CR": "Spanish (Costa Rica)",
|
||||
"es_CU": "Spanish (Cuba)",
|
||||
"es_DO": "Spanish (Dominican Republic)",
|
||||
"es_EC": "Spanish (Ecuador)",
|
||||
"es_ES": "Spanish (Spain)",
|
||||
"es_GT": "Spanish (Guatemala)",
|
||||
"es_HN": "Spanish (Honduras)",
|
||||
"es_MX": "Spanish (Mexico)",
|
||||
"es_NI": "Spanish (Nicaragua)",
|
||||
"es_PA": "Spanish (Panama)",
|
||||
"es_PE": "Spanish (Peru)",
|
||||
"es_PR": "Spanish (Puerto Rico)",
|
||||
"es_PY": "Spanish (Paraguay)",
|
||||
"es_SV": "Spanish (El Salvador)",
|
||||
"es_US": "Spanish (United States)",
|
||||
"es_UY": "Spanish (Uruguay)",
|
||||
"es_VE": "Spanish (Venezuela)",
|
||||
"et": "Estonian",
|
||||
"et_EE": "Estonian (Estonia)",
|
||||
"eu": "Basque",
|
||||
"eu_ES": "Basque (Spain)",
|
||||
"fa": "Persian",
|
||||
"fa_IR": "Persian (Iran)",
|
||||
"ff_SN": "Fulah (Senegal)",
|
||||
"fi": "Finnish",
|
||||
"fi_FI": "Finnish (Finland)",
|
||||
"fil": "Filipino",
|
||||
"fil_PH": "Filipino (Philippines)",
|
||||
"fo_FO": "Faroese (Faroe Islands)",
|
||||
"fr": "French",
|
||||
"fr_BE": "French (Belgium)",
|
||||
"fr_CA": "French (Canada)",
|
||||
"fr_CH": "French (Switzerland)",
|
||||
"fr_FR": "French (France)",
|
||||
"fr_LU": "French (Luxembourg)",
|
||||
"fur_IT": "Friulian (Italy)",
|
||||
"fy_DE": "Western Frisian (Germany)",
|
||||
"fy_NL": "Western Frisian (Netherlands)",
|
||||
"ga": "Irish",
|
||||
"ga_IE": "Irish (Ireland)",
|
||||
"gd_GB": "Scottish Gaelic (United Kingdom)",
|
||||
"gez_ER": "Geez (Eritrea)",
|
||||
"gez_ET": "Geez (Ethiopia)",
|
||||
"gl_ES": "Galician (Spain)",
|
||||
"gu_IN": "Gujarati (India)",
|
||||
"gv_GB": "Manx (United Kingdom)",
|
||||
"hak_TW": "Hakka Chinese (Taiwan)",
|
||||
"ha_NG": "Hausa (Nigeria)",
|
||||
"he": "Hebrew",
|
||||
"he_IL": "Hebrew (Israel)",
|
||||
"hi": "Hindi",
|
||||
"hi_IN": "Hindi (India)",
|
||||
"hne_IN": "Chhattisgarhi (India)",
|
||||
"hr": "Croatian",
|
||||
"hr_HR": "Croatian (Croatia)",
|
||||
"hsb_DE": "Upper Sorbian (Germany)",
|
||||
"ht_HT": "Haitian (Haiti)",
|
||||
"hu": "Hungarian",
|
||||
"hu_HU": "Hungarian (Hungary)",
|
||||
"hus_MX": "Huastec (Mexico)",
|
||||
"hy_AM": "Armenian (Armenia)",
|
||||
"ia_FR": "Interlingua (France)",
|
||||
"id": "Indonesian",
|
||||
"id_ID": "Indonesian (Indonesia)",
|
||||
"ig_NG": "Igbo (Nigeria)",
|
||||
"ik_CA": "Inupiaq (Canada)",
|
||||
"is": "Icelandic",
|
||||
"is_IS": "Icelandic (Iceland)",
|
||||
"it": "Italian",
|
||||
"it_CH": "Italian (Switzerland)",
|
||||
"it_IT": "Italian (Italy)",
|
||||
"iu_CA": "Inuktitut (Canada)",
|
||||
"ja": "Japanese",
|
||||
"ja_JP": "Japanese (Japan)",
|
||||
"kab_DZ": "Kabyle (Algeria)",
|
||||
"ka": "Georgian",
|
||||
"ka_GE": "Georgian (Georgia)",
|
||||
"kk_KZ": "Kazakh (Kazakhstan)",
|
||||
"kl_GL": "Kalaallisut (Greenland)",
|
||||
"km_KH": "Central Khmer (Cambodia)",
|
||||
"kn_IN": "Kannada (India)",
|
||||
"kok_IN": "Konkani (India)",
|
||||
"ko": "Korean",
|
||||
"ko_KR": "Korean (South Korea)",
|
||||
"ks_IN": "Kashmiri (India)",
|
||||
"ku": "Kurdish",
|
||||
"ku_TR": "Kurdish (Turkey)",
|
||||
"kw_GB": "Cornish (United Kingdom)",
|
||||
"ky_KG": "Kirghiz (Kyrgyzstan)",
|
||||
"lb_LU": "Luxembourgish (Luxembourg)",
|
||||
"lg_UG": "Ganda (Uganda)",
|
||||
"li_BE": "Limburgan (Belgium)",
|
||||
"li_NL": "Limburgan (Netherlands)",
|
||||
"lij_IT": "Ligurian (Italy)",
|
||||
"ln_CD": "Lingala (Congo)",
|
||||
"lo_LA": "Lao (Laos)",
|
||||
"lt": "Lithuanian",
|
||||
"lt_LT": "Lithuanian (Lithuania)",
|
||||
"lv": "Latvian",
|
||||
"lv_LV": "Latvian (Latvia)",
|
||||
"lzh_TW": "Literary Chinese (Taiwan)",
|
||||
"mag_IN": "Magahi (India)",
|
||||
"mai_IN": "Maithili (India)",
|
||||
"mg_MG": "Malagasy (Madagascar)",
|
||||
"mh_MH": "Marshallese (Marshall Islands)",
|
||||
"mhr_RU": "Eastern Mari (Russia)",
|
||||
"mi": "Māori",
|
||||
"mi_NZ": "Māori (New Zealand)",
|
||||
"miq_NI": "Mískito (Nicaragua)",
|
||||
"mk": "Macedonian",
|
||||
"mk_MK": "Macedonian (Macedonia)",
|
||||
"ml": "Malayalam",
|
||||
"ml_IN": "Malayalam (India)",
|
||||
"mni_IN": "Manipuri (India)",
|
||||
"mn_MN": "Mongolian (Mongolia)",
|
||||
"mr_IN": "Marathi (India)",
|
||||
"ms": "Malay",
|
||||
"ms_MY": "Malay (Malaysia)",
|
||||
"mt": "Maltese",
|
||||
"mt_MT": "Maltese (Malta)",
|
||||
"my_MM": "Burmese (Myanmar)",
|
||||
"myv_RU": "Erzya (Russia)",
|
||||
"nah_MX": "Nahuatl languages (Mexico)",
|
||||
"nan_TW": "Min Nan Chinese (Taiwan)",
|
||||
"nb": "Norwegian Bokmål",
|
||||
"nb_NO": "Norwegian Bokmål (Norway)",
|
||||
"nds_DE": "Low German (Germany)",
|
||||
"nds_NL": "Low German (Netherlands)",
|
||||
"ne_NP": "Nepali (Nepal)",
|
||||
"nhn_MX": "Central Nahuatl (Mexico)",
|
||||
"niu_NU": "Niuean (Niue)",
|
||||
"niu_NZ": "Niuean (New Zealand)",
|
||||
"nl": "Dutch",
|
||||
"nl_AW": "Dutch (Aruba)",
|
||||
"nl_BE": "Dutch (Belgium)",
|
||||
"nl_NL": "Dutch (Netherlands)",
|
||||
"nn": "Norwegian Nynorsk",
|
||||
"nn_NO": "Norwegian Nynorsk (Norway)",
|
||||
"nr_ZA": "South Ndebele (South Africa)",
|
||||
"nso_ZA": "Pedi (South Africa)",
|
||||
"oc_FR": "Occitan (France)",
|
||||
"om": "Oromo",
|
||||
"om_ET": "Oromo (Ethiopia)",
|
||||
"om_KE": "Oromo (Kenya)",
|
||||
"or_IN": "Oriya (India)",
|
||||
"os_RU": "Ossetian (Russia)",
|
||||
"pa_IN": "Panjabi (India)",
|
||||
"pap": "Papiamento",
|
||||
"pap_AN": "Papiamento (Netherlands Antilles)",
|
||||
"pap_AW": "Papiamento (Aruba)",
|
||||
"pap_CW": "Papiamento (Curaçao)",
|
||||
"pa_PK": "Panjabi (Pakistan)",
|
||||
"pl": "Polish",
|
||||
"pl_PL": "Polish (Poland)",
|
||||
"pr": "Pirate",
|
||||
"ps_AF": "Pushto (Afghanistan)",
|
||||
"pt": "Portuguese",
|
||||
"pt_BR": "Portuguese (Brazil)",
|
||||
"pt_PT": "Portuguese (Portugal)",
|
||||
"quy_PE": "Ayacucho Quechua (Peru)",
|
||||
"quz_PE": "Cusco Quechua (Peru)",
|
||||
"raj_IN": "Rajasthani (India)",
|
||||
"ro": "Romanian",
|
||||
"ro_RO": "Romanian (Romania)",
|
||||
"ru": "Russian",
|
||||
"ru_RU": "Russian (Russia)",
|
||||
"ru_UA": "Russian (Ukraine)",
|
||||
"rw_RW": "Kinyarwanda (Rwanda)",
|
||||
"sa_IN": "Sanskrit (India)",
|
||||
"sat_IN": "Santali (India)",
|
||||
"sc_IT": "Sardinian (Italy)",
|
||||
"sco": "Scots",
|
||||
"sd_IN": "Sindhi (India)",
|
||||
"se_NO": "Northern Sami (Norway)",
|
||||
"sgs_LT": "Samogitian (Lithuania)",
|
||||
"shs_CA": "Shuswap (Canada)",
|
||||
"sid_ET": "Sidamo (Ethiopia)",
|
||||
"si": "Sinhala",
|
||||
"si_LK": "Sinhala (Sri Lanka)",
|
||||
"sk": "Slovak",
|
||||
"sk_SK": "Slovak (Slovakia)",
|
||||
"sl": "Slovenian",
|
||||
"sl_SI": "Slovenian (Slovenia)",
|
||||
"so": "Somali",
|
||||
"so_DJ": "Somali (Djibouti)",
|
||||
"so_ET": "Somali (Ethiopia)",
|
||||
"so_KE": "Somali (Kenya)",
|
||||
"so_SO": "Somali (Somalia)",
|
||||
"son_ML": "Songhai languages (Mali)",
|
||||
"sq": "Albanian",
|
||||
"sq_AL": "Albanian (Albania)",
|
||||
"sq_KV": "Albanian (Kosovo)",
|
||||
"sq_MK": "Albanian (Macedonia)",
|
||||
"sr": "Serbian",
|
||||
"sr_Cyrl": "Serbian (Cyrillic)",
|
||||
"sr_Latn": "Serbian (Latin)",
|
||||
"sr_ME": "Serbian (Montenegro)",
|
||||
"sr_RS": "Serbian (Serbia)",
|
||||
"ss_ZA": "Swati (South Africa)",
|
||||
"st_ZA": "Southern Sotho (South Africa)",
|
||||
"sv": "Swedish",
|
||||
"sv_FI": "Swedish (Finland)",
|
||||
"sv_SE": "Swedish (Sweden)",
|
||||
"sw_KE": "Swahili (Kenya)",
|
||||
"sw_TZ": "Swahili (Tanzania)",
|
||||
"szl_PL": "Silesian (Poland)",
|
||||
"ta": "Tamil",
|
||||
"ta_IN": "Tamil (India)",
|
||||
"ta_LK": "Tamil (Sri Lanka)",
|
||||
"tcy_IN": "Tulu (India)",
|
||||
"te": "Telugu",
|
||||
"te_IN": "Telugu (India)",
|
||||
"tg_TJ": "Tajik (Tajikistan)",
|
||||
"the_NP": "Chitwania Tharu (Nepal)",
|
||||
"th": "Thai",
|
||||
"th_TH": "Thai (Thailand)",
|
||||
"ti": "Tigrinya",
|
||||
"ti_ER": "Tigrinya (Eritrea)",
|
||||
"ti_ET": "Tigrinya (Ethiopia)",
|
||||
"tig_ER": "Tigre (Eritrea)",
|
||||
"tk_TM": "Turkmen (Turkmenistan)",
|
||||
"tl_PH": "Tagalog (Philippines)",
|
||||
"tn_ZA": "Tswana (South Africa)",
|
||||
"tr": "Turkish",
|
||||
"tr_CY": "Turkish (Cyprus)",
|
||||
"tr_TR": "Turkish (Turkey)",
|
||||
"ts_ZA": "Tsonga (South Africa)",
|
||||
"tt_RU": "Tatar (Russia)",
|
||||
"ug_CN": "Uighur (China)",
|
||||
"uk": "Ukrainian",
|
||||
"uk_UA": "Ukrainian (Ukraine)",
|
||||
"unm_US": "Unami (United States)",
|
||||
"ur": "Urdu",
|
||||
"ur_IN": "Urdu (India)",
|
||||
"ur_PK": "Urdu (Pakistan)",
|
||||
"uz": "Uzbek",
|
||||
"uz_UZ": "Uzbek (Uzbekistan)",
|
||||
"ve_ZA": "Venda (South Africa)",
|
||||
"vi": "Vietnamese",
|
||||
"vi_VN": "Vietnamese (Vietnam)",
|
||||
"wa_BE": "Walloon (Belgium)",
|
||||
"wae_CH": "Walser (Switzerland)",
|
||||
"wal_ET": "Wolaytta (Ethiopia)",
|
||||
"wo_SN": "Wolof (Senegal)",
|
||||
"xh_ZA": "Xhosa (South Africa)",
|
||||
"yi_US": "Yiddish (United States)",
|
||||
"yo_NG": "Yoruba (Nigeria)",
|
||||
"yue_HK": "Yue Chinese (Hong Kong)",
|
||||
"zh": "Chinese",
|
||||
"zh_CN": "Chinese (China)",
|
||||
"zh_HK": "Chinese (Hong Kong)",
|
||||
"zh_SG": "Chinese (Singapore)",
|
||||
"zh_TW": "Chinese (Taiwan)",
|
||||
"zu_ZA": "Zulu (South Africa)"
|
||||
}
|
||||
|
||||
static func label_by_code(code: String) -> String:
|
||||
if LOCALES.has(code.to_lower()):
|
||||
return code + " " + LOCALES[code.to_lower()]
|
||||
return ""
|
||||
|
||||
static func has_code(code: String) -> bool:
|
||||
for locale in LOCALES:
|
||||
var locale_code_lower = locale.to_lower()
|
||||
var code_lower = code.to_lower()
|
||||
if locale_code_lower.contains(code_lower):
|
||||
return true
|
||||
return false
|
||||
|
|
@ -0,0 +1 @@
|
|||
uid://db3ot745vputd
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
# Localization placeholders data for LocalizationEditor : MIT License
|
||||
# @author Vladimir Petrenko
|
||||
extends Resource
|
||||
class_name LocalizationPlaceholdersData
|
||||
|
||||
@export var placeholders: Dictionary = {}
|
||||
|
|
@ -0,0 +1 @@
|
|||
uid://c56hv2a0fyjv7
|
||||
7
addons/localization_editor/model/LocalizationSave.gd
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# Localization save data for LocalizationEditor : MIT License
|
||||
# @author Vladimir Petrenko
|
||||
extends Resource
|
||||
class_name LocalizationSave
|
||||
|
||||
@export var locale: String
|
||||
@export var placeholders: Dictionary = {}
|
||||
1
addons/localization_editor/model/LocalizationSave.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://bsc04m4s2dlc8
|
||||
7
addons/localization_editor/plugin.cfg
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
[plugin]
|
||||
|
||||
name="LocalizationEditor"
|
||||
description="Simple editor to localize application"
|
||||
author="Vladimir Petrenko"
|
||||
version="0.4.0"
|
||||
script="plugin.gd"
|
||||
33
addons/localization_editor/plugin.gd
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
@tool
|
||||
extends EditorPlugin
|
||||
|
||||
const IconResource = preload("res://addons/localization_editor/icons/Localization.svg")
|
||||
const LocalizationMain = preload("res://addons/localization_editor/LocalizationEditor.tscn")
|
||||
|
||||
var _localization_main: Control = null
|
||||
|
||||
func _enter_tree():
|
||||
add_autoload_singleton("LocalizationManager", "res://addons/localization_editor/LocalizationManager.gd")
|
||||
_localization_main = LocalizationMain.instantiate()
|
||||
_localization_main.name = "LocalizationEditor"
|
||||
get_editor_interface().get_editor_main_screen().add_child(_localization_main)
|
||||
_localization_main.set_editor(self)
|
||||
_make_visible(false)
|
||||
|
||||
func _make_visible(visible):
|
||||
if _localization_main:
|
||||
_localization_main.visible = visible
|
||||
|
||||
func _exit_tree():
|
||||
remove_autoload_singleton("LocalizationManager")
|
||||
if _localization_main:
|
||||
_localization_main.queue_free()
|
||||
|
||||
func _has_main_screen() -> bool:
|
||||
return true
|
||||
|
||||
func _get_plugin_name():
|
||||
return "Localization"
|
||||
|
||||
func _get_plugin_icon() -> Texture2D:
|
||||
return IconResource
|
||||
1
addons/localization_editor/plugin.gd.uid
Normal file
|
|
@ -0,0 +1 @@
|
|||
uid://cciu3vk12os2p
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# Auto Translate view for LocalizationEditor : MIT License
|
||||
# @author Vladimir Petrenko
|
||||
@tool
|
||||
extends VBoxContainer
|
||||
|
||||
@onready var _translators_ui = $Translators
|
||||
|
||||
func set_data(data: LocalizationData) -> void:
|
||||
_translators_ui.set_data(data)
|
||||
|
|
@ -0,0 +1 @@
|
|||
uid://cn4h4rfailmx
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
[gd_scene load_steps=3 format=3 uid="uid://2e10hsy4f7ak"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/localization_editor/scenes/auto_translate/LocalizationAutoTranslateEditorView.gd" id="1"]
|
||||
[ext_resource type="PackedScene" uid="uid://d15n48edirewf" path="res://addons/localization_editor/scenes/auto_translate/translator/LocalizationAutoTranslate.tscn" id="2"]
|
||||
|
||||
[node name="LocalizationAutotranslateEditorView" type="VBoxContainer"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("1")
|
||||
|
||||
[node name="Translators" parent="." instance=ExtResource("2")]
|
||||
layout_mode = 2
|
||||
anchors_preset = 0
|
||||
anchor_right = 0.0
|
||||
anchor_bottom = 0.0
|
||||
offset_right = 1152.0
|
||||
offset_bottom = 648.0
|
||||
grow_horizontal = 1
|
||||
grow_vertical = 1
|
||||
size_flags_vertical = 3
|
||||
|
|
@ -0,0 +1,482 @@
|
|||
# Autotranslate Yandex (https://translate.yandex.com/) for LocalizationEditor : MIT License
|
||||
# @author Vladimir Petrenko
|
||||
@tool
|
||||
extends MarginContainer
|
||||
|
||||
var ctx = HMACContext.new()
|
||||
|
||||
const uuid_gen = preload("res://addons/localization_editor/uuid/uuid.gd")
|
||||
|
||||
const SETTINGS_SAVE_TRANSLATOR_SELECTION = "localization_editor/translations_translator_selection"
|
||||
const SETTINGS_SAVE_AUTH = "localization_editor/translations_save_auth"
|
||||
const SETTINGS_SAVE_AUTH_DEEPL_KEY = "localization_editor/translations_save_auth_deepl_key"
|
||||
const SETTINGS_SAVE_AUTH_MICROSOFT_URL = "localization_editor/translations_save_auth_microsoft_url"
|
||||
const SETTINGS_SAVE_AUTH_MICROSOFT_LOCATION = "localization_editor/translations_save_auth_deepl_location"
|
||||
const SETTINGS_SAVE_AUTH_MICROSOFT_KEY = "localization_editor/translations_save_auth_deepl_key"
|
||||
const SETTINGS_SAVE_AUTH_AMAZON_REGION = "localization_editor/translations_save_auth_amazon_region"
|
||||
const SETTINGS_SAVE_AUTH_AMAZON_ACCESS_KEY = "localization_editor/translations_save_auth_access_key"
|
||||
const SETTINGS_SAVE_AUTH_AMAZON_SECRET_KEY = "localization_editor/translations_save_auth_secret_key"
|
||||
|
||||
var _data: LocalizationData
|
||||
var _data_keys: Array = []
|
||||
var _queries_count: int = 0
|
||||
var _from_code: String
|
||||
var _to_code: String
|
||||
|
||||
@onready var _translator: OptionButton = $Panel/VBox/HBoxTranslator/Translator
|
||||
@onready var _link: LinkButton = $Panel/VBox/HBoxTranslator/LinkButton
|
||||
@onready var _save_auth: CheckBox = $Panel/VBox/HBoxTranslator/SaveAuth
|
||||
@onready var _from_language_ui = $Panel/VBox/HBox/FromLanguage
|
||||
@onready var _to_language_ui = $Panel/VBox/HBox/ToLanguage
|
||||
@onready var _translate_ui: Button = $Panel/VBox/HBox/Translate
|
||||
@onready var _progress_ui: ProgressBar = $Panel/VBox/Progress
|
||||
|
||||
# *** DEEPL ***
|
||||
@onready var _deepl_container: HBoxContainer = $Panel/VBox/HBoxDeepL
|
||||
@onready var _deepl_key: LineEdit = $Panel/VBox/HBoxDeepL/DeepLKey
|
||||
|
||||
# *** MICROSOFT AZURE ***
|
||||
@onready var _microsoft_container: HBoxContainer = $Panel/VBox/HBoxMicrosoft
|
||||
@onready var _microsoft_url: OptionButton = $Panel/VBox/HBoxMicrosoft/URL
|
||||
@onready var _microsoft_location: LineEdit = $Panel/VBox/HBoxMicrosoft/Location
|
||||
@onready var _microsoft_key: LineEdit = $Panel/VBox/HBoxMicrosoft/Key
|
||||
|
||||
# *** AMAZON AWS ***
|
||||
@onready var _amazon_container: VBoxContainer = $Panel/VBox/VBoxAWS
|
||||
@onready var _amazon_region: OptionButton = $Panel/VBox/VBoxAWS/HBoxRegion/Region
|
||||
@onready var _amazon_access_key: LineEdit = $Panel/VBox/VBoxAWS/HBoxAccessKey/AccessKey
|
||||
@onready var _amazon_secret_key: LineEdit = $Panel/VBox/VBoxAWS/HBoxSecretKey/SecretKey
|
||||
|
||||
const Locales = preload("res://addons/localization_editor/model/LocalizationLocalesList.gd")
|
||||
|
||||
func set_data(data: LocalizationData) -> void:
|
||||
_data = data
|
||||
var has_save_auth = ProjectSettings.get_setting(SETTINGS_SAVE_AUTH) == true
|
||||
_save_auth.set_pressed(has_save_auth)
|
||||
if has_save_auth:
|
||||
_translator.selected = ProjectSettings.get_setting(SETTINGS_SAVE_TRANSLATOR_SELECTION)
|
||||
_deepl_key.text = ProjectSettings.get_setting(SETTINGS_SAVE_AUTH_DEEPL_KEY)
|
||||
_microsoft_url.selected = ProjectSettings.get_setting(SETTINGS_SAVE_AUTH_MICROSOFT_URL)
|
||||
_microsoft_location.text = ProjectSettings.get_setting(SETTINGS_SAVE_AUTH_MICROSOFT_LOCATION)
|
||||
_microsoft_key.text = ProjectSettings.get_setting(SETTINGS_SAVE_AUTH_MICROSOFT_KEY)
|
||||
_amazon_region.selected = ProjectSettings.get_setting(SETTINGS_SAVE_AUTH_AMAZON_REGION)
|
||||
_amazon_access_key.text = ProjectSettings.get_setting(SETTINGS_SAVE_AUTH_AMAZON_ACCESS_KEY)
|
||||
_amazon_secret_key.text = ProjectSettings.get_setting(SETTINGS_SAVE_AUTH_AMAZON_SECRET_KEY)
|
||||
_init_connections()
|
||||
_update_view()
|
||||
|
||||
func _init_connections() -> void:
|
||||
if not _data.is_connected("data_changed", _update_view):
|
||||
assert(_data.data_changed.connect(_update_view) == OK)
|
||||
if not _translator.is_connected("item_selected", _on_translator_selection_changed):
|
||||
_translator.item_selected.connect(_on_translator_selection_changed)
|
||||
if not _link.is_connected("pressed", _on_link_pressed):
|
||||
_link.pressed.connect(_on_link_pressed)
|
||||
if not _save_auth.toggled.is_connected(_on_save_auth_toggled):
|
||||
_save_auth.toggled.connect(_on_save_auth_toggled)
|
||||
if not _translate_ui.is_connected("pressed", _on_translate_pressed):
|
||||
assert(_translate_ui.connect("pressed", _on_translate_pressed) == OK)
|
||||
|
||||
if not _deepl_key.text_changed.is_connected(_deepl_key_text_changed):
|
||||
_deepl_key.text_changed.connect(_deepl_key_text_changed)
|
||||
|
||||
if not _amazon_region.item_selected.is_connected(_on_amazon_region_selection_changed):
|
||||
_amazon_region.item_selected.connect(_on_amazon_region_selection_changed)
|
||||
if not _amazon_access_key.text_changed.is_connected(_amazon_access_key_text_changed):
|
||||
_amazon_access_key.text_changed.connect(_amazon_access_key_text_changed)
|
||||
if not _amazon_secret_key.text_changed.is_connected(_amazon_secret_key_text_changed):
|
||||
_amazon_secret_key.text_changed.connect(_amazon_secret_key_text_changed)
|
||||
|
||||
if not _microsoft_url.is_connected("item_selected", _on_microsoft_url_selection_changed):
|
||||
_microsoft_url.item_selected.connect(_on_microsoft_url_selection_changed)
|
||||
if not _microsoft_location.text_changed.is_connected(_microsoft_location_text_changed):
|
||||
_microsoft_location.text_changed.connect(_microsoft_location_text_changed)
|
||||
if not _microsoft_key.text_changed.is_connected(_microsoft_key_text_changed):
|
||||
_microsoft_key.text_changed.connect(_microsoft_key_text_changed)
|
||||
|
||||
func _on_save_auth_toggled(button_pressed: bool) -> void:
|
||||
_update_auth_settings()
|
||||
|
||||
func _deepl_key_text_changed(_new_text: String) -> void:
|
||||
_update_auth_settings()
|
||||
|
||||
func _microsoft_location_text_changed(_new_text: String) -> void:
|
||||
_update_auth_settings()
|
||||
|
||||
func _amazon_access_key_text_changed(_new_text: String) -> void:
|
||||
_update_auth_settings()
|
||||
|
||||
func _amazon_secret_key_text_changed(_new_text: String) -> void:
|
||||
_update_auth_settings()
|
||||
|
||||
func _on_amazon_region_selection_changed(index: int):
|
||||
_update_auth_settings()
|
||||
|
||||
func _on_microsoft_url_selection_changed(index: int):
|
||||
_update_auth_settings()
|
||||
|
||||
func _microsoft_key_text_changed(_new_text: String) -> void:
|
||||
_update_auth_settings()
|
||||
|
||||
func _update_auth_settings() -> void:
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH, _save_auth.button_pressed)
|
||||
if _save_auth.button_pressed:
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_TRANSLATOR_SELECTION, _translator.selected)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_DEEPL_KEY, _deepl_key.text)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_MICROSOFT_URL, _microsoft_url.selected)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_MICROSOFT_LOCATION, _microsoft_location.text)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_MICROSOFT_KEY, _microsoft_key.text)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_AMAZON_REGION, _translator.selected)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_AMAZON_ACCESS_KEY, _amazon_access_key.text)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_AMAZON_SECRET_KEY, _amazon_secret_key.text)
|
||||
else:
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_TRANSLATOR_SELECTION, null)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_DEEPL_KEY, null)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_MICROSOFT_URL, null)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_MICROSOFT_LOCATION, null)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_MICROSOFT_KEY, null)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_AMAZON_REGION, null)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_AMAZON_ACCESS_KEY, null)
|
||||
ProjectSettings.set_setting(SETTINGS_SAVE_AUTH_AMAZON_SECRET_KEY, null)
|
||||
ProjectSettings.save()
|
||||
|
||||
func _update_view() -> void:
|
||||
_init_from_language_ui()
|
||||
_check_translate_ui_selected()
|
||||
|
||||
func _init_from_language_ui() -> void:
|
||||
_from_language_ui.clear()
|
||||
if not _from_language_ui.is_connected("selection_changed", _check_translate_ui):
|
||||
assert(_from_language_ui.connect("selection_changed", _check_translate_ui) == OK)
|
||||
for loc in _data.locales():
|
||||
var label = Locales.label_by_code(loc)
|
||||
if label != null and not label.is_empty():
|
||||
_from_language_ui.add_item(DropdownItem.new(loc, label))
|
||||
|
||||
func _init_to_language_ui(locales: Dictionary) -> void:
|
||||
_to_language_ui.clear()
|
||||
if not _to_language_ui.is_connected("selection_changed", _check_translate_ui):
|
||||
assert(_to_language_ui.connect("selection_changed", _check_translate_ui) == OK)
|
||||
for locale in locales:
|
||||
if Locales.has_code(locale):
|
||||
_to_language_ui.add_item(DropdownItem.new(locale, Locales.label_by_code(locale)))
|
||||
|
||||
func _check_translate_ui(_item: DropdownItem) -> void:
|
||||
_check_translate_ui_selected()
|
||||
|
||||
func _check_translate_ui_selected() -> void:
|
||||
if _translator.selected != -1:
|
||||
_on_translator_selected(_translator.selected)
|
||||
_check_translate_ui_disabled()
|
||||
|
||||
func _check_translate_ui_disabled() -> void:
|
||||
_translate_ui.set_disabled(_from_language_ui.get_selected_index() == -1 or _to_language_ui.get_selected_index() == -1)
|
||||
|
||||
func _on_translator_selection_changed(index: int) -> void:
|
||||
_to_language_ui.clear_selection()
|
||||
_on_translator_selected(index)
|
||||
_update_auth_settings()
|
||||
|
||||
func _on_translator_selected(index: int) -> void:
|
||||
_deepl_container.hide()
|
||||
_amazon_container.hide()
|
||||
_microsoft_container.hide()
|
||||
_check_translate_ui_disabled()
|
||||
match index:
|
||||
0:
|
||||
_link.text = "https://translate.google.com/"
|
||||
_init_to_language_ui(LocalizationAutoTranslateGoogle.LOCALES)
|
||||
1:
|
||||
_link.text = "https://yandex.com/dev/translate/"
|
||||
_init_to_language_ui(LocalizationAutoTranslateYandex.LOCALES)
|
||||
2:
|
||||
_link.text = "https://www.deepl.com/translator"
|
||||
_init_to_language_ui(LocalizationAutoTranslateDeepL.LOCALES)
|
||||
_deepl_container.show()
|
||||
3:
|
||||
_link.text = "https://aws.amazon.com/translate/"
|
||||
_init_to_language_ui(LocalizationAutoTranslateAmazon.LOCALES)
|
||||
_amazon_container.show()
|
||||
4:
|
||||
_link.text = "https://translator.microsoft.com/"
|
||||
_init_to_language_ui(LocalizationAutoTranslateMicrosoft.LOCALES)
|
||||
_microsoft_container.show()
|
||||
|
||||
func _on_link_pressed() -> void:
|
||||
OS.shell_open(_link.text)
|
||||
|
||||
func _on_translate_pressed() -> void:
|
||||
_from_code = _from_language_ui.get_selected_value()
|
||||
_from_code = _from_code.to_lower()
|
||||
_to_code = _to_language_ui.get_selected_value()
|
||||
_to_code = _to_code.to_lower()
|
||||
_translate()
|
||||
|
||||
func _translate() -> void:
|
||||
_data_keys = _data.keys().duplicate()
|
||||
var from_translation = _data.translation_by_locale(_data_keys[0], _from_code)
|
||||
var to_translation = _data.translation_by_locale(_data_keys[0], _to_code)
|
||||
_translate_ui.disabled = true
|
||||
_progress_ui.max_value = _data.keys().size()
|
||||
if not _data.locales().has(_to_code):
|
||||
_data.add_locale(_to_code, false)
|
||||
_create_requests()
|
||||
|
||||
func _create_requests() -> void:
|
||||
var space = IP.RESOLVER_MAX_QUERIES - _queries_count
|
||||
for index in range(space):
|
||||
if _data_keys.size() <= 0:
|
||||
return
|
||||
var from_translation = _data.translation_by_locale(_data_keys[0], _from_code)
|
||||
var to_translation = _data.translation_by_locale(_data_keys[0], _to_code)
|
||||
if from_translation != null and not from_translation.value.is_empty() and (to_translation.value == null or to_translation.value.is_empty()):
|
||||
match _translator.selected:
|
||||
0:
|
||||
_create_request_google(from_translation, to_translation)
|
||||
1:
|
||||
_create_request_yandex(from_translation, to_translation)
|
||||
2:
|
||||
_create_request_deepl(from_translation, to_translation)
|
||||
3:
|
||||
_create_request_amazon(from_translation, to_translation)
|
||||
4:
|
||||
_create_request_microsoft(from_translation, to_translation)
|
||||
else:
|
||||
_add_progress()
|
||||
_data_keys.remove_at(0)
|
||||
_queries_count += 1
|
||||
|
||||
# *** GOOGLE IMPLEMENTATION START ***
|
||||
func _create_request_google(from_translation, to_translation) -> void:
|
||||
var url = _create_url_google(from_translation, to_translation)
|
||||
var http_request = HTTPRequest.new()
|
||||
http_request.timeout = 5
|
||||
add_child(http_request)
|
||||
assert(http_request.request_completed.connect(_http_request_completed_google.bind(http_request, to_translation)) == OK)
|
||||
http_request.request(url, [], HTTPClient.Method.METHOD_GET)
|
||||
|
||||
func _create_url_google(from_translation, to_translation) -> String:
|
||||
var url = "https://translate.googleapis.com/translate_a/single?client=gtx"
|
||||
url += "&sl=" + from_translation.locale
|
||||
url += "&tl=" + to_translation.locale
|
||||
url += "&dt=t"
|
||||
url += "&q=" + from_translation.value.uri_encode()
|
||||
return url
|
||||
|
||||
func _http_request_completed_google(result, response_code, headers, body, http_request, to_translation):
|
||||
var json = JSON.new()
|
||||
var result_body := json.parse(body.get_string_from_utf8())
|
||||
if json.get_data() != null:
|
||||
var value = ""
|
||||
for index in range(json.get_data()[0].size()):
|
||||
if index == 0:
|
||||
value = json.get_data()[0][index][0]
|
||||
else:
|
||||
value += " " + json.get_data()[0][index][0]
|
||||
to_translation.value = value
|
||||
_add_progress()
|
||||
remove_child(http_request)
|
||||
_queries_count -= 1
|
||||
_create_requests()
|
||||
# *** GOOGLE IMPLEMENTATION END ***
|
||||
|
||||
# *** YANDEX IMPLEMENTATION START ***
|
||||
func _create_request_yandex(from_translation, to_translation) -> void:
|
||||
push_error("YANDEX IMPLEMENTATION NOT SUPPORTED YET")
|
||||
return
|
||||
# *** YANDEX IMPLEMENTATION END ***
|
||||
|
||||
# *** DEEPL IMPLEMENTATION START ***
|
||||
func _create_request_deepl(from_translation, to_translation) -> void:
|
||||
var key = _deepl_key.text
|
||||
var text = "text=" + from_translation.value.uri_encode() + "&target_lang=" + to_translation.locale
|
||||
var url = "https://api-free.deepl.com/v2/translate"
|
||||
var http_request = HTTPRequest.new()
|
||||
http_request.timeout = 5
|
||||
add_child(http_request)
|
||||
assert(http_request.request_completed.connect(_http_request_completed_deepl.bind(http_request, from_translation, to_translation)) == OK)
|
||||
var custom_headers = [
|
||||
"Host: api-free.deepl.com",
|
||||
"Authorization: DeepL-Auth-Key " + key,
|
||||
"User-Agent: YourApp/1.2.3",
|
||||
"Content-Length: " + str(text.length()),
|
||||
"Content-Type: application/x-www-form-urlencoded"
|
||||
]
|
||||
http_request.request(url, custom_headers, HTTPClient.Method.METHOD_POST, text)
|
||||
|
||||
func _http_request_completed_deepl(result, response_code, headers, body: PackedByteArray, http_request, from_translation, to_translation):
|
||||
var json = JSON.new()
|
||||
var result_body := json.parse(body.get_string_from_utf8())
|
||||
if json.get_data() != null:
|
||||
if not json.get_data().has("translations"):
|
||||
push_error("FROM: ", from_translation.value, " => ", body.get_string_from_utf8())
|
||||
to_translation.value = json.get_data().translations[0].text
|
||||
_add_progress()
|
||||
remove_child(http_request)
|
||||
_queries_count -= 1
|
||||
_create_requests()
|
||||
# *** DEEPL IMPLEMENTATION END ***
|
||||
|
||||
# *** AMAZON IMPLEMENTATION START ***
|
||||
func _create_request_amazon(from_translation, to_translation) -> void:
|
||||
var method = "POST"
|
||||
var service = "translate"
|
||||
var region = "us-east-2"
|
||||
match _amazon_region.selected:
|
||||
1:
|
||||
region = "us-east-1"
|
||||
2:
|
||||
region = "us-west-1"
|
||||
3:
|
||||
region = "us-west-2"
|
||||
4:
|
||||
region = "ap-east-1"
|
||||
5:
|
||||
region = "ap-south-1"
|
||||
6:
|
||||
region = "ap-northeast-2"
|
||||
7:
|
||||
region = "ap-southeast-1"
|
||||
8:
|
||||
region = "ap-southeast-2"
|
||||
9:
|
||||
region = "ap-northeast-1"
|
||||
10:
|
||||
region = "ca-central-1"
|
||||
11:
|
||||
region = "eu-central-1"
|
||||
12:
|
||||
region = "eu-west-1"
|
||||
13:
|
||||
region = "eu-west-2"
|
||||
14:
|
||||
region = "eu-west-3"
|
||||
15:
|
||||
region = "eu-north-1"
|
||||
16:
|
||||
region = "us-gov-west-1"
|
||||
var host = service + "." + region + ".amazonaws.com"
|
||||
var endpoint = "https://" + host + "/"
|
||||
var content_type = "application/x-amz-json-1.1"
|
||||
var amz_target = "AWSShineFrontendService_20170701.TranslateText"
|
||||
|
||||
var request_parameters = '{'
|
||||
request_parameters += '"Text": "' + from_translation.value + '",'
|
||||
request_parameters += '"SourceLanguageCode": "' + from_translation.locale + '",'
|
||||
request_parameters += '"TargetLanguageCode": "' + to_translation.locale + '"'
|
||||
request_parameters += '}'
|
||||
|
||||
# https://us-east-1.console.aws.amazon.com/iam/
|
||||
var access_key = _amazon_access_key.text
|
||||
var secret_key = _amazon_secret_key.text
|
||||
|
||||
var amz_date = Time.get_datetime_string_from_system(true).replace("-", "").replace(":", "") + "Z"
|
||||
var date_stamp = Time.get_date_string_from_system(true).replace("-", "")
|
||||
var canonical_uri = "/"
|
||||
var canonical_querystring = ""
|
||||
var canonical_headers = "content-type:" + content_type + "\n" + "host:" + host + "\n" + "x-amz-date:" + amz_date + "\n" + "x-amz-target:" + amz_target + "\n"
|
||||
var signed_headers = "content-type;host;x-amz-date;x-amz-target"
|
||||
|
||||
var payload_hash = request_parameters.sha256_text()
|
||||
var canonical_request = method + "\n" + canonical_uri + "\n" + canonical_querystring + "\n" + canonical_headers + "\n" + signed_headers + "\n" + payload_hash
|
||||
var algorithm = "AWS4-HMAC-SHA256"
|
||||
var credential_scope = date_stamp + "/" + region + "/" + service + "/" + "aws4_request"
|
||||
var string_to_sign = algorithm + "\n" + amz_date + "\n" + credential_scope + "\n" + canonical_request.sha256_text()
|
||||
|
||||
var signing_key = getSignatureKey(secret_key, date_stamp, region, service)
|
||||
var signature = signing_hex(signing_key, string_to_sign)
|
||||
var authorization_header = algorithm + " " + "Credential=" + access_key + "/" + credential_scope + ", " + "SignedHeaders=" + signed_headers + ", " + "Signature=" + signature
|
||||
|
||||
var http_request = HTTPRequest.new()
|
||||
http_request.timeout = 5
|
||||
add_child(http_request)
|
||||
assert(http_request.request_completed.connect(_http_request_completed_amazon.bind(http_request, from_translation, to_translation)) == OK)
|
||||
var headers = [
|
||||
"Content-type: application/x-amz-json-1.1",
|
||||
"X-Amz-Date: " + amz_date,
|
||||
"X-Amz-Target: " + amz_target,
|
||||
"Authorization: " + authorization_header
|
||||
]
|
||||
var error = http_request.request(endpoint, headers, HTTPClient.Method.METHOD_POST, request_parameters)
|
||||
|
||||
func getSignatureKey(key, dateStamp, regionName, serviceName):
|
||||
var kDate = signing(("AWS4" + key).to_utf8_buffer(), dateStamp)
|
||||
var kRegion = signing(kDate, regionName)
|
||||
var kService = signing(kRegion, serviceName)
|
||||
return signing(kService, "aws4_request")
|
||||
|
||||
func signing(key: PackedByteArray, msg: String):
|
||||
assert(ctx.start(HashingContext.HASH_SHA256, key) == OK)
|
||||
assert(ctx.update(msg.to_utf8_buffer()) == OK)
|
||||
var hmac = ctx.finish()
|
||||
return hmac
|
||||
|
||||
func signing_hex(key: PackedByteArray, msg: String) -> String:
|
||||
assert(ctx.start(HashingContext.HASH_SHA256, key) == OK)
|
||||
assert(ctx.update(msg.to_utf8_buffer()) == OK)
|
||||
var hmac = ctx.finish()
|
||||
return hmac.hex_encode()
|
||||
|
||||
func _http_request_completed_amazon(result, response_code, headers, body: PackedByteArray, http_request, from_translation, to_translation):
|
||||
var json = JSON.new()
|
||||
var result_body := json.parse(body.get_string_from_utf8())
|
||||
if json.get_data() != null:
|
||||
if not json.get_data().has("TranslatedText"):
|
||||
push_error("FROM: ", from_translation.value, " => ", body.get_string_from_utf8())
|
||||
to_translation.value = json.get_data().TranslatedText
|
||||
_add_progress()
|
||||
remove_child(http_request)
|
||||
_queries_count -= 1
|
||||
_create_requests()
|
||||
|
||||
# *** AMAZON IMPLEMENTATION END ***
|
||||
|
||||
# *** MICROSOFT IMPLEMENTATION START ***
|
||||
func _create_request_microsoft(from_translation, to_translation) -> void:
|
||||
var key = _microsoft_key.text
|
||||
var location = _microsoft_location.text
|
||||
var endpoint = "https://api.cognitive.microsofttranslator.com"
|
||||
match _microsoft_url.selected:
|
||||
1:
|
||||
endpoint = "https://api-apc.congnitive.microsofttranslator.com"
|
||||
2:
|
||||
endpoint = "https://api-eur.congnitive.microsofttranslator.com"
|
||||
3:
|
||||
endpoint = "https://api-nam.congnitive.microsofttranslator.com"
|
||||
var route = "/translate?api-version=3.0&from=en&to=ru"
|
||||
var http_request = HTTPRequest.new()
|
||||
http_request.timeout = 5
|
||||
add_child(http_request)
|
||||
assert(http_request.request_completed.connect(_http_request_completed_microsoft.bind(http_request, from_translation, to_translation)) == OK)
|
||||
var custom_headers = [
|
||||
"Ocp-Apim-Subscription-Key: " + key,
|
||||
"Ocp-Apim-Subscription-Region: " + location,
|
||||
"Content-type: application/json",
|
||||
"X-ClientTraceId: " + uuid_gen.v4()
|
||||
]
|
||||
var url = endpoint + route
|
||||
var body = JSON.stringify([{"Text": from_translation.value}])
|
||||
var error = http_request.request(url, custom_headers, HTTPClient.Method.METHOD_POST, body)
|
||||
|
||||
func _http_request_completed_microsoft(result, response_code, headers, body: PackedByteArray, http_request, from_translation, to_translation):
|
||||
var json = JSON.new()
|
||||
var result_body := json.parse(body.get_string_from_utf8())
|
||||
if json.get_data() != null:
|
||||
if not json.get_data()[0].has("translations"):
|
||||
push_error("FROM: ", from_translation.value, " => ", body.get_string_from_utf8())
|
||||
to_translation.value = json.get_data()[0].translations[0].text
|
||||
_add_progress()
|
||||
remove_child(http_request)
|
||||
_queries_count -= 1
|
||||
_create_requests()
|
||||
# *** MICROSOFT IMPLEMENTATION END ***
|
||||
|
||||
func _add_progress() -> void:
|
||||
_progress_ui.value = _progress_ui.value + 1
|
||||
_check_progress()
|
||||
|
||||
func _check_progress() -> void:
|
||||
if _progress_ui.value == _data.keys().size():
|
||||
_data.emit_signal_data_changed()
|
||||
_translate_ui.disabled = false
|
||||
_progress_ui.value = 0
|
||||
|
|
@ -0,0 +1 @@
|
|||
uid://drvspmt3mjcbe
|
||||
|
|
@ -0,0 +1,236 @@
|
|||
[gd_scene load_steps=8 format=3 uid="uid://bssdhtctthadv"]
|
||||
|
||||
[ext_resource type="Script" path="res://addons/localization_editor/scenes/auto_translate/translator/LocalizationAutoTranslate.gd" id="1_cuqef"]
|
||||
[ext_resource type="Texture2D" uid="uid://byv22srd37niw" path="res://addons/localization_editor/icons/Google.png" id="2_l1peq"]
|
||||
[ext_resource type="Texture2D" uid="uid://chlw8bdg84q1m" path="res://addons/localization_editor/icons/Yandex.png" id="3_ul6cn"]
|
||||
[ext_resource type="Texture2D" uid="uid://c24qna6n2q27l" path="res://addons/localization_editor/icons/DeepL.png" id="4_142cw"]
|
||||
[ext_resource type="Texture2D" uid="uid://cfu2uuf8hh0c" path="res://addons/localization_editor/icons/Amazon.png" id="5_0oig7"]
|
||||
[ext_resource type="Texture2D" uid="uid://dekewvpr4ic2c" path="res://addons/localization_editor/icons/Microsoft.png" id="6_tal6j"]
|
||||
[ext_resource type="PackedScene" path="res://addons/ui_extensions/dropdown/Dropdown.tscn" id="7_jsbqb"]
|
||||
|
||||
[node name="LocalizationAutotranslateGoogle" type="MarginContainer"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
size_flags_horizontal = 3
|
||||
script = ExtResource("1_cuqef")
|
||||
|
||||
[node name="Panel" type="Panel" parent="."]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
size_flags_vertical = 3
|
||||
|
||||
[node name="VBox" type="VBoxContainer" parent="Panel"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
|
||||
[node name="HBoxTranslator" type="HBoxContainer" parent="Panel/VBox"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="Panel/VBox/HBoxTranslator"]
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
text = "Translator"
|
||||
|
||||
[node name="Translator" type="OptionButton" parent="Panel/VBox/HBoxTranslator"]
|
||||
layout_mode = 2
|
||||
tooltip_text = "Select translation engine"
|
||||
item_count = 5
|
||||
selected = 0
|
||||
popup/item_0/text = ""
|
||||
popup/item_0/icon = ExtResource("2_l1peq")
|
||||
popup/item_0/id = 0
|
||||
popup/item_1/text = ""
|
||||
popup/item_1/icon = ExtResource("3_ul6cn")
|
||||
popup/item_1/id = 1
|
||||
popup/item_1/disabled = true
|
||||
popup/item_2/text = ""
|
||||
popup/item_2/icon = ExtResource("4_142cw")
|
||||
popup/item_2/id = 2
|
||||
popup/item_3/text = ""
|
||||
popup/item_3/icon = ExtResource("5_0oig7")
|
||||
popup/item_3/id = 3
|
||||
popup/item_4/text = ""
|
||||
popup/item_4/icon = ExtResource("6_tal6j")
|
||||
popup/item_4/id = 4
|
||||
|
||||
[node name="LinkButton" type="LinkButton" parent="Panel/VBox/HBoxTranslator"]
|
||||
layout_mode = 2
|
||||
text = "https://translate.google.com/"
|
||||
|
||||
[node name="SaveAuth" type="CheckBox" parent="Panel/VBox/HBoxTranslator"]
|
||||
layout_mode = 2
|
||||
text = "Save Authentication Data"
|
||||
|
||||
[node name="HBoxMicrosoft" type="HBoxContainer" parent="Panel/VBox"]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
|
||||
[node name="LabelURL" type="Label" parent="Panel/VBox/HBoxMicrosoft"]
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
text = "Base URL:
|
||||
"
|
||||
|
||||
[node name="URL" type="OptionButton" parent="Panel/VBox/HBoxMicrosoft"]
|
||||
layout_mode = 2
|
||||
tooltip_text = "Select BAse-URL for translation service"
|
||||
item_count = 4
|
||||
selected = 0
|
||||
popup/item_0/text = "GLOBAL | api.cognitive.microsofttranslator.com"
|
||||
popup/item_0/id = 0
|
||||
popup/item_1/text = "ASIA PACIFIC | api-apc.congnitive.microsofttranslator.com"
|
||||
popup/item_1/id = 1
|
||||
popup/item_2/text = "EUROPE | api-eur.congnitive.microsofttranslator.com"
|
||||
popup/item_2/id = 2
|
||||
popup/item_3/text = "UNITED STATES | api-nam.congnitive.microsofttranslator.com"
|
||||
popup/item_3/id = 3
|
||||
|
||||
[node name="LabelLocation" type="Label" parent="Panel/VBox/HBoxMicrosoft"]
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
text = "Location:"
|
||||
|
||||
[node name="Location" type="LineEdit" parent="Panel/VBox/HBoxMicrosoft"]
|
||||
custom_minimum_size = Vector2(160, 0)
|
||||
layout_mode = 2
|
||||
tooltip_text = "Location/Region for translation service"
|
||||
|
||||
[node name="LabelKey" type="Label" parent="Panel/VBox/HBoxMicrosoft"]
|
||||
custom_minimum_size = Vector2(50, 0)
|
||||
layout_mode = 2
|
||||
text = "Key:"
|
||||
|
||||
[node name="Key" type="LineEdit" parent="Panel/VBox/HBoxMicrosoft"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
tooltip_text = "Insert Ocp-Apim-Subscription-Key for authorisation"
|
||||
secret = true
|
||||
|
||||
[node name="VBoxAWS" type="VBoxContainer" parent="Panel/VBox"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="HBoxRegion" type="HBoxContainer" parent="Panel/VBox/VBoxAWS"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="LabelRegion" type="Label" parent="Panel/VBox/VBoxAWS/HBoxRegion"]
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
text = "Region:"
|
||||
|
||||
[node name="Region" type="OptionButton" parent="Panel/VBox/VBoxAWS/HBoxRegion"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
tooltip_text = "Select BAse-URL for translation service"
|
||||
item_count = 17
|
||||
popup/item_0/text = "US East (Ohio) | translate.us-east-2.amazonaws.com"
|
||||
popup/item_0/id = 0
|
||||
popup/item_1/text = "US East (N. Virginia) | translate.us-east-1.amazonaws.com"
|
||||
popup/item_1/id = 1
|
||||
popup/item_2/text = "US West (N. California) | translate.us-west-1.amazonaws.com"
|
||||
popup/item_2/id = 2
|
||||
popup/item_3/text = "US West (Oregon) | translate.us-west-2.amazonaws.com"
|
||||
popup/item_3/id = 3
|
||||
popup/item_4/text = "Asia Pacific (Hong Kong) | translate.ap-east-1.amazonaws.com"
|
||||
popup/item_4/id = 4
|
||||
popup/item_5/text = "Asia Pacific (Mumbai) | translate.ap-south-1.amazonaws.com"
|
||||
popup/item_5/id = 5
|
||||
popup/item_6/text = "Asia Pacific (Seoul) | translate.ap-northeast-2.amazonaws.com"
|
||||
popup/item_6/id = 6
|
||||
popup/item_7/text = "Asia Pacific (Singapore) | translate.ap-southeast-1.amazonaws.com"
|
||||
popup/item_7/id = 7
|
||||
popup/item_8/text = "Asia Pacific (Sydney) | translate.ap-southeast-2.amazonaws.com"
|
||||
popup/item_8/id = 8
|
||||
popup/item_9/text = "Asia Pacific (Tokyo) | translate.ap-northeast-1.amazonaws.com"
|
||||
popup/item_9/id = 9
|
||||
popup/item_10/text = "Canada (Central) | translate.ca-central-1.amazonaws.com"
|
||||
popup/item_10/id = 10
|
||||
popup/item_11/text = "Europe (Frankfurt) | translate.eu-central-1.amazonaws.com"
|
||||
popup/item_11/id = 11
|
||||
popup/item_12/text = "Europe (Ireland) | translate.eu-west-1.amazonaws.com"
|
||||
popup/item_12/id = 12
|
||||
popup/item_13/text = "Europe (London) | translate.eu-west-2.amazonaws.com"
|
||||
popup/item_13/id = 13
|
||||
popup/item_14/text = "Europe (Paris) | translate.eu-west-3.amazonaws.com"
|
||||
popup/item_14/id = 14
|
||||
popup/item_15/text = "Europe (Stockholm) | translate.eu-north-1.amazonaws.com"
|
||||
popup/item_15/id = 15
|
||||
popup/item_16/text = "AWS GovCloud (US-West) | translate.us-gov-west-1.amazonaws.com"
|
||||
popup/item_16/id = 16
|
||||
|
||||
[node name="HBoxAccessKey" type="HBoxContainer" parent="Panel/VBox/VBoxAWS"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="LabelAccessKey" type="Label" parent="Panel/VBox/VBoxAWS/HBoxAccessKey"]
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
text = "AccessKey:"
|
||||
|
||||
[node name="AccessKey" type="LineEdit" parent="Panel/VBox/VBoxAWS/HBoxAccessKey"]
|
||||
custom_minimum_size = Vector2(160, 0)
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
tooltip_text = "Location/Region for translation service"
|
||||
secret = true
|
||||
|
||||
[node name="HBoxSecretKey" type="HBoxContainer" parent="Panel/VBox/VBoxAWS"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="LabelSecretKey" type="Label" parent="Panel/VBox/VBoxAWS/HBoxSecretKey"]
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
text = "SecretKey:"
|
||||
|
||||
[node name="SecretKey" type="LineEdit" parent="Panel/VBox/VBoxAWS/HBoxSecretKey"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
tooltip_text = "Insert Ocp-Apim-Subscription-Key for authorisation"
|
||||
secret = true
|
||||
|
||||
[node name="HBoxDeepL" type="HBoxContainer" parent="Panel/VBox"]
|
||||
visible = false
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="Panel/VBox/HBoxDeepL"]
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
text = "Key:"
|
||||
|
||||
[node name="DeepLKey" type="LineEdit" parent="Panel/VBox/HBoxDeepL"]
|
||||
layout_mode = 2
|
||||
size_flags_horizontal = 3
|
||||
tooltip_text = "Insert DeepL-Auth-Key for authorisation"
|
||||
secret = true
|
||||
|
||||
[node name="HBox" type="HBoxContainer" parent="Panel/VBox"]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="From" type="Label" parent="Panel/VBox/HBox"]
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
text = "From:"
|
||||
|
||||
[node name="FromLanguage" parent="Panel/VBox/HBox" instance=ExtResource("7_jsbqb")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="To" type="Label" parent="Panel/VBox/HBox"]
|
||||
custom_minimum_size = Vector2(100, 0)
|
||||
layout_mode = 2
|
||||
text = "To:"
|
||||
|
||||
[node name="ToLanguage" parent="Panel/VBox/HBox" instance=ExtResource("7_jsbqb")]
|
||||
layout_mode = 2
|
||||
|
||||
[node name="Translate" type="Button" parent="Panel/VBox/HBox"]
|
||||
layout_mode = 2
|
||||
disabled = true
|
||||
text = "Translate"
|
||||
|
||||
[node name="Progress" type="ProgressBar" parent="Panel/VBox"]
|
||||
layout_mode = 2
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
# List of locales supported by Amazon translator for LocalizationEditor : MIT License
|
||||
# @author Vladimir Petrenko
|
||||
# @see https://aws.amazon.com/translate/
|
||||
class_name LocalizationAutoTranslateAmazon
|
||||
|
||||
const LOCALES = {
|
||||
"af": "Afrikaans",
|
||||
"sq": "Albanian",
|
||||
"am": "Amharic",
|
||||
"ar": "Arabic",
|
||||
"hy": "Armenian",
|
||||
"az": "Azerbaijani",
|
||||
"bn": "Bengali",
|
||||
"bs": "Bosnian",
|
||||
"bg": "Bulgarian",
|
||||
"ca": "Catalan",
|
||||
"zh": "Chinese (Simplified)",
|
||||
"zh-TW": "Chinese (Traditional)",
|
||||
"hr": "Croatian",
|
||||
"cs": "Czech",
|
||||
"da": "Danish",
|
||||
"fa-AF": "Dari",
|
||||
"nl": "Dutch",
|
||||
"en": "English",
|
||||
"et": "Estonian",
|
||||
"fa": "Farsi (Persian)",
|
||||
"tl": "Filipino, Tagalog",
|
||||
"fi": "Finnish",
|
||||
"fr": "French",
|
||||
"fr-CA": "French (Canada)",
|
||||
"ka": "Georgian",
|
||||
"de": "German",
|
||||
"el": "Greek",
|
||||
"gu": "Gujarati",
|
||||
"ht": "Haitian Creole",
|
||||
"ha": "Hausa",
|
||||
"he": "Hebrew",
|
||||
"hi": "Hindi",
|
||||
"hu": "Hungarian",
|
||||
"is": "Icelandic",
|
||||
"id": "Indonesian",
|
||||
"ga": "Irish",
|
||||
"it": "Italian",
|
||||
"ja": "Japanese",
|
||||
"kn": "Kannada",
|
||||
"kk": "Kazakh",
|
||||
"ko": "Korean",
|
||||
"lv": "Latvian",
|
||||
"lt": "Lithuanian",
|
||||
"mk": "Macedonian",
|
||||
"ms": "Malay",
|
||||
"ml": "Malayalam",
|
||||
"mt": "Maltese",
|
||||
"mr": "Marathi",
|
||||
"mn": "Mongolian",
|
||||
"no": "Norwegian (Bokmål)",
|
||||
"ps": "Pashto",
|
||||
"pl": "Polish",
|
||||
"pt": "Portuguese (Brazil)",
|
||||
"pt-PT": "Portuguese (Portugal)",
|
||||
"pa": "Punjabi",
|
||||
"ro": "Romanian",
|
||||
"ru": "Russian",
|
||||
"sr": "Serbian",
|
||||
"si": "Sinhala",
|
||||
"sk": "Slovak",
|
||||
"sl": "Slovenian",
|
||||
"so": "Somali",
|
||||
"es": "Spanish",
|
||||
"es-MX": "Spanish (Mexico)",
|
||||
"sw": "Swahili",
|
||||
"sv": "Swedish",
|
||||
"ta": "Tamil",
|
||||
"te": "Telugu",
|
||||
"th": "Thai",
|
||||
"tr": "Turkish",
|
||||
"uk": "Ukrainian",
|
||||
"ur": "Urdu",
|
||||
"uz": "Uzbek",
|
||||
"vi": "Vietnamese",
|
||||
"cy": "Welsh"
|
||||
}
|
||||
|
||||
static func label_by_code(code: String) -> String:
|
||||
if LOCALES.has(code.to_lower()):
|
||||
return code + " " + LOCALES[code.to_lower()]
|
||||
return ""
|
||||
|
|
@ -0,0 +1 @@
|
|||
uid://dwj6srgm447ko
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
# List of locales supported by DeepL translator for LocalizationEditor : MIT License
|
||||
# @author Vladimir Petrenko
|
||||
# @see https://www.deepl.com/docs-api/translate-text/translate-text/
|
||||
class_name LocalizationAutoTranslateDeepL
|
||||
|
||||
const LOCALES = {
|
||||
"BG": "Bulgarian",
|
||||
"CS": "Czech",
|
||||
"DA": "Danish",
|
||||
"DE": "German",
|
||||
"EL": "Greek",
|
||||
"EN-GB": "English (British)",
|
||||
"EN-US": "English (American)",
|
||||
"ES": "Spanish",
|
||||
"ET": "Estonian",
|
||||
"FI": "Finnish",
|
||||
"FR": "French",
|
||||
"HU": "Hungarian",
|
||||
"ID": "Indonesian",
|
||||
"IT": "Italian",
|
||||
"JA": "Japanese",
|
||||
"LT": "Lithuanian",
|
||||
"LV": "Latvian",
|
||||
"NL": "Dutch",
|
||||
"PL": "Polish",
|
||||
"PT-BR": "Portuguese (Brazilian)",
|
||||
"PT-PT": "Portuguese (all Portuguese varieties excluding Brazilian Portuguese)",
|
||||
"RO": "Romanian",
|
||||
"RU": "Russian",
|
||||
"SK": "Slovak",
|
||||
"SL": "Slovenian",
|
||||
"SV": "Swedish",
|
||||
"TR": "Turkish",
|
||||
"UK": "Ukrainian",
|
||||
"ZH": "Chinese (simplified)"
|
||||
}
|
||||
|
||||
static func label_by_code(code: String) -> String:
|
||||
if LOCALES.has(code.to_lower()):
|
||||
return code + " " + LOCALES[code.to_lower()]
|
||||
return ""
|
||||
|
|
@ -0,0 +1 @@
|
|||
uid://btouwcoi8yik5
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
# List of locales supported by Google translator for LocalizationEditor : MIT License
|
||||
# @author Vladimir Petrenko
|
||||
# @see https://cloud.google.com/translate/docs/languages
|
||||
class_name LocalizationAutoTranslateGoogle
|
||||
|
||||
const LOCALES = {
|
||||
"af": "Afrikaans",
|
||||
"sq": "Albanian",
|
||||
"am": "Amharic",
|
||||
"ar": "Arabic",
|
||||
"hy": "Armenian",
|
||||
"az": "Azerbaijani",
|
||||
"eu": "Basque",
|
||||
"be": "Belarusian",
|
||||
"bn": "Bengali",
|
||||
"bs": "Bosnian",
|
||||
"bg": "Bulgarian",
|
||||
"ca": "Catalan",
|
||||
"ceb": "Cebuano",
|
||||
"zh": "Chinese (Simplified)",
|
||||
"zh-TW": "Chinese (Traditional)",
|
||||
"co": "Corsican",
|
||||
"hr": "Croatian",
|
||||
"cs": "Czech",
|
||||
"da": "Danish",
|
||||
"nl": "Dutch",
|
||||
"en": "English",
|
||||
"eo": "Esperanto",
|
||||
"et": "Estonian",
|
||||
"fi": "Finnish",
|
||||
"fr": "French",
|
||||
"fy": "Frisian",
|
||||
"gl": "Galician",
|
||||
"ka": "Georgian",
|
||||
"de": "German",
|
||||
"el": "Greek",
|
||||
"gu": "Gujarati",
|
||||
"ht": "Haitian Creole",
|
||||
"ha": "Hausa",
|
||||
"haw": "Hawaiian",
|
||||
"he": "Hebrew",
|
||||
"iw": "Hebrew",
|
||||
"hi": "Hindi",
|
||||
"hmn": "Hmong",
|
||||
"hu": "Hungarian",
|
||||
"is": "Icelandic",
|
||||
"ig": "Igbo",
|
||||
"id": "Indonesian",
|
||||
"ga": "Irish",
|
||||
"it": "Italian",
|
||||
"ja": "Japanese",
|
||||
"jv": "Javanese",
|
||||
"kn": "Kannada",
|
||||
"kk": "Kazakh",
|
||||
"km": "Khmer",
|
||||
"rw": "Kinyarwanda",
|
||||
"ko": "Korean",
|
||||
"ku": "Kurdish",
|
||||
"ky": "Kyrgyz",
|
||||
"lo": "Lao",
|
||||
"la": "Latin",
|
||||
"lv": "Latvian",
|
||||
"lt": "Lithuanian",
|
||||
"lb": "Luxembourgish",
|
||||
"mk": "Macedonian",
|
||||
"mg": "Malagasy",
|
||||
"ms": "Malay",
|
||||
"ml": "Malayalam",
|
||||
"mt": "Maltese",
|
||||
"mi": "Maori",
|
||||
"mr": "Marathi",
|
||||
"mn": "Mongolian",
|
||||
"my": "Myanmar (Burmese)",
|
||||
"ne": "Nepali",
|
||||
"no": "Norwegian",
|
||||
"ny": "Nyanja (Chichewa)",
|
||||
"or": "Odia (Oriya)",
|
||||
"ps": "Pashto",
|
||||
"fa": "Persian",
|
||||
"pl": "Polish",
|
||||
"pt": "Portuguese (Portugal, Brazil)",
|
||||
"pa": "Punjabi",
|
||||
"ro": "Romanian",
|
||||
"ru": "Russian",
|
||||
"sm": "Samoan",
|
||||
"gd": "Scots Gaelic",
|
||||
"sr": "Serbian",
|
||||
"st": "Sesotho",
|
||||
"sn": "Shona",
|
||||
"sd": "Sindhi",
|
||||
"si": "Sinhala (Sinhalese)",
|
||||
"sk": "Slovak",
|
||||
"sl": "Slovenian",
|
||||
"so": "Somali",
|
||||
"es": "Spanish",
|
||||
"su": "Sundanese",
|
||||
"sw": "Swahili",
|
||||
"sv": "Swedish",
|
||||
"tl": "Tagalog (Filipino)",
|
||||
"tg": "Tajik",
|
||||
"ta": "Tamil",
|
||||
"tt": "Tatar",
|
||||
"te": "Telugu",
|
||||
"th": "Thai",
|
||||
"tr": "Turkish",
|
||||
"tk": "Turkmen",
|
||||
"uk": "Ukrainian",
|
||||
"ur": "Urdu",
|
||||
"ug": "Uyghur",
|
||||
"uz": "Uzbek",
|
||||
"vi": "Vietnamese",
|
||||
"cy": "Welsh",
|
||||
"xh": "Xhosa",
|
||||
"yi": "Yiddish",
|
||||
"yo": "Yoruba",
|
||||
"zu": "Zulu"
|
||||
}
|
||||
|
||||
static func label_by_code(code: String) -> String:
|
||||
if LOCALES.has(code.to_lower()):
|
||||
return code + " " + LOCALES[code.to_lower()]
|
||||
return ""
|
||||
|
|
@ -0,0 +1 @@
|
|||
uid://cmruim7wjelew
|
||||