├── .gitignore ├── COPYING ├── Flowtime.doap ├── README.md ├── build-aux └── flatpak │ ├── io.github.diegoivanme.flowtime.devel.json │ └── io.github.diegoivanme.flowtime.json ├── data ├── icons │ ├── hicolor │ │ ├── scalable │ │ │ └── apps │ │ │ │ ├── io.github.diegoivanme.flowtime.Devel.svg │ │ │ │ └── io.github.diegoivanme.flowtime.svg │ │ └── symbolic │ │ │ └── apps │ │ │ └── io.github.diegoivanme.flowtime-symbolic.svg │ ├── io.github.diegoivanme.flowtime.Source.svg │ └── meson.build ├── io.github.diegoivanme.flowtime.appdata.xml.in ├── io.github.diegoivanme.flowtime.desktop.in ├── io.github.diegoivanme.flowtime.gschema.xml ├── meson.build └── screenshots │ ├── 01.png │ ├── 02.png │ ├── 03.png │ └── 04.png ├── meson.build ├── po ├── LINGUAS ├── POTFILES ├── be.po ├── bg.po ├── de.po ├── es.po ├── flowtime.pot ├── fr.po ├── he.po ├── hi.po ├── it.po ├── meson.build ├── nl.po ├── pt_BR.po ├── ru.po ├── tr.po └── zh_CN.po ├── src ├── Application.vala ├── Models │ ├── Day.vala │ ├── InformationHolder.vala │ ├── StatObject.vala │ └── State.vala ├── Services │ ├── Alarm.vala │ ├── BackgroundStatusReporter.vala │ ├── ColorProvider.vala │ ├── Screensaver.vala │ ├── Settings.vala │ ├── Statistics.vala │ ├── Timer.vala │ └── TonePlayer.vala ├── Widgets │ ├── PreferencesWindow.vala │ ├── SoundRow.vala │ ├── StatGraph.vala │ ├── StatInfo.vala │ ├── StatList.vala │ ├── StatPage.vala │ ├── StatRow.vala │ ├── StatsWindow.vala │ ├── TimerPage.vala │ └── Window.vala ├── XmlUtils.vala ├── flowtime.gresource.xml ├── main.vala ├── meson.build ├── ui │ ├── icons │ │ ├── cafe-symbolic.svg │ │ ├── info-symbolic.svg │ │ ├── month-symbolic.svg │ │ ├── pip-out-symbolic.svg │ │ ├── profit-symbolic.svg │ │ └── timer-sand-symbolic.svg │ ├── preferenceswindow.blp │ ├── sounds │ │ ├── README.md │ │ ├── baum.ogg │ │ ├── beep.ogg │ │ ├── bleep.ogg │ │ └── tone.ogg │ ├── statinfo.blp │ ├── statlist.blp │ ├── statpage.blp │ ├── statrow.blp │ ├── statwindow.blp │ ├── style.css │ ├── timerpage.blp │ └── window.blp └── vapi │ └── config.vapi └── vala-lint.conf /.gitignore: -------------------------------------------------------------------------------- 1 | .flatpak-builder/ 2 | .flatpak/ 3 | .vscode/ -------------------------------------------------------------------------------- /Flowtime.doap: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | Flowtime 9 | 10 | Get things done, keep concentrated 11 | 12 | 13 | The Pomodoro technique is efficient for tasks you find boring, but having to take a break when you are 100% concentrated in something you like might be annoying. That's why the Flowtime technique exists: take appropiate breaks without loosing you **flow**. 14 | 15 | 16 | 17 | 18 | 19 | Vala 20 | 21 | 22 | 23 | Diego Iván 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | # Flowtime 5 | 6 | **Get what motivates you done, without losing concentration** 7 | 8 | 9 | Download on Flathub 10 | 11 | 12 |
13 | 14 | ## Gallery: 15 | 16 |
17 | 18 | 19 | 20 | 21 |
22 | 23 | ## Features: 24 | 25 | * Assistant for the Flowtime working technique 26 | * Assisted time calculations for breaks 27 | * Customizable tones for the end of the break 28 | * Notification that alerts you when your break is done 29 | * Work and break time statistics 30 | * Export your statistics to CSV 31 | 32 | ## Why? 33 | 34 | The Pomodoro technique is efficient for tasks you find boring, but having to take a break when you are 100% concentrated in something you like might be annoying. That's why the Flowtime technique exists: take appropriate breaks without losing your **flow**. 35 | 36 | ## How does it work? 37 | 38 | The time you worked is divided by 5, and that's the break time you'll take. E.g, if you worked for 50 minutes, you'll take a 10 minute break, if you worked for 2 hours, you'll take a 24 minute break. 39 | 40 | ## Installing and Running 41 | 42 | ### Flathub 43 | 44 | The only official distribution format for Flowtime is the Flatpak package available on Flathub. Click on the banner on the top of this README.md to go to Flowtime's Flathub page. Any other unofficial distribution formats that might be available are highly discouraged. 45 | 46 | ### Native Packages / Ports 47 | 48 | There exist some third party, distribution specific, packages: 49 | 50 | | Distribution | Package name | Mantainer | 51 | | ------------------- | --------------- | --------------- | 52 | | Alpine Linux | `flowtime` | [chereskata](https://gitlab.alpinelinux.org/chereskata) | 53 | | ALT Linux | [`flowtime`](https://packages.altlinux.org/ru/sisyphus/srpms/flowtime/) | [oleg](https://packages.altlinux.org/ru/sisyphus/maintainers/oleg/) | 54 | | Arch Linux (AUR) | `flowtime` | igor-dyatlov | 55 | | Arch Linux (AUR) | `flowtime-git` | igor-dyatlov | 56 | 57 | 58 | ### Building from source 59 | 60 | #### Flatpak and GNOME Builder 61 | 62 | GNOME Builder provides a high quality Flatpak integration. All dependencies, runtimes and SDK extensions necessary will be installed by the application if they're not available. Just click the "Run" button and the app will be built :smile:. 63 | 64 | #### Requirements 65 | 66 | | Dependency | Version | 67 | | ---------- | ------- | 68 | | Meson | 0.59.0 | 69 | | gtk-4 | 4.11 | 70 | | libportal | 0.7.1 | 71 | | libadwaita-1 | 1.4 | 72 | | libxml-2.0 | 1.0 | 73 | 74 | To compile and install, run: 75 | 76 | ```sh 77 | meson builddir --prefix=/usr 78 | cd builddir 79 | sudo ninja install 80 | flowtime 81 | ``` 82 | -------------------------------------------------------------------------------- /build-aux/flatpak/io.github.diegoivanme.flowtime.devel.json: -------------------------------------------------------------------------------- 1 | { 2 | "app-id": "io.github.diegoivanme.flowtime", 3 | "runtime": "org.gnome.Platform", 4 | "runtime-version": "master", 5 | "sdk": "org.gnome.Sdk", 6 | "command": "flowtime", 7 | "sdk-extensions": [ 8 | "org.freedesktop.Sdk.Extension.vala" 9 | ], 10 | "build-options": { 11 | "prepend-path": "/usr/lib/sdk/vala/bin/", 12 | "prepend-ld-library-path": "/usr/lib/sdk/vala/lib" 13 | }, 14 | "finish-args": [ 15 | "--share=ipc", 16 | "--socket=fallback-x11", 17 | "--socket=pulseaudio", 18 | "--socket=wayland", 19 | "--talk-name=org.freedesktop.ScreenSaver", 20 | "--talk-name=org.gnome.ScreenSaver", 21 | "--device=dri" 22 | ], 23 | "cleanup": [ 24 | "/include", 25 | "/lib/pkgconfig", 26 | "/man", 27 | "/share/doc", 28 | "/share/gtk-doc", 29 | "/share/man", 30 | "/share/pkgconfig", 31 | "/share/vala", 32 | "*.la", 33 | "*.a" 34 | ], 35 | "modules": [ 36 | { 37 | "name": "blueprint-compiler", 38 | "buildsystem": "meson", 39 | "sources": [ 40 | { 41 | "type": "git", 42 | "url": "https://gitlab.gnome.org/jwestman/blueprint-compiler", 43 | "tag": "v0.10.0" 44 | } 45 | ] 46 | }, 47 | { 48 | "name": "libportal", 49 | "buildsystem": "meson", 50 | "config-opts": [ 51 | "-Dbackend-gtk3=disabled", 52 | "-Dbackend-gtk4=enabled", 53 | "-Dbackend-qt5=disabled", 54 | "-Ddocs=false", 55 | "-Dtests=false" 56 | ], 57 | "sources": [ 58 | { 59 | "url": "https://github.com/flatpak/libportal.git", 60 | "type": "git", 61 | "tag": "0.7.1", 62 | "commit": "e9ed3a50cdde321eaf42361212480a66eb94a57a" 63 | } 64 | ] 65 | }, 66 | { 67 | "name": "flowtime", 68 | "builddir": true, 69 | "buildsystem": "meson", 70 | "sources": [ 71 | { 72 | "type": "dir", 73 | "path": "../../" 74 | } 75 | ] 76 | } 77 | ] 78 | } -------------------------------------------------------------------------------- /build-aux/flatpak/io.github.diegoivanme.flowtime.json: -------------------------------------------------------------------------------- 1 | { 2 | "app-id" : "io.github.diegoivanme.flowtime", 3 | "runtime" : "org.gnome.Platform", 4 | "runtime-version" : "44", 5 | "sdk" : "org.gnome.Sdk", 6 | "command" : "flowtime", 7 | "sdk-extensions" : [ 8 | "org.freedesktop.Sdk.Extension.vala" 9 | ], 10 | "build-options" : { 11 | "prepend-path" : "/usr/lib/sdk/vala/bin/", 12 | "prepend-ld-library-path" : "/usr/lib/sdk/vala/lib", 13 | "env" : { } 14 | }, 15 | "finish-args" : [ 16 | "--share=ipc", 17 | "--socket=fallback-x11", 18 | "--socket=pulseaudio", 19 | "--socket=wayland", 20 | "--device=dri" 21 | ], 22 | "cleanup" : [ 23 | "/include", 24 | "/lib/pkgconfig", 25 | "/man", 26 | "/share/doc", 27 | "/share/gtk-doc", 28 | "/share/man", 29 | "/share/pkgconfig", 30 | "/share/vala", 31 | "*.la", 32 | "*.a" 33 | ], 34 | "modules" : [ 35 | { 36 | "name": "libportal", 37 | "buildsystem": "meson", 38 | "config-opts": [ 39 | "-Dbackend-gtk3=disabled", 40 | "-Dbackend-gtk4=enabled", 41 | "-Dbackend-qt5=disabled", 42 | "-Ddocs=false", 43 | "-Dtests=false" 44 | ], 45 | "sources": [ 46 | { 47 | "url": "https://github.com/flatpak/libportal.git", 48 | "type": "git", 49 | "commit": "09ec040159b754c14610ad02e4de17d0b9bc6612" 50 | } 51 | ] 52 | }, 53 | { 54 | "name" : "flowtime", 55 | "builddir" : true, 56 | "buildsystem" : "meson", 57 | "sources" : [ 58 | { 59 | "type" : "dir", 60 | "path" : "../../" 61 | } 62 | ] 63 | } 64 | ] 65 | } 66 | -------------------------------------------------------------------------------- /data/icons/hicolor/symbolic/apps/io.github.diegoivanme.flowtime-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /data/icons/meson.build: -------------------------------------------------------------------------------- 1 | application_id = 'io.github.diegoivanme.flowtime' 2 | 3 | scalable_dir = join_paths('hicolor', 'scalable', 'apps') 4 | install_data( 5 | join_paths(scalable_dir, ('@0@.svg').format(application_id)), 6 | install_dir: join_paths(get_option('datadir'), 'icons', scalable_dir) 7 | ) 8 | 9 | symbolic_dir = join_paths('hicolor', 'symbolic', 'apps') 10 | install_data( 11 | join_paths(symbolic_dir, ('@0@-symbolic.svg').format(application_id)), 12 | install_dir: join_paths(get_option('datadir'), 'icons', symbolic_dir) 13 | ) 14 | -------------------------------------------------------------------------------- /data/io.github.diegoivanme.flowtime.appdata.xml.in: -------------------------------------------------------------------------------- 1 | 2 | 3 | io.github.diegoivanme.flowtime 4 | CC0-1.0 5 | GPL-3.0-or-later 6 | 7 | Flowtime 8 | Spend your time wisely 9 | 10 | 11 |

12 | The Pomodoro technique is efficient for tasks you find boring, but having to take a break when you are 100% concentrated in something you like might be annoying. That's why the Flowtime technique exists: take appropriate breaks without losing your flow. 13 |

14 |

15 | Instead of strict work and break times, you work as long as you wish and your break is a portion of how long you worked (by default, 20%). For example, if you work for an hour, your break is 12 minutes. This lets you concentrate on your work and take appropriate breaks when convenient without a rigid schedule. 16 |

17 |
18 | 19 | 20 | 21 | https://raw.githubusercontent.com/Diego-Ivan/Flowtime/main/data/screenshots/01.png 22 | 23 | 24 | https://raw.githubusercontent.com/Diego-Ivan/Flowtime/main/data/screenshots/02.png 25 | 26 | 27 | https://raw.githubusercontent.com/Diego-Ivan/Flowtime/main/data/screenshots/03.png 28 | 29 | 30 | https://raw.githubusercontent.com/Diego-Ivan/Flowtime/main/data/screenshots/04.png 31 | 32 | 33 | 34 | 35 | 36 | 37 |

Flowtime v6.1 has arrived with a couple of minor fixes and improvements

38 |
    39 |
  • Updated French Translation
  • 40 |
  • Break Time Percentage is now actually saved below the 10% (Bugfix)
  • 41 |
