From ade2d05a1b83a319ec251b9d448dd0408298bbb8 Mon Sep 17 00:00:00 2001 From: OverloadedOrama <35376950+OverloadedOrama@users.noreply.github.com> Date: Sat, 7 Dec 2019 17:45:48 +0200 Subject: [PATCH] Partial localization support - Greek Language Also added a Preferences window, where the user can change Pixelorama's language. Note that the .csv's delimiter is Tab and not comma. --- Main.tscn | 32 +++++++-- Scripts/Main.gd | 75 +++++++++++++++------- Translations/#Translations.csv | 41 ++++++++++++ Translations/#Translations.csv.import | 16 +++++ Translations/#Translations.el.translation | Bin 0 -> 2416 bytes Translations/#Translations.en.translation | Bin 0 -> 1773 bytes project.godot | 5 ++ 7 files changed, 143 insertions(+), 26 deletions(-) create mode 100644 Translations/#Translations.csv create mode 100644 Translations/#Translations.csv.import create mode 100644 Translations/#Translations.el.translation create mode 100644 Translations/#Translations.en.translation diff --git a/Main.tscn b/Main.tscn index 8fa5b34..4820a9a 100644 --- a/Main.tscn +++ b/Main.tscn @@ -1294,7 +1294,7 @@ margin_bottom = 42.0 margin_top = 5.0 margin_right = 46.0 margin_bottom = 19.0 -text = "Width: " +text = "Width:" [node name="WidthValue" type="SpinBox" parent="CreateNewImage/VBoxContainer/WidthCont"] margin_left = 50.0 @@ -1402,7 +1402,6 @@ margin_right = 200.0 margin_bottom = 114.0 [node name="VBoxContainer" type="VBoxContainer" parent="ScaleImage"] -editor/display_folded = true margin_left = 8.0 margin_top = 8.0 margin_right = 192.0 @@ -1414,7 +1413,6 @@ margin_bottom = 14.0 text = "Image Size" [node name="WidthCont" type="HBoxContainer" parent="ScaleImage/VBoxContainer"] -editor/display_folded = true margin_top = 18.0 margin_right = 184.0 margin_bottom = 42.0 @@ -1423,7 +1421,7 @@ margin_bottom = 42.0 margin_top = 5.0 margin_right = 46.0 margin_bottom = 19.0 -text = "Width: " +text = "Width:" [node name="WidthValue" type="SpinBox" parent="ScaleImage/VBoxContainer/WidthCont"] margin_left = 50.0 @@ -1474,6 +1472,30 @@ text = "Nearest" items = [ "Nearest", null, false, 0, null, "Bilinear", null, false, 1, null, "Cubic", null, false, 2, null, "Trilinear", null, false, 3, null, "Lanczos", null, true, 4, null ] selected = 0 +[node name="PreferencesDialog" type="AcceptDialog" parent="."] +editor/display_folded = true +margin_right = 200.0 +margin_bottom = 70.0 +window_title = "Preferences" + +[node name="LanguageContainer" type="HBoxContainer" parent="PreferencesDialog"] +margin_right = 40.0 +margin_bottom = 40.0 + +[node name="LanguageLabel" type="Label" parent="PreferencesDialog/LanguageContainer"] +margin_top = 12.0 +margin_right = 57.0 +margin_bottom = 27.0 +text = "Language:" + +[node name="LanguageOption" type="OptionButton" parent="PreferencesDialog/LanguageContainer"] +margin_left = 61.0 +margin_right = 142.0 +margin_bottom = 40.0 +text = "English" +items = [ "System Language", null, false, 0, null, "Greek", null, false, 1, null, "English", null, false, 2, null ] +selected = 0 + [node name="AboutDialog" type="AcceptDialog" parent="."] editor/display_folded = true margin_right = 284.0 @@ -1610,6 +1632,8 @@ dialog_text = "Are you sure you want to exit Pixelorama?" [connection signal="popup_hide" from="ExportSprites" to="." method="_can_draw_true"] [connection signal="confirmed" from="ScaleImage" to="." method="_on_ScaleImage_confirmed"] [connection signal="popup_hide" from="ScaleImage" to="." method="_can_draw_true"] +[connection signal="popup_hide" from="PreferencesDialog" to="." method="_can_draw_true"] +[connection signal="item_selected" from="PreferencesDialog/LanguageContainer/LanguageOption" to="." method="_on_LanguageOption_item_selected"] [connection signal="popup_hide" from="AboutDialog" to="." method="_can_draw_true"] [connection signal="pressed" from="AboutDialog/AboutUI/Links/LinkButtons/Website" to="AboutDialog" method="_on_Website_pressed"] [connection signal="pressed" from="AboutDialog/AboutUI/Links/LinkButtons/GitHub" to="AboutDialog" method="_on_GitHub_pressed"] diff --git a/Scripts/Main.gd b/Scripts/Main.gd index 8723dce..145478b 100644 --- a/Scripts/Main.gd +++ b/Scripts/Main.gd @@ -1,6 +1,7 @@ extends Control -var config_cache : ConfigFile = ConfigFile.new() +var config_cache := ConfigFile.new() +var loaded_locales : Array var current_save_path := "" var current_export_path := "" var opensprite_file_selected := false @@ -23,9 +24,25 @@ func _ready() -> void: # This property is only available in 3.2alpha or later, so use `set()` to fail gracefully if it doesn't exist. OS.set("min_window_size", Vector2(1152, 648)) - # Restore the window position/size if values are present in the configuration cache + #Make sure locales are always sorted, in the same order + loaded_locales = TranslationServer.get_loaded_locales() + loaded_locales.sort() + + # Load settings from the config file config_cache.load("user://cache.ini") + # Load language + if config_cache.has_section_key("preferences", "locale"): + var saved_locale : String = config_cache.get_value("preferences", "locale") + TranslationServer.set_locale(saved_locale) + + # Set the language option menu's default selected option to the loaded locale + var locale_index := loaded_locales.find(saved_locale) + $PreferencesDialog/LanguageContainer/LanguageOption.selected = locale_index + 1 + else: # If the user doesn't have a language preference, set it to their OS' locale + TranslationServer.set_locale(OS.get_locale()) + + # Restore the window position/size if values are present in the configuration cache if config_cache.has_section_key("window", "screen"): OS.current_screen = config_cache.get_value("window", "screen") if config_cache.has_section_key("window", "maximized"): @@ -38,32 +55,33 @@ func _ready() -> void: OS.window_size = config_cache.get_value("window", "size") var file_menu_items := { - "New..." : KEY_MASK_CTRL + KEY_N, - "Open..." : KEY_MASK_CTRL + KEY_O, - "Save..." : KEY_MASK_CTRL + KEY_S, - "Save as..." : KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_S, - "Import..." : KEY_MASK_CTRL + KEY_I, - "Export PNG..." : KEY_MASK_CTRL + KEY_E, - "Export PNG as..." : KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_E, - "Quit" : KEY_MASK_CTRL + KEY_Q + tr("New...") : KEY_MASK_CTRL + KEY_N, + tr("Open...") : KEY_MASK_CTRL + KEY_O, + tr("Save...") : KEY_MASK_CTRL + KEY_S, + tr("Save as...") : KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_S, + tr("Import PNG...") : KEY_MASK_CTRL + KEY_I, + tr("Export PNG...") : KEY_MASK_CTRL + KEY_E, + tr("Export PNG as...") : KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_E, + tr("Quit") : KEY_MASK_CTRL + KEY_Q } var edit_menu_items := { - "Undo" : KEY_MASK_CTRL + KEY_Z, - "Redo" : KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_Z, - "Scale Image" : 0, - "Crop Image" : 0, - "Clear Selection" : 0, - "Flip Horizontal": KEY_MASK_SHIFT + KEY_H, - "Flip Vertical": KEY_MASK_SHIFT + KEY_V + tr("Undo") : KEY_MASK_CTRL + KEY_Z, + tr("Redo") : KEY_MASK_SHIFT + KEY_MASK_CTRL + KEY_Z, + tr("Scale Image") : 0, + tr("Crop Image") : 0, + tr("Clear Selection") : 0, + tr("Flip Horizontal") : KEY_MASK_SHIFT + KEY_H, + tr("Flip Vertical") : KEY_MASK_SHIFT + KEY_V, + tr("Preferences") : 0 } var view_menu_items := { - "Tile Mode" : KEY_MASK_CTRL + KEY_T, - "Show Grid" : KEY_MASK_CTRL + KEY_G, - "Show Rulers": KEY_MASK_CTRL + KEY_R, - "Show Guides": KEY_MASK_CTRL + KEY_Y + tr("Tile Mode") : KEY_MASK_CTRL + KEY_T, + tr("Show Grid") : KEY_MASK_CTRL + KEY_G, + tr("Show Rulers") : KEY_MASK_CTRL + KEY_R, + tr("Show Guides") : KEY_MASK_CTRL + KEY_Y } var help_menu_items := { - "About Pixelorama" : 0 + tr("About Pixelorama") : 0 } var file_menu : PopupMenu = Global.file_menu.get_popup() var edit_menu : PopupMenu = Global.edit_menu.get_popup() @@ -259,6 +277,9 @@ func edit_menu_id_pressed(id : int) -> void: canvas.layers[canvas.current_layer_index][0].flip_y() canvas.layers[canvas.current_layer_index][0].lock() canvas.handle_redo("Draw") + 7: #Preferences + $PreferencesDialog.popup_centered() + Global.can_draw = false func view_menu_id_pressed(id : int) -> void: match id: @@ -588,6 +609,15 @@ func _on_ScaleImage_confirmed() -> void: Global.undo_redo.add_do_method(Global, "redo", [Global.canvas]) Global.undo_redo.commit_action() +func _on_LanguageOption_item_selected(ID : int) -> void: + if ID == 0: + TranslationServer.set_locale(OS.get_locale()) + else: + TranslationServer.set_locale(loaded_locales[ID - 1]) + + config_cache.set_value("preferences", "locale", TranslationServer.get_locale()) + config_cache.save("user://cache.ini") + func _on_ImportSprites_popup_hide() -> void: if !opensprite_file_selected: Global.can_draw = true @@ -973,3 +1003,4 @@ func _exit_tree() -> void: config_cache.set_value("window", "position", OS.window_position) config_cache.set_value("window", "size", OS.window_size) config_cache.save("user://cache.ini") + diff --git a/Translations/#Translations.csv b/Translations/#Translations.csv new file mode 100644 index 0000000..c117c30 --- /dev/null +++ b/Translations/#Translations.csv @@ -0,0 +1,41 @@ +id en el +OK OK Εντάξει +Cancel Cancel Άκυρο +Open Open Άνοιγμα +Please Confirm... Please Confirm... Παρακαλώ επιβεβαιώστε... +Width: Width: Πλάτος: +Height: Height: Ύψος: +File File Αρχείο +Edit Edit Επεξεργασία +View View Προβολή +Help Help Βοήθεια +New... New... Νέο... +Open... Open... Άνοιγμα... +Save... Save... Αποθήκευση... +Save as... Save as... Αποθήκευση ως... +Import PNG... Import PNG... Εισαγωγή PNG... +Export PNG... Export PNG... Εξαγωγή PNG... +Export PNG as... Export PNG as... Εξαγωγή PNG ως... +Quit Quit Έξοδος +Undo Undo Αναίρεση +Redo Redo Ακύρωση αναίρεσης +Scale Image Scale Image Κλιμάκωση εικόνας +Crop Image Crop Image Περικοπή +Clear Selection Clear Selection Καθαρισμός επιλογής +Flip Horizontal Flip Horizontal Οριζόντια αναστροφή +Flip Vertical Flip Vertical Κάθετη αναστροφή +Preferences Preferences Προτιμήσεις +Language: Language: Γλώσσα: +System Language System Language Γλώσσα Συστήματος +English English Αγγλικά +Greek Greek Ελληνικά +Tile Mode Tile Mode Λειτουργία μοτίβου +Show Grid Show Grid Εμφάνιση πλέγματος +Show Rulers Show Rulers Εμφάνιση χαράκων +Show Guides Show Guides Εμφάνιση οδηγών +About Pixelorama About Pixelorama Σχετικά με το Pixelorama +Utility Tools Utility Tools Βοηθητικά Εργαλεία +Draw Tools Draw Tools Εργαλεία Ζωγραφικής +Left tool options Left tool options Επιλογές αριστερού εργαλείου +Right tool options Right tool options Επιλογές δεξιού εργαλείου +Layers Layers Στρώσεις \ No newline at end of file diff --git a/Translations/#Translations.csv.import b/Translations/#Translations.csv.import new file mode 100644 index 0000000..5e632a1 --- /dev/null +++ b/Translations/#Translations.csv.import @@ -0,0 +1,16 @@ +[remap] + +importer="csv_translation" +type="Translation" + +[deps] + +files=[ "res://Translations/#Translations.en.translation", "res://Translations/#Translations.el.translation" ] + +source_file="res://Translations/#Translations.csv" +dest_files=[ "res://Translations/#Translations.en.translation", "res://Translations/#Translations.el.translation" ] + +[params] + +compress=true +delimiter=2 diff --git a/Translations/#Translations.el.translation b/Translations/#Translations.el.translation new file mode 100644 index 0000000000000000000000000000000000000000..795e17d90ca5152c56b212b6601fa62ec73b1f41 GIT binary patch literal 2416 zcmbtWU2Kz882&&fL&uaQ{vhhUAR&vB;L^N|o!o`?l!Kmmg-IuP|wM*LxH;z%p zqz0N4nb9%Bbhr@Hb?Zvkb=~#_FBW5#b3zoOS4QK7Awe`6^+xe|PQT-tI=r#u$vN-y z{=et_7Fu_=K5aO^8*r`yc&-OpcDO>FZ9$hmn5b4Fu(38MoltiR#+Ju6;hsSO;-mkNY(% z>=4Wp3J1M@Pr)tZ4tl%8APXJdj8jEwsH>|tD%doBEB1UN6dXvIb6P%wlnK-U{9SW? zjCxy!=_dyDz{jt4V{yBRuStH*nl!&Qk0DxKKH=9eVBn@!{}aAC$v? z6Yhl0|Hfl4r1z}AH{~XWBk(V^|NZ;RYkq`(y#tu2SR0n?{%;Vp3Nms3D_@PBg;M9& z`Nl%Ge>)C=yG3aJ;fmgHHH59;2$ZCB&o>XZodVAfgg7}>XY?A}$ZhH*uX1HgvKNS7_v6krpX=1a!&}CxtDNVulVB2gRHm zK!kabgGJVa_Pof7w2X;)LyR&UGUUXpNSIyTL+A zkyo{>kOg5=ut|tn8D*Xl2UENQJ`IZ$ievJmj1)S`A*hXh#%07rrED-KYQL%c7>h3$kYvQtbPiERu!iCQv9 zgD1NlZ_22QDCMAf+Y|QC5V0lkBU|H#aPge_3uAG9{dLq0PZ6xjf`SB>#7fL*QoA z__?2R@;KkUF#f_KsLdEc28L4$#i784=~z6R(M_BeF@eG})U<bj$OK!|?<*AX{}|Cxj-D>A$CfhmT|GX;q=>|Fl{wZUxsQ&CimbmW^l=+yb?^C7&hUCy%vI P3*!tHe*;?af33d(d~u&4 literal 0 HcmV?d00001 diff --git a/Translations/#Translations.en.translation b/Translations/#Translations.en.translation new file mode 100644 index 0000000000000000000000000000000000000000..37e58d508d59ce2014c9e72fdbc5d4ef29136ee4 GIT binary patch literal 1773 zcmbtVU1$_n6uw5Yu4auIQTz#J+Vmkv+-RW|Ht}~8^V680-8Hdl4dd=*cXW1UnVHR+ z2NNFziJ%Xnh;0fQ+9;xJNF~}TQTq^Dk%H8!;FBUKf>@~d(}%0y+04Zu_~wO=bIy0q zIrp4%XYWR$kuY=DRLCg+$+S(3`>f@Fl;R^wa+h*2^^DfN1XG0^BYj1M~v>0pbt3lJuh<{affixb|7dVOJl8yaN0V+;q7@NCmh9 z6adusi`$o!hmf>KI5)iL$vSM%FbL#B`0VPGxs;P8OOSlu*t&0MMlxRVwK=|RJ`B23 zg5;OHyl^=UV{)GCk7ve-o1ACO>dcLD_|p~BtbJ~-eXX}D9z&lk`IU*vEd1zB2wx_R z+CL%X`Q6HIyOw+G*Vl_r-i1wH5@B#aoLYf+(gOh0Joc{o`j>VXlk2Meb$H+GTL}s%st~=e+3V)%`!gmVKA+xHsfO5cMN_q8vl^{0GN8elqXpfnG-iPyLht z^2gfQG7vien|>UGBO@i+Af&AKpPIzzY0tjQx8YJn-BR#Wr}v(X=il}B!AZ_h*5CKV zm~z;Yr|emQ2{T`Ztc7y_m9`GoL&~|z__h9_lDH>tyK*Z>ebB7E^A3czKOOVL%X*7> zAk_hbz5|+p7p-=4c=HTD8y_cMIS1)~an|UDZt&DIoiFPvJkeY8y~n?>si~hH z26}-guk?GKT&z;#a^7$M?*F$Me)1f;%QB!JT8IU>Zik^tifp qL^#-q<2sf!m2MGCo)ThpMpD=86pLZv$|f_x-C