diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..677477f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# EditorConfig +root = true + +# elementary defaults +[*] +charset = utf-8 +end_of_line = lf +indent_size = tab +indent_style = space +insert_final_newline = true +max_line_length = 80 +tab_width = 4 + +# Markup files +[{*.html,*.xml,*.xml.in,*.yml}] +tab_width = 2 diff --git a/.gitignore b/.gitignore index ca6cfcb..378eac2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1 @@ -*.swp -*~ - build -.ninja_* -build.ninja -data/writeas diff --git a/data/meson.build b/data/meson.build index 413e7ee..59bd02a 100644 --- a/data/meson.build +++ b/data/meson.build @@ -1,25 +1,32 @@ +# Install icons icon_sizes = ['16', '24', '32', '48', '64', '128'] foreach i : icon_sizes - install_data( - join_paths('icons', i, meson.project_name() + '.png'), - install_dir: join_paths(get_option('datadir'), 'icons', 'hicolor', i + 'x' + i, 'apps'), + install_data ( + join_paths ('icons', i, meson.project_name () + '.png'), + install_dir: join_paths (get_option ('datadir'), 'icons', 'hicolor', i + 'x' + i, 'apps') + ) + install_data ( + join_paths ('icons', i, meson.project_name () + '.png'), + install_dir: join_paths (get_option ('datadir'), 'icons', 'hicolor', i + 'x' + i + '@2', 'apps') ) endforeach -i18n.merge_file( - input: meson.project_name() + '.desktop.in', - output: meson.project_name() + '.desktop', - po_dir: join_paths(meson.source_root(), 'po', 'extra'), +# Translate and install our .desktop file so the Applications Menu will see it +i18n.merge_file ( + input: meson.project_name () + '.desktop.in', + output: meson.project_name () + '.desktop', + po_dir: join_paths (meson.source_root (), 'po', 'extra'), type: 'desktop', install: true, - install_dir: join_paths(get_option('datadir'), 'applications') + install_dir: join_paths (get_option ('datadir'), 'applications') ) -i18n.merge_file( - input: meson.project_name() + '.appdata.xml.in', - output: meson.project_name() + '.appdata.xml', - po_dir: join_paths(meson.source_root(), 'po', 'extra'), +# Translate and install our .appdata.xml file so AppCenter will see it +i18n.merge_file ( + input: meson.project_name () + '.appdata.xml.in', + output: meson.project_name () + '.appdata.xml', + po_dir: join_paths (meson.source_root (), 'po', 'extra'), install: true, - install_dir: join_paths(get_option('datadir'), 'metainfo') + install_dir: join_paths (get_option ('datadir'), 'metainfo') ) diff --git a/screenshot-monospace.png b/data/screenshots/screenshot-monospace.png similarity index 100% rename from screenshot-monospace.png rename to data/screenshots/screenshot-monospace.png diff --git a/screenshot-sans-light.png b/data/screenshots/screenshot-sans-light.png similarity index 100% rename from screenshot-sans-light.png rename to data/screenshots/screenshot-sans-light.png diff --git a/screenshot-serif-dark.png b/data/screenshots/screenshot-serif-dark.png similarity index 100% rename from screenshot-serif-dark.png rename to data/screenshots/screenshot-serif-dark.png diff --git a/screenshot-serif-light.png b/data/screenshots/screenshot-serif-light.png similarity index 100% rename from screenshot-serif-light.png rename to data/screenshots/screenshot-serif-light.png diff --git a/data/writeas-gtk.appdata.xml.in b/data/writeas-gtk.appdata.xml.in deleted file mode 100644 index bbec7a3..0000000 --- a/data/writeas-gtk.appdata.xml.in +++ /dev/null @@ -1,114 +0,0 @@ - - - com.github.writeas.writeas-gtk - GPL-3.0+ - CC0 - Write.as - Publish a thought in seconds - - -

Write.as is a simple writing tool and publishing platform. There's no sign up — just open the app, write something, and publish.

-

Published posts get a secret, unique link on Write.as that you can share with anyone, or keep to yourself. In either case, you remain private because we don't collect personal information about you.

-
    -
  • Simple, distraction-free editor built for your words
  • -
  • Instantly launches to a blank page or your last draft
  • -
  • Writing automatically saves as you type
  • -
  • Work on a single local draft, then publish or save as another file when you're finished
  • -
  • Choose from three different fonts: serif, sans-serif, or monospace
  • -
  • Dark mode on platforms that support it
  • -
  • Publish to Write.as and share your post (example)
  • -
  • Manage published posts with the built-in command-line interface
  • -
-
- - Write.as - https://write.as/ - https://write.as/contact - https://github.com/writeas/writeas-gtk/issues - hello@write.as - - - com.github.writeas.writeas-gtk - - - - - The Write.as editor. - https://write.as/img/screens/gtk/serif.png - - - The Write.as editor in dark mode. - https://write.as/img/screens/gtk/serif-dark.png - - - https://write.as/img/screens/gtk/sans.png - - - https://write.as/img/screens/gtk/monospace.png - - - - none - none - none - none - none - none - none - none - none - none - none - none - none - none - none - none - none - none - none - none - none - moderate - none - none - none - none - none - - - - -