42 |
43 |
44 |
45 | 46 | 47 | 320 48 | 49 | 50 | 51 | io.github.diegoivanme.flowtime.desktop 52 | 53 | 54 | 55 | GTK 56 | GNOME 57 | Utility 58 | Clock 59 | 60 | 61 | 62 | keyboard 63 | pointing 64 | touch 65 | 66 | 67 | 68 | flowtime 69 | io.github.diegoivanme.flowtime.desktop 70 | Diego Iván 71 | https://github.com/Diego-Ivan/Flowtime 72 | https://github.com/Diego-Ivan/Flowtime/issues 73 | https://github.com/Diego-Ivan/Flowtime 74 | https://github.com/Diego-Ivan/Flowtime/tree/main/po 75 | 76 | 77 | #8ee5f9 78 | #26a269 79 | 80 | 81 |
82 | -------------------------------------------------------------------------------- /data/io.github.diegoivanme.flowtime.desktop.in: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=Flowtime 3 | Exec=flowtime 4 | Icon=io.github.diegoivanme.flowtime 5 | Terminal=false 6 | Type=Application 7 | Categories=GTK;Office;Utility; 8 | StartupNotify=true 9 | -------------------------------------------------------------------------------- /data/io.github.diegoivanme.flowtime.gschema.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | "tone.ogg" 12 | Alarm Tone 13 | Use a tone for the break time alarm 14 | 15 | 16 | 17 | -1 18 | [LEGACY] 19 | [LEGACY] 20 | 21 | 22 | 23 | 24 | 25 25 | Percentage of work time to take into break time 26 | 27 | 28 | 29 | 30 | 2 31 | Months Saved for Statistics 32 | The amount of months the statistical information will be retained. In case its overpassed, that data will be deleted 33 | 34 | 35 | 36 | false 37 | Timer autostart 38 | Automatically start timer when the stage is changed 39 | 40 | 41 | 42 | true 43 | Enable/Disable Distraction Free Mode 44 | The distraction free mode uses a special window without too much clutter. Ideal when you just want what matters 45 | 46 | 47 | 48 | false 49 | Activate screensaver in break time 50 | Activates the screensaver when the break stage starts 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /data/meson.build: -------------------------------------------------------------------------------- 1 | desktop_file = i18n.merge_file( 2 | input: 'io.github.diegoivanme.flowtime.desktop.in', 3 | output: 'io.github.diegoivanme.flowtime.desktop', 4 | type: 'desktop', 5 | po_dir: '../po', 6 | install: true, 7 | install_dir: join_paths(get_option('datadir'), 'applications') 8 | ) 9 | 10 | desktop_utils = find_program('desktop-file-validate', required: false) 11 | if desktop_utils.found() 12 | test('Validate desktop file', desktop_utils, 13 | args: [desktop_file] 14 | ) 15 | endif 16 | 17 | appstream_file = i18n.merge_file( 18 | input: 'io.github.diegoivanme.flowtime.appdata.xml.in', 19 | output: 'io.github.diegoivanme.flowtime.appdata.xml', 20 | po_dir: '../po', 21 | install: true, 22 | install_dir: join_paths(get_option('datadir'), 'appdata') 23 | ) 24 | 25 | appstreamcli = find_program('appstreamcli', required: false) 26 | if appstreamcli.found() 27 | test('Validate appstream file', appstreamcli, 28 | args: ['validate', appstream_file] 29 | ) 30 | endif 31 | 32 | install_data('io.github.diegoivanme.flowtime.gschema.xml', 33 | install_dir: join_paths(get_option('datadir'), 'glib-2.0/schemas') 34 | ) 35 | 36 | compile_schemas = find_program('glib-compile-schemas', required: false) 37 | if compile_schemas.found() 38 | test('Validate schema file', compile_schemas, 39 | args: ['--strict', '--dry-run', meson.current_source_dir()] 40 | ) 41 | endif 42 | 43 | subdir('icons') 44 | -------------------------------------------------------------------------------- /data/screenshots/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Diego-Ivan/Flowtime/9022a39997d9eb8c7421af824e8d885a2bc2e0a1/data/screenshots/01.png -------------------------------------------------------------------------------- /data/screenshots/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Diego-Ivan/Flowtime/9022a39997d9eb8c7421af824e8d885a2bc2e0a1/data/screenshots/02.png -------------------------------------------------------------------------------- /data/screenshots/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Diego-Ivan/Flowtime/9022a39997d9eb8c7421af824e8d885a2bc2e0a1/data/screenshots/03.png -------------------------------------------------------------------------------- /data/screenshots/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Diego-Ivan/Flowtime/9022a39997d9eb8c7421af824e8d885a2bc2e0a1/data/screenshots/04.png -------------------------------------------------------------------------------- /meson.build: -------------------------------------------------------------------------------- 1 | project('flowtime', ['c', 'vala'], 2 | version: '6.5', 3 | meson_version: '>= 0.60.0', 4 | default_options: [ 'warning_level=2', 5 | ], 6 | ) 7 | 8 | app_id = 'io.github.diegoivanme.flowtime' 9 | i18n = import('i18n') 10 | 11 | 12 | 13 | subdir('data') 14 | subdir('src') 15 | subdir('po') 16 | 17 | gnome.post_install( 18 | glib_compile_schemas: true, 19 | gtk_update_icon_cache: true, 20 | update_desktop_database: true, 21 | ) 22 | -------------------------------------------------------------------------------- /po/LINGUAS: -------------------------------------------------------------------------------- 1 | be 2 | bg 3 | de 4 | es 5 | fr 6 | he 7 | hi 8 | it 9 | nl 10 | pt_BR 11 | ru 12 | tr 13 | zh_CN 14 | -------------------------------------------------------------------------------- /po/POTFILES: -------------------------------------------------------------------------------- 1 | data/io.github.diegoivanme.flowtime.desktop.in 2 | data/io.github.diegoivanme.flowtime.appdata.xml.in 3 | src/Application.vala 4 | src/Models/StatObject.vala 5 | src/Services/Alarm.vala 6 | src/Services/Statistics.vala 7 | src/Services/BackgroundStatusReporter.vala 8 | src/Services/Timer.vala 9 | src/Widgets/StatInfo.vala 10 | src/Widgets/StatsWindow.vala 11 | src/Widgets/TimerPage.vala 12 | src/Widgets/Window.vala 13 | src/ui/preferenceswindow.blp 14 | src/ui/statinfo.blp 15 | src/ui/statpage.blp 16 | src/ui/statwindow.blp 17 | src/ui/window.blp 18 | -------------------------------------------------------------------------------- /po/be.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the flowtime package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: flowtime\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-10-21 12:27-0600\n" 11 | "PO-Revision-Date: 2022-12-30 16:08+0300\n" 12 | "Last-Translator: \n" 13 | "Language-Team: \n" 14 | "Language: be\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" 19 | "%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" 20 | "X-Generator: Poedit 3.1.1\n" 21 | 22 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 23 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 24 | msgid "Flowtime" 25 | msgstr "Flowtime" 26 | 27 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 28 | msgid "Spend your time wisely" 29 | msgstr "" 30 | 31 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 32 | msgid "" 33 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 34 | "take a break when you are 100% concentrated in something you like might be " 35 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 36 | "without loosing you **flow**." 37 | msgstr "" 38 | "Тэхніка Pomodoro эфектыўная для задач, якія здаюцца вам сумнымі, але " 39 | "неабходнасць рабіць перапынак, калі вы на 100% сканцэнтраваны на тым, што " 40 | "вам падабаецца, можа раздражняць. Вось чаму існуе тэхніка Flowtime: рабіце " 41 | "адпаведныя перапынкі, не губляючы **патоку**." 42 | 43 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:78 44 | msgid "Diego Iván" 45 | msgstr "Diego Iván" 46 | 47 | #: src/Application.vala:77 48 | msgid "Flowtime is saving your statistics" 49 | msgstr "" 50 | 51 | #: src/Application.vala:146 52 | #, fuzzy 53 | msgid "translator_credits" 54 | msgstr "vokaEntropy <7w8kluayj@mozmail.com>" 55 | 56 | #. If seconds is less than a minute, it will display seconds 57 | #: src/Models/StatObject.vala:21 src/Widgets/StatInfo.vala:56 58 | msgid "seconds" 59 | msgstr "секунд" 60 | 61 | #: src/Models/StatObject.vala:31 src/Widgets/StatInfo.vala:65 62 | msgid "minutes" 63 | msgstr "хвілін" 64 | 65 | #: src/Models/StatObject.vala:59 src/Widgets/StatInfo.vala:92 66 | msgid "hour" 67 | msgstr "гадзіну" 68 | 69 | #: src/Models/StatObject.vala:62 src/Widgets/StatInfo.vala:95 70 | msgid "hours" 71 | msgstr "гадзіны" 72 | 73 | #: src/Models/StatObject.vala:79 src/Widgets/StatInfo.vala:110 74 | msgid "day" 75 | msgstr "дзень" 76 | 77 | #: src/Models/StatObject.vala:82 src/Widgets/StatInfo.vala:113 78 | msgid "days" 79 | msgstr "дзён" 80 | 81 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 82 | #, fuzzy 83 | msgid "Break is over!" 84 | msgstr "Усяго перапынкаў" 85 | 86 | #: src/Services/Alarm.vala:29 87 | msgid "Let's get back to work" 88 | msgstr "" 89 | 90 | #: src/Services/Statistics.vala:237 91 | msgid "Today" 92 | msgstr "Сёння" 93 | 94 | #: src/Services/Statistics.vala:239 95 | msgid "This Week" 96 | msgstr "На гэтым тыдні" 97 | 98 | #: src/Services/Statistics.vala:241 99 | msgid "This Month" 100 | msgstr "У гэтым месяцы" 101 | 102 | #: src/Services/Statistics.vala:243 103 | #, fuzzy 104 | msgid "All Time" 105 | msgstr "Таймер" 106 | 107 | #: src/Services/BackgroundStatusReporter.vala:36 108 | #, fuzzy, c-format 109 | msgid "Break Stage: %s" 110 | msgstr "Перапынак" 111 | 112 | #: src/Services/BackgroundStatusReporter.vala:40 113 | #, fuzzy, c-format 114 | msgid "Work Stage: %s" 115 | msgstr "Праца" 116 | 117 | #: src/Services/Timer.vala:177 src/ui/statinfo.blp:52 118 | #, fuzzy 119 | msgid "Work" 120 | msgstr "Усяго працы" 121 | 122 | #: src/Services/Timer.vala:179 src/ui/statinfo.blp:65 123 | #, fuzzy 124 | msgid "Break" 125 | msgstr "Усяго перапынкаў" 126 | 127 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 128 | #: src/Widgets/StatInfo.vala:44 129 | #, c-format 130 | msgid "You've worked %s and have taken a break during %s." 131 | msgstr "" 132 | 133 | #: src/Widgets/StatsWindow.vala:43 134 | #, c-format 135 | msgid "%s is your most productive day of the week" 136 | msgstr "%s — ваш самы прадуктыўны дзень тыдня" 137 | 138 | #: src/Widgets/TimerPage.vala:43 139 | msgid "Work Stage" 140 | msgstr "Праца" 141 | 142 | #: src/Widgets/TimerPage.vala:46 143 | msgid "Break Stage" 144 | msgstr "Перапынак" 145 | 146 | #: src/Widgets/TimerPage.vala:52 147 | #, fuzzy 148 | msgid "Pause Timer" 149 | msgstr "Таймер" 150 | 151 | #: src/Widgets/TimerPage.vala:56 152 | #, fuzzy 153 | msgid "Start Timer" 154 | msgstr "Таймер" 155 | 156 | #: src/Widgets/Window.vala:137 157 | msgid "There is a Session Active" 158 | msgstr "" 159 | 160 | #: src/Widgets/Window.vala:137 161 | msgid "Do you want to quit?" 162 | msgstr "" 163 | 164 | #: src/Widgets/Window.vala:141 165 | msgid "Cancel" 166 | msgstr "" 167 | 168 | #: src/Widgets/Window.vala:142 169 | msgid "Hide Window" 170 | msgstr "" 171 | 172 | #: src/Widgets/Window.vala:143 173 | msgid "Quit Session" 174 | msgstr "" 175 | 176 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 177 | msgid "_Preferences" 178 | msgstr "_Налады" 179 | 180 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 181 | msgid "Statistics" 182 | msgstr "Статыстыка" 183 | 184 | #: src/ui/preferenceswindow.blp:16 185 | msgid "Months Saved" 186 | msgstr "Захавана месяцаў" 187 | 188 | #: src/ui/preferenceswindow.blp:17 189 | msgid "The amount of months that the work data will be saved" 190 | msgstr "Дадзеныя за колькі месяцаў будуць захаваны" 191 | 192 | #: src/ui/preferenceswindow.blp:29 193 | msgid "Timer" 194 | msgstr "Таймер" 195 | 196 | #: src/ui/preferenceswindow.blp:32 197 | #, fuzzy 198 | msgid "Break time percentage" 199 | msgstr "Перапынак" 200 | 201 | #: src/ui/preferenceswindow.blp:33 202 | msgid "The percetage of work time that will be used as break time" 203 | msgstr "" 204 | 205 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 206 | #: src/ui/statwindow.blp:71 207 | msgid "Break Time" 208 | msgstr "Усяго перапынкаў" 209 | 210 | #: src/ui/preferenceswindow.blp:47 211 | msgid "Autostart" 212 | msgstr "Аўтазапуск" 213 | 214 | #: src/ui/preferenceswindow.blp:48 215 | msgid "Automatically start the timer when the stage is changed" 216 | msgstr "Аўтаматычна запускаць таймер пры змене этапу" 217 | 218 | #: src/ui/preferenceswindow.blp:59 219 | msgid "Activate Screensaver on Break Time" 220 | msgstr "" 221 | 222 | #: src/ui/preferenceswindow.blp:60 223 | msgid "" 224 | "Activate the screensaver when the break stage starts. Requires Autostart" 225 | msgstr "" 226 | 227 | #: src/ui/preferenceswindow.blp:66 228 | msgid "Sounds" 229 | msgstr "Гукі" 230 | 231 | #: src/ui/preferenceswindow.blp:67 232 | msgid "Alarm sounds that mark break time" 233 | msgstr "Гук папярэджання, што перапынак скончыўся" 234 | 235 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 236 | msgid "Start working to see your progress" 237 | msgstr "" 238 | 239 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 240 | msgid "Overview" 241 | msgstr "" 242 | 243 | #: src/ui/statpage.blp:22 244 | msgid "See Details" 245 | msgstr "Праглядзець падрабязнасці" 246 | 247 | #: src/ui/statwindow.blp:30 248 | msgid "Save as CSV" 249 | msgstr "" 250 | 251 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 252 | msgid "Work Time" 253 | msgstr "Усяго працы" 254 | 255 | #: src/ui/window.blp:12 256 | msgid "_Distraction Free Mode" 257 | msgstr "" 258 | 259 | #: src/ui/window.blp:18 260 | msgid "_About Flowtime" 261 | msgstr "_Аб праграме" 262 | 263 | #: src/ui/window.blp:66 264 | #, fuzzy 265 | msgid "_Stages" 266 | msgstr "Этапы" 267 | 268 | #: src/ui/window.blp:77 269 | #, fuzzy 270 | msgid "S_tatistics" 271 | msgstr "Статыстыка" 272 | 273 | #~ msgid "Get things done, keep concentrated" 274 | #~ msgstr "Вырашайце задачы, не губляйце канцэнтрацыю" 275 | 276 | #~ msgid "_Enable Small View" 277 | #~ msgstr "_Уключыць кампактны рэжым" 278 | 279 | #~ msgid "Flowtime 2.0: Keep on track!" 280 | #~ msgstr "Flowtime 2.0: Адсочвайце час!" 281 | 282 | #~ msgid "In this new version, a shiny new feature was added: Statistics!" 283 | #~ msgstr "У гэтай новай версіі была дададзена цудоўная функцыя: Статыстыка!" 284 | 285 | #~ msgid "" 286 | #~ "Have an overview of how much time you have worked in the last month, week " 287 | #~ "and day" 288 | #~ msgstr "" 289 | #~ "Майце агляд таго, колькі часу вы працавалі за апошні месяц, тыдзень і " 290 | #~ "дзень" 291 | 292 | #~ msgid "Take a look at your day-specific data" 293 | #~ msgstr "Паглядзіце дадзеныя за дзень" 294 | 295 | #~ msgid "Export your statistics to CSV format" 296 | #~ msgstr "Экспарт статыстыкі ў фармат CSV" 297 | -------------------------------------------------------------------------------- /po/bg.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the flowtime package. 4 | # FIRST AUTHOR , YEAR. 5 | # twlvnn kraftwerk , 2024. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: flowtime\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2024-01-06 16:17+0300\n" 12 | "PO-Revision-Date: 2024-06-26 15:53+0200\n" 13 | "Last-Translator: twlvnn kraftwerk \n" 14 | "Language-Team: Bulgarian \n" 15 | "Language: bg\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n != 1)\n" 20 | "X-Generator: Gtranslator 46.1\n" 21 | 22 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 23 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 24 | msgid "Flowtime" 25 | msgstr "Flowtime" 26 | 27 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 28 | msgid "Spend your time wisely" 29 | msgstr "Прекарвайте времето си разумно" 30 | 31 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 32 | msgid "" 33 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 34 | "take a break when you are 100% concentrated in something you like might be " 35 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 36 | "without loosing you **flow**." 37 | msgstr "" 38 | "Техниката „Помодоро“ е ефикасна за задачи, които ви се струват скучни, но " 39 | "необходимостта да правите почивка, когато сте 100% концентрирани върху нещо, " 40 | "което ви харесва, може да е досадна. Ето защо съществува техниката " 41 | "„Flowtime“: правете подходящи почивки, без да губите **потока**." 42 | 43 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:60 44 | msgid "Diego Iván" 45 | msgstr "Diego Iván" 46 | 47 | #: src/Application.vala:73 48 | msgid "Flowtime is saving your statistics" 49 | msgstr "„Flowtime“ запазва вашата статистика" 50 | 51 | #: src/Application.vala:144 52 | msgid "translator_credits" 53 | msgstr "twlvnn kraftwerk " 54 | 55 | #: src/Application.vala:149 56 | msgid "Sounds by: " 57 | msgstr "Звуци от: " 58 | 59 | #: src/Models/StatObject.vala:24 src/Widgets/StatInfo.vala:56 60 | msgid "seconds" 61 | msgstr "секунди" 62 | 63 | #: src/Models/StatObject.vala:29 src/Widgets/StatInfo.vala:61 64 | msgid "minutes" 65 | msgstr "минути" 66 | 67 | #: src/Models/StatObject.vala:38 src/Widgets/StatInfo.vala:70 68 | msgid "hour" 69 | msgstr "час" 70 | 71 | #: src/Models/StatObject.vala:41 src/Widgets/StatInfo.vala:73 72 | msgid "hours" 73 | msgstr "часове" 74 | 75 | #: src/Models/StatObject.vala:49 src/Widgets/StatInfo.vala:81 76 | msgid "day" 77 | msgstr "ден" 78 | 79 | #: src/Models/StatObject.vala:52 src/Widgets/StatInfo.vala:84 80 | msgid "days" 81 | msgstr "дни" 82 | 83 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 84 | msgid "Break is over!" 85 | msgstr "Почивката приключи!" 86 | 87 | #: src/Services/Alarm.vala:29 88 | msgid "Let's get back to work" 89 | msgstr "Да се върнем на работа" 90 | 91 | #: src/Services/Statistics.vala:237 92 | msgid "Today" 93 | msgstr "Днес" 94 | 95 | #: src/Services/Statistics.vala:239 96 | msgid "This Week" 97 | msgstr "Тази седмица" 98 | 99 | #: src/Services/Statistics.vala:241 100 | msgid "This Month" 101 | msgstr "Този месец" 102 | 103 | #: src/Services/Statistics.vala:243 104 | msgid "All Time" 105 | msgstr "Общо" 106 | 107 | #: src/Services/BackgroundStatusReporter.vala:36 108 | #, c-format 109 | msgid "Break Stage: %s" 110 | msgstr "Етап на почивка: %s" 111 | 112 | #: src/Services/BackgroundStatusReporter.vala:40 113 | #, c-format 114 | msgid "Work Stage: %s" 115 | msgstr "Етап на работа: %s" 116 | 117 | #: src/Services/Timer.vala:153 src/ui/statinfo.blp:52 118 | msgid "Work" 119 | msgstr "Работа" 120 | 121 | #: src/Services/Timer.vala:155 src/ui/statinfo.blp:65 122 | msgid "Break" 123 | msgstr "Почивка" 124 | 125 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 126 | #: src/Widgets/StatInfo.vala:44 127 | #, c-format 128 | msgid "You've worked %s and have taken a break during %s." 129 | msgstr "Работили сте %s и сте си взели почивка по време на %s." 130 | 131 | #: src/Widgets/StatsWindow.vala:43 132 | #, c-format 133 | msgid "%s is your most productive day of the week" 134 | msgstr "%s е най-продуктивният ви ден от седмицата" 135 | 136 | #: src/Widgets/TimerPage.vala:43 137 | msgid "Work Stage" 138 | msgstr "Етап на работа" 139 | 140 | #: src/Widgets/TimerPage.vala:46 141 | msgid "Break Stage" 142 | msgstr "Етап на почивка" 143 | 144 | #: src/Widgets/TimerPage.vala:52 145 | msgid "Pause Timer" 146 | msgstr "Пауза на таймера" 147 | 148 | #: src/Widgets/TimerPage.vala:56 149 | msgid "Start Timer" 150 | msgstr "Стартиране на таймера" 151 | 152 | #: src/Widgets/Window.vala:141 153 | msgid "There is a timer active" 154 | msgstr "Има активен таймер" 155 | 156 | #: src/Widgets/Window.vala:141 157 | msgid "Do you want to quit?" 158 | msgstr "Искате ли да спрете програмата?" 159 | 160 | #: src/Widgets/Window.vala:145 161 | msgid "Cancel" 162 | msgstr "Отказване, отменяне, прекрати" 163 | 164 | #: src/Widgets/Window.vala:146 165 | msgid "Hide window" 166 | msgstr "Скриване на прозореца" 167 | 168 | #: src/Widgets/Window.vala:147 169 | msgid "Quit" 170 | msgstr "Спиране на програмата" 171 | 172 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 173 | msgid "_Preferences" 174 | msgstr "_Настройки" 175 | 176 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 177 | msgid "Statistics" 178 | msgstr "Статистики" 179 | 180 | #: src/ui/preferenceswindow.blp:16 181 | msgid "Months Saved" 182 | msgstr "Запазени месеци" 183 | 184 | #: src/ui/preferenceswindow.blp:17 185 | msgid "The amount of months that the work data will be saved" 186 | msgstr "Броят месеци, през които ще бъдат запазени данните за работа" 187 | 188 | #: src/ui/preferenceswindow.blp:29 189 | msgid "Timer" 190 | msgstr "Таймер" 191 | 192 | #: src/ui/preferenceswindow.blp:32 193 | msgid "Break time percentage" 194 | msgstr "Процент на времето за почивка" 195 | 196 | #: src/ui/preferenceswindow.blp:33 197 | msgid "The percetage of work time that will be used as break time" 198 | msgstr "" 199 | "Процентът от работното време, който ще се използва като време за почивка" 200 | 201 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 202 | #: src/ui/statwindow.blp:71 203 | msgid "Break Time" 204 | msgstr "Почивка" 205 | 206 | #: src/ui/preferenceswindow.blp:47 207 | msgid "Autostart" 208 | msgstr "Автоматично стартиране" 209 | 210 | #: src/ui/preferenceswindow.blp:48 211 | msgid "Automatically start the timer when the stage is changed" 212 | msgstr "Автоматично стартиране на таймера при смяна на етапа" 213 | 214 | #: src/ui/preferenceswindow.blp:59 215 | msgid "Activate Screensaver on Break Time" 216 | msgstr "Активиране на скрийсейвърa при начало на почивки" 217 | 218 | #: src/ui/preferenceswindow.blp:60 219 | msgid "" 220 | "Activate the screensaver when the break stage starts. Requires Autostart" 221 | msgstr "" 222 | "Активирайте скрийнсейвъра, когато започне етапът на почивката. Изисква " 223 | "„Aвтоматично стартиране“" 224 | 225 | #: src/ui/preferenceswindow.blp:66 226 | msgid "Sounds" 227 | msgstr "Звуци" 228 | 229 | #: src/ui/preferenceswindow.blp:67 230 | msgid "Alarm sounds that mark break time" 231 | msgstr "Алармени звуци, които отбелязват времето за почивка" 232 | 233 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 234 | msgid "Start working to see your progress" 235 | msgstr "Започнете да работите, за да видите напредъка си" 236 | 237 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 238 | msgid "Overview" 239 | msgstr "Преглед, обобщение" 240 | 241 | #: src/ui/statpage.blp:22 242 | msgid "See Details" 243 | msgstr "Виж подробности" 244 | 245 | #: src/ui/statwindow.blp:30 246 | msgid "Save as CSV" 247 | msgstr "Запазване като CSV" 248 | 249 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 250 | msgid "Work Time" 251 | msgstr "Работа" 252 | 253 | #: src/ui/window.blp:12 254 | msgid "_Distraction Free Mode" 255 | msgstr "_Режим „Без разсейване“" 256 | 257 | #: src/ui/window.blp:18 258 | msgid "_About Flowtime" 259 | msgstr "_Относно „Flowtime“" 260 | 261 | #: src/ui/window.blp:66 262 | msgid "_Stages" 263 | msgstr "_Етапи" 264 | 265 | #: src/ui/window.blp:77 266 | msgid "S_tatistics" 267 | msgstr "_Статистики" 268 | -------------------------------------------------------------------------------- /po/de.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the flowtime package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: flowtime\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-10-21 12:27-0600\n" 11 | "PO-Revision-Date: 2022-03-10 21:46+0100\n" 12 | "Last-Translator: \n" 13 | "Language-Team: \n" 14 | "Language: de\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 19 | "X-Generator: Poedit 3.0.1\n" 20 | 21 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 22 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 23 | msgid "Flowtime" 24 | msgstr "" 25 | 26 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 27 | msgid "Spend your time wisely" 28 | msgstr "" 29 | 30 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 31 | msgid "" 32 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 33 | "take a break when you are 100% concentrated in something you like might be " 34 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 35 | "without loosing you **flow**." 36 | msgstr "" 37 | "Die Pomodoro-Technik ist effizient für Aufgaben, die Sie langweilig finden, " 38 | "aber eine Pause zu machen, wenn Sie sich zu 100 % auf etwas konzentrieren, " 39 | "das Ihnen Spaß macht, kann lästig sein. Deshalb gibt es die Flowtime-" 40 | "Technik: Angemessene Pausen machen, ohne den **Fluss** zu verlieren." 41 | 42 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:78 43 | msgid "Diego Iván" 44 | msgstr "" 45 | 46 | #: src/Application.vala:77 47 | msgid "Flowtime is saving your statistics" 48 | msgstr "" 49 | 50 | #: src/Application.vala:146 51 | #, fuzzy 52 | msgid "translator_credits" 53 | msgstr "tronta" 54 | 55 | #. If seconds is less than a minute, it will display seconds 56 | #: src/Models/StatObject.vala:21 src/Widgets/StatInfo.vala:56 57 | msgid "seconds" 58 | msgstr "" 59 | 60 | #: src/Models/StatObject.vala:31 src/Widgets/StatInfo.vala:65 61 | msgid "minutes" 62 | msgstr "" 63 | 64 | #: src/Models/StatObject.vala:59 src/Widgets/StatInfo.vala:92 65 | msgid "hour" 66 | msgstr "" 67 | 68 | #: src/Models/StatObject.vala:62 src/Widgets/StatInfo.vala:95 69 | msgid "hours" 70 | msgstr "" 71 | 72 | #: src/Models/StatObject.vala:79 src/Widgets/StatInfo.vala:110 73 | msgid "day" 74 | msgstr "" 75 | 76 | #: src/Models/StatObject.vala:82 src/Widgets/StatInfo.vala:113 77 | msgid "days" 78 | msgstr "" 79 | 80 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 81 | #, fuzzy 82 | msgid "Break is over!" 83 | msgstr "Pausenzeit" 84 | 85 | #: src/Services/Alarm.vala:29 86 | msgid "Let's get back to work" 87 | msgstr "" 88 | 89 | #: src/Services/Statistics.vala:237 90 | msgid "Today" 91 | msgstr "" 92 | 93 | #: src/Services/Statistics.vala:239 94 | msgid "This Week" 95 | msgstr "" 96 | 97 | #: src/Services/Statistics.vala:241 98 | msgid "This Month" 99 | msgstr "" 100 | 101 | #: src/Services/Statistics.vala:243 102 | msgid "All Time" 103 | msgstr "" 104 | 105 | #: src/Services/BackgroundStatusReporter.vala:36 106 | #, fuzzy, c-format 107 | msgid "Break Stage: %s" 108 | msgstr "Pausenzeit" 109 | 110 | #: src/Services/BackgroundStatusReporter.vala:40 111 | #, fuzzy, c-format 112 | msgid "Work Stage: %s" 113 | msgstr "Pausenzeit" 114 | 115 | #: src/Services/Timer.vala:177 src/ui/statinfo.blp:52 116 | msgid "Work" 117 | msgstr "" 118 | 119 | #: src/Services/Timer.vala:179 src/ui/statinfo.blp:65 120 | #, fuzzy 121 | msgid "Break" 122 | msgstr "Pausenzeit" 123 | 124 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 125 | #: src/Widgets/StatInfo.vala:44 126 | #, c-format 127 | msgid "You've worked %s and have taken a break during %s." 128 | msgstr "" 129 | 130 | #: src/Widgets/StatsWindow.vala:43 131 | #, c-format 132 | msgid "%s is your most productive day of the week" 133 | msgstr "" 134 | 135 | #: src/Widgets/TimerPage.vala:43 136 | #, fuzzy 137 | msgid "Work Stage" 138 | msgstr "Pausenzeit" 139 | 140 | #: src/Widgets/TimerPage.vala:46 141 | #, fuzzy 142 | msgid "Break Stage" 143 | msgstr "Pausenzeit" 144 | 145 | #: src/Widgets/TimerPage.vala:52 146 | msgid "Pause Timer" 147 | msgstr "" 148 | 149 | #: src/Widgets/TimerPage.vala:56 150 | msgid "Start Timer" 151 | msgstr "" 152 | 153 | #: src/Widgets/Window.vala:137 154 | msgid "There is a Session Active" 155 | msgstr "" 156 | 157 | #: src/Widgets/Window.vala:137 158 | msgid "Do you want to quit?" 159 | msgstr "" 160 | 161 | #: src/Widgets/Window.vala:141 162 | msgid "Cancel" 163 | msgstr "" 164 | 165 | #: src/Widgets/Window.vala:142 166 | msgid "Hide Window" 167 | msgstr "" 168 | 169 | #: src/Widgets/Window.vala:143 170 | msgid "Quit Session" 171 | msgstr "" 172 | 173 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 174 | msgid "_Preferences" 175 | msgstr "_Einstellungen" 176 | 177 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 178 | msgid "Statistics" 179 | msgstr "" 180 | 181 | #: src/ui/preferenceswindow.blp:16 182 | msgid "Months Saved" 183 | msgstr "" 184 | 185 | #: src/ui/preferenceswindow.blp:17 186 | msgid "The amount of months that the work data will be saved" 187 | msgstr "" 188 | 189 | #: src/ui/preferenceswindow.blp:29 190 | msgid "Timer" 191 | msgstr "" 192 | 193 | #: src/ui/preferenceswindow.blp:32 194 | #, fuzzy 195 | msgid "Break time percentage" 196 | msgstr "Pausenzeit" 197 | 198 | #: src/ui/preferenceswindow.blp:33 199 | msgid "The percetage of work time that will be used as break time" 200 | msgstr "" 201 | 202 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 203 | #: src/ui/statwindow.blp:71 204 | #, fuzzy 205 | msgid "Break Time" 206 | msgstr "Pausenzeit" 207 | 208 | #: src/ui/preferenceswindow.blp:47 209 | msgid "Autostart" 210 | msgstr "" 211 | 212 | #: src/ui/preferenceswindow.blp:48 213 | msgid "Automatically start the timer when the stage is changed" 214 | msgstr "" 215 | 216 | #: src/ui/preferenceswindow.blp:59 217 | msgid "Activate Screensaver on Break Time" 218 | msgstr "" 219 | 220 | #: src/ui/preferenceswindow.blp:60 221 | msgid "" 222 | "Activate the screensaver when the break stage starts. Requires Autostart" 223 | msgstr "" 224 | 225 | #: src/ui/preferenceswindow.blp:66 226 | msgid "Sounds" 227 | msgstr "Klänge" 228 | 229 | #: src/ui/preferenceswindow.blp:67 230 | msgid "Alarm sounds that mark break time" 231 | msgstr "Alarmtöne, die die Pausenzeit markieren" 232 | 233 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 234 | msgid "Start working to see your progress" 235 | msgstr "" 236 | 237 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 238 | msgid "Overview" 239 | msgstr "" 240 | 241 | #: src/ui/statpage.blp:22 242 | msgid "See Details" 243 | msgstr "" 244 | 245 | #: src/ui/statwindow.blp:30 246 | msgid "Save as CSV" 247 | msgstr "" 248 | 249 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 250 | msgid "Work Time" 251 | msgstr "" 252 | 253 | #: src/ui/window.blp:12 254 | msgid "_Distraction Free Mode" 255 | msgstr "" 256 | 257 | #: src/ui/window.blp:18 258 | msgid "_About Flowtime" 259 | msgstr "_Über Flowtime" 260 | 261 | #: src/ui/window.blp:66 262 | msgid "_Stages" 263 | msgstr "" 264 | 265 | #: src/ui/window.blp:77 266 | msgid "S_tatistics" 267 | msgstr "" 268 | 269 | #~ msgid "Get things done, keep concentrated" 270 | #~ msgstr "Dinge erledigen, konzentriert bleiben" 271 | 272 | #~ msgid "Good Job!" 273 | #~ msgstr "Gut gemacht!" 274 | 275 | #~ msgid "Time to take a rest" 276 | #~ msgstr "Zeit zum Ausruhen" 277 | 278 | #~ msgid "In the meantime, drink some water" 279 | #~ msgstr "In der Zwischenzeit etwas Wasser trinken" 280 | 281 | #~ msgid "It's coffee time" 282 | #~ msgstr "Es ist Zeit für einen Kaffee" 283 | 284 | #~ msgid "You deserve a break" 285 | #~ msgstr "Sie haben sich eine Pause verdient" 286 | 287 | #~ msgid "Keep a healthy mind" 288 | #~ msgstr "Behalten Sie einen gesunden Geist" 289 | 290 | #~ msgid "Just breathe" 291 | #~ msgstr "Einfach atmen" 292 | 293 | #~ msgid "Relax, refresh and recharge" 294 | #~ msgstr "Entspannen, erfrischen und auftanken" 295 | 296 | #~ msgid "Celebrate your small wins" 297 | #~ msgstr "Feiern Sie Ihre kleinen Erfolge" 298 | 299 | #~ msgid "Impossible is just an opinion" 300 | #~ msgstr "Unmöglich ist nur eine Sichtweise" 301 | 302 | #~ msgid "Way to go!" 303 | #~ msgstr "Gut gemacht!" 304 | 305 | #~ msgid "Begin anywhere" 306 | #~ msgstr "Irgendwo anfangen" 307 | 308 | #~ msgid "The possibilities are never ending" 309 | #~ msgstr "Die Möglichkeiten sind endlos" 310 | 311 | #~ msgid "" 312 | #~ "New feature! The end of the break is now marked with both a notification " 313 | #~ "and tone" 314 | #~ msgstr "" 315 | #~ "Neue Funktion! Das Ende der Pause wird jetzt durch eine Benachrichtigung " 316 | #~ "und einen Ton angezeigt" 317 | 318 | #~ msgid "Customizable tones!" 319 | #~ msgstr "Anpassbare Töne!" 320 | 321 | #~ msgid "" 322 | #~ "The first release of Flowtime! Work for all the time you feel " 323 | #~ "concentrated, take breaks when it's necessary. Spanish Translation " 324 | #~ "available!" 325 | #~ msgstr "" 326 | #~ "Die erste Version von Flowtime! Arbeiten Sie so lange, wie Sie sich " 327 | #~ "konzentriert fühlen, und machen Sie Pausen, wenn es nötig ist. Spanische " 328 | #~ "Übersetzung verfügbar!" 329 | 330 | #~ msgid "Changes will be applied in the next work session" 331 | #~ msgstr "Änderungen werden in der nächsten Arbeitssitzung umgesetzt" 332 | 333 | #~ msgid "Time until break" 334 | #~ msgstr "Zeit bis zur Pause" 335 | 336 | #~ msgid "The time you have to work until a break is allowed." 337 | #~ msgstr "Die Zeit, die Sie arbeiten müssen, bis eine Pause erlaubt ist." 338 | -------------------------------------------------------------------------------- /po/flowtime.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the flowtime package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: flowtime\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2024-01-06 16:17+0300\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 21 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 22 | msgid "Flowtime" 23 | msgstr "" 24 | 25 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 26 | msgid "Spend your time wisely" 27 | msgstr "" 28 | 29 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 30 | msgid "" 31 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 32 | "take a break when you are 100% concentrated in something you like might be " 33 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 34 | "without loosing you **flow**." 35 | msgstr "" 36 | 37 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:60 38 | msgid "Diego Iván" 39 | msgstr "" 40 | 41 | #: src/Application.vala:73 42 | msgid "Flowtime is saving your statistics" 43 | msgstr "" 44 | 45 | #: src/Application.vala:144 46 | msgid "translator_credits" 47 | msgstr "" 48 | 49 | #: src/Application.vala:149 50 | msgid "Sounds by: " 51 | msgstr "" 52 | 53 | #: src/Models/StatObject.vala:24 src/Widgets/StatInfo.vala:56 54 | msgid "seconds" 55 | msgstr "" 56 | 57 | #: src/Models/StatObject.vala:29 src/Widgets/StatInfo.vala:61 58 | msgid "minutes" 59 | msgstr "" 60 | 61 | #: src/Models/StatObject.vala:38 src/Widgets/StatInfo.vala:70 62 | msgid "hour" 63 | msgstr "" 64 | 65 | #: src/Models/StatObject.vala:41 src/Widgets/StatInfo.vala:73 66 | msgid "hours" 67 | msgstr "" 68 | 69 | #: src/Models/StatObject.vala:49 src/Widgets/StatInfo.vala:81 70 | msgid "day" 71 | msgstr "" 72 | 73 | #: src/Models/StatObject.vala:52 src/Widgets/StatInfo.vala:84 74 | msgid "days" 75 | msgstr "" 76 | 77 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 78 | msgid "Break is over!" 79 | msgstr "" 80 | 81 | #: src/Services/Alarm.vala:29 82 | msgid "Let's get back to work" 83 | msgstr "" 84 | 85 | #: src/Services/Statistics.vala:237 86 | msgid "Today" 87 | msgstr "" 88 | 89 | #: src/Services/Statistics.vala:239 90 | msgid "This Week" 91 | msgstr "" 92 | 93 | #: src/Services/Statistics.vala:241 94 | msgid "This Month" 95 | msgstr "" 96 | 97 | #: src/Services/Statistics.vala:243 98 | msgid "All Time" 99 | msgstr "" 100 | 101 | #: src/Services/BackgroundStatusReporter.vala:36 102 | #, c-format 103 | msgid "Break Stage: %s" 104 | msgstr "" 105 | 106 | #: src/Services/BackgroundStatusReporter.vala:40 107 | #, c-format 108 | msgid "Work Stage: %s" 109 | msgstr "" 110 | 111 | #: src/Services/Timer.vala:153 src/ui/statinfo.blp:52 112 | msgid "Work" 113 | msgstr "" 114 | 115 | #: src/Services/Timer.vala:155 src/ui/statinfo.blp:65 116 | msgid "Break" 117 | msgstr "" 118 | 119 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 120 | #: src/Widgets/StatInfo.vala:44 121 | #, c-format 122 | msgid "You've worked %s and have taken a break during %s." 123 | msgstr "" 124 | 125 | #: src/Widgets/StatsWindow.vala:43 126 | #, c-format 127 | msgid "%s is your most productive day of the week" 128 | msgstr "" 129 | 130 | #: src/Widgets/TimerPage.vala:43 131 | msgid "Work Stage" 132 | msgstr "" 133 | 134 | #: src/Widgets/TimerPage.vala:46 135 | msgid "Break Stage" 136 | msgstr "" 137 | 138 | #: src/Widgets/TimerPage.vala:52 139 | msgid "Pause Timer" 140 | msgstr "" 141 | 142 | #: src/Widgets/TimerPage.vala:56 143 | msgid "Start Timer" 144 | msgstr "" 145 | 146 | #: src/Widgets/Window.vala:141 147 | msgid "There is a timer active" 148 | msgstr "" 149 | 150 | #: src/Widgets/Window.vala:141 151 | msgid "Do you want to quit?" 152 | msgstr "" 153 | 154 | #: src/Widgets/Window.vala:145 155 | msgid "Cancel" 156 | msgstr "" 157 | 158 | #: src/Widgets/Window.vala:146 159 | msgid "Hide window" 160 | msgstr "" 161 | 162 | #: src/Widgets/Window.vala:147 163 | msgid "Quit" 164 | msgstr "" 165 | 166 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 167 | msgid "_Preferences" 168 | msgstr "" 169 | 170 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 171 | msgid "Statistics" 172 | msgstr "" 173 | 174 | #: src/ui/preferenceswindow.blp:16 175 | msgid "Months Saved" 176 | msgstr "" 177 | 178 | #: src/ui/preferenceswindow.blp:17 179 | msgid "The amount of months that the work data will be saved" 180 | msgstr "" 181 | 182 | #: src/ui/preferenceswindow.blp:29 183 | msgid "Timer" 184 | msgstr "" 185 | 186 | #: src/ui/preferenceswindow.blp:32 187 | msgid "Break time percentage" 188 | msgstr "" 189 | 190 | #: src/ui/preferenceswindow.blp:33 191 | msgid "The percetage of work time that will be used as break time" 192 | msgstr "" 193 | 194 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 195 | #: src/ui/statwindow.blp:71 196 | msgid "Break Time" 197 | msgstr "" 198 | 199 | #: src/ui/preferenceswindow.blp:47 200 | msgid "Autostart" 201 | msgstr "" 202 | 203 | #: src/ui/preferenceswindow.blp:48 204 | msgid "Automatically start the timer when the stage is changed" 205 | msgstr "" 206 | 207 | #: src/ui/preferenceswindow.blp:59 208 | msgid "Activate Screensaver on Break Time" 209 | msgstr "" 210 | 211 | #: src/ui/preferenceswindow.blp:60 212 | msgid "" 213 | "Activate the screensaver when the break stage starts. Requires Autostart" 214 | msgstr "" 215 | 216 | #: src/ui/preferenceswindow.blp:66 217 | msgid "Sounds" 218 | msgstr "" 219 | 220 | #: src/ui/preferenceswindow.blp:67 221 | msgid "Alarm sounds that mark break time" 222 | msgstr "" 223 | 224 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 225 | msgid "Start working to see your progress" 226 | msgstr "" 227 | 228 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 229 | msgid "Overview" 230 | msgstr "" 231 | 232 | #: src/ui/statpage.blp:22 233 | msgid "See Details" 234 | msgstr "" 235 | 236 | #: src/ui/statwindow.blp:30 237 | msgid "Save as CSV" 238 | msgstr "" 239 | 240 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 241 | msgid "Work Time" 242 | msgstr "" 243 | 244 | #: src/ui/window.blp:12 245 | msgid "_Distraction Free Mode" 246 | msgstr "" 247 | 248 | #: src/ui/window.blp:18 249 | msgid "_About Flowtime" 250 | msgstr "" 251 | 252 | #: src/ui/window.blp:66 253 | msgid "_Stages" 254 | msgstr "" 255 | 256 | #: src/ui/window.blp:77 257 | msgid "S_tatistics" 258 | msgstr "" 259 | -------------------------------------------------------------------------------- /po/fr.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the flowtime package. 4 | # FIRST AUTHOR , YEAR. 5 | # Irénée THIRION , 2023. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: flowtime\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2023-10-21 12:27-0600\n" 12 | "PO-Revision-Date: 2023-11-03 15:55+0100\n" 13 | "Last-Translator: Irénée THIRION \n" 14 | "Language-Team: French \n" 15 | "Language: fr\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n > 1)\n" 20 | "X-Generator: Gtranslator 45.3\n" 21 | 22 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 23 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 24 | msgid "Flowtime" 25 | msgstr "Flowtime" 26 | 27 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 28 | msgid "Spend your time wisely" 29 | msgstr "Dépensez votre temps avec sagesse" 30 | 31 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 32 | msgid "" 33 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 34 | "take a break when you are 100% concentrated in something you like might be " 35 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 36 | "without loosing you **flow**." 37 | msgstr "" 38 | "La technique Pomodoro est efficace pour les tâches que vous trouvez " 39 | "ennuyeuses, mais devoir faire une pause lorsque vous êtes concentré à 100% " 40 | "sur quelque chose que vous aimez peut être frustrant. C’est pourquoi la " 41 | "technique Flowtime existe : faire des pauses appropriées sans perdre son " 42 | "**flow**." 43 | 44 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:78 45 | msgid "Diego Iván" 46 | msgstr "Diego Iván" 47 | 48 | #: src/Application.vala:77 49 | msgid "Flowtime is saving your statistics" 50 | msgstr "Flowtime enregistre vos statistiques" 51 | 52 | #: src/Application.vala:146 53 | msgid "translator_credits" 54 | msgstr "Irénée Thirion" 55 | 56 | #. If seconds is less than a minute, it will display seconds 57 | #: src/Models/StatObject.vala:21 src/Widgets/StatInfo.vala:56 58 | msgid "seconds" 59 | msgstr "secondes" 60 | 61 | #: src/Models/StatObject.vala:31 src/Widgets/StatInfo.vala:65 62 | msgid "minutes" 63 | msgstr "minutes" 64 | 65 | #: src/Models/StatObject.vala:59 src/Widgets/StatInfo.vala:92 66 | msgid "hour" 67 | msgstr "heure" 68 | 69 | #: src/Models/StatObject.vala:62 src/Widgets/StatInfo.vala:95 70 | msgid "hours" 71 | msgstr "heures" 72 | 73 | #: src/Models/StatObject.vala:79 src/Widgets/StatInfo.vala:110 74 | msgid "day" 75 | msgstr "jour" 76 | 77 | #: src/Models/StatObject.vala:82 src/Widgets/StatInfo.vala:113 78 | msgid "days" 79 | msgstr "jours" 80 | 81 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 82 | msgid "Break is over!" 83 | msgstr "La pause est terminée !" 84 | 85 | #: src/Services/Alarm.vala:29 86 | msgid "Let's get back to work" 87 | msgstr "Retournons au travail" 88 | 89 | #: src/Services/Statistics.vala:237 90 | msgid "Today" 91 | msgstr "Aujourd’hui" 92 | 93 | #: src/Services/Statistics.vala:239 94 | msgid "This Week" 95 | msgstr "Cette semaine" 96 | 97 | #: src/Services/Statistics.vala:241 98 | msgid "This Month" 99 | msgstr "Ce mois-ci" 100 | 101 | #: src/Services/Statistics.vala:243 102 | msgid "All Time" 103 | msgstr "Total" 104 | 105 | #: src/Services/BackgroundStatusReporter.vala:36 106 | #, c-format 107 | msgid "Break Stage: %s" 108 | msgstr "Phase de pause : %s" 109 | 110 | #: src/Services/BackgroundStatusReporter.vala:40 111 | #, c-format 112 | msgid "Work Stage: %s" 113 | msgstr "Phase de travail : %s" 114 | 115 | #: src/Services/Timer.vala:177 src/ui/statinfo.blp:52 116 | msgid "Work" 117 | msgstr "Travail" 118 | 119 | #: src/Services/Timer.vala:179 src/ui/statinfo.blp:65 120 | msgid "Break" 121 | msgstr "Pause" 122 | 123 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 124 | #: src/Widgets/StatInfo.vala:44 125 | #, c-format 126 | msgid "You've worked %s and have taken a break during %s." 127 | msgstr "Vous avez travaillé %s et avez pris %s de pause." 128 | 129 | #: src/Widgets/StatsWindow.vala:43 130 | #, c-format 131 | msgid "%s is your most productive day of the week" 132 | msgstr "%s est votre jour le plus productif de la semaine" 133 | 134 | #: src/Widgets/TimerPage.vala:43 135 | msgid "Work Stage" 136 | msgstr "Phase de travail" 137 | 138 | #: src/Widgets/TimerPage.vala:46 139 | msgid "Break Stage" 140 | msgstr "Phase de pause" 141 | 142 | #: src/Widgets/TimerPage.vala:52 143 | msgid "Pause Timer" 144 | msgstr "Mettre le minuteur en pause" 145 | 146 | #: src/Widgets/TimerPage.vala:56 147 | msgid "Start Timer" 148 | msgstr "Démarrer le minuteur" 149 | 150 | #: src/Widgets/Window.vala:137 151 | msgid "There is a Session Active" 152 | msgstr "Il y a une session active" 153 | 154 | #: src/Widgets/Window.vala:137 155 | msgid "Do you want to quit?" 156 | msgstr "Souhaitez-vous quitter ?" 157 | 158 | #: src/Widgets/Window.vala:141 159 | msgid "Cancel" 160 | msgstr "Annuler" 161 | 162 | #: src/Widgets/Window.vala:142 163 | msgid "Hide Window" 164 | msgstr "Masquer la fenêtre" 165 | 166 | #: src/Widgets/Window.vala:143 167 | msgid "Quit Session" 168 | msgstr "Quitter la session" 169 | 170 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 171 | msgid "_Preferences" 172 | msgstr "_Préférences" 173 | 174 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 175 | msgid "Statistics" 176 | msgstr "Statistiques" 177 | 178 | #: src/ui/preferenceswindow.blp:16 179 | msgid "Months Saved" 180 | msgstr "Mois enregistrés" 181 | 182 | #: src/ui/preferenceswindow.blp:17 183 | msgid "The amount of months that the work data will be saved" 184 | msgstr "" 185 | "Nombre de mois pendant lesquels les données de travail seront sauvegardées" 186 | 187 | #: src/ui/preferenceswindow.blp:29 188 | msgid "Timer" 189 | msgstr "Minuteur" 190 | 191 | #: src/ui/preferenceswindow.blp:32 192 | msgid "Break time percentage" 193 | msgstr "Pourcentage de temps de pause" 194 | 195 | #: src/ui/preferenceswindow.blp:33 196 | msgid "The percetage of work time that will be used as break time" 197 | msgstr "Pourcentage du temps de travail qui sera utilisé comme temps de pause" 198 | 199 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 200 | #: src/ui/statwindow.blp:71 201 | msgid "Break Time" 202 | msgstr "Temps de pause" 203 | 204 | #: src/ui/preferenceswindow.blp:47 205 | msgid "Autostart" 206 | msgstr "Démarrage automatique" 207 | 208 | #: src/ui/preferenceswindow.blp:48 209 | msgid "Automatically start the timer when the stage is changed" 210 | msgstr "Démarre automatiquement le minuteur quand la phase est changée" 211 | 212 | #: src/ui/preferenceswindow.blp:59 213 | msgid "Activate Screensaver on Break Time" 214 | msgstr "Activer l’économiseur d’écran pendant les temps de pause" 215 | 216 | #: src/ui/preferenceswindow.blp:60 217 | msgid "" 218 | "Activate the screensaver when the break stage starts. Requires Autostart" 219 | msgstr "" 220 | "Activer l’économiseur d’écran quand une phase de pause commence. Requiert un " 221 | "redémarrage de l’application" 222 | 223 | #: src/ui/preferenceswindow.blp:66 224 | msgid "Sounds" 225 | msgstr "Sons" 226 | 227 | #: src/ui/preferenceswindow.blp:67 228 | msgid "Alarm sounds that mark break time" 229 | msgstr "Sons d’alarme marquant l’heure de pause" 230 | 231 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 232 | msgid "Start working to see your progress" 233 | msgstr "Commencez à travailler pour voir votre progression" 234 | 235 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 236 | msgid "Overview" 237 | msgstr "Aperçu" 238 | 239 | #: src/ui/statpage.blp:22 240 | msgid "See Details" 241 | msgstr "Voir les détails" 242 | 243 | #: src/ui/statwindow.blp:30 244 | msgid "Save as CSV" 245 | msgstr "Enregistrer au format CSV" 246 | 247 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 248 | msgid "Work Time" 249 | msgstr "Temps de travail" 250 | 251 | #: src/ui/window.blp:12 252 | msgid "_Distraction Free Mode" 253 | msgstr "Mode sans _distractions" 254 | 255 | #: src/ui/window.blp:18 256 | msgid "_About Flowtime" 257 | msgstr "À _propos de Flowtime" 258 | 259 | #: src/ui/window.blp:66 260 | msgid "_Stages" 261 | msgstr "_Phases" 262 | 263 | #: src/ui/window.blp:77 264 | msgid "S_tatistics" 265 | msgstr "_Statistiques" 266 | 267 | #~ msgid "Get things done, keep concentrated" 268 | #~ msgstr "Faites ce que vous avez à faire, restez concentré" 269 | 270 | #~ msgid "_Enable Small View" 271 | #~ msgstr "_Activer la petite vue" 272 | 273 | #~ msgid "Flowtime 2.0: Keep on track!" 274 | #~ msgstr "Flowtime 2.0 : Gardez le cap !" 275 | 276 | #~ msgid "In this new version, a shiny new feature was added: Statistics!" 277 | #~ msgstr "" 278 | #~ "Dans cette nouvelle version, une nouvelle fonctionnalité a été ajoutée : " 279 | #~ "les statistiques !" 280 | 281 | #~ msgid "" 282 | #~ "Have an overview of how much time you have worked in the last month, week " 283 | #~ "and day" 284 | #~ msgstr "" 285 | #~ "Ayez un aperçu de votre temps de travail au cours du dernier mois, de la " 286 | #~ "dernière semaine et du dernier jour." 287 | 288 | #~ msgid "Take a look at your day-specific data" 289 | #~ msgstr "Jetez un coup d'œil à vos données journalières" 290 | 291 | #~ msgid "Export your statistics to CSV format" 292 | #~ msgstr "Exportez vos statistiques au format CSV" 293 | -------------------------------------------------------------------------------- /po/he.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the flowtime package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: flowtime\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2023-10-21 12:27-0600\n" 11 | "PO-Revision-Date: 2024-03-13 16:44+0200\n" 12 | "Last-Translator: Yaron Shahrabani \n" 13 | "Language-Team: \n" 14 | "Language: he\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? " 19 | "2 : 3);\n" 20 | "X-Generator: Poedit 3.4.2\n" 21 | 22 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 23 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 24 | msgid "Flowtime" 25 | msgstr "Flowtime" 26 | 27 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 28 | msgid "Spend your time wisely" 29 | msgstr "ניצול נכון של הזמן שלך" 30 | 31 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 32 | msgid "" 33 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 34 | "take a break when you are 100% concentrated in something you like might be " 35 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 36 | "without loosing you **flow**." 37 | msgstr "" 38 | "טכניקת פומודורו יעילה למשימות משעממות, אבל לצאת להפסקה במהלך 100% ריכוז יכול " 39 | "להיות די מעצבן. לכן קיימת טכניקת Flowtime: יציאה להפסקות מספיקות מבלי לצאת " 40 | "מ**הרצף**." 41 | 42 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:78 43 | msgid "Diego Iván" 44 | msgstr "דייגו איוון" 45 | 46 | #: src/Application.vala:77 47 | msgid "Flowtime is saving your statistics" 48 | msgstr "‫Flowtime שומר את הסטטיסטיקה שלך" 49 | 50 | #: src/Application.vala:146 51 | msgid "translator_credits" 52 | msgstr "ירון שהרבני " 53 | 54 | #. If seconds is less than a minute, it will display seconds 55 | #: src/Models/StatObject.vala:21 src/Widgets/StatInfo.vala:56 56 | msgid "seconds" 57 | msgstr "שניות" 58 | 59 | #: src/Models/StatObject.vala:31 src/Widgets/StatInfo.vala:65 60 | msgid "minutes" 61 | msgstr "דקות" 62 | 63 | #: src/Models/StatObject.vala:59 src/Widgets/StatInfo.vala:92 64 | msgid "hour" 65 | msgstr "שעה" 66 | 67 | #: src/Models/StatObject.vala:62 src/Widgets/StatInfo.vala:95 68 | msgid "hours" 69 | msgstr "שעות" 70 | 71 | #: src/Models/StatObject.vala:79 src/Widgets/StatInfo.vala:110 72 | msgid "day" 73 | msgstr "יום" 74 | 75 | #: src/Models/StatObject.vala:82 src/Widgets/StatInfo.vala:113 76 | msgid "days" 77 | msgstr "יומיים" 78 | 79 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 80 | msgid "Break is over!" 81 | msgstr "ההפסקה הסתיימה!" 82 | 83 | #: src/Services/Alarm.vala:29 84 | msgid "Let's get back to work" 85 | msgstr "נחזור לעבודה" 86 | 87 | #: src/Services/Statistics.vala:237 88 | msgid "Today" 89 | msgstr "היום" 90 | 91 | #: src/Services/Statistics.vala:239 92 | msgid "This Week" 93 | msgstr "השבוע" 94 | 95 | #: src/Services/Statistics.vala:241 96 | msgid "This Month" 97 | msgstr "החודש" 98 | 99 | #: src/Services/Statistics.vala:243 100 | msgid "All Time" 101 | msgstr "כל הזמן" 102 | 103 | #: src/Services/BackgroundStatusReporter.vala:36 104 | #, c-format 105 | msgid "Break Stage: %s" 106 | msgstr "שלב הפסקה: %s" 107 | 108 | #: src/Services/BackgroundStatusReporter.vala:40 109 | #, c-format 110 | msgid "Work Stage: %s" 111 | msgstr "שלב עבודה: %s" 112 | 113 | #: src/Services/Timer.vala:177 src/ui/statinfo.blp:52 114 | msgid "Work" 115 | msgstr "עבודה" 116 | 117 | #: src/Services/Timer.vala:179 src/ui/statinfo.blp:65 118 | msgid "Break" 119 | msgstr "הפסקה" 120 | 121 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 122 | #: src/Widgets/StatInfo.vala:44 123 | #, c-format 124 | msgid "You've worked %s and have taken a break during %s." 125 | msgstr "עבדת %s ויצאת להפסקה במשך %s." 126 | 127 | #: src/Widgets/StatsWindow.vala:43 128 | #, c-format 129 | msgid "%s is your most productive day of the week" 130 | msgstr "%s הוא היום הכי מועיל שלך בשבוע" 131 | 132 | #: src/Widgets/TimerPage.vala:43 133 | msgid "Work Stage" 134 | msgstr "שלב עבודה" 135 | 136 | #: src/Widgets/TimerPage.vala:46 137 | msgid "Break Stage" 138 | msgstr "שלב הפסקה" 139 | 140 | #: src/Widgets/TimerPage.vala:52 141 | msgid "Pause Timer" 142 | msgstr "השהיית מתזמן" 143 | 144 | #: src/Widgets/TimerPage.vala:56 145 | msgid "Start Timer" 146 | msgstr "התחלת מתזמן" 147 | 148 | #: src/Widgets/Window.vala:137 149 | msgid "There is a Session Active" 150 | msgstr "יש הפעלה רצה" 151 | 152 | #: src/Widgets/Window.vala:137 153 | msgid "Do you want to quit?" 154 | msgstr "לצאת?" 155 | 156 | #: src/Widgets/Window.vala:141 157 | msgid "Cancel" 158 | msgstr "הסגה" 159 | 160 | #: src/Widgets/Window.vala:142 161 | msgid "Hide Window" 162 | msgstr "הסתרת חלון" 163 | 164 | #: src/Widgets/Window.vala:143 165 | msgid "Quit Session" 166 | msgstr "יציאה מהפעלה" 167 | 168 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 169 | msgid "_Preferences" 170 | msgstr "הע_דפות" 171 | 172 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 173 | msgid "Statistics" 174 | msgstr "סטטיסטיקה" 175 | 176 | #: src/ui/preferenceswindow.blp:16 177 | msgid "Months Saved" 178 | msgstr "חודשים לשמירה" 179 | 180 | #: src/ui/preferenceswindow.blp:17 181 | msgid "The amount of months that the work data will be saved" 182 | msgstr "כמות החודשים עבורם יישמרו נתוני העבודה" 183 | 184 | #: src/ui/preferenceswindow.blp:29 185 | msgid "Timer" 186 | msgstr "מתזמן" 187 | 188 | #: src/ui/preferenceswindow.blp:32 189 | msgid "Break time percentage" 190 | msgstr "אחוז זמני הפסקה" 191 | 192 | #: src/ui/preferenceswindow.blp:33 193 | msgid "The percetage of work time that will be used as break time" 194 | msgstr "אחוז העבודה שייחשב לזמן הפסקה" 195 | 196 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 197 | #: src/ui/statwindow.blp:71 198 | msgid "Break Time" 199 | msgstr "זמן הפסקה" 200 | 201 | #: src/ui/preferenceswindow.blp:47 202 | msgid "Autostart" 203 | msgstr "התחלה אוטומטית" 204 | 205 | #: src/ui/preferenceswindow.blp:48 206 | msgid "Automatically start the timer when the stage is changed" 207 | msgstr "להתחיל את המתזמן אוטומטית כאשר השלב משתנה" 208 | 209 | #: src/ui/preferenceswindow.blp:59 210 | msgid "Activate Screensaver on Break Time" 211 | msgstr "הפעלת שומר מסך בזמן ההפסקה" 212 | 213 | #: src/ui/preferenceswindow.blp:60 214 | msgid "" 215 | "Activate the screensaver when the break stage starts. Requires Autostart" 216 | msgstr "להפעיל שומר מסך עם תחילת שלב ההפסקה. דורש הפעלה אוטומטית" 217 | 218 | #: src/ui/preferenceswindow.blp:66 219 | msgid "Sounds" 220 | msgstr "צלילים" 221 | 222 | #: src/ui/preferenceswindow.blp:67 223 | msgid "Alarm sounds that mark break time" 224 | msgstr "צלילי התראה שמסמנים את זמן ההפסקה" 225 | 226 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 227 | msgid "Start working to see your progress" 228 | msgstr "ניתן להתחיל לעבוד כדי לראות את ההתקדמות שלך" 229 | 230 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 231 | msgid "Overview" 232 | msgstr "סקירה" 233 | 234 | #: src/ui/statpage.blp:22 235 | msgid "See Details" 236 | msgstr "הצגת פרטים" 237 | 238 | #: src/ui/statwindow.blp:30 239 | msgid "Save as CSV" 240 | msgstr "שמירה כ־CSV" 241 | 242 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 243 | msgid "Work Time" 244 | msgstr "זמן עבודה" 245 | 246 | #: src/ui/window.blp:12 247 | msgid "_Distraction Free Mode" 248 | msgstr "מצב _נטול הסחות" 249 | 250 | #: src/ui/window.blp:18 251 | msgid "_About Flowtime" 252 | msgstr "_על Flowtime" 253 | 254 | #: src/ui/window.blp:66 255 | msgid "_Stages" 256 | msgstr "_שלבים" 257 | 258 | #: src/ui/window.blp:77 259 | msgid "S_tatistics" 260 | msgstr "ס_טטיסטיקה" 261 | 262 | #~ msgid "Get things done, keep concentrated" 263 | #~ msgstr "לקדם משימות, לשמור על מיקוד" 264 | 265 | #~ msgid "Flowtime 2.0: Keep on track!" 266 | #~ msgstr "Flowtime 2.0: מטפחים עשייה!" 267 | 268 | #~ msgid "In this new version, a shiny new feature was added: Statistics!" 269 | #~ msgstr "בגרסה זו, נוספה יכולת חדשה ונוצצת: סטטיסטיקה!" 270 | 271 | #~ msgid "" 272 | #~ "Have an overview of how much time you have worked in the last month, week " 273 | #~ "and day" 274 | #~ msgstr "קבלת סקירה על הזמן שהושקע בחודש החולף ברמת שבוע ויום" 275 | 276 | #~ msgid "Take a look at your day-specific data" 277 | #~ msgstr "מבט מעמיק על הנתונים היומיים שלך" 278 | 279 | #~ msgid "Export your statistics to CSV format" 280 | #~ msgstr "ייצוא הסטטיסטיקה שלך לתצורת CSV" 281 | -------------------------------------------------------------------------------- /po/hi.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the flowtime package. 4 | # FIRST AUTHOR , YEAR. 5 | # Scrambled777 , 2024. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: flowtime\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2024-01-06 16:17+0300\n" 12 | "PO-Revision-Date: 2024-05-11 14:37+0530\n" 13 | "Last-Translator: Scrambled777 \n" 14 | "Language-Team: Hindi \n" 15 | "Language: hi\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 20 | "X-Generator: Gtranslator 46.1\n" 21 | 22 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 23 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 24 | msgid "Flowtime" 25 | msgstr "Flowtime" 26 | 27 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 28 | msgid "Spend your time wisely" 29 | msgstr "अपना समय समझदारी से व्यतीत करें" 30 | 31 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 32 | msgid "" 33 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 34 | "take a break when you are 100% concentrated in something you like might be " 35 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 36 | "without loosing you **flow**." 37 | msgstr "" 38 | "Pomodoro तकनीक उन कार्यों के लिए प्रभावी है जो आपको उबाऊ लगते हैं, लेकिन जब आप अपनी " 39 | "पसंद की किसी चीज़ में 100% केंद्रित होते हैं तो विराम लेना कष्टप्रद हो सकता है। इसीलिए " 40 | "Flowtime तकनीक मौजूद है: अपना **प्रवाह** खोए बिना उचित विराम लें।" 41 | 42 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:60 43 | msgid "Diego Iván" 44 | msgstr "डिएगो इवान" 45 | 46 | #: src/Application.vala:73 47 | msgid "Flowtime is saving your statistics" 48 | msgstr "Flowtime आपके आंकड़े सहेज रहा है" 49 | 50 | #: src/Application.vala:144 51 | msgid "translator_credits" 52 | msgstr "Scrambled777 " 53 | 54 | #: src/Application.vala:149 55 | msgid "Sounds by: " 56 | msgstr "ध्वनियां द्वारा: " 57 | 58 | #: src/Models/StatObject.vala:24 src/Widgets/StatInfo.vala:56 59 | msgid "seconds" 60 | msgstr "सेकंड" 61 | 62 | #: src/Models/StatObject.vala:29 src/Widgets/StatInfo.vala:61 63 | msgid "minutes" 64 | msgstr "मिनट" 65 | 66 | #: src/Models/StatObject.vala:38 src/Widgets/StatInfo.vala:70 67 | msgid "hour" 68 | msgstr "घंटा" 69 | 70 | #: src/Models/StatObject.vala:41 src/Widgets/StatInfo.vala:73 71 | msgid "hours" 72 | msgstr "घंटे" 73 | 74 | #: src/Models/StatObject.vala:49 src/Widgets/StatInfo.vala:81 75 | msgid "day" 76 | msgstr "दिन" 77 | 78 | #: src/Models/StatObject.vala:52 src/Widgets/StatInfo.vala:84 79 | msgid "days" 80 | msgstr "दिन" 81 | 82 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 83 | msgid "Break is over!" 84 | msgstr "विराम खत्म हुआ!" 85 | 86 | #: src/Services/Alarm.vala:29 87 | msgid "Let's get back to work" 88 | msgstr "चलिए काम पर वापस आते हैं" 89 | 90 | #: src/Services/Statistics.vala:237 91 | msgid "Today" 92 | msgstr "आज" 93 | 94 | #: src/Services/Statistics.vala:239 95 | msgid "This Week" 96 | msgstr "इस सप्ताह" 97 | 98 | #: src/Services/Statistics.vala:241 99 | msgid "This Month" 100 | msgstr "इस महीने" 101 | 102 | #: src/Services/Statistics.vala:243 103 | msgid "All Time" 104 | msgstr "हर समय" 105 | 106 | #: src/Services/BackgroundStatusReporter.vala:36 107 | #, c-format 108 | msgid "Break Stage: %s" 109 | msgstr "विराम अवस्था: %s" 110 | 111 | #: src/Services/BackgroundStatusReporter.vala:40 112 | #, c-format 113 | msgid "Work Stage: %s" 114 | msgstr "कार्य अवस्था: %s" 115 | 116 | #: src/Services/Timer.vala:153 src/ui/statinfo.blp:52 117 | msgid "Work" 118 | msgstr "कार्य" 119 | 120 | #: src/Services/Timer.vala:155 src/ui/statinfo.blp:65 121 | msgid "Break" 122 | msgstr "विराम" 123 | 124 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 125 | #: src/Widgets/StatInfo.vala:44 126 | #, c-format 127 | msgid "You've worked %s and have taken a break during %s." 128 | msgstr "आपने %s पर काम किया है और %s के दौरान विराम लिया है।" 129 | 130 | #: src/Widgets/StatsWindow.vala:43 131 | #, c-format 132 | msgid "%s is your most productive day of the week" 133 | msgstr "%s आपका सप्ताह का सबसे उत्पादक दिन है" 134 | 135 | #: src/Widgets/TimerPage.vala:43 136 | msgid "Work Stage" 137 | msgstr "कार्य अवस्था" 138 | 139 | #: src/Widgets/TimerPage.vala:46 140 | msgid "Break Stage" 141 | msgstr "विराम अवस्था" 142 | 143 | #: src/Widgets/TimerPage.vala:52 144 | msgid "Pause Timer" 145 | msgstr "टाइमर रोकें" 146 | 147 | #: src/Widgets/TimerPage.vala:56 148 | msgid "Start Timer" 149 | msgstr "टाइमर प्रारंभ करें" 150 | 151 | #: src/Widgets/Window.vala:141 152 | msgid "There is a timer active" 153 | msgstr "एक टाइमर सक्रिय है" 154 | 155 | #: src/Widgets/Window.vala:141 156 | msgid "Do you want to quit?" 157 | msgstr "क्या आप बाहर निकलना चाहते है?" 158 | 159 | #: src/Widgets/Window.vala:145 160 | msgid "Cancel" 161 | msgstr "रद्द करें" 162 | 163 | #: src/Widgets/Window.vala:146 164 | msgid "Hide window" 165 | msgstr "खिड़की छिपाएं" 166 | 167 | #: src/Widgets/Window.vala:147 168 | msgid "Quit" 169 | msgstr "छोड़ें" 170 | 171 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 172 | msgid "_Preferences" 173 | msgstr "प्राथमिकताएं (_P)" 174 | 175 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 176 | msgid "Statistics" 177 | msgstr "आंकड़े" 178 | 179 | #: src/ui/preferenceswindow.blp:16 180 | msgid "Months Saved" 181 | msgstr "महीने बचाये" 182 | 183 | #: src/ui/preferenceswindow.blp:17 184 | msgid "The amount of months that the work data will be saved" 185 | msgstr "जितने महीनों तक कार्य डेटा सहेजा जाएगा" 186 | 187 | #: src/ui/preferenceswindow.blp:29 188 | msgid "Timer" 189 | msgstr "टाइमर" 190 | 191 | #: src/ui/preferenceswindow.blp:32 192 | msgid "Break time percentage" 193 | msgstr "विराम समय प्रतिशत" 194 | 195 | #: src/ui/preferenceswindow.blp:33 196 | msgid "The percetage of work time that will be used as break time" 197 | msgstr "कार्य समय का वह प्रतिशत जिसका उपयोग विराम टाइम के रूप में किया जाएगा" 198 | 199 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 200 | #: src/ui/statwindow.blp:71 201 | msgid "Break Time" 202 | msgstr "विराम समय" 203 | 204 | #: src/ui/preferenceswindow.blp:47 205 | msgid "Autostart" 206 | msgstr "स्वतः प्रारंभ" 207 | 208 | #: src/ui/preferenceswindow.blp:48 209 | msgid "Automatically start the timer when the stage is changed" 210 | msgstr "अवस्था बदलने पर स्वचालित रूप से टाइमर शुरू हो जाता है" 211 | 212 | #: src/ui/preferenceswindow.blp:59 213 | msgid "Activate Screensaver on Break Time" 214 | msgstr "विराम टाइम पर स्क्रीनसेवर सक्रिय करें" 215 | 216 | #: src/ui/preferenceswindow.blp:60 217 | msgid "" 218 | "Activate the screensaver when the break stage starts. Requires Autostart" 219 | msgstr "विराम अवस्था शुरू होने पर स्क्रीनसेवर सक्रिय करें। स्वतः प्रारंभ की आवश्यकता है" 220 | 221 | #: src/ui/preferenceswindow.blp:66 222 | msgid "Sounds" 223 | msgstr "ध्वनि" 224 | 225 | #: src/ui/preferenceswindow.blp:67 226 | msgid "Alarm sounds that mark break time" 227 | msgstr "अलार्म बजता है जो विराम टाइम को चिह्नित करता है" 228 | 229 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 230 | msgid "Start working to see your progress" 231 | msgstr "अपनी प्रगति देखने के लिए काम करना शुरू करें" 232 | 233 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 234 | msgid "Overview" 235 | msgstr "अवलोकन" 236 | 237 | #: src/ui/statpage.blp:22 238 | msgid "See Details" 239 | msgstr "विवरण देखें" 240 | 241 | #: src/ui/statwindow.blp:30 242 | msgid "Save as CSV" 243 | msgstr "CSV के रूप में सहेजें" 244 | 245 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 246 | msgid "Work Time" 247 | msgstr "कार्य समय" 248 | 249 | #: src/ui/window.blp:12 250 | msgid "_Distraction Free Mode" 251 | msgstr "व्याकुलता मुक्त मोड (_D)" 252 | 253 | #: src/ui/window.blp:18 254 | msgid "_About Flowtime" 255 | msgstr "Flowtime के बारे में (_A)" 256 | 257 | #: src/ui/window.blp:66 258 | msgid "_Stages" 259 | msgstr "अवस्था (_S)" 260 | 261 | #: src/ui/window.blp:77 262 | msgid "S_tatistics" 263 | msgstr "आंकड़े (_t)" 264 | -------------------------------------------------------------------------------- /po/meson.build: -------------------------------------------------------------------------------- 1 | i18n.gettext('flowtime', preset: 'glib') 2 | -------------------------------------------------------------------------------- /po/nl.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 2 | # This file is distributed under the same license as the flowtime package. 3 | # 4 | # Heimen Stoffels , 2022. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: flowtime\n" 8 | "Report-Msgid-Bugs-To: \n" 9 | "POT-Creation-Date: 2023-10-21 12:27-0600\n" 10 | "PO-Revision-Date: 2022-07-09 13:15+0200\n" 11 | "Last-Translator: Heimen Stoffels \n" 12 | "Language-Team: Dutch\n" 13 | "Language: nl\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 18 | "X-Generator: Lokalize 22.04.2\n" 19 | 20 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 21 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 22 | msgid "Flowtime" 23 | msgstr "Flowtime" 24 | 25 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 26 | msgid "Spend your time wisely" 27 | msgstr "" 28 | 29 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 30 | msgid "" 31 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 32 | "take a break when you are 100% concentrated in something you like might be " 33 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 34 | "without loosing you **flow**." 35 | msgstr "" 36 | "De Pomodoro-techniek is het efficiëntst bij saaie taken, maar een pauze " 37 | "nemen terwijl je volledig gefocust bent op iets is ook niet prettig. Wij " 38 | "hebben daarom de Flowtime-techniek ontwikkeld: pauzes op momenten dat het " 39 | "jou uitkomt, zonder uit de **flow** te raken." 40 | 41 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:78 42 | msgid "Diego Iván" 43 | msgstr "Diego Iván" 44 | 45 | #: src/Application.vala:77 46 | msgid "Flowtime is saving your statistics" 47 | msgstr "" 48 | 49 | #: src/Application.vala:146 50 | #, fuzzy 51 | msgid "translator_credits" 52 | msgstr "Heimen Stoffels " 53 | 54 | #. If seconds is less than a minute, it will display seconds 55 | #: src/Models/StatObject.vala:21 src/Widgets/StatInfo.vala:56 56 | msgid "seconds" 57 | msgstr "seconden" 58 | 59 | #: src/Models/StatObject.vala:31 src/Widgets/StatInfo.vala:65 60 | msgid "minutes" 61 | msgstr "minuten" 62 | 63 | #: src/Models/StatObject.vala:59 src/Widgets/StatInfo.vala:92 64 | msgid "hour" 65 | msgstr "uur" 66 | 67 | #: src/Models/StatObject.vala:62 src/Widgets/StatInfo.vala:95 68 | msgid "hours" 69 | msgstr "uur" 70 | 71 | #: src/Models/StatObject.vala:79 src/Widgets/StatInfo.vala:110 72 | msgid "day" 73 | msgstr "dag" 74 | 75 | #: src/Models/StatObject.vala:82 src/Widgets/StatInfo.vala:113 76 | msgid "days" 77 | msgstr "dagen" 78 | 79 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 80 | #, fuzzy 81 | msgid "Break is over!" 82 | msgstr "Pauzetijd" 83 | 84 | #: src/Services/Alarm.vala:29 85 | msgid "Let's get back to work" 86 | msgstr "" 87 | 88 | #: src/Services/Statistics.vala:237 89 | msgid "Today" 90 | msgstr "Vandaag" 91 | 92 | #: src/Services/Statistics.vala:239 93 | msgid "This Week" 94 | msgstr "Deze week" 95 | 96 | #: src/Services/Statistics.vala:241 97 | msgid "This Month" 98 | msgstr "Deze maand" 99 | 100 | #: src/Services/Statistics.vala:243 101 | #, fuzzy 102 | msgid "All Time" 103 | msgstr "Tijdklok" 104 | 105 | #: src/Services/BackgroundStatusReporter.vala:36 106 | #, fuzzy, c-format 107 | msgid "Break Stage: %s" 108 | msgstr "Pauze" 109 | 110 | #: src/Services/BackgroundStatusReporter.vala:40 111 | #, fuzzy, c-format 112 | msgid "Work Stage: %s" 113 | msgstr "Werk" 114 | 115 | #: src/Services/Timer.vala:177 src/ui/statinfo.blp:52 116 | #, fuzzy 117 | msgid "Work" 118 | msgstr "Werktijd" 119 | 120 | #: src/Services/Timer.vala:179 src/ui/statinfo.blp:65 121 | #, fuzzy 122 | msgid "Break" 123 | msgstr "Pauzetijd" 124 | 125 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 126 | #: src/Widgets/StatInfo.vala:44 127 | #, c-format 128 | msgid "You've worked %s and have taken a break during %s." 129 | msgstr "" 130 | 131 | #: src/Widgets/StatsWindow.vala:43 132 | #, c-format 133 | msgid "%s is your most productive day of the week" 134 | msgstr "%s was de productiefste dag van de week" 135 | 136 | #: src/Widgets/TimerPage.vala:43 137 | msgid "Work Stage" 138 | msgstr "Werk" 139 | 140 | #: src/Widgets/TimerPage.vala:46 141 | msgid "Break Stage" 142 | msgstr "Pauze" 143 | 144 | #: src/Widgets/TimerPage.vala:52 145 | #, fuzzy 146 | msgid "Pause Timer" 147 | msgstr "Tijdklok" 148 | 149 | #: src/Widgets/TimerPage.vala:56 150 | #, fuzzy 151 | msgid "Start Timer" 152 | msgstr "Tijdklok" 153 | 154 | #: src/Widgets/Window.vala:137 155 | msgid "There is a Session Active" 156 | msgstr "" 157 | 158 | #: src/Widgets/Window.vala:137 159 | msgid "Do you want to quit?" 160 | msgstr "" 161 | 162 | #: src/Widgets/Window.vala:141 163 | msgid "Cancel" 164 | msgstr "" 165 | 166 | #: src/Widgets/Window.vala:142 167 | msgid "Hide Window" 168 | msgstr "" 169 | 170 | #: src/Widgets/Window.vala:143 171 | msgid "Quit Session" 172 | msgstr "" 173 | 174 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 175 | msgid "_Preferences" 176 | msgstr "_Voorkeuren" 177 | 178 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 179 | msgid "Statistics" 180 | msgstr "Statistieken" 181 | 182 | #: src/ui/preferenceswindow.blp:16 183 | msgid "Months Saved" 184 | msgstr "Aantal maanden" 185 | 186 | #: src/ui/preferenceswindow.blp:17 187 | msgid "The amount of months that the work data will be saved" 188 | msgstr "Het aantal maanden waarin de gegevens dienen te worden bijgehouden" 189 | 190 | #: src/ui/preferenceswindow.blp:29 191 | msgid "Timer" 192 | msgstr "Tijdklok" 193 | 194 | #: src/ui/preferenceswindow.blp:32 195 | #, fuzzy 196 | msgid "Break time percentage" 197 | msgstr "Pauze" 198 | 199 | #: src/ui/preferenceswindow.blp:33 200 | msgid "The percetage of work time that will be used as break time" 201 | msgstr "" 202 | 203 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 204 | #: src/ui/statwindow.blp:71 205 | msgid "Break Time" 206 | msgstr "Pauzetijd" 207 | 208 | #: src/ui/preferenceswindow.blp:47 209 | msgid "Autostart" 210 | msgstr "Automatisch starten" 211 | 212 | #: src/ui/preferenceswindow.blp:48 213 | msgid "Automatically start the timer when the stage is changed" 214 | msgstr "Start de tijdklok direct na het inschakelen van een fase" 215 | 216 | #: src/ui/preferenceswindow.blp:59 217 | msgid "Activate Screensaver on Break Time" 218 | msgstr "" 219 | 220 | #: src/ui/preferenceswindow.blp:60 221 | msgid "" 222 | "Activate the screensaver when the break stage starts. Requires Autostart" 223 | msgstr "" 224 | 225 | #: src/ui/preferenceswindow.blp:66 226 | msgid "Sounds" 227 | msgstr "Geluiden" 228 | 229 | #: src/ui/preferenceswindow.blp:67 230 | msgid "Alarm sounds that mark break time" 231 | msgstr "Geluiden waarmee pauzes worden aangekondigd" 232 | 233 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 234 | msgid "Start working to see your progress" 235 | msgstr "" 236 | 237 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 238 | msgid "Overview" 239 | msgstr "" 240 | 241 | #: src/ui/statpage.blp:22 242 | msgid "See Details" 243 | msgstr "Details bekijken" 244 | 245 | #: src/ui/statwindow.blp:30 246 | msgid "Save as CSV" 247 | msgstr "" 248 | 249 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 250 | msgid "Work Time" 251 | msgstr "Werktijd" 252 | 253 | #: src/ui/window.blp:12 254 | msgid "_Distraction Free Mode" 255 | msgstr "" 256 | 257 | #: src/ui/window.blp:18 258 | msgid "_About Flowtime" 259 | msgstr "_Over Flowtime" 260 | 261 | #: src/ui/window.blp:66 262 | #, fuzzy 263 | msgid "_Stages" 264 | msgstr "Fases" 265 | 266 | #: src/ui/window.blp:77 267 | #, fuzzy 268 | msgid "S_tatistics" 269 | msgstr "Statistieken" 270 | 271 | #~ msgid "Get things done, keep concentrated" 272 | #~ msgstr "Rond je taken af door gefocust te blijven" 273 | 274 | #~ msgid "_Enable Small View" 275 | #~ msgstr "Compact_e weergave" 276 | 277 | #~ msgid "Flowtime 2.0: Keep on track!" 278 | #~ msgstr "Flowtime 2.0: blijf bij de tijd!" 279 | 280 | #~ msgid "In this new version, a shiny new feature was added: Statistics!" 281 | #~ msgstr "Deze nieuwe versie bevat een gloednieuwe functie: statistieken!" 282 | 283 | #~ msgid "" 284 | #~ "Have an overview of how much time you have worked in the last month, week " 285 | #~ "and day" 286 | #~ msgstr "Bekijk hoelang je de afgelopen maand, week of dag hebt gewerkt" 287 | 288 | #~ msgid "Take a look at your day-specific data" 289 | #~ msgstr "Bekijk dagelijkse informatie" 290 | 291 | #~ msgid "Export your statistics to CSV format" 292 | #~ msgstr "Exporteer statistieken naar csv-formaat" 293 | 294 | #~ msgid "Good Job!" 295 | #~ msgstr "Lekker bezig!" 296 | 297 | #~ msgid "Time to take a rest" 298 | #~ msgstr "Tijd voor een pauze" 299 | 300 | #~ msgid "In the meantime, drink some water" 301 | #~ msgstr "Drink ondertussen wat water" 302 | 303 | #~ msgid "It's coffee time" 304 | #~ msgstr "Tijd voor een bakkie leut" 305 | 306 | #~ msgid "You deserve a break" 307 | #~ msgstr "Je hebt wel een pauze verdiend" 308 | 309 | #~ msgid "Keep a healthy mind" 310 | #~ msgstr "Houd je geest scherp" 311 | 312 | #~ msgid "Just breathe" 313 | #~ msgstr "Adem in, adem uit" 314 | 315 | #~ msgid "Relax, refresh and recharge" 316 | #~ msgstr "Ontspan en doe nieuwe energie op" 317 | 318 | #~ msgid "Celebrate your small wins" 319 | #~ msgstr "Vier successen, groot of klein" 320 | 321 | #~ msgid "Impossible is just an opinion" 322 | #~ msgstr "Niets is onmogelijk" 323 | 324 | #~ msgid "Way to go!" 325 | #~ msgstr "Ga zo door!" 326 | 327 | #~ msgid "Begin anywhere" 328 | #~ msgstr "Je moet ergens beginnen" 329 | 330 | #~ msgid "The possibilities are never ending" 331 | #~ msgstr "Je mogelijkheden zijn eindeloos" 332 | 333 | #~ msgid "flowtime" 334 | #~ msgstr "flowtime" 335 | 336 | #~ msgid "Version 1.1.0" 337 | #~ msgstr "Versie 1.1.0" 338 | 339 | #~ msgid "" 340 | #~ "New feature! The end of the break is now marked with both a notification " 341 | #~ "and tone" 342 | #~ msgstr "" 343 | #~ "Nieuw: het einde van een pauze wordt voortaan aangekondigd middels een " 344 | #~ "melding en geluid" 345 | 346 | #~ msgid "Customizable tones!" 347 | #~ msgstr "Aanpasbare geluidsmeldingen!" 348 | 349 | #~ msgid "Version 1.0.0" 350 | #~ msgstr "Versie 1.0.0" 351 | 352 | #~ msgid "" 353 | #~ "The first release of Flowtime! Work for all the time you feel " 354 | #~ "concentrated, take breaks when it's necessary. Spanish Translation " 355 | #~ "available!" 356 | #~ msgstr "" 357 | #~ "Dit is de eerste versie van Flowtime! Werk zolang je gefocust bent, maar " 358 | #~ "neem pauzes indien nodig. Spaanse vertaling meegeleverd!" 359 | 360 | #~ msgid "Changes will be applied in the next work session" 361 | #~ msgstr "De wijzigingen worden toegepast in de volgende werksessie" 362 | 363 | #~ msgid "Time until break" 364 | #~ msgstr "Werktijd" 365 | 366 | #~ msgid "The time you have to work until a break is allowed." 367 | #~ msgstr "De tijd die je moet werken voordat je een pauze mag nemen." 368 | -------------------------------------------------------------------------------- /po/pt_BR.po: -------------------------------------------------------------------------------- 1 | # Brazilian Portuguese translation for flowtime package. 2 | # Copyright (C) 2022-2024 io.github.diegoivanme.flowtime's COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the flowtime package. 4 | # Fúlvio Leo , 2024. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: flowtime\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2024-01-06 16:17+0300\n" 11 | "PO-Revision-Date: 2024-07-30 15:53-0300\n" 12 | "Last-Translator: Fúlvio Leo \n" 13 | "Language-Team: Brazilian Portuguese\n" 14 | "Language: pt_BR\n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | "Plural-Forms: nplurals=2; plural=(n > 1);\n" 19 | "X-Generator: Gtranslator 46.1\n" 20 | 21 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 22 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 23 | msgid "Flowtime" 24 | msgstr "Flowtime" 25 | 26 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 27 | msgid "Spend your time wisely" 28 | msgstr "Gaste seu tempo com sabedoria" 29 | 30 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 31 | msgid "" 32 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 33 | "take a break when you are 100% concentrated in something you like might be " 34 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 35 | "without loosing you **flow**." 36 | msgstr "" 37 | "A técnica Pomodoro é eficiente para tarefas que você considera tediosas, mas " 38 | "tirar uma pausa quando você está 100% concentrado em algo que gosta pode ser " 39 | "chato. É por isso que a técnica Flowtime existe: tire pausas apropriadas sem " 40 | "perder a fluidez." 41 | 42 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:60 43 | msgid "Diego Iván" 44 | msgstr "Diego Iván" 45 | 46 | #: src/Application.vala:73 47 | msgid "Flowtime is saving your statistics" 48 | msgstr "Flowtime está salvando suas estatísticas" 49 | 50 | #: src/Application.vala:144 51 | msgid "translator_credits" 52 | msgstr "Fúlvio Leo " 53 | 54 | #: src/Application.vala:149 55 | msgid "Sounds by: " 56 | msgstr "Sons de:" 57 | 58 | #: src/Models/StatObject.vala:24 src/Widgets/StatInfo.vala:56 59 | msgid "seconds" 60 | msgstr "segundos" 61 | 62 | #: src/Models/StatObject.vala:29 src/Widgets/StatInfo.vala:61 63 | msgid "minutes" 64 | msgstr "minutos" 65 | 66 | #: src/Models/StatObject.vala:38 src/Widgets/StatInfo.vala:70 67 | msgid "hour" 68 | msgstr "hora" 69 | 70 | #: src/Models/StatObject.vala:41 src/Widgets/StatInfo.vala:73 71 | msgid "hours" 72 | msgstr "horas" 73 | 74 | #: src/Models/StatObject.vala:49 src/Widgets/StatInfo.vala:81 75 | msgid "day" 76 | msgstr "dia" 77 | 78 | #: src/Models/StatObject.vala:52 src/Widgets/StatInfo.vala:84 79 | msgid "days" 80 | msgstr "dias" 81 | 82 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 83 | msgid "Break is over!" 84 | msgstr "A pausa terminou!" 85 | 86 | #: src/Services/Alarm.vala:29 87 | msgid "Let's get back to work" 88 | msgstr "Vamos voltar ao trabalho" 89 | 90 | #: src/Services/Statistics.vala:237 91 | msgid "Today" 92 | msgstr "Hoje" 93 | 94 | #: src/Services/Statistics.vala:239 95 | msgid "This Week" 96 | msgstr "Essa Semana" 97 | 98 | #: src/Services/Statistics.vala:241 99 | msgid "This Month" 100 | msgstr "Esse mês" 101 | 102 | #: src/Services/Statistics.vala:243 103 | msgid "All Time" 104 | msgstr "Todo o tempo" 105 | 106 | #: src/Services/BackgroundStatusReporter.vala:36 107 | #, c-format 108 | msgid "Break Stage: %s" 109 | msgstr "Estágio da pausa: %s" 110 | 111 | #: src/Services/BackgroundStatusReporter.vala:40 112 | #, c-format 113 | msgid "Work Stage: %s" 114 | msgstr "Estágio do trabalho: %s" 115 | 116 | #: src/Services/Timer.vala:153 src/ui/statinfo.blp:52 117 | msgid "Work" 118 | msgstr "Trabalho" 119 | 120 | #: src/Services/Timer.vala:155 src/ui/statinfo.blp:65 121 | msgid "Break" 122 | msgstr "Pausa" 123 | 124 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 125 | #: src/Widgets/StatInfo.vala:44 126 | #, c-format 127 | msgid "You've worked %s and have taken a break during %s." 128 | msgstr "Você trabalhou %s e fez uma pausa durante %s." 129 | 130 | #: src/Widgets/StatsWindow.vala:43 131 | #, c-format 132 | msgid "%s is your most productive day of the week" 133 | msgstr "%s é o seu dia mais produto da semana" 134 | 135 | #: src/Widgets/TimerPage.vala:43 136 | msgid "Work Stage" 137 | msgstr "Estágio de trabalho" 138 | 139 | #: src/Widgets/TimerPage.vala:46 140 | msgid "Break Stage" 141 | msgstr "Estágio de pausa" 142 | 143 | #: src/Widgets/TimerPage.vala:52 144 | msgid "Pause Timer" 145 | msgstr "Temporizador de pausa" 146 | 147 | #: src/Widgets/TimerPage.vala:56 148 | msgid "Start Timer" 149 | msgstr "Iniciar temporizador" 150 | 151 | #: src/Widgets/Window.vala:141 152 | msgid "There is a timer active" 153 | msgstr "Existe um temporizador ativo" 154 | 155 | #: src/Widgets/Window.vala:141 156 | msgid "Do you want to quit?" 157 | msgstr "Você quer sair?" 158 | 159 | #: src/Widgets/Window.vala:145 160 | msgid "Cancel" 161 | msgstr "Cancelar" 162 | 163 | #: src/Widgets/Window.vala:146 164 | msgid "Hide window" 165 | msgstr "Esconder janela" 166 | 167 | #: src/Widgets/Window.vala:147 168 | msgid "Quit" 169 | msgstr "Sair" 170 | 171 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 172 | msgid "_Preferences" 173 | msgstr "_Preferências" 174 | 175 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 176 | msgid "Statistics" 177 | msgstr "Estatísticas" 178 | 179 | #: src/ui/preferenceswindow.blp:16 180 | msgid "Months Saved" 181 | msgstr "Meses salvos" 182 | 183 | #: src/ui/preferenceswindow.blp:17 184 | msgid "The amount of months that the work data will be saved" 185 | msgstr "A quantidade de meses que os dados de trabalho serão salvos" 186 | 187 | #: src/ui/preferenceswindow.blp:29 188 | msgid "Timer" 189 | msgstr "Temporizador" 190 | 191 | #: src/ui/preferenceswindow.blp:32 192 | msgid "Break time percentage" 193 | msgstr "Porcentagem de tempo de intervalo" 194 | 195 | #: src/ui/preferenceswindow.blp:33 196 | msgid "The percetage of work time that will be used as break time" 197 | msgstr "A porcentagem do tempo de trabalho que será usado como intervalo" 198 | 199 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 200 | #: src/ui/statwindow.blp:71 201 | msgid "Break Time" 202 | msgstr "Tempo de pausa" 203 | 204 | #: src/ui/preferenceswindow.blp:47 205 | msgid "Autostart" 206 | msgstr "Começo automático" 207 | 208 | #: src/ui/preferenceswindow.blp:48 209 | msgid "Automatically start the timer when the stage is changed" 210 | msgstr "Iniciar o cronômetro automaticamente quando o estágio for alterado" 211 | 212 | #: src/ui/preferenceswindow.blp:59 213 | msgid "Activate Screensaver on Break Time" 214 | msgstr "Ativar protetor de tela no intervalo" 215 | 216 | #: src/ui/preferenceswindow.blp:60 217 | msgid "" 218 | "Activate the screensaver when the break stage starts. Requires Autostart" 219 | msgstr "" 220 | "Ative o protetor de tela quando o estágio de pausa começar. Requer Começo " 221 | "automático" 222 | 223 | #: src/ui/preferenceswindow.blp:66 224 | msgid "Sounds" 225 | msgstr "Sons" 226 | 227 | #: src/ui/preferenceswindow.blp:67 228 | msgid "Alarm sounds that mark break time" 229 | msgstr "Sons de alarme que marcam o intervalo" 230 | 231 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 232 | msgid "Start working to see your progress" 233 | msgstr "Comece a trabalhar para ver seu progresso" 234 | 235 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 236 | msgid "Overview" 237 | msgstr "Visão geral" 238 | 239 | #: src/ui/statpage.blp:22 240 | msgid "See Details" 241 | msgstr "Ver detalhes" 242 | 243 | #: src/ui/statwindow.blp:30 244 | msgid "Save as CSV" 245 | msgstr "Salvar como CSV" 246 | 247 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 248 | msgid "Work Time" 249 | msgstr "Tempo de trabalho" 250 | 251 | #: src/ui/window.blp:12 252 | msgid "_Distraction Free Mode" 253 | msgstr "_Modo sem distrações" 254 | 255 | #: src/ui/window.blp:18 256 | msgid "_About Flowtime" 257 | msgstr "_Sobre o Flowtime" 258 | 259 | #: src/ui/window.blp:66 260 | msgid "_Stages" 261 | msgstr "_Estágios" 262 | 263 | #: src/ui/window.blp:77 264 | msgid "S_tatistics" 265 | msgstr "_Estatísticas" 266 | -------------------------------------------------------------------------------- /po/ru.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the flowtime package. 4 | # FIRST AUTHOR , YEAR. 5 | # Alexandre Prokoudine , 2022. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: flowtime\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2023-10-21 12:27-0600\n" 12 | "PO-Revision-Date: 2023-10-08 02:35+0200\n" 13 | "Last-Translator: Alexandre Prokoudine \n" 14 | "Language-Team: Russian \n" 15 | "Language: ru\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" 20 | "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" 21 | "X-Generator: Poedit 3.2.2\n" 22 | 23 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 24 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 25 | msgid "Flowtime" 26 | msgstr "Flowtime" 27 | 28 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 29 | msgid "Spend your time wisely" 30 | msgstr "Используйте время разумно" 31 | 32 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 33 | msgid "" 34 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 35 | "take a break when you are 100% concentrated in something you like might be " 36 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 37 | "without loosing you **flow**." 38 | msgstr "" 39 | "Техника Pomodoro эффективна для задач, которые кажутся вам скучными. Но " 40 | "делать перерыв, когда вы полностью сконцентрированы на работе, бывает " 41 | "неприятно. Поэтому и разработана техника Flowtime: делайте перерывы, не " 42 | "теряя ощущение потока." 43 | 44 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:78 45 | msgid "Diego Iván" 46 | msgstr "Diego Iván" 47 | 48 | #: src/Application.vala:77 49 | msgid "Flowtime is saving your statistics" 50 | msgstr "Flowtime сохраняет статистику" 51 | 52 | #: src/Application.vala:146 53 | msgid "translator_credits" 54 | msgstr "Александр Прокудин, alexandre.prokoudine@gmail.com" 55 | 56 | #. If seconds is less than a minute, it will display seconds 57 | #: src/Models/StatObject.vala:21 src/Widgets/StatInfo.vala:56 58 | msgid "seconds" 59 | msgstr "секунд" 60 | 61 | #: src/Models/StatObject.vala:31 src/Widgets/StatInfo.vala:65 62 | msgid "minutes" 63 | msgstr "минут" 64 | 65 | #: src/Models/StatObject.vala:59 src/Widgets/StatInfo.vala:92 66 | msgid "hour" 67 | msgstr "час" 68 | 69 | #: src/Models/StatObject.vala:62 src/Widgets/StatInfo.vala:95 70 | msgid "hours" 71 | msgstr "часов" 72 | 73 | #: src/Models/StatObject.vala:79 src/Widgets/StatInfo.vala:110 74 | msgid "day" 75 | msgstr "день" 76 | 77 | #: src/Models/StatObject.vala:82 src/Widgets/StatInfo.vala:113 78 | msgid "days" 79 | msgstr "дней" 80 | 81 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 82 | msgid "Break is over!" 83 | msgstr "Перерыв закончен!" 84 | 85 | #: src/Services/Alarm.vala:29 86 | msgid "Let's get back to work" 87 | msgstr "Давайте вернемся к работе" 88 | 89 | #: src/Services/Statistics.vala:237 90 | msgid "Today" 91 | msgstr "Сегодня" 92 | 93 | #: src/Services/Statistics.vala:239 94 | msgid "This Week" 95 | msgstr "На этой неделе" 96 | 97 | #: src/Services/Statistics.vala:241 98 | msgid "This Month" 99 | msgstr "В этом месяце" 100 | 101 | #: src/Services/Statistics.vala:243 102 | msgid "All Time" 103 | msgstr "Всё время" 104 | 105 | #: src/Services/BackgroundStatusReporter.vala:36 106 | #, c-format 107 | msgid "Break Stage: %s" 108 | msgstr "Стадия перерыва: %s" 109 | 110 | #: src/Services/BackgroundStatusReporter.vala:40 111 | #, c-format 112 | msgid "Work Stage: %s" 113 | msgstr "Стадия работы: %s" 114 | 115 | #: src/Services/Timer.vala:177 src/ui/statinfo.blp:52 116 | msgid "Work" 117 | msgstr "Работа" 118 | 119 | #: src/Services/Timer.vala:179 src/ui/statinfo.blp:65 120 | msgid "Break" 121 | msgstr "Перерыв" 122 | 123 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 124 | #: src/Widgets/StatInfo.vala:44 125 | #, c-format 126 | msgid "You've worked %s and have taken a break during %s." 127 | msgstr "Вы проработали %s и сделали перерыв во время %s." 128 | 129 | #: src/Widgets/StatsWindow.vala:43 130 | #, c-format 131 | msgid "%s is your most productive day of the week" 132 | msgstr "%s — ваш самый продуктивный день недели" 133 | 134 | #: src/Widgets/TimerPage.vala:43 135 | msgid "Work Stage" 136 | msgstr "Работа" 137 | 138 | #: src/Widgets/TimerPage.vala:46 139 | msgid "Break Stage" 140 | msgstr "Перерыв" 141 | 142 | #: src/Widgets/TimerPage.vala:52 143 | msgid "Pause Timer" 144 | msgstr "Пауза" 145 | 146 | #: src/Widgets/TimerPage.vala:56 147 | msgid "Start Timer" 148 | msgstr "Запустить" 149 | 150 | #: src/Widgets/Window.vala:137 151 | msgid "There is a Session Active" 152 | msgstr "Прямо сейчас есть запущенный сеанс" 153 | 154 | #: src/Widgets/Window.vala:137 155 | msgid "Do you want to quit?" 156 | msgstr "Вы хотите выйти из программы?" 157 | 158 | #: src/Widgets/Window.vala:141 159 | msgid "Cancel" 160 | msgstr "Отмена" 161 | 162 | #: src/Widgets/Window.vala:142 163 | msgid "Hide Window" 164 | msgstr "Скрыть окно" 165 | 166 | #: src/Widgets/Window.vala:143 167 | msgid "Quit Session" 168 | msgstr "Завершить сеанс" 169 | 170 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 171 | msgid "_Preferences" 172 | msgstr "_Параметры" 173 | 174 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 175 | msgid "Statistics" 176 | msgstr "Статистика" 177 | 178 | #: src/ui/preferenceswindow.blp:16 179 | msgid "Months Saved" 180 | msgstr "Сохранено месяцев" 181 | 182 | #: src/ui/preferenceswindow.blp:17 183 | msgid "The amount of months that the work data will be saved" 184 | msgstr "Данные за сколько месяцев будут сохранены" 185 | 186 | #: src/ui/preferenceswindow.blp:29 187 | msgid "Timer" 188 | msgstr "Таймер" 189 | 190 | #: src/ui/preferenceswindow.blp:32 191 | #, fuzzy 192 | msgid "Break time percentage" 193 | msgstr "Перерыв" 194 | 195 | #: src/ui/preferenceswindow.blp:33 196 | msgid "The percetage of work time that will be used as break time" 197 | msgstr "" 198 | 199 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 200 | #: src/ui/statwindow.blp:71 201 | msgid "Break Time" 202 | msgstr "Всего перерывов" 203 | 204 | #: src/ui/preferenceswindow.blp:47 205 | msgid "Autostart" 206 | msgstr "Автозапуск" 207 | 208 | #: src/ui/preferenceswindow.blp:48 209 | msgid "Automatically start the timer when the stage is changed" 210 | msgstr "Автоматически запускать таймер при смене этапа" 211 | 212 | #: src/ui/preferenceswindow.blp:59 213 | msgid "Activate Screensaver on Break Time" 214 | msgstr "" 215 | 216 | #: src/ui/preferenceswindow.blp:60 217 | msgid "" 218 | "Activate the screensaver when the break stage starts. Requires Autostart" 219 | msgstr "" 220 | 221 | #: src/ui/preferenceswindow.blp:66 222 | msgid "Sounds" 223 | msgstr "Звуки" 224 | 225 | #: src/ui/preferenceswindow.blp:67 226 | msgid "Alarm sounds that mark break time" 227 | msgstr "Звук предупреждения, что перерыв закончился" 228 | 229 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 230 | msgid "Start working to see your progress" 231 | msgstr "Начните работу, чтобы увидеть прогресс" 232 | 233 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 234 | msgid "Overview" 235 | msgstr "Обзор" 236 | 237 | #: src/ui/statpage.blp:22 238 | msgid "See Details" 239 | msgstr "Подробнее" 240 | 241 | #: src/ui/statwindow.blp:30 242 | msgid "Save as CSV" 243 | msgstr "Сохранить как CSV" 244 | 245 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 246 | msgid "Work Time" 247 | msgstr "Всего работы" 248 | 249 | #: src/ui/window.blp:12 250 | msgid "_Distraction Free Mode" 251 | msgstr "_Режим без отвлечений" 252 | 253 | #: src/ui/window.blp:18 254 | msgid "_About Flowtime" 255 | msgstr "_О программе" 256 | 257 | #: src/ui/window.blp:66 258 | msgid "_Stages" 259 | msgstr "_Стадии" 260 | 261 | #: src/ui/window.blp:77 262 | msgid "S_tatistics" 263 | msgstr "Ст_атистика" 264 | 265 | #~ msgid "Break time divisor" 266 | #~ msgstr "Делитель перерывов" 267 | 268 | #~ msgid "The factor used to calculate break time" 269 | #~ msgstr "Коэффициент для расчета времени на перерыв" 270 | 271 | #~ msgid "Get things done, keep concentrated" 272 | #~ msgstr "Решайте задачи, не теряйте концентрацию" 273 | 274 | #~ msgid "Flowtime 2.6: Small Changes" 275 | #~ msgstr "Flowtime 2.6: небольшие изменения" 276 | 277 | #~ msgid "New Features:" 278 | #~ msgstr "Новые функции:" 279 | 280 | #~ msgid "Icons have been redesigned by daudix-UFO" 281 | #~ msgstr "Новые значки нарисованы daudix-UFO" 282 | 283 | #~ msgid "New Translations: Turkish and Russian Translations" 284 | #~ msgstr "Новые переводы: турецкий и русский" 285 | 286 | #~ msgid "_Enable Small View" 287 | #~ msgstr "_Включить компактный режим" 288 | 289 | #~ msgid "Flowtime 2.0: Keep on track!" 290 | #~ msgstr "Flowtime 2.0: не отвлекайтесь!" 291 | 292 | #~ msgid "In this new version, a shiny new feature was added: Statistics!" 293 | #~ msgstr "В этой версии появилась новая классная функция: статистика!" 294 | 295 | #~ msgid "" 296 | #~ "Have an overview of how much time you have worked in the last month, week " 297 | #~ "and day" 298 | #~ msgstr "" 299 | #~ "Посмотрите, сколько времени вы работали в последний месяц, неделю и день" 300 | 301 | #~ msgid "Take a look at your day-specific data" 302 | #~ msgstr "Посмотрите данные за день" 303 | 304 | #~ msgid "Export your statistics to CSV format" 305 | #~ msgstr "Экспортировать статистику в формат CSV" 306 | 307 | #~ msgid "Fancy new feature: Small View Mode!" 308 | #~ msgstr "Классная новая возможность: компактный режим!" 309 | 310 | #~ msgid "Reduce clutter in your Flowtime window." 311 | #~ msgstr "Уберите всё лишнее из окна Flowtime" 312 | 313 | #~ msgid "Maximize your concentration." 314 | #~ msgstr "Увеличьте свою концентрацию" 315 | -------------------------------------------------------------------------------- /po/tr.po: -------------------------------------------------------------------------------- 1 | # Turkish translation for io.github.diegoivanme.flowtime. 2 | # Copyright (C) 2022-2024 io.github.diegoivanme.flowtime's COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the io.github.diegoivanme.flowtime package. 4 | # 5 | # Sabri Ünal , 2022, 2023, 2024. 6 | # 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: io.github.diegoivanme.flowtime\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2024-01-06 16:17+0300\n" 12 | "PO-Revision-Date: 2024-01-06 16:24+0300\n" 13 | "Last-Translator: Sabri Ünal \n" 14 | "Language-Team: Turkish \n" 15 | "Language: tr\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "Plural-Forms: nplurals=1; plural=0;\n" 20 | "X-Generator: Poedit 3.4.2\n" 21 | 22 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 23 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 24 | msgid "Flowtime" 25 | msgstr "Flowtime" 26 | 27 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 28 | msgid "Spend your time wisely" 29 | msgstr "Zamanınızı akıllıca kullanın" 30 | 31 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 32 | msgid "" 33 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 34 | "take a break when you are 100% concentrated in something you like might be " 35 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 36 | "without loosing you **flow**." 37 | msgstr "" 38 | "Pomodoro tekniği sıkıcı bulduğunuz görevler için etkilidir, ancak sevdiğiniz " 39 | "bir şeye %100 odaklandığınızda ara vermek zorunda kalmak can sıkıcı " 40 | "olabilir. Flowtime tekniği bu yüzden mevcuttur: **akışı** kaybetmeden uygun " 41 | "molalar verin." 42 | 43 | # Geliştirici adı 44 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:60 45 | msgid "Diego Iván" 46 | msgstr "Diego Iván" 47 | 48 | #: src/Application.vala:73 49 | msgid "Flowtime is saving your statistics" 50 | msgstr "Flowtime istatistiklerinizi kaydediyor" 51 | 52 | #: src/Application.vala:144 53 | msgid "translator_credits" 54 | msgstr "Sabri Ünal " 55 | 56 | #: src/Application.vala:149 57 | msgid "Sounds by: " 58 | msgstr "Sesler:" 59 | 60 | #: src/Models/StatObject.vala:24 src/Widgets/StatInfo.vala:56 61 | msgid "seconds" 62 | msgstr "saniye" 63 | 64 | #: src/Models/StatObject.vala:29 src/Widgets/StatInfo.vala:61 65 | msgid "minutes" 66 | msgstr "dakika" 67 | 68 | #: src/Models/StatObject.vala:38 src/Widgets/StatInfo.vala:70 69 | msgid "hour" 70 | msgstr "saat" 71 | 72 | #: src/Models/StatObject.vala:41 src/Widgets/StatInfo.vala:73 73 | msgid "hours" 74 | msgstr "saat" 75 | 76 | #: src/Models/StatObject.vala:49 src/Widgets/StatInfo.vala:81 77 | msgid "day" 78 | msgstr "gün" 79 | 80 | #: src/Models/StatObject.vala:52 src/Widgets/StatInfo.vala:84 81 | msgid "days" 82 | msgstr "gün" 83 | 84 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 85 | msgid "Break is over!" 86 | msgstr "Mola bitti!" 87 | 88 | #: src/Services/Alarm.vala:29 89 | msgid "Let's get back to work" 90 | msgstr "İşimize geri dönelim" 91 | 92 | #: src/Services/Statistics.vala:237 93 | msgid "Today" 94 | msgstr "Bugün" 95 | 96 | #: src/Services/Statistics.vala:239 97 | msgid "This Week" 98 | msgstr "Bu Hafta" 99 | 100 | #: src/Services/Statistics.vala:241 101 | msgid "This Month" 102 | msgstr "Bu Ay" 103 | 104 | #: src/Services/Statistics.vala:243 105 | msgid "All Time" 106 | msgstr "Tüm Zamanlar" 107 | 108 | #: src/Services/BackgroundStatusReporter.vala:36 109 | #, c-format 110 | msgid "Break Stage: %s" 111 | msgstr "Mola Aşaması: %s" 112 | 113 | #: src/Services/BackgroundStatusReporter.vala:40 114 | #, c-format 115 | msgid "Work Stage: %s" 116 | msgstr "Çalışma Aşaması: %s" 117 | 118 | #: src/Services/Timer.vala:153 src/ui/statinfo.blp:52 119 | msgid "Work" 120 | msgstr "Çalışma" 121 | 122 | #: src/Services/Timer.vala:155 src/ui/statinfo.blp:65 123 | msgid "Break" 124 | msgstr "Mola" 125 | 126 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 127 | #: src/Widgets/StatInfo.vala:44 128 | #, c-format 129 | msgid "You've worked %s and have taken a break during %s." 130 | msgstr "%s çalıştınız ve %s mola verdiniz." 131 | 132 | #: src/Widgets/StatsWindow.vala:43 133 | #, c-format 134 | msgid "%s is your most productive day of the week" 135 | msgstr "haftanın en verimli gününüz %s" 136 | 137 | #: src/Widgets/TimerPage.vala:43 138 | msgid "Work Stage" 139 | msgstr "Çalışma Aşaması" 140 | 141 | #: src/Widgets/TimerPage.vala:46 142 | msgid "Break Stage" 143 | msgstr "Mola Aşaması" 144 | 145 | #: src/Widgets/TimerPage.vala:52 146 | msgid "Pause Timer" 147 | msgstr "Zamanlayıcıyı Duraklat" 148 | 149 | #: src/Widgets/TimerPage.vala:56 150 | msgid "Start Timer" 151 | msgstr "Zamanlayıcıyı Başlat" 152 | 153 | #: src/Widgets/Window.vala:141 154 | msgid "There is a timer active" 155 | msgstr "Etkin zamanlayıcı var" 156 | 157 | #: src/Widgets/Window.vala:141 158 | msgid "Do you want to quit?" 159 | msgstr "Çıkmak mı istiyorsun?" 160 | 161 | #: src/Widgets/Window.vala:145 162 | msgid "Cancel" 163 | msgstr "İptal" 164 | 165 | #: src/Widgets/Window.vala:146 166 | msgid "Hide window" 167 | msgstr "Pencereyi gizle" 168 | 169 | #: src/Widgets/Window.vala:147 170 | msgid "Quit" 171 | msgstr "Çık" 172 | 173 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 174 | msgid "_Preferences" 175 | msgstr "_Tercihler" 176 | 177 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 178 | msgid "Statistics" 179 | msgstr "İstatistikler" 180 | 181 | #: src/ui/preferenceswindow.blp:16 182 | msgid "Months Saved" 183 | msgstr "Kaydedilecek Ay" 184 | 185 | #: src/ui/preferenceswindow.blp:17 186 | msgid "The amount of months that the work data will be saved" 187 | msgstr "Çalışma verilerinin kaydedileceği ay sayısı" 188 | 189 | #: src/ui/preferenceswindow.blp:29 190 | msgid "Timer" 191 | msgstr "Kronometre" 192 | 193 | #: src/ui/preferenceswindow.blp:32 194 | msgid "Break time percentage" 195 | msgstr "Mola süresi yüzdesi" 196 | 197 | #: src/ui/preferenceswindow.blp:33 198 | msgid "The percetage of work time that will be used as break time" 199 | msgstr "Mola süresi olarak kullanılacak çalışma süresi yüzdesi" 200 | 201 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 202 | #: src/ui/statwindow.blp:71 203 | msgid "Break Time" 204 | msgstr "Mola Süresi" 205 | 206 | #: src/ui/preferenceswindow.blp:47 207 | msgid "Autostart" 208 | msgstr "Kendiliğinden başlat" 209 | 210 | #: src/ui/preferenceswindow.blp:48 211 | msgid "Automatically start the timer when the stage is changed" 212 | msgstr "Aşama değiştirildiğinde zamanlayıcıyı kendiliğinden başlat" 213 | 214 | #: src/ui/preferenceswindow.blp:59 215 | msgid "Activate Screensaver on Break Time" 216 | msgstr "Mola Süresinde Ekran Koruyucuyu Etkinleştir" 217 | 218 | #: src/ui/preferenceswindow.blp:60 219 | msgid "" 220 | "Activate the screensaver when the break stage starts. Requires Autostart" 221 | msgstr "" 222 | "Mola aşaması başladığında ekran koruyucuyu etkinleştir. Kendiliğinden " 223 | "Başlatma Gerektirir" 224 | 225 | #: src/ui/preferenceswindow.blp:66 226 | msgid "Sounds" 227 | msgstr "Sesler" 228 | 229 | #: src/ui/preferenceswindow.blp:67 230 | msgid "Alarm sounds that mark break time" 231 | msgstr "Mola zamanını belirten alarm sesleri" 232 | 233 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 234 | msgid "Start working to see your progress" 235 | msgstr "İlerlemenizi görmek için çalışmaya başlayın" 236 | 237 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 238 | msgid "Overview" 239 | msgstr "Genel Görünüm" 240 | 241 | #: src/ui/statpage.blp:22 242 | msgid "See Details" 243 | msgstr "Ayrıntıları Gör" 244 | 245 | #: src/ui/statwindow.blp:30 246 | msgid "Save as CSV" 247 | msgstr "CSV Olarak Kaydet" 248 | 249 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 250 | msgid "Work Time" 251 | msgstr "Çalışma Zamanı" 252 | 253 | #: src/ui/window.blp:12 254 | msgid "_Distraction Free Mode" 255 | msgstr "_Dikkat Dağıtmayan Kip" 256 | 257 | #: src/ui/window.blp:18 258 | msgid "_About Flowtime" 259 | msgstr "Flowtime _Hakkında" 260 | 261 | #: src/ui/window.blp:66 262 | msgid "_Stages" 263 | msgstr "_Aşamalar" 264 | 265 | #: src/ui/window.blp:77 266 | msgid "S_tatistics" 267 | msgstr "İ_statistikler" 268 | -------------------------------------------------------------------------------- /po/zh_CN.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the flowtime package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: flowtime\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2024-01-06 16:17+0300\n" 12 | "PO-Revision-Date: 2025-03-26 22:05+0800\n" 13 | "Last-Translator: \n" 14 | "Language-Team: \n" 15 | "Language: zh_CN\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | "X-Generator: Poedit 3.5\n" 20 | 21 | #: data/io.github.diegoivanme.flowtime.desktop.in:3 22 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:7 23 | msgid "Flowtime" 24 | msgstr "" 25 | 26 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:8 27 | msgid "Spend your time wisely" 28 | msgstr "合理安排你的时间" 29 | 30 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:11 31 | msgid "" 32 | "The Pomodoro technique is efficient for tasks you find boring, but having to " 33 | "take a break when you are 100% concentrated in something you like might be " 34 | "annoying. That's why the Flowtime technique exists: take appropiate breaks " 35 | "without loosing you **flow**." 36 | msgstr "" 37 | "番茄工作法对于你觉得枯燥的任务很有效,但在你全神贯注的做一件事时,休息可能是" 38 | "不合时宜的。这也是 Flowtime 工作法存在的原因:适时休息且不会中断你的**工作流" 39 | "**。" 40 | 41 | #: data/io.github.diegoivanme.flowtime.appdata.xml.in:60 42 | msgid "Diego Iván" 43 | msgstr "" 44 | 45 | #: src/Application.vala:73 46 | msgid "Flowtime is saving your statistics" 47 | msgstr "Flowtime 正在保存你的统计数据" 48 | 49 | #: src/Application.vala:144 50 | msgid "translator_credits" 51 | msgstr "Bu Kun" 52 | 53 | #: src/Application.vala:149 54 | msgid "Sounds by: " 55 | msgstr "音效:" 56 | 57 | #: src/Models/StatObject.vala:24 src/Widgets/StatInfo.vala:56 58 | msgid "seconds" 59 | msgstr "秒" 60 | 61 | #: src/Models/StatObject.vala:29 src/Widgets/StatInfo.vala:61 62 | msgid "minutes" 63 | msgstr "分" 64 | 65 | #: src/Models/StatObject.vala:38 src/Widgets/StatInfo.vala:70 66 | msgid "hour" 67 | msgstr "小时" 68 | 69 | #: src/Models/StatObject.vala:41 src/Widgets/StatInfo.vala:73 70 | msgid "hours" 71 | msgstr "小时" 72 | 73 | #: src/Models/StatObject.vala:49 src/Widgets/StatInfo.vala:81 74 | msgid "day" 75 | msgstr "天" 76 | 77 | #: src/Models/StatObject.vala:52 src/Widgets/StatInfo.vala:84 78 | msgid "days" 79 | msgstr "天" 80 | 81 | #: src/Services/Alarm.vala:28 src/Services/BackgroundStatusReporter.vala:34 82 | msgid "Break is over!" 83 | msgstr "休息时间到!" 84 | 85 | #: src/Services/Alarm.vala:29 86 | msgid "Let's get back to work" 87 | msgstr "是时候回到工作上来了" 88 | 89 | #: src/Services/Statistics.vala:237 90 | msgid "Today" 91 | msgstr "今天" 92 | 93 | #: src/Services/Statistics.vala:239 94 | msgid "This Week" 95 | msgstr "本周" 96 | 97 | #: src/Services/Statistics.vala:241 98 | msgid "This Month" 99 | msgstr "本月" 100 | 101 | #: src/Services/Statistics.vala:243 102 | msgid "All Time" 103 | msgstr "所有时间" 104 | 105 | #: src/Services/BackgroundStatusReporter.vala:36 106 | #, c-format 107 | msgid "Break Stage: %s" 108 | msgstr "休息阶段:%s" 109 | 110 | #: src/Services/BackgroundStatusReporter.vala:40 111 | #, c-format 112 | msgid "Work Stage: %s" 113 | msgstr "工作阶段:%s" 114 | 115 | #: src/Services/Timer.vala:153 src/ui/statinfo.blp:52 116 | msgid "Work" 117 | msgstr "工作" 118 | 119 | #: src/Services/Timer.vala:155 src/ui/statinfo.blp:65 120 | msgid "Break" 121 | msgstr "休息" 122 | 123 | #. translators: This phrase is used in the context: You've worked HH:MM:SS... 124 | #: src/Widgets/StatInfo.vala:44 125 | #, c-format 126 | msgid "You've worked %s and have taken a break during %s." 127 | msgstr "你已经工作了 %s 且休息了 %s。" 128 | 129 | #: src/Widgets/StatsWindow.vala:43 130 | #, c-format 131 | msgid "%s is your most productive day of the week" 132 | msgstr "%s 是你一周里最有生产力的一天" 133 | 134 | #: src/Widgets/TimerPage.vala:43 135 | msgid "Work Stage" 136 | msgstr "工作阶段" 137 | 138 | #: src/Widgets/TimerPage.vala:46 139 | msgid "Break Stage" 140 | msgstr "休息阶段" 141 | 142 | #: src/Widgets/TimerPage.vala:52 143 | msgid "Pause Timer" 144 | msgstr "暂停计时器" 145 | 146 | #: src/Widgets/TimerPage.vala:56 147 | msgid "Start Timer" 148 | msgstr "开始计时器" 149 | 150 | #: src/Widgets/Window.vala:141 151 | msgid "There is a timer active" 152 | msgstr "有一个计时器正在运行" 153 | 154 | #: src/Widgets/Window.vala:141 155 | msgid "Do you want to quit?" 156 | msgstr "你想要退出吗?" 157 | 158 | #: src/Widgets/Window.vala:145 159 | msgid "Cancel" 160 | msgstr "取消" 161 | 162 | #: src/Widgets/Window.vala:146 163 | msgid "Hide window" 164 | msgstr "隐藏窗口" 165 | 166 | #: src/Widgets/Window.vala:147 167 | msgid "Quit" 168 | msgstr "退出" 169 | 170 | #: src/ui/preferenceswindow.blp:10 src/ui/window.blp:7 171 | msgid "_Preferences" 172 | msgstr "首选项 (_P)" 173 | 174 | #: src/ui/preferenceswindow.blp:13 src/ui/statwindow.blp:9 175 | msgid "Statistics" 176 | msgstr "统计数据" 177 | 178 | #: src/ui/preferenceswindow.blp:16 179 | msgid "Months Saved" 180 | msgstr "保存几个月的数据" 181 | 182 | #: src/ui/preferenceswindow.blp:17 183 | msgid "The amount of months that the work data will be saved" 184 | msgstr "指定要保存几个月的工作数据" 185 | 186 | #: src/ui/preferenceswindow.blp:29 187 | msgid "Timer" 188 | msgstr "计时器" 189 | 190 | #: src/ui/preferenceswindow.blp:32 191 | msgid "Break time percentage" 192 | msgstr "休息时间比例" 193 | 194 | #: src/ui/preferenceswindow.blp:33 195 | msgid "The percetage of work time that will be used as break time" 196 | msgstr "指定将多少比例的工作时长用作休息时长" 197 | 198 | #: src/ui/preferenceswindow.blp:45 src/ui/statwindow.blp:61 199 | #: src/ui/statwindow.blp:71 200 | msgid "Break Time" 201 | msgstr "休息时间" 202 | 203 | #: src/ui/preferenceswindow.blp:47 204 | msgid "Autostart" 205 | msgstr "自启动" 206 | 207 | #: src/ui/preferenceswindow.blp:48 208 | msgid "Automatically start the timer when the stage is changed" 209 | msgstr "进入另一阶段时,自动启动计时器" 210 | 211 | #: src/ui/preferenceswindow.blp:59 212 | msgid "Activate Screensaver on Break Time" 213 | msgstr "在休息时间激活锁屏" 214 | 215 | #: src/ui/preferenceswindow.blp:60 216 | msgid "" 217 | "Activate the screensaver when the break stage starts. Requires Autostart" 218 | msgstr "在休息阶段开始时激活锁屏。需要开启自启动选项" 219 | 220 | #: src/ui/preferenceswindow.blp:66 221 | msgid "Sounds" 222 | msgstr "音效" 223 | 224 | #: src/ui/preferenceswindow.blp:67 225 | msgid "Alarm sounds that mark break time" 226 | msgstr "开始休息时播放的音效" 227 | 228 | #: src/ui/statinfo.blp:10 src/ui/statwindow.blp:86 229 | msgid "Start working to see your progress" 230 | msgstr "开始工作以看见你的进度" 231 | 232 | #: src/ui/statpage.blp:15 src/ui/window.blp:94 233 | msgid "Overview" 234 | msgstr "概览" 235 | 236 | #: src/ui/statpage.blp:22 237 | msgid "See Details" 238 | msgstr "查看详情" 239 | 240 | #: src/ui/statwindow.blp:30 241 | msgid "Save as CSV" 242 | msgstr "以 CSV 格式保存" 243 | 244 | #: src/ui/statwindow.blp:41 src/ui/statwindow.blp:51 245 | msgid "Work Time" 246 | msgstr "工作时间" 247 | 248 | #: src/ui/window.blp:12 249 | msgid "_Distraction Free Mode" 250 | msgstr "免打扰模式 (_D)" 251 | 252 | #: src/ui/window.blp:18 253 | msgid "_About Flowtime" 254 | msgstr "关于 Flowtime (_A)" 255 | 256 | #: src/ui/window.blp:66 257 | msgid "_Stages" 258 | msgstr "阶段 (_S)" 259 | 260 | #: src/ui/window.blp:77 261 | msgid "S_tatistics" 262 | msgstr "统计数据 (_t)" 263 | -------------------------------------------------------------------------------- /src/Application.vala: -------------------------------------------------------------------------------- 1 | /* Application.vala 2 | * 3 | * Copyright 2021-2023 Diego Iván 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | * 18 | * SPDX-License-Identifier: GPL-3.0-or-later 19 | */ 20 | 21 | namespace Flowtime { 22 | public class Application : Adw.Application { 23 | private Window main_window; 24 | private Xdp.Portal session_monitor = new Xdp.Portal (); 25 | 26 | private const ActionEntry[] APP_ENTRIES = { 27 | { "quit", action_close }, 28 | { "about", about_flowtime }, 29 | { "preferences", flowtime_preferences } 30 | }; 31 | 32 | public Application () { 33 | Object ( 34 | application_id: "io.github.diegoivanme.flowtime", 35 | flags: GLib.ApplicationFlags.FLAGS_NONE 36 | ); 37 | add_action_entries (APP_ENTRIES, this); 38 | set_accels_for_action ("app.quit", { "Q" }); 39 | set_accels_for_action ("app.preferences", { "comma" }); 40 | 41 | Intl.setlocale (LocaleCategory.ALL, ""); 42 | Intl.bindtextdomain (Config.GETTEXT_PACKAGE, Config.GNOMELOCALEDIR); 43 | Intl.textdomain (Config.GETTEXT_PACKAGE); 44 | } 45 | 46 | private async void query_monitor_session () { 47 | try { 48 | bool success = yield session_monitor.session_monitor_start (null, NONE, null); 49 | 50 | if (!success) { 51 | critical ("Shutdown monitor failed"); 52 | return; 53 | } 54 | 55 | session_monitor.session_state_changed.connect (on_session_state_changed); 56 | } 57 | catch (Error e) { 58 | critical ("Shutdown monitor failed: %s", e.message); 59 | } 60 | } 61 | 62 | private void on_session_state_changed (bool screensaver_active, 63 | Xdp.LoginSessionState session_state) { 64 | if (session_state == ENDING) { 65 | inhibit_to_save.begin (); 66 | } 67 | } 68 | 69 | private async void inhibit_to_save () { 70 | try { 71 | var parent = Xdp.parent_new_gtk (main_window); 72 | int id = yield session_monitor.session_inhibit (parent, 73 | _("Flowtime is saving your statistics"), 74 | LOGOUT | USER_SWITCH, 75 | null); 76 | if (id == -1) { 77 | critical ("Session could not be inhibited, failed to save statistics"); 78 | return; 79 | } 80 | 81 | main_window.query_save_for_shutdown (); 82 | session_monitor.session_uninhibit (id); 83 | } 84 | catch (Error e) { 85 | critical (e.message); 86 | } 87 | } 88 | 89 | protected override void activate () { 90 | if (main_window == null) { 91 | main_window = new Window (this); 92 | query_monitor_session.begin (); 93 | } 94 | main_window.present (); 95 | } 96 | 97 | protected override void shutdown () { 98 | base.shutdown (); 99 | 100 | var settings = new Services.Settings (); 101 | settings.save (); 102 | quit (); 103 | } 104 | 105 | private void flowtime_preferences () { 106 | main_window.show_preferences (); 107 | } 108 | 109 | private void action_close () { 110 | query_close.begin (); 111 | } 112 | 113 | private async void query_close () { 114 | if (yield main_window.query_quit ()) { 115 | shutdown (); 116 | } 117 | } 118 | 119 | private void about_flowtime () { 120 | const string COPYRIGHT = "Copyright \xc2\xa9 2021-2024 Diego Iván M.E"; 121 | const string? DEVELOPERS[] = { 122 | "Diego Iván M.E", 123 | null 124 | }; 125 | const string? ARTISTS[] = { 126 | "Brage Fuglseth", 127 | "David Lapshin", 128 | null 129 | }; 130 | const string SOUND_ARTISTS[] = { 131 | "Mike Koenig https://soundbible.com/1251-Beep.html", 132 | "SoundBible https://soundbible.com/1815-A-Tone.html", 133 | }; 134 | 135 | var about = new Adw.AboutDialog () { 136 | application_icon = Config.APP_ID, 137 | application_name = "Flowtime", 138 | artists = ARTISTS, 139 | copyright = COPYRIGHT, 140 | developers = DEVELOPERS, 141 | issue_url = "https://github.com/Diego-Ivan/Flowtime/issues", 142 | license_type = GPL_3_0, 143 | translator_credits = _("translator_credits"), 144 | version = Config.VERSION, 145 | website = "https://github.com/Diego-Ivan/Flowtime", 146 | }; 147 | 148 | about.add_credit_section (_("Sounds by"), SOUND_ARTISTS); 149 | 150 | about.present (this.active_window); 151 | } 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /src/Models/Day.vala: -------------------------------------------------------------------------------- 1 | /* Day.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | public class Flowtime.Models.Day : Object, InformationHolder { 9 | public Xml.Node* node { get; private set; } 10 | private Xml.Node* worktime_node; 11 | private Xml.Node* breaktime_node; 12 | 13 | private DateTime _date; 14 | public DateTime date { 15 | get { 16 | return _date; 17 | } 18 | set { 19 | _date = value; 20 | node->set_prop ("date", value.format_iso8601 ()); 21 | } 22 | } 23 | 24 | private int _worktime = 0; 25 | internal int worktime { 26 | get { 27 | return _worktime; 28 | } 29 | set { 30 | _worktime = value; 31 | worktime_node->set_content (value.to_string ()); 32 | } 33 | } 34 | 35 | private int _breaktime = 0; 36 | internal int breaktime { 37 | get { 38 | return _breaktime; 39 | } 40 | set { 41 | _breaktime = value; 42 | breaktime_node->set_content (value.to_string ()); 43 | } 44 | } 45 | 46 | public string day_of_week { 47 | owned get { 48 | return date.format ("%A"); 49 | } 50 | } 51 | 52 | public Day () { 53 | node = new Xml.Node (null, "day"); 54 | date = new DateTime.now_local (); 55 | 56 | worktime_node = node->new_text_child (null, "worktime", ""); 57 | breaktime_node = node->new_text_child (null, "breaktime", ""); 58 | } 59 | 60 | public Day.from_xml (Xml.Node* n) { 61 | node = n; 62 | date = new DateTime.from_iso8601 (n->get_prop ("date"), null); 63 | 64 | for (Xml.Node* i = node->children; i != null; i = i->next) { 65 | if (i->type == ELEMENT_NODE) { 66 | switch (i->name) { 67 | case "worktime": 68 | worktime_node = XmlUtils.get_content_node (i, "worktime"); 69 | _worktime = int.parse(worktime_node->get_content ()); 70 | break; 71 | 72 | case "breaktime": 73 | breaktime_node = XmlUtils.get_content_node (i, "breaktime"); 74 | _breaktime = int.parse (breaktime_node->get_content ()); 75 | break; 76 | } 77 | } 78 | } 79 | } 80 | 81 | public void unlink () { 82 | node->unlink (); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /src/Models/InformationHolder.vala: -------------------------------------------------------------------------------- 1 | /* InformationHolder.vala 2 | * 3 | * Copyright 2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | public interface Flowtime.Models.InformationHolder : Object { 9 | public abstract int worktime { get; set; } 10 | public abstract int breaktime { get; set; } 11 | } 12 | -------------------------------------------------------------------------------- /src/Models/StatObject.vala: -------------------------------------------------------------------------------- 1 | /* StatObject.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | public class Flowtime.Models.StatObject : Object { 9 | public string date { get; private set; } 10 | public string time { get; private set; } 11 | 12 | public StatObject (DateTime date_time, int time_seconds) { 13 | date = date_time.format ("%x"); 14 | time = format_time (time_seconds); 15 | } 16 | 17 | private string format_time (int seconds) { 18 | const int MINUTE = 60; 19 | const int HOUR = 3600; 20 | const int DAY = 86400; 21 | string unit = ""; 22 | 23 | if (seconds < MINUTE) { 24 | unit = _("seconds"); 25 | return @"$seconds $unit"; 26 | } 27 | 28 | if (seconds < HOUR) { 29 | unit = _("minutes"); 30 | return "%02d:%02d %s".printf (seconds / MINUTE, seconds % MINUTE, unit); 31 | } 32 | 33 | if (seconds < DAY) { 34 | int hours = seconds / HOUR; 35 | int minutes = (seconds % HOUR) / MINUTE; 36 | 37 | if (hours == 1 && minutes == 0) { 38 | unit = _("hour"); 39 | } 40 | else { 41 | unit = _("hours"); 42 | } 43 | 44 | return "%d:%02d %s".printf (seconds / HOUR, minutes, unit); 45 | } 46 | 47 | int days = seconds / DAY; 48 | if (days == 1) { 49 | unit = _("day"); 50 | } 51 | else { 52 | unit = _("days"); 53 | } 54 | 55 | return @"$days $unit"; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/Models/State.vala: -------------------------------------------------------------------------------- 1 | /* State.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | public class Flowtime.Models.State : Object, InformationHolder { 9 | public int worktime { get; set; default = 0; } 10 | public int breaktime { get; set; default = 0; } 11 | } 12 | -------------------------------------------------------------------------------- /src/Services/Alarm.vala: -------------------------------------------------------------------------------- 1 | /* Alarm.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | public class Flowtime.Services.Alarm { 9 | private TonePlayer player = new TonePlayer (); 10 | private unowned GLib.Application application = GLib.Application.get_default (); 11 | 12 | private Timer _timer; 13 | public Timer timer { 14 | get { 15 | return _timer; 16 | } 17 | set { 18 | _timer = value; 19 | timer.done.connect (on_timer_done); 20 | } 21 | } 22 | 23 | public Alarm (Timer timer) { 24 | this.timer = timer; 25 | } 26 | 27 | private void on_timer_done () { 28 | var notification = new GLib.Notification (_("Break is over!")); 29 | notification.set_body (_("Let's get back to work")); 30 | notification.set_priority (NORMAL); 31 | 32 | application.send_notification ("Flowtime-Break-Done", notification); 33 | 34 | var settings = new Settings (); 35 | player.play_tone (settings.tone); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/Services/BackgroundStatusReporter.vala: -------------------------------------------------------------------------------- 1 | /* BackgroundStatusReporter.vala 2 | * 3 | * Copyright 2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | public class Flowtime.Services.BackgroundStatusReporter { 9 | private Xdp.Portal portal = new Xdp.Portal (); 10 | 11 | private Timer _timer; 12 | public Timer timer { 13 | get { 14 | return _timer; 15 | } 16 | set { 17 | if (_timer != null) { 18 | timer.updated.disconnect (on_timer_updated); 19 | } 20 | _timer = value; 21 | timer.updated.connect (on_timer_updated); 22 | } 23 | } 24 | 25 | public BackgroundStatusReporter (Timer timer) { 26 | this.timer = timer; 27 | } 28 | 29 | private async void on_timer_updated () { 30 | string status = ""; 31 | switch (timer.mode) { 32 | case BREAK: 33 | if (timer.seconds == 0) { 34 | status = _("Break is over!"); 35 | } else { 36 | status = _("Break Stage: %s".printf (timer.formatted_time)); 37 | } 38 | break; 39 | case WORK: 40 | status = _("Work Stage: %s".printf (timer.formatted_time)); 41 | break; 42 | } 43 | 44 | try { 45 | bool success = yield portal.set_background_status (status, null); 46 | if (!success) { 47 | critical ("Updating background status failed"); 48 | } 49 | } catch (Error e) { 50 | critical (e.message); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/Services/ColorProvider.vala: -------------------------------------------------------------------------------- 1 | /* ColorProvider.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | [SingleInstance] 9 | public class Flowtime.Services.ColorProvider : Object { 10 | private Adw.StyleManager style_manager = Adw.StyleManager.get_default (); 11 | private Gtk.CssProvider break_provider = new Gtk.CssProvider (); 12 | public Gtk.CssProvider? current_provider { get; private set; } 13 | 14 | private Services.TimerMode _mode; 15 | public Services.TimerMode mode { 16 | get { 17 | return _mode; 18 | } 19 | set { 20 | _mode = value; 21 | 22 | if (mode == WORK) { 23 | disable_break_colors (); 24 | } 25 | else { 26 | enable_break_colors (); 27 | } 28 | } 29 | } 30 | 31 | public Gdk.RGBA work_accent { 32 | get { 33 | var color = Gdk.RGBA (); 34 | string hex = "#1c71d8"; 35 | color.parse (hex); 36 | 37 | return color; 38 | } 39 | } 40 | 41 | public Gdk.RGBA break_accent { 42 | get { 43 | var color = Gdk.RGBA (); 44 | string hex = "#8ff0a4"; 45 | color.parse (hex); 46 | 47 | return color; 48 | } 49 | } 50 | 51 | private static ColorProvider? instance = null; 52 | public ColorProvider () { 53 | if (instance == null) { 54 | instance = this; 55 | } 56 | } 57 | 58 | construct { 59 | style_manager.notify["dark"].connect (on_style_changed); 60 | 61 | on_style_changed (); 62 | } 63 | 64 | private void enable_break_colors () { 65 | current_provider = break_provider; 66 | Gtk.StyleContext.add_provider_for_display (Gdk.Display.get_default (), 67 | current_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION 68 | ); 69 | } 70 | 71 | private void disable_break_colors () { 72 | if (current_provider == null) { 73 | return; 74 | } 75 | 76 | Gtk.StyleContext.remove_provider_for_display (Gdk.Display.get_default (), current_provider); 77 | current_provider = null; 78 | } 79 | 80 | private void on_style_changed () { 81 | if (Adw.StyleManager.get_default ().dark) 82 | load_break_dark (); 83 | else 84 | load_break_light (); 85 | } 86 | 87 | private void load_break_dark () { 88 | break_provider.load_from_string ( 89 | "@define-color accent_color @green_1;@define-color accent_bg_color @green_5;" 90 | ); 91 | } 92 | 93 | private void load_break_light () { 94 | break_provider.load_from_string ( 95 | "@define-color accent_color @green_5;@define-color accent_bg_color @green_4;" 96 | ); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /src/Services/Screensaver.vala: -------------------------------------------------------------------------------- 1 | /* Screensaver.vala 2 | * 3 | * Copyright 2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | public errordomain ScreensaverError { 9 | UNSUPPORTED 10 | } 11 | 12 | public class Flowtime.Services.Screensaver : Object { 13 | private enum ScreensaverInterface { 14 | FREEDESKTOP, 15 | GNOME, 16 | NONE 17 | } 18 | 19 | private const string BUS_NAME = "org.freedesktop.ScreenSaver"; 20 | private const string OBJECT_PATH = "/org/freedesktop/ScreenSaver"; 21 | private const string SET_METHOD_NAME = "SetActive"; 22 | private const string GET_METHOD_NAME = "GetActive"; 23 | 24 | private const string GNOME_BUS_NAME = "org.gnome.ScreenSaver"; 25 | private const string GNOME_OBJECT_PATH = "/org/gnome/ScreenSaver"; 26 | 27 | private DBusConnection? connection = null; 28 | 29 | /* 30 | * In case using BUS_NAME fails, we'll try communicating to org.gnome.ScreenSaver. 31 | * 32 | * The reason we are using it as fallback is because org.freedesktop.ScreenSaver.SetActive 33 | * is not implemented in GNOME, thus throwing an error every time it is called. 34 | */ 35 | private ScreensaverInterface @interface = NONE; 36 | 37 | [CCode (notify = false)] 38 | public bool supported { 39 | get { 40 | return @interface != NONE; 41 | } 42 | } 43 | 44 | private Timer _timer; 45 | public Timer timer { 46 | get { 47 | return _timer; 48 | } 49 | construct { 50 | _timer = value; 51 | timer.notify["mode"].connect(timer_mode_changed); 52 | } 53 | } 54 | 55 | public async Screensaver (Timer timer) throws IOError, ScreensaverError { 56 | Object (timer: timer); 57 | 58 | connection = yield Bus.get (SESSION, null); 59 | bool supports_screensaver = yield system_supports_screensaver (); 60 | 61 | if (!supports_screensaver) { 62 | throw new ScreensaverError.UNSUPPORTED ("Screensaver is not supported on this system"); 63 | } 64 | } 65 | 66 | private async bool system_supports_screensaver () { 67 | try { 68 | yield connection.call (BUS_NAME, OBJECT_PATH, 69 | BUS_NAME, GET_METHOD_NAME, 70 | null, VariantType.BOOLEAN, 71 | NONE, -1, null); 72 | @interface = FREEDESKTOP; 73 | return true; 74 | } catch (Error e) { 75 | warning (@"$BUS_NAME.$SET_METHOD_NAME unsupported: $(e.message). Trying fallback..."); 76 | } 77 | 78 | try { 79 | yield connection.call (GNOME_BUS_NAME, GNOME_OBJECT_PATH, 80 | GNOME_BUS_NAME, GET_METHOD_NAME, 81 | null, VariantType.TUPLE, 82 | NONE, -1, null); 83 | @interface = GNOME; 84 | return true; 85 | } catch (Error e) { 86 | warning (@"Screensaver is not supported in this system: $(e.message)"); 87 | } 88 | 89 | return false; 90 | } 91 | 92 | private void timer_mode_changed () { 93 | var settings = new Settings (); 94 | bool screensaver = settings.activate_screensaver && settings.autostart; 95 | 96 | if (timer.mode == BREAK && screensaver && supported) { 97 | activate_screensaver.begin (); 98 | } 99 | } 100 | 101 | public async void activate_screensaver () { 102 | Variant parameters = new Variant.tuple ({ new Variant.boolean (true) }); 103 | 104 | switch (@interface) { 105 | case FREEDESKTOP: 106 | yield activate_freedesktop (parameters); 107 | break; 108 | case GNOME: 109 | yield activate_gnome (parameters); 110 | break; 111 | case NONE: 112 | break; 113 | } 114 | } 115 | 116 | private async void activate_freedesktop (Variant parameters) { 117 | try { 118 | yield connection.call (BUS_NAME, OBJECT_PATH, 119 | BUS_NAME, SET_METHOD_NAME, 120 | parameters, VariantType.BOOLEAN, 121 | NONE, -1, null); 122 | } catch (Error e) { 123 | warning (e.message); 124 | } 125 | } 126 | 127 | private async void activate_gnome (Variant parameters) { 128 | try { 129 | yield connection.call (GNOME_BUS_NAME, GNOME_OBJECT_PATH, 130 | GNOME_BUS_NAME, SET_METHOD_NAME, 131 | parameters, null, 132 | NONE, -1, null); 133 | } catch (Error e) { 134 | warning (e.message); 135 | } 136 | } 137 | } 138 | -------------------------------------------------------------------------------- /src/Services/Settings.vala: -------------------------------------------------------------------------------- 1 | /* Settings.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | [SingleInstance] 9 | public class Flowtime.Services.Settings : Object { 10 | private GLib.Settings settings = new GLib.Settings (Config.APP_ID); 11 | 12 | private int _months_saved; 13 | public int months_saved { 14 | get { 15 | return _months_saved; 16 | } 17 | set { 18 | if (value > 6 || value < 0) { 19 | critical ("Value for months saved is out of range"); 20 | return; 21 | } 22 | _months_saved = value; 23 | } 24 | } 25 | 26 | private double _break_percentage; 27 | public double break_percentage { 28 | get { 29 | return _break_percentage; 30 | } 31 | set { 32 | if (value < 10 || value > 100) { 33 | critical ("Break percentage is out of bounds"); 34 | return; 35 | } 36 | _break_percentage = value; 37 | } 38 | } 39 | 40 | public string tone { get; set; } 41 | public bool autostart { get; set; } 42 | public bool distraction_free { get; set; } 43 | public bool activate_screensaver { get; set; } 44 | 45 | private Settings? instance = null; 46 | public Settings () { 47 | if (instance == null) { 48 | instance = this; 49 | } 50 | } 51 | 52 | construct { 53 | port_divisor (); 54 | 55 | settings.bind ("tone", this, "tone", DEFAULT); 56 | settings.bind ("autostart", this, "autostart", DEFAULT); 57 | settings.bind ("distraction-free", this, "distraction-free", DEFAULT); 58 | settings.bind ("months-saved", this, "months-saved", DEFAULT); 59 | settings.bind ("break-percentage", this, "break-percentage", DEFAULT); 60 | settings.bind ("activate-screensaver", this, "activate-screensaver", DEFAULT); 61 | 62 | settings.delay (); 63 | } 64 | 65 | public void save () { 66 | settings.apply (); 67 | } 68 | 69 | private void port_divisor () { 70 | int divisor = settings.get_int ("break-divisor"); 71 | if (divisor < 0) { 72 | return; 73 | } 74 | 75 | settings.set_double ("break-percentage", 100.0 / divisor); 76 | settings.set_int ("break-divisor", -1); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/Services/Statistics.vala: -------------------------------------------------------------------------------- 1 | /* Statistics.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | using Flowtime.Models; 9 | 10 | [SingleInstance] 11 | public class Flowtime.Services.Statistics : GLib.Object { 12 | private Xml.Doc* doc = new Xml.Doc ("1.0"); 13 | private Xml.Node* root_element; 14 | 15 | private string path { 16 | owned get { 17 | return Path.build_filename (Environment.get_user_data_dir (), "statistics.xml"); 18 | } 19 | } 20 | 21 | public Day? today { get; private set; default = null; } 22 | 23 | public List all_days = new List (); 24 | public string productive_day { get; private set; } 25 | 26 | public State total = new State (); 27 | public State month = new State (); 28 | public State week = new State (); 29 | 30 | public signal void updated (); 31 | 32 | ~Statistics () { 33 | delete doc; 34 | } 35 | 36 | private static Statistics? instance = null; 37 | public Statistics () { 38 | if (instance == null) { 39 | instance = this; 40 | } 41 | } 42 | 43 | construct { 44 | root_element = new Xml.Node (null, "statistics"); 45 | doc->set_root_element (root_element); 46 | Xml.Node* comment = new Xml.Node.comment ("GENERATED BY FLOWTIME : DO NOT MODIFY"); 47 | root_element->add_child (comment); 48 | 49 | retrieve_statistics.begin (); 50 | } 51 | 52 | private async void retrieve_statistics () { 53 | var file = File.new_for_path (path); 54 | 55 | if (!file.query_exists ()) { 56 | setup_new_statistics_file (); 57 | save (); 58 | return; 59 | } 60 | 61 | delete doc; 62 | 63 | doc = Xml.Parser.parse_file (path); 64 | if (doc == null) { 65 | warning ("Statistics file was found, but cannot be parsed. Creating a new one"); 66 | setup_new_statistics_file (); 67 | 68 | doc = new Xml.Doc (); 69 | doc->set_root_element (root_element); 70 | } 71 | 72 | root_element = doc->get_root_element (); 73 | retrieve_days (); 74 | } 75 | 76 | private void setup_new_statistics_file () { 77 | root_element->new_prop ("start", new DateTime.now_utc ().format_iso8601 ()); 78 | today = new Day (); 79 | root_element->add_child (today.node); 80 | } 81 | 82 | private void retrieve_days () { 83 | assert (root_element->name == "statistics"); 84 | var current_date = new DateTime.now_local (); 85 | var settings = new Settings (); 86 | 87 | int months_saved = settings.months_saved; 88 | Day[] overpassed_days = {}; 89 | 90 | const TimeSpan WEEK = TimeSpan.DAY * 7; 91 | const TimeSpan MONTH = TimeSpan.DAY * 30; 92 | 93 | for (Xml.Node* i = root_element->children; i != null; i = i->next) { 94 | if (i->type == ELEMENT_NODE) { 95 | var d = new Day.from_xml (XmlUtils.get_content_node (i, "day")); 96 | TimeSpan ts = current_date.difference (d.date); 97 | 98 | if (ts > MONTH * months_saved) { 99 | overpassed_days += d; 100 | continue; 101 | } 102 | 103 | total.worktime += d.worktime; 104 | total.breaktime += d.breaktime; 105 | all_days.append (d); 106 | 107 | if (ts > MONTH) { 108 | continue; 109 | } 110 | 111 | month.worktime += d.worktime; 112 | month.breaktime += d.breaktime; 113 | if (ts > WEEK) { 114 | continue; 115 | } 116 | 117 | week.worktime += d.worktime; 118 | week.breaktime += d.breaktime; 119 | 120 | if (d.date.get_day_of_year () == current_date.get_day_of_year ()) { 121 | today = d; 122 | } 123 | } 124 | } 125 | 126 | if (today == null) { 127 | today = new Day (); 128 | root_element->add_child (today.node); 129 | all_days.append(today); 130 | } 131 | 132 | foreach (var day in overpassed_days) { 133 | day.unlink (); 134 | } 135 | 136 | get_most_productive_day (); 137 | } 138 | 139 | public void add_time_to_mode (TimerMode mode, int time_seconds) { 140 | switch (mode) { 141 | case WORK: 142 | today.worktime += time_seconds; 143 | week.worktime += time_seconds; 144 | month.worktime += time_seconds; 145 | total.worktime += time_seconds; 146 | break; 147 | 148 | case BREAK: 149 | today.breaktime += time_seconds; 150 | week.breaktime += time_seconds; 151 | month.breaktime += time_seconds; 152 | total.breaktime += time_seconds; 153 | break; 154 | 155 | default: 156 | assert_not_reached (); 157 | } 158 | 159 | save (); 160 | updated (); 161 | } 162 | 163 | public int get_time_from_mode_and_period (TimerMode mode, TimePeriod period) { 164 | if (mode == WORK) { 165 | return get_worktime_from_period (period); 166 | } 167 | return get_breaktime_from_period (period); 168 | } 169 | 170 | private int get_worktime_from_period (TimePeriod period) { 171 | switch (period) { 172 | case TODAY: 173 | return today.worktime; 174 | case WEEK: 175 | return week.worktime; 176 | case MONTH: 177 | return month.worktime; 178 | case ALL: 179 | return total.worktime; 180 | default: 181 | assert_not_reached (); 182 | } 183 | } 184 | 185 | private int get_breaktime_from_period (TimePeriod period) { 186 | switch (period) { 187 | case TODAY: 188 | return today.breaktime; 189 | case WEEK: 190 | return week.breaktime; 191 | case MONTH: 192 | return month.breaktime; 193 | case ALL: 194 | return total.breaktime; 195 | default: 196 | assert_not_reached (); 197 | } 198 | } 199 | 200 | private void get_most_productive_day () { 201 | var days_table = new HashTable (string.hash, str_equal); 202 | 203 | foreach (Day day in all_days) { 204 | if (!(day.day_of_week in days_table)) { 205 | days_table[day.day_of_week] = day.worktime; 206 | continue; 207 | } 208 | int time = days_table[day.day_of_week] + day.worktime; 209 | days_table[day.day_of_week] = time; 210 | } 211 | 212 | int highest = -1; 213 | foreach (string day_string in days_table.get_keys ()) { 214 | int count = days_table[day_string]; 215 | if (count >= highest) { 216 | productive_day = day_string; 217 | highest = count; 218 | } 219 | } 220 | } 221 | 222 | public void save () { 223 | message ("Saving document..."); 224 | doc->save_file (path); 225 | } 226 | } 227 | 228 | public enum Flowtime.Services.TimePeriod { 229 | TODAY, 230 | WEEK, 231 | MONTH, 232 | ALL; 233 | 234 | public string to_string () { 235 | switch (this) { 236 | case TODAY: 237 | return _("Today"); 238 | case WEEK: 239 | return _("This Week"); 240 | case MONTH: 241 | return _("This Month"); 242 | case ALL: 243 | return _("All Time"); 244 | default: 245 | assert_not_reached (); 246 | } 247 | } 248 | } 249 | -------------------------------------------------------------------------------- /src/Services/Timer.vala: -------------------------------------------------------------------------------- 1 | /* Timer.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | public class Flowtime.Services.Timer : Object { 9 | public bool running { get; protected set; default = false; } 10 | 11 | private int _seconds; 12 | public int seconds { 13 | get { 14 | return _seconds; 15 | } 16 | set { 17 | _seconds = value; 18 | formatted_time = format_time (); 19 | updated (); 20 | } 21 | } 22 | 23 | public bool is_used { 24 | get { 25 | return running || seconds > 0; 26 | } 27 | } 28 | 29 | public TimerMode mode { get; private set; default = WORK; } 30 | public string formatted_time { get; private set; } 31 | 32 | public signal void updated (); 33 | public signal void done (); 34 | 35 | private const int INTERVAL_MILLISECONDS = 1000; 36 | private uint? timeout_id = null; 37 | 38 | private DateTime? last_datetime = null; 39 | private int initial_breaktime = 0; 40 | 41 | ~Timer () { 42 | stop (); 43 | save_to_statistics (); 44 | } 45 | 46 | construct { 47 | seconds = 0; 48 | } 49 | 50 | public void start () { 51 | last_datetime = new DateTime.now_utc (); 52 | running = true; 53 | timeout_id = Timeout.add (INTERVAL_MILLISECONDS, timeout); 54 | } 55 | 56 | public void stop () { 57 | running = false; 58 | if (timeout_id == null) { 59 | return; 60 | } 61 | Source.remove (timeout_id); 62 | } 63 | 64 | public void next_mode () { 65 | stop (); 66 | last_datetime = null; 67 | save_to_statistics (); 68 | 69 | var settings = new Settings (); 70 | 71 | /* 72 | * This would mean that we want to change the mode to break. We will obtain the seconds for this 73 | * mode and change it accordingly 74 | */ 75 | if (mode == WORK) { 76 | initial_breaktime = (int) (seconds * settings.break_percentage / 100); 77 | seconds = initial_breaktime; 78 | mode = BREAK; 79 | } 80 | else { 81 | // Reset timer in case the next mode is work mode 82 | seconds = 0; 83 | initial_breaktime = 0; 84 | mode = WORK; 85 | } 86 | 87 | if (settings.autostart) { 88 | start (); 89 | } 90 | } 91 | 92 | private string format_time () { 93 | return "%02d:%02d".printf (seconds / 60, seconds % 60); 94 | } 95 | 96 | public void save_to_statistics () { 97 | var statistics = new Statistics (); 98 | if (mode == WORK) { 99 | statistics.add_time_to_mode (mode, seconds); 100 | } 101 | else { 102 | statistics.add_time_to_mode (mode, initial_breaktime - seconds); 103 | } 104 | } 105 | 106 | protected bool timeout () { 107 | if (!running) { 108 | return false; 109 | } 110 | 111 | var current_time = new DateTime.now_utc (); 112 | 113 | if (last_datetime == null) { 114 | last_datetime = current_time; 115 | } 116 | 117 | // Obtaining the difference between the last and current times, casting it to seconds 118 | int time_seconds = (int) (current_time.difference (last_datetime) / TimeSpan.SECOND); 119 | 120 | switch (mode) { 121 | case WORK: 122 | seconds += time_seconds; 123 | break; 124 | 125 | case BREAK: 126 | if (time_seconds >= seconds) { 127 | seconds = 0; 128 | running = false; 129 | done (); 130 | return false; 131 | } 132 | else { 133 | seconds -= time_seconds; 134 | } 135 | break; 136 | 137 | default: 138 | assert_not_reached (); 139 | } 140 | last_datetime = current_time; 141 | 142 | return true; 143 | } 144 | } 145 | 146 | public enum Flowtime.Services.TimerMode { 147 | WORK, 148 | BREAK; 149 | 150 | public string to_string () { 151 | switch (this) { 152 | case WORK: 153 | return _("Work"); 154 | case BREAK: 155 | return _("Break"); 156 | default: 157 | assert_not_reached (); 158 | } 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /src/Services/TonePlayer.vala: -------------------------------------------------------------------------------- 1 | /* TonePlayer.vala 2 | * 3 | * Copyright 2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | [SingleInstance] 9 | public class Flowtime.Services.TonePlayer : Object { 10 | private struct Sound { 11 | public string name; 12 | public File sound_file; 13 | } 14 | 15 | private HashTable tone_map; 16 | 17 | private unowned GLib.Application app = GLib.Application.get_default (); 18 | private Gtk.MediaFile? media_file = null; 19 | 20 | private TonePlayer? instance = null; 21 | public TonePlayer () { 22 | if (instance == null) { 23 | instance = this; 24 | } 25 | } 26 | 27 | construct { 28 | tone_map = new HashTable (string.hash, str_equal); 29 | 30 | register_sound ("Baum", "baum.ogg"); 31 | register_sound ("Beep", "beep.ogg"); 32 | register_sound ("Tone", "tone.ogg"); 33 | register_sound ("Bleep", "bleep.ogg"); 34 | 35 | var settings = new Settings (); 36 | swap_media_file (tone_map[settings.tone].sound_file); 37 | } 38 | 39 | public void register_sound (string name, string sound_file) { 40 | var file = File.new_for_uri (@"resource://$(app.resource_base_path)/$(sound_file)"); 41 | var sound = Sound () { 42 | name = name, 43 | sound_file = file 44 | }; 45 | tone_map[sound_file] = sound; 46 | } 47 | 48 | public void play_tone (string key) 49 | requires (key in tone_map) { 50 | unowned File sound = tone_map[key].sound_file; 51 | if (media_file != null && media_file.playing) { 52 | media_file.pause (); 53 | } 54 | swap_media_file (sound); 55 | media_file.play_now (); 56 | } 57 | 58 | private void swap_media_file (File new_file) { 59 | media_file?.close (); 60 | media_file = Gtk.MediaFile.for_file (new_file); 61 | } 62 | 63 | public List get_tone_keys () { 64 | return tone_map.get_keys (); 65 | } 66 | 67 | public string get_tone_name (string tone_key) 68 | requires (tone_key in tone_map) { 69 | return tone_map[tone_key].name; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/Widgets/PreferencesWindow.vala: -------------------------------------------------------------------------------- 1 | /* PreferencesWindow.vala 2 | * 3 | * Copyright 2021-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | namespace Flowtime { 9 | [GtkTemplate (ui = "/io/github/diegoivanme/flowtime/preferenceswindow.ui")] 10 | public class PreferencesWindow : Adw.PreferencesDialog { 11 | [GtkChild] 12 | private unowned Adw.PreferencesGroup sounds_group; 13 | [GtkChild] 14 | private unowned Gtk.Switch autostart_switch; 15 | [GtkChild] 16 | private unowned Adw.SpinRow months_spinrow; 17 | [GtkChild] 18 | private unowned Adw.SpinRow percentage_spinrow; 19 | [GtkChild] 20 | private unowned Adw.SwitchRow screensaver_row; 21 | 22 | private Services.Settings settings = new Services.Settings (); 23 | 24 | public Services.Screensaver? screensaver { get; construct; default = null; } 25 | 26 | public PreferencesWindow (Gtk.Window? parent, Services.Screensaver? screensaver) { 27 | Object (screensaver: screensaver); 28 | present (parent); 29 | } 30 | 31 | construct { 32 | Gtk.CheckButton? button_group = null; 33 | months_spinrow.value = 0; 34 | 35 | settings.bind_property ("autostart", 36 | autostart_switch, "active", 37 | SYNC_CREATE | BIDIRECTIONAL 38 | ); 39 | 40 | settings.bind_property ("months-saved", 41 | months_spinrow, "value", 42 | SYNC_CREATE | BIDIRECTIONAL 43 | ); 44 | 45 | settings.bind_property ("activate-screensaver", 46 | screensaver_row, "active", 47 | SYNC_CREATE | BIDIRECTIONAL); 48 | 49 | settings.bind_property ("break-percentage", 50 | percentage_spinrow, "value", 51 | SYNC_CREATE | BIDIRECTIONAL); 52 | 53 | var tone_player = new Services.TonePlayer (); 54 | foreach (unowned string key in tone_player.get_tone_keys ()) { 55 | var row = new SoundRow (key); 56 | if (button_group == null) { 57 | button_group = row.check_button; 58 | } 59 | 60 | row.check_button.group = button_group; 61 | 62 | if (row.tone_key == settings.tone) { 63 | row.check_button.active = true; 64 | } 65 | 66 | sounds_group.add (row); 67 | } 68 | 69 | screensaver_row.visible = screensaver == null ? false : screensaver.supported; 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/Widgets/SoundRow.vala: -------------------------------------------------------------------------------- 1 | /* SoundRow.vala 2 | * 3 | * Copyright 2021-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | namespace Flowtime { 9 | public class SoundRow : Adw.ActionRow { 10 | public string tone_key { get; set; } 11 | public Gtk.CheckButton check_button { get; private set; } 12 | 13 | private Services.Settings settings = new Services.Settings (); 14 | private Services.TonePlayer player = new Services.TonePlayer (); 15 | 16 | public SoundRow (string tone_key) { 17 | Object (tone_key: tone_key); 18 | title = player.get_tone_name (tone_key); 19 | } 20 | 21 | construct { 22 | check_button = new Gtk.CheckButton (); 23 | add_prefix (check_button); 24 | activatable_widget = check_button; 25 | 26 | activated.connect (play_sound); 27 | } 28 | 29 | private void play_sound () { 30 | settings.tone = tone_key; 31 | player.play_tone (tone_key); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Widgets/StatGraph.vala: -------------------------------------------------------------------------------- 1 | /* StatGraph.vala 2 | * 3 | * Copyright 2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | public class Flowtime.StatGraph : Gtk.Widget { 9 | private const int DEFAULT_SIZE = 170; 10 | private const Graphene.Size SIZE = { DEFAULT_SIZE, DEFAULT_SIZE }; 11 | 12 | private Models.InformationHolder _state_info = null; 13 | public Models.InformationHolder state_info { 14 | get { 15 | return _state_info; 16 | } 17 | set { 18 | if (_state_info != null) { 19 | state_info.notify["worktime"].disconnect (queue_draw); 20 | state_info.notify["breaktime"].disconnect (queue_draw); 21 | } 22 | 23 | _state_info = value; 24 | state_info.notify["worktime"].connect (queue_draw); 25 | state_info.notify["breaktime"].connect (queue_draw); 26 | 27 | queue_draw (); 28 | } 29 | } 30 | 31 | static construct { 32 | set_css_name ("graph"); 33 | } 34 | 35 | construct { 36 | accessible_role = IMG; 37 | } 38 | 39 | public override void snapshot (Gtk.Snapshot snapshot) { 40 | var bounds = Graphene.Rect () { 41 | size = SIZE, 42 | origin = { 0, 0 } 43 | }; 44 | 45 | Cairo.Context ctx = snapshot.append_cairo (bounds); 46 | 47 | int worktime = state_info.worktime; 48 | int breaktime = state_info.breaktime; 49 | 50 | const double FULL_CIRCLE = Math.PI * 2; 51 | double x = DEFAULT_SIZE * 0.5; 52 | double y = DEFAULT_SIZE * 0.5; 53 | double radius = DEFAULT_SIZE * 0.5; 54 | 55 | double total_time = worktime + breaktime; 56 | double worktime_proportion = worktime / total_time; 57 | double worktime_angle = worktime_proportion * FULL_CIRCLE; 58 | 59 | var color_provider = new Services.ColorProvider (); 60 | Gdk.RGBA work_color = color_provider.work_accent; 61 | Gdk.RGBA break_color = color_provider.break_accent; 62 | 63 | ctx.set_source_rgba (work_color.red, work_color.green, work_color.blue, 1); 64 | ctx.line_to (x, y); 65 | ctx.arc (x, y, radius, 0, worktime_angle); 66 | ctx.line_to (x, y); 67 | ctx.fill (); 68 | ctx.stroke (); 69 | 70 | ctx.set_source_rgba (break_color.red, break_color.green, break_color.blue, 1); 71 | ctx.line_to (x, y); 72 | ctx.arc_negative (x, y, radius, 0, worktime_angle); 73 | ctx.line_to (x, y); 74 | ctx.fill (); 75 | ctx.stroke (); 76 | } 77 | 78 | public override void measure ( 79 | Gtk.Orientation orientation, 80 | int for_size, 81 | out int minimum_size, 82 | out int natural_size, 83 | out int minimum_baseline, 84 | out int natural_baseline 85 | ) { 86 | minimum_size = natural_size = DEFAULT_SIZE; 87 | minimum_baseline = natural_baseline = -1; 88 | } 89 | 90 | public override Gtk.SizeRequestMode get_request_mode () { 91 | return CONSTANT_SIZE; 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /src/Widgets/StatInfo.vala: -------------------------------------------------------------------------------- 1 | /* StatInfo.vala 2 | * 3 | * Copyright 2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | [GtkTemplate (ui = "/io/github/diegoivanme/flowtime/statinfo.ui")] 9 | public class Flowtime.StatInfo : Adw.Bin { 10 | [GtkChild] 11 | private unowned Adw.PreferencesGroup overview_group; 12 | [GtkChild] 13 | private unowned Gtk.Stack content_stack; 14 | 15 | public unowned Models.InformationHolder info_state { get; private set; } 16 | private Services.Statistics statistics = new Services.Statistics (); 17 | 18 | private Services.TimePeriod _time_period; 19 | public Services.TimePeriod time_period { 20 | get { 21 | return _time_period; 22 | } 23 | set construct { 24 | _time_period = value; 25 | set_state_from_period (); 26 | } 27 | } 28 | 29 | static construct { 30 | typeof (StatGraph).ensure (); 31 | } 32 | 33 | private void format_description () { 34 | if (info_state.worktime == 0 && info_state.breaktime == 0) { 35 | content_stack.visible_child_name = "empty"; 36 | return; 37 | } 38 | content_stack.visible_child_name = "info"; 39 | 40 | string formatted_worktime = format_time (info_state.worktime); 41 | string formatted_breaktime = format_time (info_state.breaktime); 42 | 43 | // translators: This phrase is used in the context: You've worked HH:MM:SS... 44 | overview_group.description = _("You've worked %s and have taken a break during %s.").printf ( 45 | formatted_worktime, formatted_breaktime 46 | ); 47 | } 48 | 49 | private string format_time (int seconds) { 50 | const int MINUTE = 60; 51 | const int HOUR = 3600; 52 | const int DAY = 86400; 53 | string unit = ""; 54 | 55 | if (seconds < MINUTE) { 56 | unit = _("seconds"); 57 | return @"$seconds $unit"; 58 | } 59 | 60 | if (seconds < HOUR) { 61 | unit = _("minutes"); 62 | return "%02d:%02d %s".printf (seconds / MINUTE, seconds % MINUTE, unit); 63 | } 64 | 65 | if (seconds < DAY) { 66 | int hours = seconds / HOUR; 67 | int minutes = (seconds % HOUR) / MINUTE; 68 | 69 | if (hours == 1 && minutes == 0) { 70 | unit = _("hour"); 71 | } 72 | else { 73 | unit = _("hours"); 74 | } 75 | 76 | return "%d:%02d %s".printf (seconds / HOUR, minutes, unit); 77 | } 78 | 79 | int days = seconds / DAY; 80 | if (days == 1) { 81 | unit = _("day"); 82 | } 83 | else { 84 | unit = _("days"); 85 | } 86 | 87 | return @"$days $unit"; 88 | } 89 | 90 | private void disconnect_information_holder () { 91 | info_state.notify["worktime"].disconnect (format_description); 92 | info_state.notify["breaktime"].disconnect (format_description); 93 | } 94 | 95 | private void set_state_from_period () { 96 | if (info_state != null) { 97 | disconnect_information_holder (); 98 | } 99 | 100 | switch (time_period) { 101 | case TODAY: 102 | info_state = statistics.today; 103 | break; 104 | case WEEK: 105 | info_state = statistics.week; 106 | break; 107 | case MONTH: 108 | info_state = statistics.month; 109 | break; 110 | case ALL: 111 | info_state = statistics.total; 112 | break; 113 | } 114 | overview_group.title = time_period.to_string (); 115 | 116 | info_state.notify["worktime"].connect (format_description); 117 | info_state.notify["breaktime"].connect (format_description); 118 | format_description (); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src/Widgets/StatList.vala: -------------------------------------------------------------------------------- 1 | /* StatList.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | namespace Flowtime { 9 | [GtkTemplate (ui = "/io/github/diegoivanme/flowtime/statlist.ui")] 10 | public class StatList : Adw.PreferencesGroup { 11 | private ListStore list_store = new ListStore (typeof(Models.StatObject)); 12 | public ListModel list_model { 13 | get { 14 | return list_store; 15 | } 16 | } 17 | 18 | static construct { 19 | typeof(Models.StatObject).ensure (); 20 | typeof(StatRow).ensure (); 21 | } 22 | 23 | public void append (Models.StatObject object) { 24 | list_store.append (object); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/Widgets/StatPage.vala: -------------------------------------------------------------------------------- 1 | /* StatPage.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | [GtkTemplate (ui = "/io/github/diegoivanme/flowtime/statpage.ui")] 9 | public class Flowtime.StatPage : Adw.Bin { 10 | public Services.TimePeriod selected_period { get; private set; default = TODAY; } 11 | 12 | static construct { 13 | typeof (StatInfo).ensure (); 14 | typeof (TimePeriodRow).ensure (); 15 | } 16 | 17 | [GtkCallback] 18 | private void on_details_button_clicked () { 19 | var stat_window = new StatsWindow (); 20 | stat_window.present (this.root); 21 | } 22 | 23 | [GtkCallback] 24 | private void on_row_activated (Gtk.ListBoxRow row) { 25 | var period_row = (TimePeriodRow) row; 26 | selected_period = period_row.time_period; 27 | notify_property ("selected-period"); 28 | } 29 | } 30 | 31 | public class Flowtime.TimePeriodRow : Adw.ActionRow { 32 | private Services.TimePeriod _time_period; 33 | public Services.TimePeriod time_period { 34 | get { 35 | return _time_period; 36 | } 37 | set { 38 | _time_period = value; 39 | title = value.to_string (); 40 | } 41 | } 42 | 43 | construct { 44 | activatable = true; 45 | add_suffix (new Gtk.Image.from_icon_name ("go-next-symbolic")); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/Widgets/StatRow.vala: -------------------------------------------------------------------------------- 1 | /* StatRow.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | namespace Flowtime { 9 | [GtkTemplate (ui = "/io/github/diegoivanme/flowtime/statrow.ui")] 10 | public class StatRow : Adw.Bin { 11 | [GtkChild] 12 | private unowned Gtk.Label date_label; 13 | [GtkChild] 14 | private unowned Gtk.Label time_label; 15 | 16 | public string date { 17 | get { 18 | return date_label.label; 19 | } 20 | set { 21 | date_label.label = value; 22 | } 23 | } 24 | 25 | public string time { 26 | get { 27 | return time_label.label; 28 | } 29 | set { 30 | time_label.label = value; 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/Widgets/StatsWindow.vala: -------------------------------------------------------------------------------- 1 | /* StatsWindow.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | namespace Flowtime { 9 | [GtkTemplate (ui = "/io/github/diegoivanme/flowtime/statwindow.ui")] 10 | public class StatsWindow : Adw.Dialog { 11 | [GtkChild] 12 | private unowned StatList work_list; 13 | [GtkChild] 14 | private unowned StatList break_list; 15 | [GtkChild] 16 | private unowned Gtk.Button save_button; 17 | [GtkChild] 18 | private unowned Gtk.Stack content_stack; 19 | 20 | construct { 21 | var statistics = new Services.Statistics (); 22 | if (statistics.total.worktime == 0) { 23 | content_stack.visible_child_name = "empty"; 24 | save_button.visible = false; 25 | } 26 | 27 | foreach (Models.Day day in statistics.all_days) { 28 | var work_object = new Models.StatObject (day.date, day.worktime); 29 | work_list.append (work_object); 30 | 31 | var break_object = new Models.StatObject (day.date, day.breaktime); 32 | break_list.append (break_object); 33 | } 34 | 35 | if (!statistics.all_days.is_empty ()) { 36 | work_list.description = _("%s is your most productive day of the week").printf (statistics.productive_day); 37 | } 38 | } 39 | 40 | public async void save_as_csv (File file) 41 | requires (file.query_exists ()) 42 | { 43 | var statistics = new Services.Statistics (); 44 | string format = "date,worktime,breatkime"; 45 | 46 | foreach (Models.Day day in statistics.all_days) { 47 | var work_object = new Models.StatObject (day.date, day.worktime); 48 | var break_object = new Models.StatObject (day.date, day.breaktime); 49 | 50 | format += "\"%s\",\"%s\",\"%s\"\n".printf(work_object.date, work_object.time, break_object.time); 51 | } 52 | 53 | try { 54 | FileUtils.set_contents (file.get_path (), format); 55 | } 56 | catch (Error e) { 57 | critical (e.message); 58 | } 59 | } 60 | 61 | [GtkCallback] 62 | private void on_save_button_clicked () { 63 | save_action.begin (); 64 | } 65 | 66 | private async void save_action () { 67 | var file_dialog = new Gtk.FileDialog () { 68 | modal = true 69 | }; 70 | 71 | try { 72 | File file = yield file_dialog.save ((Gtk.Window) this.root, null); 73 | yield save_as_csv (file); 74 | } 75 | catch (Error e) { 76 | critical (e.message); 77 | } 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/Widgets/TimerPage.vala: -------------------------------------------------------------------------------- 1 | /* TimerPage.vala 2 | * 3 | * Copyright 2022-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | namespace Flowtime { 9 | [GtkTemplate (ui = "/io/github/diegoivanme/flowtime/timerpage.ui")] 10 | public class TimerPage : Adw.Bin { 11 | [GtkChild] 12 | private unowned Gtk.Button pause_button; 13 | [GtkChild] 14 | private unowned Gtk.Label time_label; 15 | [GtkChild] 16 | private unowned Gtk.Label stage_label; 17 | 18 | public Services.Timer _timer; 19 | public Services.Timer timer { 20 | get { 21 | return _timer; 22 | } 23 | set { 24 | _timer = value; 25 | timer.bind_property ("formatted-time", time_label, "label", SYNC_CREATE); 26 | 27 | timer.notify["running"].connect (on_running_changed); 28 | timer.notify["mode"].connect (update_labels); 29 | 30 | on_running_changed (); 31 | update_labels (); 32 | } 33 | } 34 | 35 | public uint seconds { 36 | get { 37 | return timer.seconds; 38 | } 39 | } 40 | 41 | private void update_labels () { 42 | if (timer.mode == WORK) { 43 | stage_label.label = _("Work Stage"); 44 | return; 45 | } 46 | stage_label.label = _("Break Stage"); 47 | } 48 | 49 | private void on_running_changed () { 50 | if (timer.running) { 51 | pause_button.icon_name = "media-playback-pause-symbolic"; 52 | pause_button.tooltip_text = _("Pause Timer"); 53 | return; 54 | } 55 | pause_button.icon_name = "media-playback-start-symbolic"; 56 | pause_button.tooltip_text = _("Start Timer"); 57 | } 58 | 59 | [GtkCallback] 60 | private void on_pause_button_clicked () { 61 | if (timer.running) { 62 | timer.stop (); 63 | return; 64 | } 65 | timer.start (); 66 | } 67 | 68 | [GtkCallback] 69 | private void on_next_button_clicked () { 70 | timer.next_mode (); 71 | } 72 | } 73 | } 74 | 75 | -------------------------------------------------------------------------------- /src/Widgets/Window.vala: -------------------------------------------------------------------------------- 1 | /* Window.vala 2 | * 3 | * Copyright 2021-2023 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | [GtkTemplate (ui = "/io/github/diegoivanme/flowtime/window.ui")] 9 | public class Flowtime.Window : Adw.ApplicationWindow { 10 | [GtkChild] 11 | private unowned Services.Timer timer; 12 | [GtkChild] 13 | private unowned Adw.ViewStack view_stack; 14 | [GtkChild] 15 | private unowned Adw.ViewSwitcher view_switcher; 16 | [GtkChild] 17 | private unowned Adw.ViewSwitcherBar switcher_bar; 18 | [GtkChild] 19 | private unowned StatInfo overview_info; 20 | [GtkChild] 21 | private unowned Adw.NavigationView navigation_view; 22 | 23 | private Adw.Animation hide_animation; 24 | private Adw.Animation show_animation; 25 | private Adw.AnimationTarget content_target; 26 | private Adw.AnimationTarget switchers_target; 27 | 28 | private Services.Screensaver? screensaver = null; 29 | private Services.BackgroundStatusReporter background_reporter; 30 | private Services.Alarm alarm; 31 | 32 | private bool _distraction_free = false; 33 | public bool distraction_free { 34 | get { 35 | return _distraction_free; 36 | } 37 | set { 38 | bool animations_playing = 39 | hide_animation.state == PLAYING || show_animation.state == PLAYING; 40 | 41 | if (value == distraction_free || animations_playing) { 42 | return; 43 | } 44 | 45 | _distraction_free = value; 46 | distraction_free_transition (); 47 | } 48 | } 49 | 50 | public Window (Gtk.Application app) { 51 | Object (application: app); 52 | } 53 | 54 | static construct { 55 | typeof(StatPage).ensure (); 56 | typeof(TimerPage).ensure (); 57 | } 58 | 59 | construct { 60 | install_property_action ("win.distraction-free", "distraction-free"); 61 | 62 | content_target = new Adw.CallbackAnimationTarget (change_content_opacity); 63 | switchers_target = new Adw.CallbackAnimationTarget (change_switchers_opacity); 64 | 65 | hide_animation = new Adw.TimedAnimation (view_stack, 1, 0, 200, switchers_target) { 66 | easing = EASE_IN_OUT_CUBIC 67 | }; 68 | 69 | show_animation = new Adw.TimedAnimation (view_stack, 0, 1, 200, content_target) { 70 | easing = EASE_IN_OUT_CUBIC 71 | }; 72 | 73 | hide_animation.done.connect (() => { 74 | switcher_bar.visible = view_switcher.visible = !distraction_free; 75 | view_stack.visible_child_name = "timer"; 76 | show_animation.play (); 77 | }); 78 | distraction_free = false; 79 | 80 | init_services.begin (); 81 | } 82 | 83 | private async void init_services () { 84 | background_reporter = new Services.BackgroundStatusReporter (timer); 85 | alarm = new Services.Alarm (timer); 86 | 87 | var color_provider = new Services.ColorProvider (); 88 | timer.bind_property ("mode", color_provider, "mode", SYNC_CREATE); 89 | 90 | try { 91 | screensaver = yield new Services.Screensaver (timer); 92 | } catch (Error e) { 93 | critical (e.message); 94 | } 95 | } 96 | 97 | private void distraction_free_transition () { 98 | if (view_stack.visible_child_name == "statistics" || switcher_bar.reveal) { 99 | hide_animation.target = show_animation.target = content_target; 100 | } else { 101 | hide_animation.target = show_animation.target = switchers_target; 102 | } 103 | 104 | hide_animation.play (); 105 | } 106 | 107 | private void change_switchers_opacity (double @value) { 108 | switcher_bar.opacity = view_switcher.opacity = value; 109 | } 110 | 111 | private void change_content_opacity (double @value) { 112 | switcher_bar.opacity = view_switcher.opacity = view_stack.opacity = value; 113 | } 114 | 115 | [GtkCallback] 116 | private bool on_close_request () { 117 | if (!timer.running || timer.seconds == 0) { 118 | timer.save_to_statistics (); 119 | hide_on_close = false; 120 | } 121 | return false; 122 | } 123 | 124 | [GtkCallback] 125 | private void change_to_overview (Object source, ParamSpec pspec) { 126 | var stat_page = (StatPage) source; 127 | overview_info.time_period = stat_page.selected_period; 128 | navigation_view.pop (); 129 | navigation_view.activate_action_variant ("navigation.push", "overview"); 130 | } 131 | 132 | public void show_preferences () { 133 | new PreferencesWindow (this, screensaver); 134 | } 135 | 136 | public async bool query_quit () { 137 | if (!timer.running) { 138 | timer.save_to_statistics (); 139 | return true; 140 | } 141 | 142 | var warning = new Adw.AlertDialog (_("There is a timer active"), _("Do you want to quit?")) { 143 | close_response = "cancel", 144 | }; 145 | 146 | warning.add_response ("cancel", _("Cancel")); 147 | warning.add_response ("hide", _("Hide window")); 148 | warning.add_response ("quit", _("Quit")); 149 | 150 | warning.set_response_appearance ("quit", DESTRUCTIVE); 151 | 152 | string response = yield warning.choose (this, null); 153 | 154 | if (response == "quit") { 155 | timer.save_to_statistics (); 156 | return true; 157 | } 158 | 159 | if (response == "hide") { 160 | close_request (); 161 | } 162 | 163 | return false; 164 | } 165 | 166 | public void query_save_for_shutdown () { 167 | timer.save_to_statistics (); 168 | } 169 | } 170 | -------------------------------------------------------------------------------- /src/XmlUtils.vala: -------------------------------------------------------------------------------- 1 | /* XmlUtils.vala 2 | * 3 | * Copyright 2022 Diego Iván 4 | * 5 | * SPDX-License-Identifier: GPL-3.0-or-later 6 | */ 7 | 8 | namespace Flowtime.XmlUtils { 9 | public Xml.Node* get_content_node (Xml.Node* n, string node_name) { 10 | assert (n->name == node_name); 11 | 12 | for (Xml.Node* i = n->children; i != null; i = i->next) { 13 | if (i->type == TEXT_NODE) { 14 | return i; 15 | } 16 | } 17 | return n; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/flowtime.gresource.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ui/style.css 5 | 6 | ui/window.ui 7 | ui/statpage.ui 8 | ui/statrow.ui 9 | ui/statwindow.ui 10 | ui/preferenceswindow.ui 11 | ui/timerpage.ui 12 | ui/statlist.ui 13 | ui/statinfo.ui 14 | 15 | ui/sounds/tone.ogg 16 | ui/sounds/baum.ogg 17 | ui/sounds/bleep.ogg 18 | ui/sounds/beep.ogg 19 | 20 | 21 | ui/icons/timer-sand-symbolic.svg 22 | ui/icons/profit-symbolic.svg 23 | ui/icons/info-symbolic.svg 24 | ui/icons/month-symbolic.svg 25 | ui/icons/cafe-symbolic.svg 26 | ui/icons/pip-out-symbolic.svg 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/main.vala: -------------------------------------------------------------------------------- 1 | /* main.vala 2 | * 3 | * Copyright 2021 Diego Iván 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | 19 | namespace Flowtime { 20 | public Application app; 21 | public static int main (string[] args) { 22 | app = new Application (); 23 | return app.run (args); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/meson.build: -------------------------------------------------------------------------------- 1 | flowtime_sources = [ 2 | 'main.vala', 3 | 'Application.vala', 4 | 'XmlUtils.vala', 5 | 6 | # Models 7 | 'Models/Day.vala', 8 | 'Models/State.vala', 9 | 'Models/StatObject.vala', 10 | 'Models/InformationHolder.vala', 11 | 12 | # Services 13 | 'Services/Timer.vala', 14 | 'Services/ColorProvider.vala', 15 | 'Services/Statistics.vala', 16 | 'Services/Alarm.vala', 17 | 'Services/Settings.vala', 18 | 'Services/Screensaver.vala', 19 | 'Services/BackgroundStatusReporter.vala', 20 | 'Services/TonePlayer.vala', 21 | 22 | # Widgets 23 | 'Widgets/PreferencesWindow.vala', 24 | 'Widgets/SoundRow.vala', 25 | 'Widgets/StatGraph.vala', 26 | 'Widgets/StatInfo.vala', 27 | 'Widgets/StatList.vala', 28 | 'Widgets/StatPage.vala', 29 | 'Widgets/StatRow.vala', 30 | 'Widgets/StatsWindow.vala', 31 | 'Widgets/TimerPage.vala', 32 | 'Widgets/Window.vala', 33 | ] 34 | 35 | flowtime_deps = [ 36 | dependency('libadwaita-1', version: '>= 1.4'), 37 | dependency('libxml-2.0'), 38 | dependency('libportal-gtk4'), 39 | ] 40 | 41 | conf = configuration_data() 42 | conf.set_quoted('APP_ID', app_id) 43 | conf.set_quoted('G_LOG_DOMAIN', 'Flowtime') 44 | conf.set_quoted('VERSION', meson.project_version()) 45 | conf.set_quoted('GETTEXT_PACKAGE', meson.project_name()) 46 | conf.set_quoted('DATADIR', join_paths(get_option('prefix'), get_option('datadir'))) 47 | conf.set_quoted('GNOMELOCALEDIR', join_paths(get_option('prefix'), get_option('localedir'))) 48 | configure_file(output: 'config.h', configuration: conf) 49 | 50 | add_project_arguments( 51 | '-include', 'config.h', 52 | '-DGETTEXT_PACKAGE="@0@"'.format(meson.project_name()), 53 | language: 'c' 54 | ) 55 | 56 | gnome = import('gnome') 57 | blueprint_compiler = find_program('blueprint-compiler') 58 | 59 | blueprints = files ( 60 | 'ui/preferenceswindow.blp', 61 | 'ui/statrow.blp', 62 | 'ui/statwindow.blp', 63 | 'ui/window.blp', 64 | 'ui/statlist.blp', 65 | 'ui/statinfo.blp', 66 | 'ui/statpage.blp', 67 | 'ui/timerpage.blp', 68 | ) 69 | 70 | flowtime_resources_file = files('flowtime.gresource.xml') 71 | flowtime_resources = gnome.compile_resources('flowtime-resources', 72 | flowtime_resources_file, 73 | c_name: 'flowtime', 74 | dependencies: custom_target( 75 | build_always_stale: true, 76 | command: [blueprint_compiler, 'batch-compile', '@OUTPUT@', '@CURRENT_SOURCE_DIR@', '@INPUT@'], 77 | input: blueprints, 78 | output: '.', 79 | ), 80 | ) 81 | 82 | executable('flowtime', flowtime_resources, flowtime_sources, 83 | vala_args: [ 84 | meson.project_source_root() + '/src/vapi/config.vapi', 85 | '--target-glib=2.50', 86 | '--enable-checking', 87 | '--gresourcesdir=src/', 88 | '--vapidir', meson.project_source_root() / 'vapi', 89 | ], 90 | dependencies: flowtime_deps, 91 | install: true, 92 | ) 93 | -------------------------------------------------------------------------------- /src/ui/icons/cafe-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/ui/icons/info-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | -------------------------------------------------------------------------------- /src/ui/icons/month-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/ui/icons/pip-out-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/ui/icons/profit-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/ui/icons/timer-sand-symbolic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/ui/preferenceswindow.blp: -------------------------------------------------------------------------------- 1 | using Gtk 4.0; 2 | using Adw 1; 3 | 4 | template $FlowtimePreferencesWindow : Adw.PreferencesDialog { 5 | Adw.PreferencesPage { 6 | title: _("_Preferences"); 7 | 8 | Adw.PreferencesGroup { 9 | title: _("Statistics"); 10 | 11 | Adw.SpinRow months_spinrow { 12 | title: _("Months Saved"); 13 | subtitle: _("The amount of months that the work data will be saved"); 14 | 15 | adjustment: Adjustment { 16 | lower: 1; 17 | upper: 6; 18 | step-increment: 1; 19 | page-increment: 3; 20 | }; 21 | } 22 | } 23 | 24 | Adw.PreferencesGroup { 25 | title: _("Timer"); 26 | 27 | Adw.SpinRow percentage_spinrow { 28 | title: _("Break time percentage"); 29 | subtitle: _("The percetage of work time that will be used as break time"); 30 | 31 | adjustment: Adjustment { 32 | lower: 10; 33 | upper: 100; 34 | step-increment: 1; 35 | page-increment: 10; 36 | }; 37 | } 38 | } 39 | 40 | Adw.PreferencesGroup { 41 | title: _("Break Time"); 42 | Adw.ActionRow { 43 | title: _("Autostart"); 44 | subtitle: _("Automatically start the timer when the stage is changed"); 45 | 46 | [suffix] 47 | Switch autostart_switch { 48 | valign: center; 49 | } 50 | 51 | activatable-widget: autostart_switch; 52 | } 53 | 54 | Adw.SwitchRow screensaver_row { 55 | title: _("Activate Screensaver on Break Time"); 56 | subtitle: _("Activate the screensaver when the break stage starts. Requires Autostart"); 57 | sensitive: bind autostart_switch.active; 58 | } 59 | } 60 | 61 | Adw.PreferencesGroup sounds_group { 62 | title: _("Sounds"); 63 | description: _("Alarm sounds that mark break time"); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/ui/sounds/README.md: -------------------------------------------------------------------------------- 1 | # Usage of Sounds 2 | 3 | The following sounds: 4 | 5 | * Baum.ogg 6 | * Beep.ogg 7 | * Bleep.ogg 8 | 9 | Are licensed by *Mike Koenig* and originally published at [SoundBible](https://soundbible.com/). 10 | 11 | The sound ['Tone.ogg'](https://soundbible.com/1815-A-Tone.html) is registered at the Same Webpage as a public domain sound. Orginally published by user *His Self*. 12 | -------------------------------------------------------------------------------- /src/ui/sounds/baum.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Diego-Ivan/Flowtime/9022a39997d9eb8c7421af824e8d885a2bc2e0a1/src/ui/sounds/baum.ogg -------------------------------------------------------------------------------- /src/ui/sounds/beep.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Diego-Ivan/Flowtime/9022a39997d9eb8c7421af824e8d885a2bc2e0a1/src/ui/sounds/beep.ogg -------------------------------------------------------------------------------- /src/ui/sounds/bleep.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Diego-Ivan/Flowtime/9022a39997d9eb8c7421af824e8d885a2bc2e0a1/src/ui/sounds/bleep.ogg -------------------------------------------------------------------------------- /src/ui/sounds/tone.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Diego-Ivan/Flowtime/9022a39997d9eb8c7421af824e8d885a2bc2e0a1/src/ui/sounds/tone.ogg -------------------------------------------------------------------------------- /src/ui/statinfo.blp: -------------------------------------------------------------------------------- 1 | using Gtk 4.0; 2 | using Adw 1; 3 | 4 | template $FlowtimeStatInfo : Adw.Bin { 5 | Stack content_stack { 6 | StackPage { 7 | name: "empty"; 8 | child: Adw.StatusPage { 9 | styles ["compact"] 10 | title: _("Start working to see your progress"); 11 | icon-name: "timer-sand-symbolic"; 12 | }; 13 | } 14 | 15 | StackPage { 16 | name: "info"; 17 | child: ScrolledWindow { 18 | propagate-natural-height: true; 19 | propagate-natural-width: true; 20 | Adw.Clamp { 21 | Adw.PreferencesGroup overview_group { 22 | margin-start: 12; 23 | margin-end: 12; 24 | margin-top: 6; 25 | margin-bottom: 6; 26 | 27 | Box { 28 | orientation: vertical; 29 | spacing: 18; 30 | $FlowtimeStatGraph { 31 | halign: center; 32 | state-info: bind template.info-state no-sync-create; 33 | 34 | accessibility { 35 | labelled-by: overview_group; 36 | } 37 | } 38 | 39 | Box { 40 | orientation: horizontal; 41 | spacing: 36; 42 | halign: center; 43 | Box { 44 | orientation: horizontal; 45 | spacing: 6; 46 | 47 | Adw.Bin work_bin { 48 | styles["work", "stat-detail"] 49 | valign: center; 50 | } 51 | Label { 52 | label: _("Work"); 53 | } 54 | } 55 | 56 | Box { 57 | orientation: horizontal; 58 | spacing: 6; 59 | 60 | Adw.Bin break_bin { 61 | styles["break", "stat-detail"] 62 | valign: center; 63 | } 64 | Label { 65 | label: _("Break"); 66 | } 67 | } 68 | } 69 | } 70 | } 71 | } 72 | }; 73 | } 74 | } 75 | } -------------------------------------------------------------------------------- /src/ui/statlist.blp: -------------------------------------------------------------------------------- 1 | using Gtk 4.0; 2 | using Gio 2.0; 3 | using Adw 1; 4 | 5 | template $FlowtimeStatList : Adw.PreferencesGroup { 6 | ListView list_view { 7 | styles ["navigation-sidebar"] 8 | 9 | factory: BuilderListItemFactory { 10 | template ListItem { 11 | focusable: false; 12 | child: $FlowtimeStatRow { 13 | date: bind template.item as <$FlowtimeModelsStatObject>.date; 14 | time: bind template.item as <$FlowtimeModelsStatObject>.time; 15 | }; 16 | } 17 | }; 18 | 19 | model: NoSelection { 20 | model: bind template.list-model; 21 | }; 22 | } 23 | } -------------------------------------------------------------------------------- /src/ui/statpage.blp: -------------------------------------------------------------------------------- 1 | using Gtk 4.0; 2 | using Adw 1; 3 | 4 | template $FlowtimeStatPage : Adw.Bin { 5 | ScrolledWindow { 6 | propagate-natural-width: true; 7 | propagate-natural-height: true; 8 | 9 | Adw.Clamp { 10 | margin-start: 12; 11 | margin-end: 12; 12 | margin-top: 12; 13 | margin-bottom: 24; 14 | Adw.PreferencesGroup { 15 | title: _("Overview"); 16 | 17 | [header-suffix] 18 | Button details_button { 19 | styles["flat"] 20 | clicked => $on_details_button_clicked (); 21 | Adw.ButtonContent { 22 | label: _("See Details"); 23 | icon-name: "info-symbolic"; 24 | } 25 | } 26 | 27 | ListBox { 28 | styles["boxed-list"] 29 | margin-top: 12; 30 | selection-mode: none; 31 | row-activated => $on_row_activated (); 32 | 33 | $FlowtimeTimePeriodRow { 34 | time-period: today; 35 | } 36 | $FlowtimeTimePeriodRow { 37 | time-period: week; 38 | } 39 | $FlowtimeTimePeriodRow { 40 | time-period: month; 41 | } 42 | $FlowtimeTimePeriodRow { 43 | time-period: all; 44 | } 45 | } 46 | } 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /src/ui/statrow.blp: -------------------------------------------------------------------------------- 1 | using Gtk 4.0; 2 | using Adw 1; 3 | 4 | template $FlowtimeStatRow : Adw.Bin { 5 | styles [ 6 | "card", 7 | ] 8 | 9 | Box { 10 | orientation: vertical; 11 | margin-top: 12; 12 | margin-bottom: 12; 13 | margin-start: 12; 14 | 15 | Label date_label { 16 | halign: start; 17 | selectable: true; 18 | 19 | styles [ 20 | "heading", 21 | ] 22 | } 23 | 24 | Label time_label { 25 | halign: start; 26 | selectable: true; 27 | 28 | styles [ 29 | "body", 30 | ] 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/ui/statwindow.blp: -------------------------------------------------------------------------------- 1 | using Gtk 4.0; 2 | using Adw 1; 3 | 4 | template $FlowtimeStatsWindow : Adw.Dialog { 5 | width-request: 355; 6 | height-request: 200; 7 | follows-content-size: true; 8 | title: _("Statistics"); 9 | 10 | Adw.Breakpoint { 11 | condition ("max-width: 400sp") 12 | setters { 13 | header_bar.title-widget: null; 14 | switcher_bar.reveal: true; 15 | } 16 | } 17 | 18 | Adw.ToolbarView main_view { 19 | [top] 20 | Adw.HeaderBar header_bar { 21 | title-widget: Adw.ViewSwitcher switcher_title { 22 | policy: wide; 23 | stack: view_stack; 24 | }; 25 | 26 | [start] 27 | Button save_button { 28 | icon-name: "folder-download-symbolic"; 29 | tooltip-text: _("Save as CSV"); 30 | clicked => $on_save_button_clicked(); 31 | } 32 | } 33 | 34 | Stack content_stack { 35 | StackPage { 36 | name: "main-content"; 37 | 38 | child: Adw.ViewStack view_stack { 39 | Adw.ViewStackPage { 40 | title: _("Work Time"); 41 | name: "work"; 42 | icon-name: "computer-symbolic"; 43 | 44 | child: ScrolledWindow { 45 | propagate-natural-height: true; 46 | propagate-natural-width: true; 47 | 48 | Adw.Clamp { 49 | $FlowtimeStatList work_list { 50 | title: _("Work Time"); 51 | margin-top: "12"; 52 | margin-start: "12"; 53 | margin-end: "12"; 54 | } 55 | } 56 | }; 57 | } 58 | 59 | Adw.ViewStackPage { 60 | title: _("Break Time"); 61 | name: "break"; 62 | icon-name: "cafe-symbolic"; 63 | 64 | child: ScrolledWindow { 65 | propagate-natural-height: true; 66 | propagate-natural-width: true; 67 | 68 | Adw.Clamp { 69 | $FlowtimeStatList break_list { 70 | title: _("Break Time"); 71 | margin-top: "3"; 72 | margin-start: "12"; 73 | margin-end: "12"; 74 | } 75 | } 76 | }; 77 | } 78 | }; 79 | } 80 | 81 | StackPage { 82 | name: "empty"; 83 | child: Adw.StatusPage { 84 | styles["compact"] 85 | title: _("Start working to see your progress"); 86 | icon-name: "timer-sand-symbolic"; 87 | }; 88 | } 89 | } 90 | 91 | [bottom] 92 | Adw.ViewSwitcherBar switcher_bar { 93 | stack: view_stack; 94 | vexpand: true; 95 | valign: end; 96 | } 97 | } 98 | 99 | ShortcutController { 100 | Shortcut { 101 | trigger: "w"; 102 | action: "action(window.close)"; 103 | } 104 | 105 | Shortcut { 106 | trigger: "Escape"; 107 | action: "action(window.close)"; 108 | } 109 | } 110 | } -------------------------------------------------------------------------------- /src/ui/style.css: -------------------------------------------------------------------------------- 1 | .large-button { 2 | padding: 8px; 3 | } 4 | 5 | .not-so-large-button { 6 | padding: 4px; 7 | } 8 | 9 | .time-label { 10 | color: @accent_color; 11 | font-weight: 300; 12 | font-size: 400%; 13 | } 14 | 15 | .stat-detail { 16 | min-width: 15px; 17 | min-height: 15px; 18 | border-radius: 20%; 19 | } 20 | 21 | .work { 22 | background-color: #1c71d8; 23 | } 24 | 25 | .break { 26 | background-color: #8ff0a4; 27 | } 28 | 29 | widget.compact { 30 | font-size: 89%; 31 | } 32 | 33 | graph { 34 | box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.03), 0 2px 6px 2px rgba(0, 0, 0, 0.07), 0 4px 12px 4px rgba(0, 0, 0, 0.03); 35 | border-radius: 50%; 36 | } 37 | -------------------------------------------------------------------------------- /src/ui/timerpage.blp: -------------------------------------------------------------------------------- 1 | using Gtk 4.0; 2 | using Adw 1; 3 | 4 | template $FlowtimeTimerPage : Adw.Bin { 5 | halign: center; 6 | valign: baseline_center; 7 | vexpand: true; 8 | 9 | 10 | Box { 11 | spacing: 30; 12 | orientation: vertical; 13 | 14 | Box { 15 | orientation: vertical; 16 | valign: start; 17 | vexpand: true; 18 | 19 | Label stage_label { 20 | styles ["accent", "heading"] 21 | } 22 | 23 | Label time_label { 24 | label: "00:00"; 25 | styles ["time-label", "numeric"] 26 | } 27 | } 28 | 29 | Box { 30 | orientation: horizontal; 31 | halign: center; 32 | valign: start; 33 | spacing: 6; 34 | 35 | Button pause_button { 36 | icon-name: "media-playback-start-symbolic"; 37 | halign: center; 38 | clicked => $on_pause_button_clicked (); 39 | 40 | styles ["suggested-action", "circular", "large-button"] 41 | } 42 | 43 | Button next_button { 44 | icon-name: "media-seek-forward-symbolic"; 45 | valign: center; 46 | clicked => $on_next_button_clicked (); 47 | 48 | styles ["circular", "not-so-large-button"] 49 | } 50 | } 51 | } 52 | } -------------------------------------------------------------------------------- /src/ui/window.blp: -------------------------------------------------------------------------------- 1 | using Gtk 4.0; 2 | using Adw 1; 3 | 4 | menu action-menu { 5 | section { 6 | item { 7 | label: _("_Preferences"); 8 | action: "app.preferences"; 9 | } 10 | 11 | item { 12 | label: _("_Distraction Free Mode"); 13 | action: "win.distraction-free"; 14 | } 15 | } 16 | section { 17 | item { 18 | label: _("_About Flowtime"); 19 | action: "app.about"; 20 | } 21 | } 22 | } 23 | 24 | template $FlowtimeWindow : Adw.ApplicationWindow { 25 | default-height: 405; 26 | default-width: 425; 27 | height-request: 300; 28 | width-request: 360; 29 | hide-on-close: true; 30 | title: ""; 31 | close-request => $on_close_request(); 32 | 33 | Adw.Breakpoint { 34 | condition ("max-width: 400sp") 35 | setters { 36 | switcher_bar.reveal: true; 37 | headerbar.show-title: false; 38 | } 39 | } 40 | 41 | Adw.NavigationView navigation_view { 42 | Adw.NavigationPage { 43 | tag: "main-view"; 44 | title: "Flowtime"; 45 | Adw.ToolbarView main_view { 46 | [top] 47 | Adw.HeaderBar headerbar { 48 | show-end-title-buttons: true; 49 | 50 | [start] 51 | MenuButton { 52 | menu-model: action-menu; 53 | icon-name: "open-menu-symbolic"; 54 | } 55 | 56 | title-widget: Adw.ViewSwitcher view_switcher { 57 | policy: wide; 58 | stack: view_stack; 59 | }; 60 | } 61 | 62 | WindowHandle { 63 | Adw.ViewStack view_stack { 64 | Adw.ViewStackPage { 65 | icon-name: "timer-sand-symbolic"; 66 | name: "timer"; 67 | title: _("_Stages"); 68 | use-underline: true; 69 | child: 70 | $FlowtimeTimerPage timer_page { 71 | timer: $FlowtimeServicesTimer timer {}; 72 | }; 73 | } 74 | 75 | Adw.ViewStackPage { 76 | icon-name: "profit-symbolic"; 77 | name: "statistics"; 78 | title: _("S_tatistics"); 79 | use-underline: true; 80 | child: $FlowtimeStatPage { 81 | notify::selected-period => $change_to_overview (); 82 | }; 83 | } 84 | } 85 | } 86 | 87 | [bottom] 88 | Adw.ViewSwitcherBar switcher_bar { 89 | stack: view_stack; 90 | } 91 | } 92 | } 93 | 94 | Adw.NavigationPage { 95 | title: _("Overview"); 96 | tag: "overview"; 97 | 98 | Adw.ToolbarView { 99 | [top] 100 | Adw.HeaderBar header_bar {} 101 | 102 | $FlowtimeStatInfo overview_info { 103 | time-period: today; 104 | } 105 | } 106 | } 107 | } 108 | 109 | 110 | ShortcutController { 111 | Shortcut { 112 | trigger: "w"; 113 | action: "action(window.close)"; 114 | } 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /src/vapi/config.vapi: -------------------------------------------------------------------------------- 1 | [CCode (cprefix = "", lower_case_cprefix = "", cheader_filename = "config.h")] 2 | namespace Config { 3 | public const string VERSION; 4 | public const string APP_ID; 5 | public const string GETTEXT_PACKAGE; 6 | public const string GNOMELOCALEDIR; 7 | public const string DATADIR; 8 | } 9 | -------------------------------------------------------------------------------- /vala-lint.conf: -------------------------------------------------------------------------------- 1 | [Checks] 2 | block-opening-brace-space-before=error 3 | double-semicolon=error 4 | double-spaces=error 5 | ellipsis=warn 6 | line-length=warn 7 | naming-convention=error 8 | no-space=error 9 | note=warn 10 | space-before-paren=error 11 | use-of-tabs=error 12 | trailing-newlines=error 13 | trailing-whitespace=error 14 | unnecessary-string-template=error 15 | 16 | [Disabler] 17 | disable-by-inline-comments=true 18 | 19 | [line-length] 20 | max-line-length=110 21 | ignore-comments=true 22 | 23 | [naming-convention] 24 | exceptions=UUID, 25 | 26 | [note] 27 | keywords=TODO,FIXME, 28 | --------------------------------------------------------------------------------