This update fixes a few minor visual issues.

-
    -
  • Fix black bar that appears in the editor on elementary OS
  • -
  • Fix currently-selected font not reflected in menu when app first loads
  • -
-
-
- - -

GTK updates and fixes.

-
    -
  • Fix fonts, padding, cursor color
  • -
  • Increase the default font size
  • -
-
-
- - -

Initial release

-
    -
  • Auto-saving single draft
  • -
  • Dark mode on platforms that support it
  • -
  • Choose between three fonts
  • -
  • Save draft as another file
  • -
  • Publish anonymously to Write.as
  • -
-
-
-
- - 25 - -
diff --git a/data/writeas-gtk.desktop.in b/data/writeas-gtk.desktop.in deleted file mode 100644 index 1c4f71a..0000000 --- a/data/writeas-gtk.desktop.in +++ /dev/null @@ -1,12 +0,0 @@ -[Desktop Entry] -Type=Application -Name=Write.as -Comment=Publish a thought in seconds. -Exec=com.github.writeas.writeas-gtk -Icon=com.github.writeas.writeas-gtk -Terminal=false -MimeType= -Categories=GTK;Office;Publishing; -Keywords=blog;text;editor;publish; -StartupNotify=true - diff --git a/meson.build b/meson.build index 1782140..4bc98de 100644 --- a/meson.build +++ b/meson.build @@ -1,35 +1,43 @@ -project( +# Project name, programming language and version +project ( 'com.github.writeas.writeas-gtk', - 'vala', 'c', + 'c', 'vala', version: '1.0.2', - license: 'GPL-3.0', ) -i18n = import('i18n') -add_project_arguments( - '-DGETTEXT_PACKAGE="@0@"'.format(meson.project_name()), +# GNOME module +gnome = import ('gnome') + +# Translation module +i18n = import ('i18n') + + +# Project arguments +add_project_arguments ( + '-DGETTEXT_PACKAGE="@0@"'.format (meson.project_name ()), language: 'c' ) +# Listing dependencies dependencies = [ - dependency('gtk+-3.0'), - dependency('gtksourceview-3.0') + dependency ('gtk+-3.0'), + dependency ('gtksourceview-3.0') ] -subdir('src') +subdir ('src') -executable( - meson.project_name(), +# Define executable +executable ( + meson.project_name (), sources, dependencies: dependencies, install: true ) -subdir('data') -subdir('po') - -subdir('fonts/lora') +subdir ('data') +subdir ('po') -meson.add_install_script('meson/post_install.py') +subdir ('fonts/lora') +meson.add_install_script ('meson/post_install.py') diff --git a/po/POTFILES b/po/POTFILES index 105e969..97ad7fb 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -1,2 +1,2 @@ -src/window.vala -src/Granite/Accels.vala \ No newline at end of file +src/Granite/Accels.vala +src/Window.vala diff --git a/po/com.github.writeas.writeas-gtk.pot b/po/com.github.writeas.writeas-gtk.pot index 36812a5..aba4fef 100644 --- a/po/com.github.writeas.writeas-gtk.pot +++ b/po/com.github.writeas.writeas-gtk.pot @@ -1,97 +1,97 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.writeas.writeas-gtk package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.writeas.writeas-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-01 14:51+0200\n" +"POT-Creation-Date: 2021-11-19 15:58+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/window.vala:56 +#: src/Granite/Accels.vala:42 +msgid "Shift" +msgstr "" + +#: src/Granite/Accels.vala:46 +msgid "Ctrl" +msgstr "" + +#: src/Granite/Accels.vala:50 +msgid "Alt" +msgstr "" + +#. TRANSLATORS: This is a non-symbol representation of the "-" key +#: src/Granite/Accels.vala:69 +msgid "Minus" +msgstr "" + +#. TRANSLATORS: This is a non-symbol representation of the "+" key +#: src/Granite/Accels.vala:74 +msgid "Plus" +msgstr "" + +#: src/Granite/Accels.vala:78 +msgid "Enter" +msgstr "" + +#. TRANSLATORS: This is a delimiter that separates two keyboard shortcut labels like "⌘ + →, Control + A" +#: src/Granite/Accels.vala:124 +msgid ", " +msgstr "" + +#: src/Window.vala:56 #, c-format msgid "%i word" msgid_plural "%i words" msgstr[0] "" msgstr[1] "" -#: src/window.vala:147 +#: src/Window.vala:144 msgid "Publish to Write.as on the web" msgstr "" -#: src/window.vala:157 +#: src/Window.vala:154 msgid "Light theme" msgstr "" -#: src/window.vala:158 +#: src/Window.vala:155 msgid "Dark theme" msgstr "" -#: src/window.vala:161 +#: src/Window.vala:158 msgid "Toggle light/dark theme" msgstr "" -#: src/window.vala:175 +#: src/Window.vala:172 msgid "Change document font" msgstr "" -#: src/window.vala:180 +#: src/Window.vala:177 msgid "Serif" msgstr "" -#: src/window.vala:181 +#: src/Window.vala:178 msgid "Sans-serif" msgstr "" -#: src/window.vala:183 +#: src/Window.vala:180 msgid "Monospace" msgstr "" -#: src/window.vala:377 +#: src/Window.vala:374 msgid "Save as" msgstr "" -#: src/window.vala:390 +#: src/Window.vala:387 msgid "Cancel" msgstr "" - -#: src/Granite/Accels.vala:42 -msgid "Shift" -msgstr "" - -#: src/Granite/Accels.vala:46 -msgid "Ctrl" -msgstr "" - -#: src/Granite/Accels.vala:50 -msgid "Alt" -msgstr "" - -#. TRANSLATORS: This is a non-symbol representation of the "-" key -#: src/Granite/Accels.vala:69 -msgid "Minus" -msgstr "" - -#. TRANSLATORS: This is a non-symbol representation of the "+" key -#: src/Granite/Accels.vala:74 -msgid "Plus" -msgstr "" - -#: src/Granite/Accels.vala:78 -msgid "Enter" -msgstr "" - -#. TRANSLATORS: This is a delimiter that separates two keyboard shortcut labels like "⌘ + →, Control + A" -#: src/Granite/Accels.vala:124 -msgid ", " -msgstr "" diff --git a/po/extra/extra.pot b/po/extra/extra.pot index 15b7e89..0870b01 100644 --- a/po/extra/extra.pot +++ b/po/extra/extra.pot @@ -1,140 +1,140 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-01 14:51+0200\n" +"POT-Creation-Date: 2021-11-19 15:58+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/com.github.writeas.writeas-gtk.desktop.in:4 #: data/com.github.writeas.writeas-gtk.appdata.xml.in:6 #: data/com.github.writeas.writeas-gtk.appdata.xml.in:24 msgid "Write.as" msgstr "" #: data/com.github.writeas.writeas-gtk.desktop.in:5 msgid "Publish a thought in seconds." msgstr "" #: data/com.github.writeas.writeas-gtk.desktop.in:7 msgid "com.github.writeas.writeas-gtk" msgstr "" #: data/com.github.writeas.writeas-gtk.desktop.in:11 msgid "blog;text;editor;publish;" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:7 msgid "Publish a thought in seconds" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:10 msgid "" "Write.as is a simple writing tool and publishing platform. There's no sign " "up — just open the app, write something, and publish." msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:11 msgid "" "Published posts get a secret, unique link on Write.as that you can share " "with anyone, or keep to yourself. In either case, you remain private because " "we don't collect personal information about you." msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:13 msgid "Simple, distraction-free editor built for your words" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:14 msgid "Instantly launches to a blank page or your last draft" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:15 msgid "Writing automatically saves as you type" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:16 msgid "" "Work on a single local draft, then publish or save as another file when " "you're finished" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:17 msgid "Choose from three different fonts: serif, sans-serif, or monospace" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:18 #: data/com.github.writeas.writeas-gtk.appdata.xml.in:103 msgid "Dark mode on platforms that support it" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:19 msgid "Publish to Write.as and share your post" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:20 msgid "Manage published posts with the built-in command-line interface" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:36 msgid "The Write.as editor." msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:40 msgid "The Write.as editor in dark mode." msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:82 msgid "This update fixes a few minor visual issues." msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:84 msgid "Fix black bar that appears in the editor on elementary OS" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:85 msgid "Fix currently-selected font not reflected in menu when app first loads" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:91 msgid "GTK updates and fixes." msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:93 msgid "Fix fonts, padding, cursor color" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:94 msgid "Increase the default font size" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:100 msgid "Initial release" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:102 msgid "Auto-saving single draft" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:104 msgid "Choose between three fonts" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:105 msgid "Save draft as another file" msgstr "" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:106 msgid "Publish anonymously to Write.as" msgstr "" diff --git a/po/extra/fr.po b/po/extra/fr.po index 232638d..c5d2145 100644 --- a/po/extra/fr.po +++ b/po/extra/fr.po @@ -1,155 +1,155 @@ # French translations for extra package. -# Copyright (C) 2019 THE extra'S COPYRIGHT HOLDER +# Copyright (C) 2021 THE extra'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. -# Nathan Bonnemains (@NathanBnm), 2019. +# Nathan Bonnemains (@NathanBnm), 2021. # msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-01 14:51+0200\n" -"PO-Revision-Date: 2019-03-30 18:20+0100\n" +"POT-Creation-Date: 2021-11-19 15:58+0100\n" +"PO-Revision-Date: 2021-11-19 15:53+0100\n" "Last-Translator: Nathan Bonnemains (@NathanBnm)\n" -"Language-Team: Français\n" +"Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: data/com.github.writeas.writeas-gtk.desktop.in:4 #: data/com.github.writeas.writeas-gtk.appdata.xml.in:6 #: data/com.github.writeas.writeas-gtk.appdata.xml.in:24 msgid "Write.as" msgstr "Write.as" #: data/com.github.writeas.writeas-gtk.desktop.in:5 msgid "Publish a thought in seconds." msgstr "Publiez vos pensées en quelques secondes." #: data/com.github.writeas.writeas-gtk.desktop.in:7 msgid "com.github.writeas.writeas-gtk" msgstr "com.github.writeas.writeas-gtk" #: data/com.github.writeas.writeas-gtk.desktop.in:11 msgid "blog;text;editor;publish;" msgstr "blog;texte;éditeur;publier;" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:7 msgid "Publish a thought in seconds" msgstr "Publiez vos pensées en quelques secondes" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:10 msgid "" "Write.as is a simple writing tool and publishing platform. There's no sign " "up — just open the app, write something, and publish." msgstr "" "Write.as est une simple application d'écriture et de publication. Il n'y a " "pas d'inscription — ouvrez simplement l'application, écrivez quelque-chose, " "et publiez-le." #: data/com.github.writeas.writeas-gtk.appdata.xml.in:11 msgid "" "Published posts get a secret, unique link on Write.as that you can share " "with anyone, or keep to yourself. In either case, you remain private because " "we don't collect personal information about you." msgstr "" "Les publications possèdent un lien unique et secret sur Write.as que vous " -"pouvez partager avec qui vous voulez, ou bien le garder pour vous. Dans tous " -"les cas, cela reste privé car nous ne collectons pas d'informations " +"pouvez partager avec qui vous souhaitez, ou bien le garder pour vous. Dans " +"tous les cas, cela reste privé car nous ne collectons pas d'informations " "personnelles sur vous." #: data/com.github.writeas.writeas-gtk.appdata.xml.in:13 msgid "Simple, distraction-free editor built for your words" msgstr "Un éditeur simple, sans distraction construit pour vos écritures" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:14 msgid "Instantly launches to a blank page or your last draft" msgstr "" "Lancement instantanné sur une page blanche ou bien votre dernier brouillon" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:15 msgid "Writing automatically saves as you type" msgstr "Enregistrement automatique au fur et à mesure que vous tapez" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:16 msgid "" "Work on a single local draft, then publish or save as another file when " "you're finished" msgstr "" "Travaillez sur un brouillon local, puis publiez ou enregistrez le en tant " "que fichier lorsqu'il est terminé" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:17 msgid "Choose from three different fonts: serif, sans-serif, or monospace" msgstr "" "Choisissez parmi trois différentes polices : serif, sans-serif ou monospace" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:18 #: data/com.github.writeas.writeas-gtk.appdata.xml.in:103 msgid "Dark mode on platforms that support it" msgstr "Thème sombre sur les plateformes qui le supportent" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:19 msgid "Publish to Write.as and share your post" msgstr "Publiez sur Write.as et partagez votre publication" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:20 msgid "Manage published posts with the built-in command-line interface" msgstr "" "Gérez vos publications publiées avec l'interface en ligne de commande incluse" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:36 msgid "The Write.as editor." msgstr "L'éditeur Write.as" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:40 msgid "The Write.as editor in dark mode." msgstr "L'éditeur Write.as avec le thème sombre" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:82 msgid "This update fixes a few minor visual issues." msgstr "Cette mise à jour corrige quelques problèmes graphiques mineurs." #: data/com.github.writeas.writeas-gtk.appdata.xml.in:84 msgid "Fix black bar that appears in the editor on elementary OS" msgstr "" "Correction de la barre noire qui apparaît dans l'éditeur sur elementary OS" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:85 msgid "Fix currently-selected font not reflected in menu when app first loads" msgstr "" "Correction de la police sélectionnée qui ne s'appliquait pas dans le menu au " "premier chargement de l'application" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:91 msgid "GTK updates and fixes." msgstr "Mise à jour de GTK et corrections." #: data/com.github.writeas.writeas-gtk.appdata.xml.in:93 msgid "Fix fonts, padding, cursor color" msgstr "Correction des polices, des marges et de la couleur du curseur" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:94 msgid "Increase the default font size" msgstr "Augmentation de la taille de la police par défaut" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:100 msgid "Initial release" msgstr "Version initiale" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:102 msgid "Auto-saving single draft" msgstr "Enregistrement automatique d'un simple brouillon" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:104 msgid "Choose between three fonts" msgstr "Choisissez parmi tois polices" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:105 msgid "Save draft as another file" msgstr "Enregisrez le brouillon dans un autre fichier" #: data/com.github.writeas.writeas-gtk.appdata.xml.in:106 msgid "Publish anonymously to Write.as" msgstr "Publiez anonymement sur Write.as" diff --git a/po/extra/meson.build b/po/extra/meson.build index 891039a..637dc67 100644 --- a/po/extra/meson.build +++ b/po/extra/meson.build @@ -1,7 +1,8 @@ -i18n.gettext('extra', +# Install metadata translations +i18n.gettext ('extra', args: [ - '--directory=' + meson.source_root(), + '--directory=' + meson.source_root (), '--from-code=UTF-8' ], install: false ) \ No newline at end of file diff --git a/po/fr.po b/po/fr.po index bc405ff..2dbb7ec 100644 --- a/po/fr.po +++ b/po/fr.po @@ -1,96 +1,96 @@ # French translations for com.github.writeas.writeas-gtk package. -# Copyright (C) 2019 THE com.github.writeas.writeas-gtk'S COPYRIGHT HOLDER +# Copyright (C) 2021 THE com.github.writeas.writeas-gtk'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.writeas.writeas-gtk package. -# Nathan Bonnemains (@NathanBnm), 2019. +# Nathan Bonnemains (@NathanBnm), 2021. # msgid "" msgstr "" "Project-Id-Version: com.github.writeas.writeas-gtk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-01 14:51+0200\n" -"PO-Revision-Date: 2019-03-30 18:20+0100\n" +"POT-Creation-Date: 2021-11-19 15:58+0100\n" +"PO-Revision-Date: 2021-11-19 15:53+0100\n" "Last-Translator: Nathan Bonnemains (@NathanBnm)\n" -"Language-Team: Français\n" +"Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: src/window.vala:56 +#: src/Granite/Accels.vala:42 +msgid "Shift" +msgstr "Maj" + +#: src/Granite/Accels.vala:46 +msgid "Ctrl" +msgstr "Ctrl" + +#: src/Granite/Accels.vala:50 +msgid "Alt" +msgstr "Alt" + +#. TRANSLATORS: This is a non-symbol representation of the "-" key +#: src/Granite/Accels.vala:69 +msgid "Minus" +msgstr "Moins" + +#. TRANSLATORS: This is a non-symbol representation of the "+" key +#: src/Granite/Accels.vala:74 +msgid "Plus" +msgstr "Plus" + +#: src/Granite/Accels.vala:78 +msgid "Enter" +msgstr "Entrée" + +#. TRANSLATORS: This is a delimiter that separates two keyboard shortcut labels like "⌘ + →, Control + A" +#: src/Granite/Accels.vala:124 +msgid ", " +msgstr ", " + +#: src/Window.vala:56 #, c-format msgid "%i word" msgid_plural "%i words" msgstr[0] "%i mot" msgstr[1] "%i mots" -#: src/window.vala:147 +#: src/Window.vala:144 msgid "Publish to Write.as on the web" msgstr "Publier vers Write.as sur le Web" -#: src/window.vala:157 +#: src/Window.vala:154 msgid "Light theme" msgstr "Thème clair" -#: src/window.vala:158 +#: src/Window.vala:155 msgid "Dark theme" msgstr "Thème sombre" -#: src/window.vala:161 +#: src/Window.vala:158 msgid "Toggle light/dark theme" -msgstr "Basculer le thème clair/sombre" +msgstr "Basculer entre le thème clair/sombre" -#: src/window.vala:175 +#: src/Window.vala:172 msgid "Change document font" msgstr "Modifier la police du document" -#: src/window.vala:180 +#: src/Window.vala:177 msgid "Serif" msgstr "Serif" -#: src/window.vala:181 +#: src/Window.vala:178 msgid "Sans-serif" msgstr "Sans-serif" -#: src/window.vala:183 +#: src/Window.vala:180 msgid "Monospace" msgstr "Monospace" -#: src/window.vala:377 +#: src/Window.vala:374 msgid "Save as" msgstr "Enregistrer sous" -#: src/window.vala:390 +#: src/Window.vala:387 msgid "Cancel" msgstr "Annuler" - -#: src/Granite/Accels.vala:42 -msgid "Shift" -msgstr "Maj" - -#: src/Granite/Accels.vala:46 -msgid "Ctrl" -msgstr "Ctrl" - -#: src/Granite/Accels.vala:50 -msgid "Alt" -msgstr "Alt" - -#. TRANSLATORS: This is a non-symbol representation of the "-" key -#: src/Granite/Accels.vala:69 -msgid "Minus" -msgstr "Moins" - -#. TRANSLATORS: This is a non-symbol representation of the "+" key -#: src/Granite/Accels.vala:74 -msgid "Plus" -msgstr "Plus" - -#: src/Granite/Accels.vala:78 -msgid "Enter" -msgstr "Entrée" - -#. TRANSLATORS: This is a delimiter that separates two keyboard shortcut labels like "⌘ + →, Control + A" -#: src/Granite/Accels.vala:124 -msgid ", " -msgstr ", " diff --git a/po/meson.build b/po/meson.build index 1b700fa..df1245b 100644 --- a/po/meson.build +++ b/po/meson.build @@ -1,9 +1,11 @@ -i18n.gettext(meson.project_name(), +# Install main translations +i18n.gettext (meson.project_name (), args: [ - '--directory=' + meson.source_root(), + '--directory=' + meson.source_root (), '--from-code=UTF-8', '-cTRANSLATORS' - ] + ], + preset: 'glib' ) -subdir('extra') \ No newline at end of file +subdir ('extra') \ No newline at end of file diff --git a/src/Granite/Accels.vala b/src/Granite/Accels.vala index 33eb62a..dd47222 100644 --- a/src/Granite/Accels.vala +++ b/src/Granite/Accels.vala @@ -1,136 +1,136 @@ // From https://github.com/elementary/granite/blob/621f2669f6c8940fe32ac9817ddca92e97d27ae0/lib/Widgets/Utils.vala#L79-L192 /* * Copyright (C) 2012-2017 Granite Developers * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ namespace Granite { /** * Converts a {@link Gtk.accelerator_parse} style accel string to a human-readable string. * * @param accel an accelerator label like “a” or “Right” * * @return a human-readable string like "Ctrl + A" or "⌘ + →" */ public static string accel_to_string (string accel) { uint accel_key; Gdk.ModifierType accel_mods; Gtk.accelerator_parse (accel, out accel_key, out accel_mods); string[] arr = {}; if (Gdk.ModifierType.SUPER_MASK in accel_mods) { arr += "⌘"; } if (Gdk.ModifierType.SHIFT_MASK in accel_mods) { arr += _("Shift"); } if (Gdk.ModifierType.CONTROL_MASK in accel_mods) { arr += _("Ctrl"); } if (Gdk.ModifierType.MOD1_MASK in accel_mods) { arr += _("Alt"); } switch (accel_key) { case Gdk.Key.Up: arr += "↑"; break; case Gdk.Key.Down: arr += "↓"; break; case Gdk.Key.Left: arr += "←"; break; case Gdk.Key.Right: arr += "→"; break; case Gdk.Key.minus: case Gdk.Key.KP_Subtract: - ///TRANSLATORS: This is a non-symbol representation of the "-" key + // TRANSLATORS: This is a non-symbol representation of the "-" key arr += _("Minus"); break; case Gdk.Key.KP_Add: case Gdk.Key.plus: - ///TRANSLATORS: This is a non-symbol representation of the "+" key + // TRANSLATORS: This is a non-symbol representation of the "+" key arr += _("Plus"); break; case Gdk.Key.KP_Enter: case Gdk.Key.Return: arr += _("Enter"); break; default: arr += Gtk.accelerator_get_label (accel_key, 0); break; } return string.joinv (" + ", arr); } /** * Takes a description and an array of accels and returns {@link Pango} markup for use in a {@link Gtk.Tooltip}. This method uses {@link Granite.accel_to_string}. * * Example: * * Description * Shortcut 1, Shortcut 2 * * @param a string array of accelerator labels like {"a", "Right"} * * @param description a standard tooltip text string * * @return {@link Pango} markup with the description label on one line and a list of human-readable accels on a new line */ public static string markup_accel_tooltip (string[]? accels, string? description = null) { string[] parts = {}; if (description != null && description != "") { parts += description; } if (accels != null && accels.length > 0) { string[] unique_accels = {}; for (int i = 0; i < accels.length; i++) { if (accels[i] == "") { continue; } var accel_string = accel_to_string (accels[i]); if (!(accel_string in unique_accels)) { unique_accels += accel_string; } } if (unique_accels.length > 0) { - ///TRANSLATORS: This is a delimiter that separates two keyboard shortcut labels like "⌘ + →, Control + A" + // TRANSLATORS: This is a delimiter that separates two keyboard shortcut labels like "⌘ + →, Control + A" var accel_label = string.joinv (_(", "), unique_accels); var accel_markup = """%s""".printf (accel_label); parts += accel_markup; } } return string.joinv ("\n", parts); } } diff --git a/src/Window.vala b/src/Window.vala index c6d8b08..6cb5720 100644 --- a/src/Window.vala +++ b/src/Window.vala @@ -1,416 +1,416 @@ /* Copyright © 2018 Write.as This file is part of the Write.as GTK desktop app. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ public class WriteAs.MainWindow : Gtk.ApplicationWindow { private Gtk.TextView canvas; private Gtk.HeaderBar header; private Granite.ModeSwitch darkmode_switch; private Gtk.RadioMenuItem font_serif_option; private Gtk.RadioMenuItem font_sans_option; private Gtk.RadioMenuItem font_wrap_option; private static string data_dir = ".writeas"; private static string version = "1.0.2"; private int font_size = 16; private bool dark_mode = false; private string font = "Lora, 'Palatino Linotype'," + "'Book Antiqua', 'New York', 'DejaVu serif', serif"; private string fontstyle = "serif"; private bool text_changed = false; private bool is_initializing = true; construct { header = new Gtk.HeaderBar(); header.title = "Write.as"; construct_toolbar(); build_keyboard_shortcuts(); var scrolled = new Gtk.ScrolledWindow(null, null); canvas = new Gtk.SourceView(); canvas.wrap_mode = Gtk.WrapMode.WORD_CHAR; scrolled.add(canvas); add(scrolled); size_allocate.connect((_) => {adjust_text_style();}); canvas.event_after.connect((evt) => { - // TODO This word count algorithm may be quite naive - // and could do improvement. + // TODO This word count algorithm may be quite naive and could do improvement. + var word_count = canvas.buffer.text.split(" ").length; header.subtitle = ngettext("%i word","%i words",word_count).printf(word_count); text_changed = true; }); Timeout.add_full(Priority.DEFAULT_IDLE, 100/*ms*/, () => { if (!text_changed) return Source.CONTINUE; var text = canvas.buffer.text; // This happens sometimes for some reason, but it's difficult to debug. if (text == "") return Source.CONTINUE; try { draft_file().replace_contents(text.data, null, false, FileCreateFlags.PRIVATE | FileCreateFlags.REPLACE_DESTINATION, null); text_changed = false; } catch (Error err) {/* We'll try again anyways. */} return Source.CONTINUE; }); adjust_text_style(false); } public MainWindow(Gtk.Application app) { stdout.printf("writeas-gtk v%s\n", version); set_application(app); icon_name = "com.github.writeas.writeas-gtk"; init_folder(); try { open_file(draft_file()); } catch (Error err) {} restore_styles(); set_default_size(800, 600); is_initializing = false; } private static void init_folder() { var home = File.new_for_path(get_data_dir()); try { home.make_directory(); } catch (Error e) { stderr.printf("Create data dir: %s\n", e.message); } } private static string get_data_dir() { return Environment.get_home_dir() + "/" + data_dir; } private static File draft_file() { var home = File.new_for_path(get_data_dir()); return home.get_child("draft.txt"); } private static bool supports_dark_theme() { var theme = Gtk.Settings.get_default().gtk_theme_name; foreach (var datapath in Environment.get_system_data_dirs()) { var path = File.new_for_path(Path.build_filename(datapath, "themes", theme)); if (path.get_child("gtk-dark.css").query_exists()) return true; try { var enumerator = path.enumerate_children("standard::*", 0); FileInfo info = null; while ((info = enumerator.next_file()) != null) { var fullpath = path.get_child(info.get_name()).get_child("gtk-dark.css"); if (fullpath.query_exists()) return true; } } catch (Error err) {/* Might be missing something, but no biggy. */} } return false; } private void construct_toolbar() { header.show_close_button = true; set_titlebar(header); var icon_size = Gtk.IconSize.LARGE_TOOLBAR; var publish_button = new Gtk.Button.from_icon_name("document-send", icon_size); publish_button.tooltip_markup = Granite.markup_accel_tooltip ( {"Return"}, _("Publish to Write.as on the web") ); publish_button.clicked.connect(() => { canvas.buffer.text += "\n\n" + publish(); canvas.grab_focus(); }); header.pack_end(publish_button); darkmode_switch = new Granite.ModeSwitch.from_icon_name ("display-brightness-symbolic", "weather-clear-night-symbolic"); darkmode_switch.primary_icon_tooltip_text = _("Light theme"); darkmode_switch.secondary_icon_tooltip_text = _("Dark theme"); darkmode_switch.tooltip_markup = Granite.markup_accel_tooltip ( {"T"}, _("Toggle light/dark theme") ); darkmode_switch.valign = Gtk.Align.CENTER; var settings = Gtk.Settings.get_default(); darkmode_switch.notify["active"].connect(() => { settings.gtk_application_prefer_dark_theme = darkmode_switch.active; dark_mode = darkmode_switch.active; if (!is_initializing) theme_save(); canvas.grab_focus(); }); if (supports_dark_theme()) header.pack_end(darkmode_switch); var fonts = new Gtk.MenuButton(); fonts.tooltip_text = _("Change document font"); fonts.image = new Gtk.Image.from_icon_name("font-x-generic", icon_size); fonts.popup = new Gtk.Menu(); header.pack_start(fonts); font_serif_option = build_fontoption(fonts.popup, _("Serif"), "serif", font); font_sans_option = build_fontoption(fonts.popup, _("Sans-serif"), "sans", "'Open Sans', 'Segoe UI', Tahoma, Arial, sans-serif"); font_wrap_option = build_fontoption(fonts.popup, _("Monospace"), "wrap", "Hack, consolas," + "Menlo-Regular, Menlo, Monaco, 'ubuntu mono', monospace"); fonts.popup.show_all(); } private unowned SList? font_options = null; private Gtk.RadioMenuItem build_fontoption(Gtk.Menu menu, string label, string fontstyle, string families) { var option = new Gtk.RadioMenuItem.with_label(font_options, label); font_options = option.get_group(); option.activate.connect(() => { this.font = families; this.fontstyle = fontstyle; adjust_text_style(!is_initializing); canvas.grab_focus(); }); var styles = option.get_style_context(); var provider = new Gtk.CssProvider(); try { provider.load_from_data("* {font-family: %s;}".printf(families)); styles.add_provider(provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); } catch (Error e) { warning(e.message); } menu.add(option); return option; } public override void grab_focus() { canvas.grab_focus(); } private KeyFile theme = new KeyFile(); private void restore_styles() { try { loaded_theme = true; theme.load_from_file(get_data_dir() + "/prefs.ini", KeyFileFlags.NONE); dark_mode = theme.get_boolean("Theme", "darkmode"); darkmode_switch.active = dark_mode; Gtk.Settings.get_default().gtk_application_prefer_dark_theme = dark_mode; font_size = theme.get_integer("Theme", "fontsize"); font = theme.get_string("Post", "font"); fontstyle = theme.get_string("Post", "fontstyle"); // Select the current font in the menu if (fontstyle == "serif") { font_serif_option.set_active(true); } else if (fontstyle == "sans") { font_sans_option.set_active(true); } else if (fontstyle == "wrap") { font_wrap_option.set_active(true); } adjust_text_style(false); } catch (Error err) {/* No biggy... */} } private Gtk.CssProvider cur_styles = null; // So the theme isn't read before it's saved. private bool loaded_theme = false; private void adjust_text_style(bool save_theme = true) { try { if (cur_styles != null) Gtk.StyleContext.remove_provider_for_screen(Gdk.Screen.get_default(), cur_styles); var padding = canvas.get_allocated_width()*0.10; var css = ("textview {font-family: %s; font-size: %dpx; padding: 20px 0;" + " caret-color: #5ac4ee;}").printf(font, font_size); cur_styles = new Gtk.CssProvider(); cur_styles.load_from_data(css); Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), cur_styles, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); canvas.left_margin = canvas.right_margin = (int) padding; if (save_theme) theme_save(); } catch (Error e) { warning(e.message); } } private void theme_save() { if (!loaded_theme) return; theme.set_boolean("Theme", "darkmode", dark_mode); theme.set_integer("Theme", "fontsize", font_size); theme.set_string("Post", "font", font); theme.set_string("Post", "fontstyle", fontstyle); try { theme.save_to_file(get_data_dir() + "/prefs.ini"); } catch (FileError err) {/* Oh well. */} } private string publish() { try { if (text_changed) {; draft_file().replace_contents(canvas.buffer.text.data, null, false, FileCreateFlags.PRIVATE | FileCreateFlags.REPLACE_DESTINATION, null); text_changed = false; } var cmd = "sh -c 'cat ~/" + data_dir + "/draft.txt | writeas --md --font %s --user-agent \"writeas-gtk v" + version + "\"'"; cmd = cmd.printf(fontstyle); string stdout, stderr; int status; Process.spawn_command_line_sync(cmd, out stdout, out stderr, out status); // Open it in the browser if (status == 0) { var browser = AppInfo.get_default_for_uri_scheme("https"); var urls = new List(); urls.append(stdout.strip()); browser.launch_uris(urls, null); } return stderr.strip(); } catch (Error err) { return err.message; } } /* --- */ private void build_keyboard_shortcuts() { /* These operations are not exposed to the UI as buttons, as most people are very familiar with them and they are not the focus of this app. */ var accels = new Gtk.AccelGroup(); // App operations accels.connect(Gdk.Key.W, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE | Gtk.AccelFlags.LOCKED, (g,a,k,m) => quit()); accels.connect(Gdk.Key.Q, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE | Gtk.AccelFlags.LOCKED, (g,a,k,m) => quit()); // File operations accels.connect(Gdk.Key.S, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE | Gtk.AccelFlags.LOCKED, (g,a,k,m) => save_as()); accels.connect(Gdk.Key.S, Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, Gtk.AccelFlags.VISIBLE | Gtk.AccelFlags.LOCKED, (g,a,k,m) => save_as()); // Adjust text size accels.connect(Gdk.Key.minus, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE | Gtk.AccelFlags.LOCKED, (g,a,k,m) => { if (font_size < 3) { return false; } if (font_size <= 10) { font_size -= 1; } else { font_size -= 2; } adjust_text_style(true); return true; }); accels.connect(Gdk.Key.equal, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE | Gtk.AccelFlags.LOCKED, (g,a,k,m) => { if (font_size < 10) { font_size += 1; } else { font_size += 2; } adjust_text_style(true); return true; }); // Toggle theme with Ctrl+T accels.connect(Gdk.Key.T, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE | Gtk.AccelFlags.LOCKED, (g,a,k,m) => { darkmode_switch.active = !darkmode_switch.active; return true; }); // Publish with Ctrl+Enter accels.connect(Gdk.Key.Return, Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE | Gtk.AccelFlags.LOCKED, (g,a,k,m) => { canvas.buffer.text += "\n\n" + publish(); return true; }); add_accel_group(accels); } private bool save_as() { try { var file = prompt_file(Gtk.FileChooserAction.SAVE, _("Save as")); file.replace_contents(canvas.buffer.text.data, null, false, FileCreateFlags.PRIVATE | FileCreateFlags.REPLACE_DESTINATION, null); } catch (Error e) { // It's fine... } return true; } private File prompt_file(Gtk.FileChooserAction mode, string action) throws UserCancellable { var file_chooser = new Gtk.FileChooserDialog(action, this, mode, _("Cancel"), Gtk.ResponseType.CANCEL, action, Gtk.ResponseType.ACCEPT); file_chooser.select_multiple = false; var filter = new Gtk.FileFilter(); filter.add_mime_type("text/plain"); file_chooser.set_filter(filter); var resp = file_chooser.run(); file_chooser.close(); if (resp == Gtk.ResponseType.ACCEPT) { return file_chooser.get_file(); } else { throw new UserCancellable.USER_CANCELLED("FileChooserDialog"); } } public void open_file(File file) throws Error { uint8[] text; file.load_contents(null, out text, null); canvas.buffer.text = (string) text; } private bool quit() { this.close(); return true; } } errordomain WriteAs.UserCancellable {USER_CANCELLED} diff --git a/src/meson.build b/src/meson.build index ff4695e..da78ee2 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,6 +1,7 @@ -sources = files( - 'Application.vala', - 'Window.vala', +sources = files ( 'Granite/Accels.vala', - 'Granite/ModeSwitch.vala' + 'Granite/ModeSwitch.vala', + + 'Application.vala', + 'Window.vala' )