ayatana-indicator-datetime-25.4.0/AUTHORS0000644000000000000000000001611214773244555014743 0ustar Abbas Baharforoosh Abdusalam <1810010207@s.upc.edu.cn> account1 Ács Zoltán Adolfo Jayme Barrientos Adrià Martín advocatux Allan LeSage Allan Nordhøy Anders Jonsson Andrea Azzarone Andreas Kleinert Andrew Shadura Antti Kaijanmäki Arthur Mello Baka Gaijin bittin1ddc447d824349b2 Bob Owen Boyuan Yang <073plan@gmail.com> Bruno Fragoso ButterflyOfFire Charles Kerr chrismeurer CI Train Bot Cleverson Cândido Colin Watson Cristian Gherman Csaba 이정희 Danjela Hoxha David Barth David Mohammed David Planella Davit Mayilyan Didier Roche Didier Roche Doma Gergő Droit <3118138007@qq.com> Dylan McCall Eduardo Addad de Oliveira ElectrifiedSpeed Elizabeth Sherrock EminUZUN Eryk Michalak Espen Wiborg Eugen Wesseloh Evgeni Golov farkasdvd <30418389+farkasdvd@users.noreply.github.com> Gabor Kelemen gallegonovato Gediminas Murauskas geni giorgio.saragnese gökhan barış göbet Grace Guo György Balló Heimen Stoffels Heimen Stoffels Henrik Dankvardt Hosted Weblate hugoalh HuNteR GaMinG Iain Lane Iain Lane iNetRoos Javier Jardón Jeannette L Jeremy Bicha J. Lavoie Joan CiberSheep Johntini Jörn Horstmann Juraj Liso karel van dongen karl-qdh Karol Kosek Ken VanDine klausade koffevar Kristjan Räts kugiigi Kyle Nitzsche Kyrylo Yanukovych Laércio Cordeiro Lars Uebernickel Lars Uebernickel larsu leela <52065244+leela52452@users.noreply.github.com> leela <53352@protonmail.com> Lejo Luigi311 Lukáš Tinkl Łukasz 'sil2100' Zemczak Luke Yelavich Luna Jernberg Marco Scaglioni Marco Trevisan (Treviño) Marcus Tomlinson Marius Gripsgard MarongHappy Martin Pitt Martin Šikuda Mateusz Rumiński Mathieu Trudel-Lapierre Mathieu Trudel-Lapierre Mertcan Gokgoz Michael Terry Michael Terry Michalis Michele Mike Gabriel Milan Korecky Milo Ivir Mirco Müller MoccoCoffee Moo M Ramani Priya mv87 Naveen Rajan Nicholas Guriev nimradium nugullpunch Oğuz Ersen Oğuz Ersen Olivier Macchioni Olivier Tilloy OPNA2608 OrionJK - Pavel Borecki Phil Clifford phlostically Quentin PAGÈS Ratchanan Srirattanamet Remus-Gabriel Chelu Renato Araujo Oliveira Filho Reza Almanda Ricardo Salveti de Araujo Richard Somlói Robert Ancell Robert Tari Rob Pearson Rodney Dawes Rodney Dawes Rodrigo Moya Rondy Andersson Rui Mendes Ryan Lortie SapuSeven Sebastian Rasmussen Sebastien Bacher Sergey Shnatsel Davidoff Sergii Horichenko Simon Quigley sock-et spnux ssantos Steve Swann Martinet Sylke Vicious taoky Ted Gould Temuri Doghonadze THANOS SIOURDAKIS thebylito Tiago Silva Miguel Timo Jyrinki Tobias p Tomáš Marný Tommy Cheng Uddin Mtm umesaburo sagawa Veselin Georgiev Viktar Vauchkevich WaldiS wdggg Weblate Wellington Terumi Uemura wigy Yaron Shahrabani Zdeněk Klauda Zhaoyu Gan Артем Володимир Бриняк Марс Ямбар Мира Странная தமிழ்நேரம் 复予 ayatana-indicator-datetime-25.4.0/.build.yml0000644000000000000000000001574514773244555015606 0ustar ######################################################### # THE FOLLOWING LINES IS USED BY docker-build ########################################################## requires: archlinux: - clang - gcc - git - make - startup-notification - which - cmake - cmake-extras - dbus - intltool - libayatana-common - gobject-introspection # - lomiri-url-dispatcher - vala - glib2 - libnotify - gstreamer - libical - evolution-data-server - gsettings-desktop-schemas - properties-cpp - ayatana-indicator-messages - gtk-doc-tools - libaccountsservice # - lomiri-schemas # - lomiri-sounds debian: # Useful URL: https://salsa.debian.org/debian-ayatana-team/ayatana-ido - clang - clang-tools - g++ - cppcheck - git - cmake - cmake-extras - intltool - libaccounts-glib-dev - libayatana-common-dev - ayatana-indicator-common - gobject-introspection - libgirepository1.0-dev - liblomiri-url-dispatcher-dev - valac - libglib2.0-dev - libnotify-dev - libgstreamer1.0-dev - libecal2.0-dev - libical-dev - libedataserver1.2-dev - libproperties-cpp-dev - libmessaging-menu-dev - gtk-doc-tools - libaccountsservice-dev - liblomiri-url-dispatcher-dev - lomiri-schemas - lomiri-sounds # for the test harness: - libgtest-dev - libdbustest1-dev - dbus-test-runner - python3-dbusmock # for 12h/24h locale unit tests: - locales # for running live EDS tests: - evolution-data-server - gvfs-daemons - systemd - lcov - gcovr ubuntu: - clang - clang-tools - g++ - cppcheck - git - cmake - cmake-extras - intltool - libaccounts-glib-dev - libayatana-common-dev - ayatana-indicator-common - gobject-introspection - libgirepository1.0-dev - liblomiri-url-dispatcher-dev - lomiri-schemas - lomiri-sounds - valac - libglib2.0-dev - libnotify-dev - libgstreamer1.0-dev - libecal2.0-dev - libical-dev - libedataserver1.2-dev - libproperties-cpp-dev - libmessaging-menu-dev - gtk-doc-tools - libaccountsservice-dev # for the test harness: - libgtest-dev - libdbustest1-dev - dbus-test-runner - python3-dbusmock # for 12h/24h locale unit tests: - locales # for running live EDS tests: - evolution-data-server - gvfs-daemons - systemd - lcov - gcovr ubuntu:focal: - clang - clang-tools - g++ - cppcheck - git - cmake - cmake-extras - intltool - libaccounts-glib-dev # - libayatana-common-dev - ayatana-indicator-common - gobject-introspection - libgirepository1.0-dev # - liblomiri-url-dispatcher-dev # - lomiri-schemas # - lomiri-sounds - valac - libglib2.0-dev - libnotify-dev - libgstreamer1.0-dev - libecal2.0-dev - libical-dev - libedataserver1.2-dev - libproperties-cpp-dev # - libmessaging-menu-dev - gtk-doc-tools - libaccountsservice-dev # for the test harness: - libgtest-dev - libdbustest1-dev - dbus-test-runner - python3-dbusmock # for 12h/24h locale unit tests: - locales # for running live EDS tests: - evolution-data-server - gvfs-daemons - systemd - lcov - gcovr variables: - 'CHECKERS=" -enable-checker deadcode.DeadStores -enable-checker alpha.deadcode.UnreachableCode -enable-checker alpha.core.CastSize -enable-checker alpha.core.CastToStruct -enable-checker alpha.core.IdenticalExpr -enable-checker alpha.core.SizeofPtr -enable-checker alpha.security.ArrayBoundV2 -enable-checker alpha.security.MallocOverflow -enable-checker alpha.security.ReturnPtrRange -enable-checker alpha.unix.SimpleStream -enable-checker alpha.unix.cstring.BufferOverlap -enable-checker alpha.unix.cstring.NotNullTerminated -enable-checker alpha.unix.cstring.OutOfBounds -enable-checker alpha.core.FixedAddr -enable-checker security.insecureAPI.strcpy"' before_scripts: - cd ${START_DIR} - if [ ! -d libayatana-common-build ]; then - git clone --depth 1 https://github.com/AyatanaIndicators/libayatana-common.git libayatana-common-build - fi - cd libayatana-common-build - if [ ${DISTRO_NAME} == "debian" ]; then - cmake . -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_LOMIRI_FEATURES=ON - else - cmake . -DCMAKE_INSTALL_PREFIX=/usr - fi - make - make install - cd - - rm -Rf libayatana-common-build/ - - cd ${START_DIR} - if [ ! -d ayatana-indicator-messages-build ]; then - git clone --depth 1 https://github.com/AyatanaIndicators/ayatana-indicator-messages.git ayatana-indicator-messages-build - fi - cd ayatana-indicator-messages-build - cmake . -DCMAKE_INSTALL_PREFIX=/usr - make - make install - cd - - rm -Rf ayatana-indicator-messages-build/ - - cd ${START_DIR} - if [ ! -d lomiri-schemas-build ]; then - git clone --depth 1 https://gitlab.com/ubports/core/lomiri-schemas.git lomiri-schemas-build - fi - cd lomiri-schemas-build - cmake . -DCMAKE_INSTALL_PREFIX=/usr - make - make install - cd - - rm -Rf lomiri-schemas-build/ - - cd ${START_DIR} - if [ ! -d lomiri-sounds-build ]; then - git clone --depth 1 https://gitlab.com/ubports/core/lomiri-sounds.git lomiri-sounds-build - fi - cd lomiri-sounds-build - cmake . -DCMAKE_INSTALL_PREFIX=/usr - make - make install - cd - - rm -Rf lomiri-sounds-build/ build_scripts: - if [ ${DISTRO_NAME} == "debian" ];then - cppcheck --enable=warning,style,performance,portability,information --suppress=missingInclude . - fi - - if [ -e ./CMakeLists.txt ]; then - if [ ${DISTRO_NAME} == "debian" ]; then - scan-build $CHECKERS cmake . -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_WERROR=ON -DENABLE_TESTS=ON -DENABLE_LOMIRI_FEATURES=ON - elif [ ${DISTRO_NAME} == "ubuntu" ]; then - scan-build $CHECKERS cmake . -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_WERROR=ON -DENABLE_TESTS=ON - else - scan-build $CHECKERS cmake . -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_VERBOSE_MAKEFILE=ON -DENABLE_WERROR=ON - fi - else - exit 1 - fi - - if [ $CPU_COUNT -gt 1 ]; then - if [ ${DISTRO_NAME} == "debian" ];then - scan-build $CHECKERS --keep-cc --use-cc=clang --use-c++=clang++ -o html-report make -j $CPU_COUNT - make clean - fi - scan-build $CHECKERS --keep-cc -o html-report make -j $CPU_COUNT - else - if [ ${DISTRO_NAME} == "debian" ];then - scan-build $CHECKERS --keep-cc --use-cc=clang --use-c++=clang++ -o html-report make - make clean - fi - scan-build $CHECKERS --keep-cc -o html-report make - fi - XVFB_RUN="$(which xvfb-run || true)" - if [ ${DISTRO_NAME} == "debian" ] || [ ${DISTRO_NAME} == "ubuntu" ];then - if [ -e ./CMakeLists.txt ]; then - ${XVFB_RUN} make test - fi - fi ayatana-indicator-datetime-25.4.0/ChangeLog0000644000000000000000000107650614773244555015463 0ustar 2025-04-02 Mike Gabriel * release 25.4.0 (HEAD -> main, tag: 25.4.0) 2025-04-01 Robert Tari * Merge branch 'sunweaver-pr/dually-build-datetime-indicator-variants' (6214cc82) 2025-03-20 Bruno Fragoso * Translated using Weblate (Portuguese) (1e8bfab0) 2025-04-01 Mike Gabriel * Bump version to 25.4.0. (8ba92f6c) * debian/: Dually build datetime indicator as ayatana-indicator-datetime and lomiri-indicator-datetime. (54838d78) * d/{control,compat}: Bump to DH compat level version 12. (b21548ca) * d/changelog: set to released (forgotten with 24.5.1 release) (bf9bcc0b) * debian/ayatana-indicator-datetime.links: Drop file. Long not needed anymore. (99b1b574) * CMake: Switch to building datetime indicator in two variants with different service executable names and systemd service files. (e46cd132) * tests/run-mkcal-db-test.sh: Make test script executable. (7f59c03c) 2025-03-20 Bruno Fragoso * Translated using Weblate (Portuguese) (84723ee8) 2025-04-01 Mike Gabriel * Merge branch 'tari01-pr/mkcal-backend' (8493897d) 2025-02-06 Robert Tari * tests/run-eds-ics-test.sh: Quote file paths (be6251cb) * tests/test-timezones.cpp: Avoid potential null pointer (227aa4bc) * Add mkCal backend (e87e6651) 2025-03-12 Mike Gabriel * release 24.5.1 (f1f745da) (tag: 24.5.1) * Merge branch 'tari01-pr/libnotify-0-8-4-icon-fix' (22b65e6b) 2025-03-10 Robert Tari * Fix missing notification icon with libnotify 0.8.4 (3bd6b2f4) 2025-03-05 Droit * Translated using Weblate (Chinese (Simplified) (zh_LATN@pinyin)) (d3dc11e4) 2025-02-17 Temuri Doghonadze * Translated using Weblate (Georgian) (831f5e82) 2025-02-12 Mike Gabriel * Merge branch 'tari01-pr/fix_calendar_not_updated' (439c0f7e) 2024-12-13 Robert Tari * fix calendar not refreshed on month range change (04038391) 2025-02-01 Quentin PAGÈS * Translated using Weblate (Occitan) (cabe8c5e) 2024-11-13 Cleverson Cândido * Translated using Weblate (Portuguese) (65427322) 2024-11-08 தமிழ்நேரம் * Translated using Weblate (Tamil) (e34dbedc) 2024-10-30 hugoalh * Translated using Weblate (Chinese (Traditional Han script)) (4afcdd50) 2024-09-27 Remus-Gabriel Chelu * Translated using Weblate (Romanian) (0f5ffc56) 2024-08-13 umesaburo sagawa * Translated using Weblate (Japanese) (2439918f) 2024-05-22 Mike Gabriel * release 24.5.0 (b6d68d24) (tag: 24.5.0) 2024-05-22 Robert Tari * Merge branch 'sunweaver-pr/lomiri-indicators-target' (eba41f23) 2024-04-10 bittin1ddc447d824349b2 * Translated using Weblate (Swedish) (c373f515) 2024-04-11 Wellington Terumi Uemura * Translated using Weblate (Portuguese (Brazil)) (15f6adcc) 2024-04-01 复予 * Translated using Weblate (Chinese (Simplified)) (eb8980f9) 2024-03-24 Steve * Translated using Weblate (French) (c33453f3) 2024-05-21 Mike Gabriel * data/ayatana-indicator-datetime.service.in: Become part of lomiri-indicators.target. (43c8d366) 2024-04-10 bittin1ddc447d824349b2 * Translated using Weblate (Swedish) (176132e1) 2024-04-11 Wellington Terumi Uemura * Translated using Weblate (Portuguese (Brazil)) (281ded45) 2024-04-01 复予 * Translated using Weblate (Chinese (Simplified)) (84f4b063) 2024-03-24 Steve * Translated using Weblate (French) (dafcf08c) 2024-02-12 Mike Gabriel * release 24.2.0 (029dad79) (tag: 24.2.0) 2024-02-12 Robert Tari * Merge branch 'sunweaver-pr/fix-soundtest' (e06f6b10) * src/CMakeLists.txt: suppress Wenum-constexpr-conversion in engine-eds.cpp (ee1824a0) 2024-02-12 Mike Gabriel * tests/: Fix test-sound. Drop parameterized test run for now. Needs more investigation. (deb2a444) 2024-02-01 Mike Gabriel * Merge branch 'tari01-pr/notification-test-lomiri' (a26eeb15) 2024-02-01 Robert Tari * tests/CMakeLists.txt: Run test-notification only when building with Lomiri features (d304a6d1) 2024-02-01 Mike Gabriel * Merge branch 'tari01-pr/fix-colour-tests' (6d67f7b4) 2024-02-01 Robert Tari * Fix tests relying on the default EDS appointment colour (d77ad890) 2024-01-31 Mike Gabriel * Revert "release 24.1.0" (0692cc58) * release 24.1.0 (070fe966) (tag: 24.1.0) * Merge branch 'luigi311-fix-tests' (ddabb4a6) 2024-01-19 Luigi311 * Tests: Fix show_alarms tests (54802146) 2023-12-31 OPNA2608 * tests/test-menus: Fix build (dcfaedfd) 2024-01-31 Mike Gabriel * Merge branch 'personal/peat-psuwit/bring-back-lomiri-hints' (2a2db70b) 2023-12-21 Ratchanan Srirattanamet * src, tests: enable notification code path without Lomiri deps (30b2de45) 2023-12-26 Mike Gabriel * release 23.10.1 (d8debd70) (tag: 23.10.1) 2023-12-19 Mike Gabriel * Merge branch 'luigi311-toggle_alarm' (d0ebe529) 2021-03-20 kugiigi * Add option to show/hide alarms (63a57fde) 2023-12-19 Mike Gabriel * Merge branch 'luigi311-toggle_events' (ecaaccca) 2021-03-18 kugiigi * Also apply show-events to Phone profile (4d984d26) 2023-12-07 Ratchanan Srirattanamet * Bring back Lomiri-specific notification hints (6f1c3f7f) 2023-10-12 Mike Gabriel * release 23.10.0 (2aace153) (tag: 23.10.0) * po/: Update translation files. (3e66ea9a) 2023-10-10 Mike Gabriel * update-pot.sh: Adjust to rename .gschema.xml file. (f934dbf4) 2023-10-09 Tomáš Marný * Translated using Weblate (Czech) (dfc4f56a) 2023-09-09 Mike Gabriel * Merge branch 'tari01-pr/fix-tests' (246c706c) 2023-07-10 Robert Tari * CMakeLists.txt: Minor CMake warning fix (7113c51b) * Enable all tests (069175a5) * Fix failing tests (bae39a93) 2023-09-09 Mike Gabriel * Merge branch 'tari01-pr/fix-schema-translation' (18e9350d) 2023-09-07 Robert Tari * Fix gschema file translation (1536c23e) 2023-09-09 Mike Gabriel * Merge branch 'tari01-pr/notification-cleanup' (0d2c8f74) 2023-09-09 Robert Tari * Remove osd-notify remnants and use native notification timeout (0a88a8d7) 2023-07-30 Eryk Michalak * Translated using Weblate (Polish) (36d648b2) 2023-07-10 Robert Tari * Merge branch 'ubports-personal/peat-psuwit/for-upstream_eds-ics-test-returncode' (e5be480f) 2023-07-01 spnux * Translated using Weblate (French) (4044d282) 2023-06-27 Sylke Vicious * Translated using Weblate (Italian) (b5d43ad2) 2023-06-22 Joan CiberSheep * Translated using Weblate (Catalan) (765578e9) 2023-06-22 Wellington Terumi Uemura * Translated using Weblate (Portuguese (Brazil)) (6ecb125a) 2023-06-09 Mike Gabriel * release 23.6.0 (c91b376f) 2023-06-06 Ratchanan Srirattanamet * engine-eds: fix retrieving custom alarm sound path (bfc2e365) 2023-07-01 spnux * Translated using Weblate (French) (3cd3991f) 2023-06-27 Sylke Vicious * Translated using Weblate (Italian) (48f44dcb) 2023-06-22 Joan CiberSheep * Translated using Weblate (Catalan) (6c3898cb) 2023-06-22 Wellington Terumi Uemura * Translated using Weblate (Portuguese (Brazil)) (c13bf380) 2023-06-09 Mike Gabriel * release 23.6.0 (5f8a86ad) (tag: 23.6.0) 2023-06-08 Robert Tari * Merge branch 'ubports-personal/peat-psuwit/for-upstream_alarm-sound' (ed6a9a21) 2023-06-07 Ratchanan Srirattanamet * tests/run-eds-ics-test: don't eat away test's result (3e65062b) 2023-06-06 Ratchanan Srirattanamet * engine-eds: fix retrieving custom alarm sound path (e089a84b) 2023-04-06 ssantos * Translated using Weblate (Portuguese) (254bd7f7) 2023-03-16 Heimen Stoffels * Translated using Weblate (Dutch) (607f0185) * Translated using Weblate (Dutch) (bc64f2d0) 2023-03-03 gallegonovato * Translated using Weblate (Spanish) (c18c1c8b) * Translated using Weblate (Spanish) (eddb5c6c) 2023-02-12 Anders Jonsson * Translated using Weblate (Swedish) (6074d9ad) 2023-02-10 Luna Jernberg * Translated using Weblate (Swedish) (b80f23b5) 2022-12-30 Milo Ivir * Translated using Weblate (Croatian) (29608576) 2022-12-09 taoky * Translated using Weblate (Chinese (Simplified)) (73944bb1) 2022-11-23 Mike Gabriel * release 22.9.1 (25143e60) (tag: 22.9.1) * Merge branch 'tari01-pr/fix-lomiri-schemas-name' (d7c2ce7f) 2022-11-14 Robert Tari * debian/control: Correct lomiri-schemas name (985e82a7) 2022-11-23 Mike Gabriel * Merge branch 'tari01-pr/fix-haptic-dbus-data' (a1063ca8) 2022-11-13 Robert Tari * Fix build failure due to missing #include (de62f549) * src/haptic.cpp: Fix data type sent to hfd-service (8452a9e5) 2022-10-19 Kristjan Räts * Translated using Weblate (Estonian) (10505c6b) 2022-10-17 Gediminas Murauskas * Translated using Weblate (Lithuanian) (3ce3c636) 2022-09-29 이정희 * Translated using Weblate (Korean) (3df059ee) 2022-09-25 Oğuz Ersen * Translated using Weblate (Turkish) (af10395a) 2022-09-22 Yaron Shahrabani * Translated using Weblate (Hebrew) (3df9d34e) 2022-09-14 Sergii Horichenko * Translated using Weblate (Ukrainian) (6ab01f49) 2022-09-14 Quentin PAGÈS * Translated using Weblate (Occitan) (2041eedf) 2022-09-14 Sergii Horichenko * Translated using Weblate (Russian) (f5e72781) 2022-09-14 Wellington Terumi Uemura * Translated using Weblate (Portuguese (Brazil)) (e8fe69d3) 2022-09-14 Mike Gabriel * release 22.9.0 (d9d1a471) (tag: 22.9.0) * Translated using Weblate (German) (b2312b61) 2022-09-14 Milan Korecky * Translated using Weblate (Czech) (8d0f3244) 2022-09-14 Mike Gabriel * po/*.po{,t}: Translation strings update (esp. source file references). (df40ea2d) * update-po{,t}.sh: Also catch multi-file source file references. (463e6b96) * po/*.po{,t}: Translation strings update. (f5b71f1f) 2022-09-13 Robert Tari * Merge branch 'sunweaver-pr/beautify-paths-in-pot-file' (0bdd75c9) 2022-09-11 Mike Gabriel * po/ayatana-indicator-datetime.pot: Update file. (1add999d) * update-po{,t}.sh: Omit ../ at beginning of file names in .pot file. (e70cba40) 2022-09-08 Mike Gabriel * po/ayatana-indicator-datetime.pot: Update translation strings. (9f193262) * update-pot.sh: Include org.ayatana.indicator.datetime.gschema.xml strings into .pot file. (0e63c5cb) * update-pot.sh: Implement a hack to successfully catch T_([...]) functions, as well. (2e979b47) * Merge branch 'sunweaver-pr/tooltip-support' (bb0f985d) 2022-07-22 Mike Gabriel * src/menu.cpp: Add tooltip. (cc458235) 2022-05-07 Rondy Andersson * Translated using Weblate (Swedish) (483841ee) 2022-04-23 Sergii Horichenko * Translated using Weblate (Ukrainian) (7f50d736) * Translated using Weblate (Ukrainian) (240dec46) * Translated using Weblate (Ukrainian) (a362212b) 2022-03-21 Yaron Shahrabani * Translated using Weblate (Hebrew) (7130cee1) 2022-03-16 Yaron Shahrabani * Translated using Weblate (Hebrew) (27f905c8) 2022-02-27 이정희 * Translated using Weblate (Korean) (7b354c64) 2022-02-28 Yaron Shahrabani * Translated using Weblate (Hebrew) (ca09e5f6) 2022-02-19 Mike Gabriel * release 22.2.0 (132bfd50) (tag: 22.2.0) * Merge branch 'tari01-pr/fix-list-conversion' (5b8f9a2b) 2022-02-19 Robert Tari * CMakeLists.txt: Fix list conversion typo (6fe762b2) 2022-02-18 Mike Gabriel * Merge branch 'tari01-pr/read-default-sounds-from-lomiri-sounds' (7d478107) 2022-02-18 Robert Tari * CMakeLists.txt: Read default sounds from lomiri-sounds pkg-config file (dbdcf14f) 2022-02-16 Mike Gabriel * Merge branch 'tari01-pr/drop-cmake-install-full-pkglibexecdir' (3589ed80) 2022-02-11 Robert Tari * Drop pkglibexecdir and use native CMake file configuration (aebb056a) 2022-02-16 Mike Gabriel * Merge branch 'tari01-pr/build-with-werror' (ba692f8e) 2022-02-11 Robert Tari * .build.yml: Build with -Werror (20dbe77b) * Fix build warnings (bfc0251b) 2022-02-16 Mike Gabriel * Merge branch 'tari01-pr/cleanup-compile-flags' (adb447d7) 2022-02-11 Robert Tari * .build.yml: Drop extra compilation flags (e4b6f9ac) * Clean up compilation flags (0ae2ec89) 2022-02-08 Mike Gabriel * Merge branch 'tari01-pr/fix-cppcheck-suppressions' (b439ad04) 2021-12-16 Robert Tari * .build.yml: Remove cppcheck suppressions (91af5e28) * Fix cppcheck errors/warnings (7f380782) 2021-12-17 Robert Tari * src/menu.cpp: Remove redundant code block: (b7df5a95) * tests/test-menu-appointments.cpp: Remove unused variables (02cc4073) * Remove unused print-to.h (cd920da7) 2021-12-16 Robert Tari * Whitespace fix (3aec729d) 2022-02-08 Robert Tari * .travis.yml: Run CI builds on Travis CI's Ubuntu focal base system (4e9da1fb) 2022-01-07 wigy * Translated using Weblate (Hungarian) (0f867872) 2022-01-02 ssantos * Translated using Weblate (Portuguese) (41c5ce08) 2021-12-15 Mike Gabriel * Merge branch 'tari01-pr/build-libayatana-common-with-enable-lomiri-features' (1d577a01) 2021-12-06 Robert Tari * .build.yml: Build libayatana-common with ENABLE_LOMIRI_FEATURES (89f313da) 2021-12-03 Mike Gabriel * Merge branch 'tari01-pr/add-lomiri-features-flag' (291efbd3) 2021-11-26 Robert Tari * .build.yml: Add ENABLE_LOMIRI_FEATURES flag and adapt build flow (22268331) * Make Lomiri features configurable at build time (5544dd0e) 2021-11-25 Mike Gabriel * Merge branch 'tari01-pr/detect-lomiri-schemas' (87bbf6da) 2021-11-24 Robert Tari * Check for lomiri-schemas package instead of individual files (8e098813) 2021-11-25 Mike Gabriel * Merge branch 'tari01-pr/drop-std-version' (2c843c5b) 2021-11-23 Robert Tari * Remove C(++) std version constraint (463ab0d2) 2021-11-23 phlostically * Translated using Weblate (Esperanto) (20d3b8ec) 2021-11-21 phlostically * Translated using Weblate (Esperanto) (b725cae4) 2021-11-22 Mike Gabriel * Merge branch 'tari01-pr/check-for-lomiri-sounds' (bc5c2ac7) 2021-11-22 Robert Tari * Check for the lomiri-sounds package (8f2a75a0) 2021-11-20 Mike Gabriel * release 0.9.0 (ffc328ce) (tag: 0.9.0) 2021-11-19 Mike Gabriel * Merge branch 'tari01-pr/rename-ubuntu-touch-sounds' (93dbe8bb) 2021-11-12 Robert Tari * debian/control: Rename ubuntu-touch-sounds to lomiri-sounds. (e23e2ae4) 2021-11-18 phlostically * Translated using Weblate (Esperanto) (95847ac8) 2021-11-18 Mike Gabriel * Merge branch 'tari01-pr/enable-hfd-service-haptic' (b3e4cbdd) 2021-11-17 Robert Tari * Re-enable haptic using hfd-service (ea5f8163) 2021-11-16 Phil Clifford * Translated using Weblate (Gaelic) (dc16358b) 2021-11-10 Mike Gabriel * Merge branch 'tari01-pr/rename-to-x-lomiri' (6da71470) 2021-11-09 Robert Tari * Rename Lomiri-specific properties to x-lomiri (841650f6) * Merge branch 'sunweaver-pr/lomiri-schemas-build-during-CI' (25c5d185) 2021-11-04 Michele * Translated using Weblate (Italian) (636f61be) 2021-11-03 ElectrifiedSpeed * Translated using Weblate (Macedonian) (4c6be99d) 2021-11-08 Mike Gabriel * .build.yml: Build lomiri-schemas from source during CI builds. (192d9e13) 2021-11-04 Michele * Translated using Weblate (Italian) (13e94691) 2021-11-03 ElectrifiedSpeed * Translated using Weblate (Macedonian) (3f64863e) 2021-11-03 Mike Gabriel * Merge branch 'tari01-pr/rename-com-ubuntu-calendar' (52b13d7b) 2021-11-03 Robert Tari * include/datetime/settings-shared.h: Rename com.ubuntu.calendar (371d9a19) 2021-11-03 Mike Gabriel * Merge branch 'tari01-pr/update-tests-manual' (d3bf05ad) 2021-11-02 Robert Tari * tests/manual: Update and fix text (14d652e9) * Whitespace fix (ea6d42c5) 2021-11-02 Mike Gabriel * Merge branch 'tari01-pr/drop-merge-review' (c699e415) 2021-11-02 Robert Tari * Drop all references to MERGE-REVIEW (5ce57919) 2021-11-01 Mike Gabriel * Merge branch 'tari01-pr/fix-sound-files-path' (b83bfcf0) 2021-10-29 Robert Tari * Fix ringtones path + drop unused definition (7e4a45db) 2021-11-01 Mike Gabriel * Merge branch 'tari01-pr/accountsservice-sound' (789be70a) 2021-10-31 Robert Tari * Rename HAVE_UT_ACCTSERVICE_SYSTEMSOUND_SETTINGS to HAS_LOMIRI_ACCTSERVICE_SOUND (ede94514) * Drop local file and generate code from /usr/share/accountsservice/interfaces/com.lomiri.touch.AccountsService.Sound.xml (b942e307) * Rename com.ubuntu.touch.AccountsService.Sound to com.lomiri.touch.AccountsService.Sound (d8f10b3c) * debian/control: Depend on lomiri-common-schemas instead of accountsservice-ubuntu-schemas + update description (a007ddef) 2021-11-01 Mike Gabriel * Merge branch 'tari01-pr/rename-ubuntu-phablet' (355cc4ad) 2021-10-29 Robert Tari * Use lomiri-phablet instead of ubuntu (eedbb87f) 2021-10-28 Mike Gabriel * Merge branch 'tari01-pr/remove-usensord' (58f80cae) 2021-10-28 Robert Tari * Remove com.canonical.usensord and disable haptic (d4210a27) 2021-10-28 Mike Gabriel * Merge branch 'tari01-pr/drop-activation-url' (59c33e40) 2021-10-28 Robert Tari * Remove the activation_url from the Appointment class (99bd6787) 2021-10-28 Mike Gabriel * Merge branch 'tari01-pr/ubuntu-alarm' (97cc3bfb) 2021-10-28 Robert Tari * Drop the 'ubuntu' prefix from the alarm types and functions (0492e95d) 2021-10-28 Mike Gabriel * Merge branch 'tari01-pr/com-ubuntu-notifications-to-com-lomiri-notifications' (2a52d61b) 2021-10-26 Robert Tari * Rename com.ubuntu.notifications to com.lomiri.notifications (97e0c383) 2021-10-26 Mike Gabriel * Merge branch 'tari01-pr/x-canonical-to-x-ayatana' (9dd99d3a) 2021-10-25 Robert Tari * Renaname x-canonical properties to x-ayatana (0b17f2a5) 2021-10-26 Mike Gabriel * Merge branch 'tari01-pr/disable-hanging-tests' (a00f7b54) 2021-10-22 Robert Tari * tests/CMakeLists.txt: Disable tests that don't work on Travis (60580050) 2021-10-25 Robert Tari * Merge branch 'sunweaver-pr/travis-cleanup' (d8197520) 2021-10-25 Mike Gabriel * .build.yml: Remove source code of locally built dependencies after they have been installed. (7929019e) * .build.yml: Run unit tests in build_scripts: target. (485360d0) * .build.yml: Drop autogen.sh support. (fd1d99c0) 2021-10-22 Robert Tari * .build.yml: Fix the ayatana-indicator-messages build (2048cd98) * data/CMakeLists.txt: Do not use automatic GSchema compilation (7150e329) 2021-10-21 Mike Gabriel * Merge branch 'tari01-pr/use-intltool-merge-translations' (ac3fe3a6) 2021-10-21 Robert Tari * data/CMakeLists.txt: Use intltool_merge_translations instead of execute_process (d340c4cf) 2021-10-21 Mike Gabriel * Merge branch 'tari01-pr/use-native-cmake-gsettings-module' (29440cf9) 2021-10-20 Robert Tari * Use native CMake GSettings module (4f92dd8d) * .travis.yml: Temporarily disable ppc64le builds (0a26104d) 2021-10-18 Mike Gabriel * Merge branch 'UbuntuBudgie-main' (0d610416) 2021-10-03 David Mohammed * Allow autostart for Budgie Desktop (a7711d40) 2021-09-16 Robert Tari * Exclude test-sound from CI builds (360da0e4) * Revert "debian/control: Add ubuntu-touch-sounds build dependency" (049da2cb) 2021-09-14 Robert Tari * debian/control: Add ubuntu-touch-sounds build dependency (27253a1c) 2021-09-14 Mike Gabriel * Merge branch 'tari01-pr/fix-focal-unit-tests' (5df17df2) 2021-09-10 Robert Tari * tests/test-live-actions: Handle case when the test is run on Lomiri (ca9dbe4b) 2021-09-09 Robert Tari * Link to lomiri-url-dispatcher where needed (3b90788d) 2021-09-08 Mike Gabriel * debian/control: Add B-D ayatana-indicator-common (for unit tests). (68880bce) 2021-09-03 Robert Tari * tests/run-eds-ics-test.sh: Sleep a little before cleanup to make sure gvfs is released + drop the rm -d flag (fbda66ba) * tests/CMakeLists.txt: Use 'CI' instead of 'TRAVIS' for test exclusion - this should also cover Jenkins (39e7cdc1) 2021-09-02 Robert Tari * .build.yml: Add missing dependencies for Ubuntu builds (388de2ee) * Merge branch 'pr/fix-unit-tests' (941de24c) * .build.yml: Also run unit tests during CI builds against Ubuntu. (2748fa58) 2021-09-01 Robert Tari * src/snap.cpp: Create Sound object via SoundBuilder (458218b1) * src/settings-live.cpp: Check for schema instead of Lomiri (b24b8edb) * Use legacy canonical names for now (26264729) * tests/run-eds-ics-test.sh: Also remove empty directories (c093535f) 2021-09-01 Mike Gabriel * Merge branch 'tari01-pr/fix-build-error' (f7c5127a) 2021-08-31 Robert Tari * debian/control: Add uuid-dev build dependency (87e47ca0) * Fix build failure on Ubuntu 20.04 (8ca77cf4) 2021-08-30 Mike Gabriel * debian/control: Add B-D: libmessaging-menu-dev. (9d95a062) 2021-08-30 Robert Tari * tests/CMakeLists.txt: Build DBusMock tests with -no-pie (c427d71e) * README.md: Fix typo (a28e2ea4) * Merge branch 'tari01-pr/fix-failing-tests' (0e8d75b5) 2021-08-30 Mike Gabriel * .travis.yml: ayatana-dev-scripts has switch its default branch from 'master' to 'main'. (2d853c12) * README.md: Adjust URLs in Travis-CI status icon. (1018b7c1) 2021-08-29 Mike Gabriel * tests/CMakeLists.txt: Move -no-pie flag from CXX flags to target linker options. (b5eb9d53) * src/settings-live.cpp: White-space change, drop blanks in between parameters in function call. (71b4866d) * src/notifications.cpp: No indentation of #ifdef-#else-#endif compiler macro. (4e5e49fd) * po/CMakeLists.txt: No fiddling anymore with the .pot file during builds. (8e534667) * include/notifications/notifications.h: Typo fix in comment. (e50e9517) * .build.yml: Build libmessaging-menu from source instead of using the distro version. (ed0e4ccf) 2021-07-28 Robert Tari * Some fixes in UBports patches after a review (1297caa8) 2021-07-19 Robert Tari * Rename com.canonical.powerd -> com.lomiri.Repowerd (86ff05f7) 2016-02-10 Charles Kerr * add a DBusMock test Fixture with helper functions to wait for arbitrary bus method calls (c1ab79e6) 2016-02-02 Charles Kerr * Move notifications tests into a new unit test. Extract notifications test fixture into a reusable header. (7155cdb1) 2021-08-29 Hosted Weblate * Update translation files (9f59b4b4) 2021-08-24 Robert Tari * Replace deprecated pre-processor symbols (6f2c0c89) 2021-08-28 Mike Gabriel * .travis.yml: Re-enable debian:stable as CI target again. Debian 11 has been released. (544cee5c) * .build.yml: Assure that all build requirements for libayatana-common are available in CI build chroots. (1a1d7d80) 2021-08-28 Weblate * Added translation using Weblate (Kurdish (Southern)) (84c67542) * Added translation using Weblate (Kurdish (Northern)) (717e1d22) 2021-08-27 Adolfo Jayme Barrientos * Translated using Weblate (Spanish) (b485f2d2) 2021-08-09 Robert Tari * Add ENABLE_WERROR option (bb20e9cd) 2021-08-09 Mike Gabriel * debian/control: Add B-D: libayatana-common-dev (>= 0.9.3). (41779f67) * Revert "Testing Travis with DUMMY file" (773f86d0) 2021-06-28 Robert Tari * Testing Travis with DUMMY file (05aa0e02) 2021-08-30 Robert Tari * Merge branch 'tari01-pr/ubports-patches' (22e66866) 2021-08-29 Hosted Weblate * Update translation files (38e5efec) 2021-08-30 Mike Gabriel * .travis.yml: ayatana-dev-scripts has switch its default branch from 'master' to 'main'. (41e3aec0) * README.md: Adjust URLs in Travis-CI status icon. (fa9ea20b) 2021-08-29 Mike Gabriel * tests/CMakeLists.txt: Move -no-pie flag from CXX flags to target linker options. (5650c6f9) * src/settings-live.cpp: White-space change, drop blanks in between parameters in function call. (11f11fcf) * src/notifications.cpp: No indentation of #ifdef-#else-#endif compiler macro. (e5f9e40b) * po/CMakeLists.txt: No fiddling anymore with the .pot file during builds. (5f6bc6bc) * include/notifications/notifications.h: Typo fix in comment. (acd91856) * .build.yml: Build libmessaging-menu from source instead of using the distro version. (333149c6) 2021-08-29 Hosted Weblate * Update translation files (1f8263de) 2021-07-28 Robert Tari * Some fixes in UBports patches after a review (28d347f4) 2021-07-19 Robert Tari * Rename com.canonical.powerd -> com.lomiri.Repowerd (6055485c) 2021-07-15 Robert Tari * src/myself.cpp: Fix libaccounts-glib.h inclusion in Focal (5a0a3aa5) * tests/CMakeLists.txt: add -no-pie compile flag (6a2853e2) * .build.yml: add ayatana-indicator-messages build dependency (03703574) * src/settings-live.cpp: initialise m_settings_cal_notification and m_settings_general_notification to NULL if we are not on Lomiri (89201d7b) 2021-05-26 farkasdvd * Alarm snoozes after timeout (#29) (0898d704) 2021-05-25 farkasdvd * Snooze starts from the current minute (#30) (40eb68ee) 2018-11-04 Rodney Dawes * Fix the EDS tests that were failing. (7f696375) 2018-10-31 Rodney Dawes * Replace ual with url-dispatcher. (f557230c) * Fix clock app URL. (376c1bb1) 2017-02-10 Rodney Dawes * Remove the hard-coding of -g compiler flag. (70a66aae) 2017-02-09 Rodney Dawes * Depend on newer cmake-extras for FILTER in intltool command. (acb754b6) 2017-02-03 Rodney Dawes * Use cmake-extras intltool module, and keep pot file in vcs. (373ffe1d) 2017-02-02 Rodney Dawes * Also need PARENT_SCOPE here. (d4f59920) * Set the coverage test targeets from where the tests are added. (6122733b) * Use cmake-extras for coverage support and always enable testing. (e4fe97eb) * Switch to using gmock module from cmake-extras. (5b555e5b) 2017-02-01 Rodney Dawes * Update app name usage to match snaps. (5b5755d1) 2016-11-16 Marco Trevisan (Treviño) * UpcomingPlanner: don't get events from the day before of the selected one (bc4e8994) 2016-11-04 Charles Kerr * remove unnecessary test in Awake::Impl::~Impl() (192f5450) * break test-notification into two separate test units (18ca4edc) 2016-10-06 Charles Kerr * In main.cpp and tests where Snap is instantiated, provide the system_bus to Snap's constructor (5ab8ee23) * in Snap, add a constructor arg for the system bus because we need it when instantiating Awake objects (6863282c) * in Awake, remove an unnecessary async call by passing the system bus into the constructor instead of fetching it asynchronously (fd6d89d2) 2016-09-21 Ted Gould * Use an explicit registry object so that it gets free'd when the function exits (23116801) 2016-07-05 Arthur Mello * Remove call to keepDisplayOn since that now is handled by Unity during Notifications (8502c81e) 2016-07-04 Arthur Mello * Should not use sounds notifications for calendar in silent mode (2467a3c6) * If in silent mode should only vibrate if the settings say so (cd033211) 2016-07-01 Arthur Mello * Only wake device if bubbles notifications are enabled (94af77ab) * Remove gsettings source call during unit tests Set minimal version for gsettings-ubuntu-touch-schemas package (643fe6c9) * Do not fail gracefully if gsettings schema is not installed (8b5aee0a) 2016-06-29 Arthur Mello * Fix notifications so it respects if it should or not show bubbles or add to notification list (f42d0a01) * Undo revisions 456/457 (c12e9b28) 2016-06-28 Renato Araujo Oliveira Filho * Fixed typos; Updated code based on review requests. (e4ab2528) 2016-06-24 Arthur Mello * Fix settings test check so we do not fail if GSettings schema is missing (ff4a63eb) * Do not fail test if GSettings schema is not installed (3adc4da8) * Fix typo (8ad06a88) * Do not fail tests if schema is not installed (c5c092a2) * Make sure that calendar settings do not affect alarm notifications (686579f6) 2016-06-23 Arthur Mello * Set calendar notification settings to true in case GSettings schema is not available Make sure calendar notification settings are correct during tests (f3f17677) 2016-06-22 Arthur Mello * Update indicator-datetime to work with the new notification settings (525a38eb) 2016-06-21 Renato Araujo Oliveira Filho * Create unit test (413b0e90) * Implemented unit test. (35a06ce6) 2016-06-16 Lukáš Tinkl * re-enable the calendar component in phone mode too (63e38ce5) 2016-05-16 Charles Kerr * fix glib-fixture.h copyright year in header comment (7946051c) * work around g++ 4.9.2 initializer list issue for vivid (8d384b89) 2016-05-14 Charles Kerr * in tests/glib-fixture.h, tweaks to the new idle_add() and timeout_add() helpers (7eee00bc) * add new tests to exercise the Snap::Response code (b8df067a) * sync tests with previous commit's Snap::Response change (8e58bff9) * add a new Snap::Response enum for more flexible handling of snap decisions (b639e39d) 2016-04-28 Renato Araujo Oliveira Filho * Detect desktop to launch applications. (a6422822) * Small fixes requeted by charles during the review. (0fb4679e) 2016-04-27 Renato Araujo Oliveira Filho * Only creates messaging menu if calendar app is instaled. Update tests. (7ecfadf5) * Use calendar app icon. (02ea97a6) 2016-04-26 Renato Araujo Oliveira Filho * Update notifications to use the new calendar icon. (04588f8b) * Make use of G_USEC_PER_SEC. (47668a01) * Fixed as reviewer requested. (0c654b46) 2016-04-20 Renato Araujo Oliveira Filho * Vibrate only once when notification about calendar events. (6a6cca28) * Fix memory leak on messaging_menu. (605ece31) 2016-04-19 Renato Araujo Oliveira Filho * Update sound test. (216f990d) * Only play sounds for alarms. (1ace19e7) * Fixed crash when clicking on messaging menu. (8d5fb6cb) 2016-04-18 Renato Araujo Oliveira Filho * Post message on messaging menu if the notification get timeout. (bb7b522e) 2016-04-15 Renato Araujo Oliveira Filho * revert last change. (d80df1bb) 2016-04-14 Renato Araujo Oliveira Filho * Play event sound even if the event has only text reminders. (6d9cae0d) 2016-04-12 Charles Kerr * sync tests to new ctor arguments for TimedatedTimezone and LiveTimezones (7967430f) * in LiveTimezones, pass the primary timezone to it on construction. We used to create it implicitly but can't do that anymore now that TimedatedTimezone takes its own ctor argument. (d50e6b5c) * in TimedatedTimezone, take a GDBusConnection argument in the ctor to simplify state management (3cd2c8e2) 2016-04-09 Charles Kerr * update test-live-actions to last commit's TimedatedFixture changes (32a1c8a2) * in tests/, remove the handrolled timedate1 bus mock. It doesn't add anything over the dbusmock template (907a22aa) * in actions-live, don't hardcode the bus strings (8b3ba566) 2016-04-08 Charles Kerr * in timezone-timedated, check for error!=nullptr before passing it to g_error_matches() (8b30701b) * in tests/test-timezone-timedated, fix copy-paste error in comments (fc5d3e97) * in test-timezone-timedated, slightly cleaner mechanism for tzid waiting (33ea7397) * pull the timezone from timedate1 regardless of whether it appears on the bus before or after we startup (53721ecc) 2016-04-06 Renato Araujo Oliveira Filho * Fixed sound file used by event alarms. (eae34dd1) * Does not add extra ref to timezone object. (74fafe94) * Generate instance of object to get individual alarm information. (09d434e5) 2016-04-05 Renato Araujo Oliveira Filho * Update non attending test with a recurrence example. (1f73b610) 2016-04-01 Renato Araujo Oliveira Filho * Include the correct header for set. (bce738fc) * Update tests. (dd610c58) * better code. (274ac6aa) * Does not play sound for events without a sound set. (b7e96734) 2016-03-31 Renato Araujo Oliveira Filho * Update code as requested by reviewer. (676b6c35) * Update tests. (b13d5719) * Remove type property from Alarm. (87d2694c) * Rebuild events list in case of accounts changed. (8edf035e) * Removed unecessary code. (56e4d6f1) * Remove empty line. (0193ddde) * Update tests. (ed2c8341) * Remove constructors from Alarm. (406aa751) 2016-03-30 Renato Araujo Oliveira Filho * Revert change. (c6ce70d2) * Create a constructor for Alarm class. (b2908655) * Update unit test. (f0711d98) * Only play a sound alert if the event contains a SOUND reminder. (dd4265f2) * Created unit test. (46f3fa5a) * Ignore alarms for events marked as not attending. (a3fa5c81) 2021-07-02 Robert Tari * Drop myself.[h|cpp] (e69137d9) 2016-03-23 Renato Araujo Oliveira Filho * Attempt to fix test on xenial. (11d4b57f) 2016-03-22 Charles Kerr * temporarily disable the formatter tests. This is a test harness error that doesn't need to block work on 1560188 (99de274e) * revert r426 & r427 to remove the calendar from the phone profile (b704508b) 2016-03-22 Renato Araujo Oliveira Filho * Fixed test. (a37bed46) * Create unit test. (b0bb093a) 2016-03-21 Renato Araujo Oliveira Filho * Make sure that the ocurrence time is used to build the url to launch external application. (7fde2181) 2016-03-18 Renato Araujo Oliveira Filho * Lauch calendar app using the event start time. (bbf8fdba) 2016-03-18 Charles Kerr * add the new unit tests (b415ca00) * get event selection up-to-date with the spec, including showing in-progress events. add unit tests to cover event priority and display order. (a8ea3ba0) 2016-03-16 Renato Araujo Oliveira Filho * update unit test. (bb2ea938) * calls 'calendar://eventId=' when clicking on an event in the indicator. (c62f5c25) 2016-02-10 Charles Kerr * resolve some test timing issues by deferring Snap object creation until it's needed (0fee0c15) * in test-notifications we do need one wait() wart after all, because the Snap is building its impl proxies asynchronously and hasn't any public way of notifying when they're built (8a5815d9) * update notification tests to wait for the needed bus events instead of waiting for arbitrary time intervals (62f4861b) * add a DBusMock test Fixture with helper functions to wait for arbitrary bus method calls (d1bbce7d) * in the GLib test Fixture, add helper functions to wait for arbitrary events and bus events (f81f91ea) 2016-02-03 Charles Kerr * in settings-live.cpp, use std::string instead of auto to make g++ 4.9.2 happy on vivid (295b91b7) * add notification title, icon checks to test-notification's battery of test combinations (6b85df64) 2016-02-03 David Barth * adjust title and notification icon according to the event type (7357c8fb) 2016-02-02 Charles Kerr * Move notifications tests into a new unit test. Extract notifications test fixture into a reusable header. (1eace0ae) 2016-02-01 Charles Kerr * add explanation comments to test-snap (a2593815) * in test-snap, move new tests to bottom to avoid confusing diff (93a32f0c) * add combinatorial tests to check how snap behaves under system settings, event types, etc (62311087) * add Settings tests for blacklisting apps' notifications (56a68ff8) * in LiveSettings, add gschema support for notification app blacklisting (fee2f8fd) * don't show calendar event notifications if com.ubuntu.calendar's notifications are blacklisted (dfa174a8) 2015-10-13 Charles Kerr * re-enable sound tests in test-snap (9aeb0b4e) * in test-snap, wait a moment after creating the Snap to allow its async dbus internals to finish bootstrapping (cdb2480b) * rather than commenting out a test, use Google Test's DISABLED_ feature to disable it (cbb76bdf) * disable broken test (874a4c05) 2021-08-29 Mike Gabriel * Merge branch 'tari01-pr/fix-deprecations' (dd625d44) 2021-08-28 Mike Gabriel * .travis.yml: Re-enable debian:stable as CI target again. Debian 11 has been released. (61b10193) * .build.yml: Assure that all build requirements for libayatana-common are available in CI build chroots. (8c682acb) 2021-08-28 Weblate * Added translation using Weblate (Kurdish (Southern)) (f0c1e91a) * Added translation using Weblate (Kurdish (Northern)) (b1d76d0c) 2021-08-27 Adolfo Jayme Barrientos * Translated using Weblate (Spanish) (d61fac2f) 2021-08-28 Mike Gabriel * .travis.yml: Re-enable debian:stable as CI target again. Debian 11 has been released. (4e0cb010) * .build.yml: Assure that all build requirements for libayatana-common are available in CI build chroots. (536c061b) 2021-08-28 Weblate * Added translation using Weblate (Kurdish (Southern)) (f17f8adf) * Added translation using Weblate (Kurdish (Northern)) (047635b8) 2021-08-27 Adolfo Jayme Barrientos * Translated using Weblate (Spanish) (0f2fafb0) 2021-08-24 Robert Tari * Replace deprecated pre-processor symbols (64b2dc5b) 2021-08-10 Mike Gabriel * Merge branch 'tari01-pr/add-enable-werror-option' (b7df3c0d) 2021-08-09 Robert Tari * Add ENABLE_WERROR option (9cea5495) 2021-08-09 Mike Gabriel * debian/control: Add B-D: libayatana-common-dev (>= 0.9.3). (bec38167) * Revert "Testing Travis with DUMMY file" (eedae05b) 2021-07-16 Robert Tari * Fix failing tests (217b4835) 2021-07-15 Robert Tari * src/myself.cpp: Fix libaccounts-glib.h inclusion in Focal (7b495005) * tests/CMakeLists.txt: add -no-pie compile flag (2f386057) * .build.yml: add ayatana-indicator-messages build dependency (1a7789f8) * src/settings-live.cpp: initialise m_settings_cal_notification and m_settings_general_notification to NULL if we are not on Lomiri (b8d44d2f) 2021-05-26 farkasdvd * Alarm snoozes after timeout (#29) (7c5e7e73) 2021-05-25 farkasdvd * Snooze starts from the current minute (#30) (e4b4a10a) 2018-11-04 Rodney Dawes * Fix the EDS tests that were failing. (b584e8ff) 2018-10-31 Rodney Dawes * Replace ual with url-dispatcher. (bdf012f7) * Fix clock app URL. (d2fc9c2d) 2017-02-10 Rodney Dawes * Remove the hard-coding of -g compiler flag. (eff92a3b) 2017-02-09 Rodney Dawes * Depend on newer cmake-extras for FILTER in intltool command. (6189a689) 2017-02-03 Rodney Dawes * Use cmake-extras intltool module, and keep pot file in vcs. (4baa615e) 2017-02-02 Rodney Dawes * Also need PARENT_SCOPE here. (579c0741) * Set the coverage test targeets from where the tests are added. (bee22d6b) * Use cmake-extras for coverage support and always enable testing. (76789a3a) * Switch to using gmock module from cmake-extras. (612ded78) 2017-02-01 Rodney Dawes * Update app name usage to match snaps. (75343ecc) 2016-11-16 Marco Trevisan (Treviño) * UpcomingPlanner: don't get events from the day before of the selected one (c1666c0a) 2016-11-04 Charles Kerr * remove unnecessary test in Awake::Impl::~Impl() (46d007f0) * break test-notification into two separate test units (c7e9bdbf) 2016-10-06 Charles Kerr * In main.cpp and tests where Snap is instantiated, provide the system_bus to Snap's constructor (0e7d1716) * in Snap, add a constructor arg for the system bus because we need it when instantiating Awake objects (34f44f95) * in Awake, remove an unnecessary async call by passing the system bus into the constructor instead of fetching it asynchronously (14870108) 2016-09-21 Ted Gould * Use an explicit registry object so that it gets free'd when the function exits (7244cca7) 2016-07-05 Arthur Mello * Remove call to keepDisplayOn since that now is handled by Unity during Notifications (2425f66e) 2016-07-04 Arthur Mello * Should not use sounds notifications for calendar in silent mode (b4654663) * If in silent mode should only vibrate if the settings say so (d61975b6) 2016-07-01 Arthur Mello * Only wake device if bubbles notifications are enabled (46b0ac44) * Remove gsettings source call during unit tests Set minimal version for gsettings-ubuntu-touch-schemas package (d425e3fa) * Do not fail gracefully if gsettings schema is not installed (55973010) 2016-06-29 Arthur Mello * Fix notifications so it respects if it should or not show bubbles or add to notification list (fb29c9e7) * Undo revisions 456/457 (1893e15b) 2016-06-28 Renato Araujo Oliveira Filho * Fixed typos; Updated code based on review requests. (4024e2c5) 2016-06-24 Arthur Mello * Fix settings test check so we do not fail if GSettings schema is missing (e23f7c25) * Do not fail test if GSettings schema is not installed (fbef2857) * Fix typo (6a78e384) * Do not fail tests if schema is not installed (2203d0b2) * Make sure that calendar settings do not affect alarm notifications (c0f53270) 2016-06-23 Arthur Mello * Set calendar notification settings to true in case GSettings schema is not available Make sure calendar notification settings are correct during tests (033735a6) 2016-06-22 Arthur Mello * Update indicator-datetime to work with the new notification settings (9c7c869a) 2016-06-21 Renato Araujo Oliveira Filho * Create unit test (c1921a48) * Implemented unit test. (c87aa3a6) 2016-06-16 Lukáš Tinkl * re-enable the calendar component in phone mode too (2098623e) 2016-05-16 Charles Kerr * fix glib-fixture.h copyright year in header comment (75619726) * work around g++ 4.9.2 initializer list issue for vivid (11509299) 2016-05-14 Charles Kerr * in tests/glib-fixture.h, tweaks to the new idle_add() and timeout_add() helpers (36bcdc4a) * add new tests to exercise the Snap::Response code (c0776b7b) * sync tests with previous commit's Snap::Response change (5556233b) * add a new Snap::Response enum for more flexible handling of snap decisions (8c7997ad) 2016-04-28 Renato Araujo Oliveira Filho * Detect desktop to launch applications. (85cb430b) * Small fixes requeted by charles during the review. (846dfb9d) 2016-04-27 Renato Araujo Oliveira Filho * Only creates messaging menu if calendar app is instaled. Update tests. (76e3bd94) * Use calendar app icon. (ec226fce) 2016-04-26 Renato Araujo Oliveira Filho * Update notifications to use the new calendar icon. (0cfd764a) * Make use of G_USEC_PER_SEC. (ba5a55ca) * Fixed as reviewer requested. (32db30a1) 2016-04-20 Renato Araujo Oliveira Filho * Vibrate only once when notification about calendar events. (d39dd625) * Fix memory leak on messaging_menu. (aeba43c7) 2016-04-19 Renato Araujo Oliveira Filho * Update sound test. (6450ac7f) * Only play sounds for alarms. (6e9b1ac9) * Fixed crash when clicking on messaging menu. (14fbc83d) 2016-04-18 Renato Araujo Oliveira Filho * Post message on messaging menu if the notification get timeout. (13978702) 2016-04-15 Renato Araujo Oliveira Filho * revert last change. (442818a8) 2016-04-14 Renato Araujo Oliveira Filho * Play event sound even if the event has only text reminders. (629e7404) 2016-04-12 Charles Kerr * sync tests to new ctor arguments for TimedatedTimezone and LiveTimezones (88bef033) * in LiveTimezones, pass the primary timezone to it on construction. We used to create it implicitly but can't do that anymore now that TimedatedTimezone takes its own ctor argument. (6c96dc57) * in TimedatedTimezone, take a GDBusConnection argument in the ctor to simplify state management (ad95b394) 2016-04-09 Charles Kerr * update test-live-actions to last commit's TimedatedFixture changes (5c53bbf1) * in tests/, remove the handrolled timedate1 bus mock. It doesn't add anything over the dbusmock template (f6b9c230) * in actions-live, don't hardcode the bus strings (7ac0160b) 2016-04-08 Charles Kerr * in timezone-timedated, check for error!=nullptr before passing it to g_error_matches() (85f702d5) * in tests/test-timezone-timedated, fix copy-paste error in comments (eb62aed7) * in test-timezone-timedated, slightly cleaner mechanism for tzid waiting (a4ddba2a) * pull the timezone from timedate1 regardless of whether it appears on the bus before or after we startup (328cdb70) 2016-04-06 Renato Araujo Oliveira Filho * Fixed sound file used by event alarms. (bbac8b00) * Does not add extra ref to timezone object. (5532e39c) * Generate instance of object to get individual alarm information. (272067d4) 2016-04-05 Renato Araujo Oliveira Filho * Update non attending test with a recurrence example. (dc904d41) 2016-04-01 Renato Araujo Oliveira Filho * Include the correct header for set. (ba6591e1) * Update tests. (2f7e3441) * better code. (c1fb6eec) * Does not play sound for events without a sound set. (e4e139f5) 2016-03-31 Renato Araujo Oliveira Filho * Update code as requested by reviewer. (30b0ba7f) * Update tests. (6df38ca1) * Remove type property from Alarm. (b1031b1d) * Rebuild events list in case of accounts changed. (7965d5b4) * Removed unecessary code. (66e8c8ea) * Remove empty line. (ca16c5e6) * Update tests. (6874753b) * Remove constructors from Alarm. (0b5b8b3d) 2016-03-30 Renato Araujo Oliveira Filho * Revert change. (d51a6d28) * Create a constructor for Alarm class. (05564ab7) * Update unit test. (031e8a96) * Only play a sound alert if the event contains a SOUND reminder. (8c57742f) * Created unit test. (6105ec78) * Ignore alarms for events marked as not attending. (ba0581ac) 2021-07-02 Robert Tari * Drop myself.[h|cpp] (b5996d64) 2016-03-23 Renato Araujo Oliveira Filho * Attempt to fix test on xenial. (b2d8ad98) 2016-03-22 Charles Kerr * temporarily disable the formatter tests. This is a test harness error that doesn't need to block work on 1560188 (e9a8c238) * revert r426 & r427 to remove the calendar from the phone profile (af623be7) 2016-03-22 Renato Araujo Oliveira Filho * Fixed test. (512726f1) * Create unit test. (15319968) 2016-03-21 Renato Araujo Oliveira Filho * Make sure that the ocurrence time is used to build the url to launch external application. (d1935f87) 2016-03-18 Renato Araujo Oliveira Filho * Lauch calendar app using the event start time. (bf774627) 2016-03-18 Charles Kerr * add the new unit tests (976cb518) * get event selection up-to-date with the spec, including showing in-progress events. add unit tests to cover event priority and display order. (e47d49ac) 2016-03-16 Renato Araujo Oliveira Filho * update unit test. (179bbad3) * calls 'calendar://eventId=' when clicking on an event in the indicator. (8b3ff842) 2016-02-10 Charles Kerr * resolve some test timing issues by deferring Snap object creation until it's needed (5b050c7f) * in test-notifications we do need one wait() wart after all, because the Snap is building its impl proxies asynchronously and hasn't any public way of notifying when they're built (7bf685ed) * update notification tests to wait for the needed bus events instead of waiting for arbitrary time intervals (4d149067) * add a DBusMock test Fixture with helper functions to wait for arbitrary bus method calls (ec6f4883) * in the GLib test Fixture, add helper functions to wait for arbitrary events and bus events (d80dca77) 2016-02-03 Charles Kerr * in settings-live.cpp, use std::string instead of auto to make g++ 4.9.2 happy on vivid (b6f3a8d8) * add notification title, icon checks to test-notification's battery of test combinations (277352c1) 2016-02-03 David Barth * adjust title and notification icon according to the event type (990df233) 2016-02-02 Charles Kerr * Move notifications tests into a new unit test. Extract notifications test fixture into a reusable header. (1e41f6a1) 2016-02-01 Charles Kerr * add explanation comments to test-snap (2769c593) * in test-snap, move new tests to bottom to avoid confusing diff (10e29f47) * add combinatorial tests to check how snap behaves under system settings, event types, etc (336dffcf) * add Settings tests for blacklisting apps' notifications (12c6fdc0) * in LiveSettings, add gschema support for notification app blacklisting (0b4ad877) * don't show calendar event notifications if com.ubuntu.calendar's notifications are blacklisted (b4ff1a24) 2015-10-13 Charles Kerr * re-enable sound tests in test-snap (1d0fd890) * in test-snap, wait a moment after creating the Snap to allow its async dbus internals to finish bootstrapping (01a3509e) * rather than commenting out a test, use Google Test's DISABLED_ feature to disable it (fe936b31) * disable broken test (ee2b0be9) 2021-06-28 Robert Tari * Testing Travis with DUMMY file (1c8f3399) 2021-06-27 Mike Gabriel * Merge branch 'tari01-pr/fix-copy-failure' (056b517b) 2021-06-25 Robert Tari * tests/CMakeLists.txt: Try to fix build failure on Debian Testing where cp -f is performed. (b31cebcb) 2021-06-27 Mike Gabriel * Merge branch 'tari01-pr/documentation' (23d6e3a8) 2021-06-23 Robert Tari * Add install instructions + update documentation (0bce1fdc) 2021-06-27 Mike Gabriel * Merge branch 'tari01-pr/fix-g-time-zone-new' (66fdcd86) 2021-06-18 Robert Tari * If possible, avoid deprecated g_time_zone_new (17aa86ab) 2021-06-27 Mike Gabriel * Merge branch 'tari01-pr/ayatana-standard-cmake' (b0d110ba) 2021-06-18 Robert Tari * Add all Ayatana standard CMakeLists.txt bits (ab1fb44f) 2021-06-27 Mike Gabriel * Merge branch 'tari01-pr/fix-libaccounts-glib-include-warning' (00cb60a1) 2021-06-18 Robert Tari * src/myself.cpp: Fix libaccounts-glib.h include warning (fa31e7f6) 2021-06-26 Mike Gabriel * .build.yml: Disable unit tests for now, until test timeouts on Debian 11 have been resolved. (ebeb2901) 2021-06-24 Mike Gabriel * Merge branch 'tari01-pr/use-appointment-text-width-from-gsettings' (d043074a) * src/menu.cpp: Pipe appointment strings through ayatana_common_utils_ellipsize + add GSettings watcher for max-menu-text-length. (a2a23612) * CMakeLists.txt: Add libayatana-common (>= 0.9.3) dependency. (a2a36676) * .build.yml: Build libayatana-common from Git. (e53de57e) 2021-05-11 Robert Tari * Merge branch 'tari01-pr/fix-gtest-path' (46148c9c) 2021-05-05 Mike Gabriel * tests/test-dbus-fixture.h: Turn TestDBusFixture::TestDBusFixture into an explicitly declared constructor. (b8d79bc7) 2021-04-27 Mike Gabriel * tests/test-eds-ics-missing-trigger.cpp: Include engine-eds.h prio to alarm-queue-simple.h. (04aaa3da) * debian/rules: Adjust previous commit to renamed ENABLE_TESTS build option. (6698490e) 2021-04-24 Nicholas Guriev * debian/rules: Run tests while building DEB package. (5497dad9) * Various tests fixes (10df92ba) 2021-04-27 Mike Gabriel * CMakeLists.txt: Drop GNUInstallDirs. Use PREFIX initialization hack. (202b9c36) * CMakeLists.txt: Rename CMake options 'enable_tests' to 'ENABLE_TESTS' and 'enable_lcov' to 'ENABLE_COVERAGE' (both defaulting to 'OFF'). (fc83ab81) 2021-04-26 Mike Gabriel * src/clock-live.cpp: Replace 'signed size_t' by 'ssize_t'. (6bfcd372) * CMakeLists.txt: Add Clang support. (96364c19) * Travis-CI: Initial draft for CI builds. (19834661) 2021-05-11 Robert Tari * Merge branch 'sunweaver-pr/travis-ci' (83110ae5) 2021-04-23 Quentin PAGÈS * Translated using Weblate (Occitan) (96773631) 2021-04-22 Ács Zoltán * Translated using Weblate (Hungarian) (5bc53ad3) 2021-05-05 Mike Gabriel * tests/test-dbus-fixture.h: Turn TestDBusFixture::TestDBusFixture into an explicitly declared constructor. (df1bdfb6) 2021-04-27 Mike Gabriel * tests/test-eds-ics-missing-trigger.cpp: Include engine-eds.h prio to alarm-queue-simple.h. (5ff3995d) * debian/rules: Adjust previous commit to renamed ENABLE_TESTS build option. (fa557f1f) 2021-04-24 Nicholas Guriev * debian/rules: Run tests while building DEB package. (fa0b50e7) * Various tests fixes (fdd18c9d) 2021-04-27 Mike Gabriel * CMakeLists.txt: Drop GNUInstallDirs. Use PREFIX initialization hack. (0562b1c0) * CMakeLists.txt: Rename CMake options 'enable_tests' to 'ENABLE_TESTS' and 'enable_lcov' to 'ENABLE_COVERAGE' (both defaulting to 'OFF'). (4258f017) 2021-04-26 Mike Gabriel * src/clock-live.cpp: Replace 'signed size_t' by 'ssize_t'. (b440e758) * CMakeLists.txt: Add Clang support. (a809dc42) * Travis-CI: Initial draft for CI builds. (3045d2b1) 2021-05-04 Robert Tari * CMakeLists.txt: Fix GTest path (5ffd6963) 2021-04-23 Quentin PAGÈS * Translated using Weblate (Occitan) (6d3a2b8d) 2021-04-22 Ács Zoltán * Translated using Weblate (Hungarian) (80ea737c) 2021-04-19 Mike Gabriel * release 0.8.3 (d0c90849) (tag: 0.8.3) * po/: Fix some date strings wrongly touched by release script. (3105ecd9) 2021-04-18 Robert Tari * Merge branch 'oSoMoN/fix-build-failures-hirsute' (ac492703) 2021-04-15 Boyuan Yang * Translated using Weblate (Chinese (Simplified)) (1d0e547b) 2021-03-30 Hosted Weblate * Update translation files (1fe741d5) 2021-03-29 Weblate * Added translation using Weblate (Chinese (Simplified) (zh_LATN@pinyin)) (7d2ca0dc) 2021-03-18 Reza Almanda * Translated using Weblate (Indonesian) (81710ca0) 2021-03-11 Boyuan Yang * Translated using Weblate (Chinese (Simplified)) (3264e2de) 2021-04-15 Boyuan Yang * Translated using Weblate (Chinese (Simplified)) (794e6c49) 2021-03-30 Hosted Weblate * Update translation files (752a941a) 2021-03-29 Weblate * Added translation using Weblate (Chinese (Simplified) (zh_LATN@pinyin)) (b42333c0) 2021-03-18 Reza Almanda * Translated using Weblate (Indonesian) (b071f766) 2021-03-11 Boyuan Yang * Translated using Weblate (Chinese (Simplified)) (04379860) 2021-03-04 Olivier Tilloy * Fix a couple of build failures on Ubuntu hirsute: (19923632) 2021-02-04 Michalis * Translated using Weblate (Greek) (e3e400a1) 2021-02-03 Robert Tari * Merge branch 'sunweaver-pr/port-to-lomiri-url-dispatcher' (b5decb84) 2021-02-03 Mike Gabriel * debian/control: Switch from liburl-dispatcher1-dev to liblomiri-url-dispatcher-dev in B-D field. (1dec0b1a) * Port from URL Dispatcher to Lomiri URL Dispatcher. (348ff667) 2021-01-28 Mike Gabriel * release 0.8.2 (de8f1a71) (tag: 0.8.2) * debian/control: Make B-D on dh-systemd optional (fixes FTBFS in Debian bullseye). (74453558) 2021-01-16 Kristjan Räts * Translated using Weblate (Estonian) (540abf51) 2020-12-30 J. Lavoie * Translated using Weblate (French (Canada)) (ed06a843) * Translated using Weblate (English (Canada)) (9759f62a) 2020-12-29 Wellington Terumi Uemura * Translated using Weblate (Portuguese (Brazil)) (de91fe10) 2020-12-30 J. Lavoie * Translated using Weblate (French) (a57750c7) 2020-12-02 Milo Ivir * Translated using Weblate (Croatian) (3d8af26f) 2020-11-29 Oğuz Ersen * Translated using Weblate (Turkish) (c7c6f853) 2020-11-27 Csaba * Translated using Weblate (Hungarian) (77ca55dd) 2020-11-26 Ács Zoltán * Translated using Weblate (Hungarian) (93bd7278) 2020-11-27 Csaba * Translated using Weblate (Hungarian) (d6b17bcd) 2020-11-10 mv87 * Translated using Weblate (German) (d739a5f3) 2020-11-02 Joan CiberSheep * Translated using Weblate (Catalan) (073b3221) 2020-11-01 Hosted Weblate * Update translation files (0a5e17f5) 2020-10-31 Weblate * Added translation using Weblate (Italian) (6d1c3124) * Added translation using Weblate (Tamil (Sri Lanka)) (891a012c) * Added translation using Weblate (Dhivehi) (9902f842) * Added translation using Weblate (Venetian) (8fe5b519) * Added translation using Weblate (Kashubian) (08cc451a) * Added translation using Weblate (Macedonian) (bcf94c92) * Added translation using Weblate (Friulian) (3d857207) * Added translation using Weblate (Tatar) (b4b9ef5a) 2020-10-28 Milan Korecky * Translated using Weblate (Czech) (6fc0edc3) 2020-10-26 Adrià Martín * Translated using Weblate (Sardinian) (b6930204) 2020-10-27 Hosted Weblate * Update translation files (9ab080b2) 2020-10-26 Michele * Translated using Weblate (Italian) (80a31cfc) 2020-10-26 Weblate * Added translation using Weblate (Manx) (006ab0ea) * Added translation using Weblate (Afar) (3f6bf177) * Added translation using Weblate (Nyanja) (b8635700) * Added translation using Weblate (Assamese) (128e0b8c) * Added translation using Weblate (Wolof) (5be36cad) 2020-10-22 Luna Jernberg * Translated using Weblate (Swedish) (90666259) 2020-10-18 Quentin PAGÈS * Translated using Weblate (Occitan) (849d2a8a) 2020-10-10 Rob Pearson * Translated using Weblate (English (United Kingdom)) (854f1614) * Translated using Weblate (English (Australia)) (9d1e1c96) 2020-10-08 koffevar * Translated using Weblate (Russian) (8b72750a) 2020-10-04 Moo * Translated using Weblate (Lithuanian) (a84bcdbf) 2020-09-30 Yaron Shahrabani * Translated using Weblate (Hebrew) (6ccc79de) 2020-09-29 Yaron Shahrabani * Translated using Weblate (Hebrew) (6d15b26c) 2020-09-28 Adolfo Jayme Barrientos * Translated using Weblate (Spanish) (a37bc8e9) 2020-09-25 Quentin PAGÈS * Translated using Weblate (Occitan) (95d51f68) 2020-09-23 Viktar Vauchkevich * Translated using Weblate (Belarusian) (81bf4474) 2020-09-10 Mike Gabriel * release 0.8.1 (7d5b542b) (tag: 0.8.1) * Merge branch 'tari01-pr/trim-lcov-py3' (2e680e59) 2020-09-10 Robert Tari * trim-lcov.py: Port trim-lcov to Python 3 (a77a2bfd) 2020-09-08 Milo Ivir * Translated using Weblate (Croatian) (62d8eebd) 2020-09-06 Baka Gaijin * Translated using Weblate (Japanese) (dd36562e) 2020-09-05 Robert Tari * Merge branch 'sunweaver-pr/break-ubuntu-indicator' into master Attributes GH PR #18:https://github.com/AyatanaIndicators/ayatana-indicator-datetime/pull/18 (3588f568) 2020-09-05 Mike Gabriel * README.md: Add a note that ayatana-indicator-datetime conflicts with indicator-datetime as found in Ubuntu. (a4ca0056) * debian/control: Add B:/R: indicator-datetime. (467c0c83) * Merge branch 'tari01-pr/drop-show-clock' (d9923217) 2020-09-03 Robert Tari * gsettings: Drop the 'show-clock' setting. Always show the clock. (24d102c1) * Whitespace fix (28ddb974) 2020-08-31 klausade * Translated using Weblate (Norwegian Bokmål) (4aa2131e) 2020-08-22 Anders Jonsson * Translated using Weblate (Swedish) (9f87cade) 2020-08-21 Mike Gabriel * Translated using Weblate (German) (c29768ec) 2020-08-22 Mike Gabriel * upload translation files (b10673aa) 2020-08-17 Mike Gabriel * release 0.8.0 (f686848d) (tag: 0.8.0) 2020-08-11 EminUZUN * Translated using Weblate (Turkish) (335044df) 2020-08-11 Robert Tari * Merge branch 'sunweaver-pr/revert-some-x-canonical-attributes-renamings' Attributes GH PR #13: https://github.com/AyatanaIndicators/ayatana-indicator-datetime/pull/13 (e64a4a66) 2020-08-11 Mike Gabriel * Partially revert fab51b4. Only rename those x-canonical attributes to x-ayatana if they are solely used by Ayatana Indicators. (90cd1b58) * Merge branch 'tari01-pr/replace-x-canonical-attributes' (6bdea82a) 2020-08-11 Robert Tari * Replace x-canonical attributes (fab51b47) * Merge branch 'sunweaver-pr/drop-upstart-support' Attributes GH PR #10: https://github.com/AyatanaIndicators/ayatana-indicator-datetime/pull/10 (594bd0b5) 2020-08-10 Mike Gabriel * Drop all references to upstart. (63f3257b) * Merge branch 'ubports-fix-systemd' (1f17333e) 2020-08-09 Marius Gripsgard * Start indicator in systemd when ayatana-indicators.target is started (f084bca4) 2020-08-06 Simon Quigley * Time *and* Date. (803dd51c) 2020-08-06 Jeremy Bicha * Capitalize Settings in indicator menu to match capitalization style. (f0d5b45a) 2020-08-06 Mike Gabriel * CMakeLists.txt: Move GNUInstallDirs inclusion further up. Inspired by https://github.com/ubports/indicator-datetime/commit/c52883d7bbcece0d532a54cbe179e508586715ed. (1843b635) 2020-08-03 Abbas Baharforoosh * Translated using Weblate (Persian) (e74f8adc) 2020-07-29 Ács Zoltán * Translated using Weblate (Hungarian) (5cfa5508) 2020-07-29 Mike Gabriel * release 0.4.1 (413cbba2) (tag: 0.4.1) 2020-07-26 Robert Tari * Fix calendar going into update loop (e7f26291) 2020-07-24 Mike Gabriel * CMakeLists.txt: Drop workaround for missing libexec dir on Debian. Debian moved forward and now supports FHS 3.0 (since Debian Policy 4.1.5). (d7548496) * src/engine-eds.cpp: Typo fix in g_debug output. (068e34af) * debian/changelog: Don't use my debian.org address. (5930dc44) * release 0.4.0 (52042628) (tag: 0.4.0) 2020-07-18 Mike Gabriel * src/myself.cpp: Fix include of . (027b23a5) * debian/rules: Disable unit tests at build time. They need a lot of love before they can be reactivated again. (330575ea) * debian/control: Adapt B-Ds: Add libaccounts-glib-dev (>= 1.18), switch from libecal1.2-dev to libecal2.0-dev (>= 3.16). (1efa0250) * Merge branch 'tari01-master' (aea9abef) 2020-07-11 Robert Tari * -Made GCC 10.1.0 friendly -Fixed to work with ECal 2.0 -Added libaccounts-glib dependency -Added mate-time-admin handler (b917e4ce) 2020-07-03 Tobias p * Translated using Weblate (Danish) (6eac66d1) 2020-06-14 MarongHappy * Translated using Weblate (Korean) (f601369e) 2020-05-30 Juraj Liso * Translated using Weblate (Slovak) (120ef47a) 2020-05-25 wdggg * Translated using Weblate (Chinese (Simplified)) (b4c296e3) 2020-05-21 wdggg * Translated using Weblate (Chinese (Simplified)) (ca7a67a8) 2020-05-09 iNetRoos * Translated using Weblate (Afrikaans) (caed71bf) 2020-05-08 Abdusalam * Translated using Weblate (Uyghur) (a0f2aeda) 2020-04-28 nugullpunch * Translated using Weblate (Korean) (8d5d981b) 2020-04-27 Jeannette L * Translated using Weblate (French (Canada)) (4a8e20ed) * Translated using Weblate (English (United Kingdom)) (52c0762e) * Translated using Weblate (English (Canada)) (cc5abeb9) * Translated using Weblate (English (Australia)) (c9623c32) * Translated using Weblate (Italian) (c26d93dd) * Translated using Weblate (French) (0366ad1f) 2020-04-24 gökhan barış göbet * Translated using Weblate (Turkish) (2658aa83) 2020-04-19 HuNteR GaMinG * Translated using Weblate (Malagasy) (31dc9b11) 2020-04-19 Tommy Cheng * Translated using Weblate (Chinese (Traditional)) (3a1d86f1) 2020-04-15 Martin Šikuda * Translated using Weblate (Czech) (4021804d) 2020-04-13 geni * Translated using Weblate (Bulgarian) (66cbfce4) 2020-04-04 Kristjan Räts * Translated using Weblate (Estonian) (071f3531) 2020-04-01 Davit Mayilyan * Translated using Weblate (Armenian) (347767e6) 2020-04-01 Johntini * Translated using Weblate (Spanish) (f5b91a1d) 2020-03-16 Grace Guo * Translated using Weblate (Japanese) (40a49520) 2020-03-05 Zdeněk Klauda * Translated using Weblate (Czech) (7c4bf6c3) 2020-02-25 Wellington Terumi Uemura * Translated using Weblate (Portuguese (Brazil)) (6ff6c6aa) 2020-02-06 Laércio Cordeiro * Translated using Weblate (Portuguese (Brazil)) (8ce6e339) 2020-01-28 MoccoCoffee * Translated using Weblate (Belarusian) (710716ba) 2020-01-15 Heimen Stoffels * Translated using Weblate (Dutch) (49b15ad8) 2020-01-02 Milo Ivir * Translated using Weblate (Croatian) (b8a15a0d) 2019-12-24 Henrik Dankvardt * Translated using Weblate (Danish) (11b26832) 2019-12-03 SapuSeven * Translated using Weblate (German) (ea486b08) 2019-10-29 Danjela Hoxha * Translated using Weblate (Albanian) (7a7348b9) 2019-10-21 Tiago Silva Miguel * Translated using Weblate (Portuguese (Brazil)) (176eed00) 2019-10-18 Uddin Mtm * Translated using Weblate (Indonesian) (593d991b) 2019-10-16 Kyrylo Yanukovych * Translated using Weblate (Russian) (ecef5fb5) 2019-10-15 giorgio.saragnese * Translated using Weblate (Italian) (72a09f08) 2019-10-09 OrionJK - * Translated using Weblate (Russian) (32fbd1f8) 2019-10-07 Mateusz Rumiński * Translated using Weblate (Polish) (ebdaa52d) 2019-09-08 ssantos * Translated using Weblate (Portuguese) (3f5e9478) 2019-09-02 Swann Martinet * Translated using Weblate (French) (5cf512ae) 2019-09-01 Moo * Translated using Weblate (Lithuanian) (f4aba8fa) 2019-08-29 Anders Jonsson * Translated using Weblate (Swedish) (42d0869c) 2019-08-28 Heimen Stoffels * Translated using Weblate (Dutch) (3433569e) 2019-08-28 Mike Gabriel * update locale files (e8cf1b52) * Merge branch 'leela52452-master' (60d54c8e) 2019-08-25 leela * Translated using Weblate (Telugu) (2898acd2) * Translated using Weblate (Telugu) (8c8686c5) * indicates an interrogative clause or phrase.. (9b572cf4) 2019-08-23 Swann Martinet * Translated using Weblate (French) (fba654c4) 2019-08-10 M Ramani Priya * Translated using Weblate (Telugu) (0929e3dd) 2019-07-28 Marco Scaglioni * Translated using Weblate (Italian) (c7686e12) 2019-07-26 sock-et * Translated using Weblate (Italian) (cec22065) 2019-07-01 Elizabeth Sherrock * Translated using Weblate (Chinese (Simplified)) (a1b64ec1) 2019-05-21 THANOS SIOURDAKIS * Translated using Weblate (Greek) (ee6278cf) 2019-05-18 THANOS SIOURDAKIS * Translated using Weblate (Greek) (b9a5f68c) 2019-05-15 Артем * Translated using Weblate (Russian) (0b780887) 2019-05-05 ssantos * Translated using Weblate (Portuguese) (6f53bbb6) 2019-04-17 Rui Mendes * Translated using Weblate (Portuguese) (f0667cee) 2019-02-19 thebylito * Translated using Weblate (Portuguese) (da04048b) 2018-11-25 ssantos * Translated using Weblate (German) (8554e07e) 2018-10-23 Iván Seoane * Translated using Weblate (Galician) (977a3672) 2018-10-15 ButterflyOfFire * Translated using Weblate (Czech) (a2da27ab) 2018-10-03 Володимир Бриняк * Translated using Weblate (Ukrainian) (5bb8aafe) 2018-09-29 Володимир Бриняк * Translated using Weblate (Ukrainian) (b12ef86f) 2018-09-27 Володимир Бриняк * Translated using Weblate (Ukrainian) (87ff58ca) 2018-09-01 account1 * Translated using Weblate (German) (168f380f) 2018-08-24 WaldiS * Translated using Weblate (Polish) (67967bbe) 2018-08-23 WaldiS * Translated using Weblate (Polish) (c32a25c7) 2018-07-29 chrismeurer * Translated using Weblate (Portuguese (Brazil)) (f1973ad5) 2018-07-22 Eugen Wesseloh * Translated using Weblate (Russian) (acbbdf90) 2018-07-01 Doma Gergő * Translated using Weblate (Hungarian) (b549266a) 2018-06-22 Lejo * Translated using Weblate (German) (84a0f2d8) 2018-06-20 Lejo * Translated using Weblate (German) (a4b1401d) 2018-06-18 nimradium * Translated using Weblate (German) (5c7d9f12) 2018-06-18 Doma Gergő * Translated using Weblate (Hungarian) (8c18fe9b) 2018-06-17 advocatux * Translated using Weblate (Spanish) (a4d1ccf6) 2018-06-10 Eduardo Addad de Oliveira * Translated using Weblate (Portuguese (Brazil)) (974e9789) 2018-05-31 Zhaoyu Gan * Translated using Weblate (Chinese (Simplified)) (704f2277) 2018-05-08 Heimen Stoffels * Translated using Weblate (Dutch) (c67c15cb) 2018-05-02 Karol Kosek * Translated using Weblate (Polish) (a9c769d3) 2018-04-04 Pavel Borecki * Translated using Weblate (Czech) (0c2a098e) 2018-04-04 Moo * Translated using Weblate (Lithuanian) (01057bc2) 2018-04-04 Pavel Borecki * Translated using Weblate (Czech) (d0b6e5b2) * Translated using Weblate (Czech) (bbf89164) 2018-04-02 Moo * Translated using Weblate (Lithuanian) (2d1a40be) 2018-03-29 Anders Jonsson * Translated using Weblate (Swedish) (1907d398) * Translated using Weblate (Swedish) (5b439dbe) 2018-03-27 Moo * Translated using Weblate (Lithuanian) (f74f7449) 2018-03-18 Allan Nordhøy * Translated using Weblate (Norwegian Bokmål) (6e6983b6) 2018-03-10 Moo * Translated using Weblate (Lithuanian) (0fea2879) 2018-03-04 Moo * Translated using Weblate (Lithuanian) (06740d31) 2018-03-03 karel van dongen * Translated using Weblate (Dutch) (f61ff67f) 2018-02-28 Moo * Translated using Weblate (Lithuanian) (2e0ee47f) 2018-02-28 Мира Странная * Translated using Weblate (Russian) (d6dd8f62) 2018-02-20 Andreas Kleinert * Translated using Weblate (German) (ae297779) 2018-02-20 Veselin Georgiev * Translated using Weblate (Bulgarian) (a8612006) 2018-02-08 Mertcan Gokgoz * Translated using Weblate (Turkish) (f96c7016) 2018-02-03 Cristian Gherman * Translated using Weblate (Romanian) (de66d78d) 2018-01-30 Марс Ямбар * Translated using Weblate (Ukrainian) (14137b65) 2018-01-22 Марс Ямбар * Translated using Weblate (Ukrainian) (d5d1ae84) 2018-01-01 Anders Jonsson * Translated using Weblate (Swedish) (5019cf95) 2017-12-18 Allan Nordhøy * Translated using Weblate (Norwegian Bokmål) (929bcdd6) 2018-01-04 Yaron Shahrabani * Translated using Weblate (Hebrew) (01550041) 2018-01-06 Kristjan Räts * Translated using Weblate (Estonian) (02d28720) 2017-12-31 Sebastian Rasmussen * Translated using Weblate (Swedish) (26c5ce4e) 2017-12-27 Viktar Vauchkevich * Translated using Weblate (Belarusian) (ae3e8d8a) 2017-12-12 Naveen Rajan * Translated using Weblate (Tamil) (b20c1eff) 2017-12-12 Allan Nordhøy * Translated using Weblate (Norwegian Bokmål) (5c5db51a) 2017-12-07 Allan Nordhøy * Translated using Weblate (Norwegian Bokmål) (6426d34b) 2017-12-06 Viktar Vauchkevich * Translated using Weblate (Belarusian) (bd544d22) 2017-12-06 Allan Nordhøy * Translated using Weblate (Norwegian Bokmål) (2ccd683b) 2017-11-30 Olivier Macchioni * Translated using Weblate (French) (ea69822c) 2018-03-28 Mike Gabriel * URL dispatcher on non-Ubuntu: Fake it as best as possible, so that the unit tests are happy and succeed. (929c53ab) * debian/control: Bump Standards-Version to 4.1.3. No changes needed. (3b05bdde) * tests/CMakeLists.txt: EDS tests are not limited to URL dispatcher builds, so re-enabling them on non-Ubuntu. (cc17de29) * tests/CMakeLists.txt: Only build manual-test-snap on Ubuntu. (448c99da) 2016-01-29 Charles Kerr * sync unit tests with calendar, locations being visible in phone profile (cc4821ae) 2018-03-26 Lukáš Tinkl * add the locations specifically for Phone and Desktop only (w/o greeter profiles) (c41db259) 2018-03-26 Charles Kerr * phone<-->desktop convergence (480e93c6) * honor gsettings for calendar events (2e14b67c) * add ubuntu-touch-sounds to Build-Depends for unit tests on phone notification sounds (c8ec1314) * use @FOO@ intead of ${FOO} for variable substitution when configuring files (d423c4a5) 2015-10-13 Charles Kerr * add a ualarm to test-snap.cpp (a1d3f811) 2018-03-26 Charles Kerr * use a different default sound for calendars than for alarms (6345c7e0) * add calendar-default-sound to the gsettings schema (b5c758c4) 2018-03-26 Mike Gabriel * Revert "cmake/UseGSettings.cmake: Drop file. Available via cmake-extras." (d035993b) 2018-03-26 Charles Kerr * generate .gschema.xml.in to include cmake constants e.g. alarm_default_sound (eec442b9) * use cmake's configure_file() to generate the test .ics files from .ics.in so that we don't have to hardcode the filenames in the test data files either (b72e4416) * add a CALENDAR_DEFAULT_SOUND constant to CMakeLists.txt (222c9e45) 2015-10-13 Charles Kerr * use the new ALARM_DEFAULT_SOUND symbolic in the src and test cpp files (31e6de71) 2018-03-26 Charles Kerr * add ALARM_DEFAULT_SOUND symbolic so that we can start removing all the hardcoded instances of this string (5f6a9116) 2015-09-21 Richard Somlói * Fixed the comment for translators (947e9fd2) 2018-03-26 Andrea Azzarone * As we removed a day we need to edit the test too. (25371d2f) * 31-jun is not a real day. (f308f59f) 2018-03-26 Mike Gabriel * tests/CMakeLists.txt: Fix linking when built with URL dispatcher support. (8fe11221) * Define compile macro HAVE_UT_ACCTSERVICE_SYSTEMSOUND_SETTINGS, if we are on Ubuntu. (c13a4d07) * URL dispatcher support: Build phone code, even if URL dispatcher is unavailable. (b39526c2) * Revert "src/timezone-geoclue.cpp: Blind shot at switching to Geoclue2 DBus API." (8dbc66ca) * Revert "Geoclue -> Geoclue2 blind shot. More namespace changes." (b16069da) 2018-03-16 Mike Gabriel * Geoclue -> Geoclue2 blind shot. More namespace changes. (67a3944d) * data/: Various path and namespace fixes (leftovers of Ubuntu Indicators -> Ayatana Indicators fork). (3ee53b79) 2017-12-08 Mike Gabriel * src/timezone-geoclue.cpp: Blind shot at switching to Geoclue2 DBus API. (da8cf48c) * data/ayatana-indicator-datetime.service.in: Fix copy+paste flaws. (111c622b) * debian/control: Add B-D systemd [linux-any] and bin:pkg D on ayatana-indicator-common. (0fec0d82) * systemd integration: Add systemd user service file and upstart override. (ee09fe7c) * data/ayatana-indicator-datetime.desktop.in: Drop GNOME from OnlyShowIn= key, add XFCE instead. (699c381a) * include/datetime/snap.h: Don't guard snap.h by HAS_UT_ACCTSERVICE_SYSTEMSOUND_SETTINGS macro. It is only used by tests/test-snap.cpp and that one is only compiled and executed if HAS_UT_ACCTSERVICE_SYSTEMSOUND_SETTINGS is defined. (9a5b4b3b) * src/snap.cpp: Forgotten namespace change unity::indicator::notifications -> ayatana::indicator::notifications. (e809a812) * tests/manual: white-space fix (95571b01) * Fix executable/project name (indicator-datetime -> ayatana-indicator-datetime) at various locations. (750b36c2) * debian/watch: Use correct upstream URL. (5658f730) * src/CMakeLists.txt: Use correct variable (URLDISPATCH_LIBS -> URLDISPATCHER_LIBRARIES). (88f078e5) * include/datetime/snap.h: Fix macro name (HAVE_UT_ACCTSERVICE_SYSTEMSOUND_SETTINGS -> HAS_UT_ACCTSERVICE_SYSTEMSOUND_SETTINGS). (401510a6) * data/org.ayatana.indicator.datetime: Fix Name= key (indicator-datetime -> ayatana-indicator-datetime). (0519a8d6) * tests/CMakeLists.txt: Also update DG_LOG_DOMAIN namespace in test suite. (e4eeef57) * debian/control: Fix dependency; we need accountsservice-ubuntu-schemas on Ubuntu, not gsettings-ubuntu-schemas. (040092b2) * debian/control: Tweak bin:pkg dependencies, improve SYNOPSIS and LONG_DESCRIPTION. (6a0950b3) * debian/control: Add B-D: on Ubuntu pull in gsettings-ubuntu-schemas at build-time. (6ecf3c4d) * src/CMakeLists.txt: Add ${URLDISPATCH_LIBS} to target_link_libraries() call. (3affaee2) * src/CMakeLists.txt: Set DG_LOG_DOMAIN to ayatana-indicator-datetime. (c9f02171) * src/CMakeLists.txt: Fix name (namespace-wise) of service executable. (d5826b83) * include/datetime/settings-shared.h: Namespace fix for SETTINGS_INTERFACE macro. (4855696e) * README.md: Use more itemizations. (d671e82c) * README.md: More manual line breaks. (835940bd) * README.md: Layout improvements. (ed218bac) * README.md: Add some manual line breaks. (b7950517) * README(.md): Ship README.md, symlinked from README -> README.md. (dabd7c8c) * README: Some namespace fixes. Prepare for being a markdown document. (436caeff) * Drop .bzrignore file. (deccc82d) * debian/control: Add B-D: intltool. (74863f09) * Use GSettings cmake module from cmake-extras. (3eb2ae42) * include/datetime/dbus-shared.h: Fix namespace of BUS_DATETIME_*. (438baee6) * cmake/UseGSettings.cmake: Drop file. Available via cmake-extras. (0846900d) * data/: Fix file namespaces for XDG and upstart files. (95ab717c) * debian/control: Add B-D: cmake-extras (>= 0.10). (554e86b9) * tests/test-formatter.cpp: Fix locale setting and ignore failures if the build system does not have en_US.UTF-8 as valid locale available. (e3dada2f) * tests/run-eds-ics-test.sh: Make sure the folder for the tasks.isc file exists before copying it there. (4d4434fe) * rebase C++ namespace (5220b871) * Indicator namespace adaptations. (e88a51c8) * Make the datetime indicator build on non-Ubuntu systems (which mostly lack url-dispatcher and Ubuntu Touch sound schema files. (f5450594) * Many more C++ namespace name changes (unity -> ayatana). (4a6ec712) 2017-12-06 Mike Gabriel * Rename GNOMELOCALEDIR -> LOCALEDIR. (755e153e) * CMakeLists.txt: Set correct PROJECT_VERSION. (76f869c2) * CMakeLists.txt: Move gettext initialization below the GNUInstallDirs include. This fixes broken i18n support. (8bb39fec) 2017-12-02 Mike Gabriel * debian/control: Fix D (glib2.0-bin -> libglib2.0-bin). (60e71c1a) 2017-11-29 Mike Gabriel * po/*.po: Update translation files once more. (ddac6766) * update-po.sh: Preserve .pot file when updating *.po files. (4c3f2f56) 2017-11-27 Kristjan Räts * Translated using Weblate (Estonian) (4817043f) 2017-11-26 Kristjan Räts * Translated using Weblate (Estonian) (6117e386) 2017-11-18 Kristjan Räts * Translated using Weblate (Estonian) (ee9e223e) 2017-11-05 Kristjan Räts * Translated using Weblate (Estonian) (a4d4d996) 2017-10-12 Andrew Shadura * Translated using Weblate (Slovak) (7c4fc845) 2017-11-29 Mike Gabriel * po/ayatana-indicator-datetime.pot: Update with now correct file names for .xml files. (51856217) * update-pot.sh: Fix filenames of .ini(.in) and .xml(.in) files in po template file. (c597efca) 2017-10-24 Mike Gabriel * update-po*.sh: Add license header. (81e6675c) 2017-10-12 Mike Gabriel * update-po(|t).sh: Add gettext update scripts. (f41bb7dc) * po/*.po: Add .pot file, add many not-yet-translated .po files. Update LINGUAS file. (8a1c5058) * CMakeLists.txt: Set GETTEXT_DOMAIN to ayatana-indicator-datetime. (f2faa829) * update-po.sh (9e6b8de3) 2017-05-17 Mike Gabriel * Fork ayatana-indicator-datetime from Ubuntu's indicator-datetime. (4afa2b50) 2015-10-13 Charles Kerr * bump the version to 15.10 to match the branch (cab972e0) 2015-10-05 CI Train Bot * Releasing 13.10.0+15.10.20151005-0ubuntu1 (9ef9bb62) 2015-10-05 Charles Kerr * Change the default alarm sound from "Suru arpeggio.ogg" to "Alarm clock.ogg" Fixes: #1489037 Approved by: PS Jenkins bot, Pete Woods (5cdf435a) * sync with trunk (55ec6e57) 2015-09-09 CI Train Bot * Releasing 13.10.0+15.10.20150909-0ubuntu1 (3f3445ae) 2015-09-09 Sebastien Bacher * under unity8 start system-settings instead unity-control-center, don't special case u-c-c by looking for the binary, Unity installations come with it installed Fixes: #1489481 Approved by: Ted Gould, Charles Kerr, PS Jenkins bot (3c40d739) 2015-09-09 Iain Lane * Remove warnings from test logs. Swallow the ones that are expected and fail the test if they don't show up. In addition, fail tests if unexpected warnings show up again. Approved by: Charles Kerr (13bcfccd) 2015-09-09 Lars Uebernickel * state-fixture: use TestDBusFixture for system bus (ec001e64) * glib-fixture: fail tests on unexpected warnings (046cd3a7) * test-utils: don't pass NULL as gsettings string value (60f30453) 2015-09-04 Charles Kerr * replace the default alarm from 'Suru arpeggio.ogg' to 'Alarm clock.ogg (645e1ade) 2015-09-03 Lars Uebernickel * timezone-timedated: subscribe to PropertiesChanged directly (bda03d74) 2015-09-03 Iain Lane * Make test-live-actions quit itself once the tz has been changed, the mock no longer does this (49dbcaf9) * Avoid nested GMainLoops by reading from the file on startup (29b5c4da) 2015-09-01 Iain Lane * Add some comments (1da27f90) * Rename FileTimezone to TimedatedTimezone (a3937830) * Add a timeout so we can't hang forever (f016debf) 2015-08-31 Iain Lane * Use timedated's Timezone property instead of watching /etc/timezone (132ac93b) 2015-08-27 Sebastien Bacher * under unity8 start system-settings instead unity-control-center, don't special case u-c-c by looking for the binary, Unity installations come with it installed (5d0a213d) 2015-07-28 CI Train Bot * Releasing 13.10.0+15.10.20150728-0ubuntu1 (ad2d17a8) 2015-07-28 Iain Lane * Update for e-d-s 3.16 Approved by: Iain Lane (07803fa4) 2015-07-27 CI Train Bot * Releasing 13.10.0+15.10.20150727-0ubuntu1 (cbdb486a) 2015-07-27 Charles Kerr * drop build-dependency on g++-4.9 Fixes: #1452319 Approved by: Pete Woods, PS Jenkins bot, Rodney Dawes (ad6c0d6c) 2015-07-22 Iain Lane * Merge with 15.04 branch which is what got uploaded to the archive (cc5a9953) 2015-07-20 Iain Lane * merge trunk, no need to give dbus names any more (a0335176) 2015-07-15 Charles Kerr * drop build-dependency on g++-4.9 (e2e03d4a) 2015-07-10 CI Train Bot * Releasing 13.10.0+15.10.20150710.1-0ubuntu1 (55e0db0b) 2015-07-10 Charles Kerr * Get icaltimezone structures from EDS rather than assuming the tzid will always be GTimeZone friendly. Fixes: #1473068 Approved by: Rodney Dawes, PS Jenkins bot, Charles Kerr, Antti Kaijanmäki (71413be3) * sync with trunk (29a6bc36) 2015-07-09 Charles Kerr * add a g_warning() if we can't suss out the tzid (508e4452) * add dobey's tests (b6bdb4e5) * oops, disabling the other tests was only supposed to be to speed up local tests & wasn't supposed to be pushed (6031f62f) * add dobey's test case that has 'TZID:Pacific Time (US & Canada)' (b68ecc15) * avoid the round trip to EDS if we can figure out the tzid from libical first (42bd1c10) * when possible, ask the ECalClient for the icaltimezone to use (a08215ad) * make the EDS EngineImpl's GCancellable a shared pointer, since we're about to start passing it around to subtasks (c0e2387f) * add failing test for timezone issue in bug #1473068 (61189fa5) 2015-06-24 CI Train Bot * Releasing 13.10.0+15.10.20150624-0ubuntu1 (074bee9f) 2015-06-24 Charles Kerr * Speedups/cleanups to the EDS regression tests Approved by: Pete Woods, PS Jenkins bot (519cb05c) 2015-06-23 Charles Kerr * remove unnecessary pieces from the EDS test scaffolding. clean up script variable names. (8bd6bf4d) 2015-06-22 CI Train Bot * Releasing 13.10.0+15.10.20150622-0ubuntu1 (7468f3f2) 2015-06-22 Charles Kerr * Fix bugs relating to timezones and triggers from clock-app alarms. Fixes: #1456281, #1465806 Approved by: Ted Gould, PS Jenkins bot (a85f7441) * don't copy debian/changelog from vivid (cfefa6fb) * get the 15.10 branch up-to-date with the fixes and test improvements in the 15.04 branch. (2ed815aa) 2015-06-19 Robert Ancell * Fix tests (813f10d4) 2015-06-18 CI Train Bot * Releasing 13.10.0+15.04.20150618-0ubuntu1 (e1205e09) 2015-06-18 Charles Kerr * Fix invalid valarms in older clock-app alarms. Fixes: #1465806 Approved by: PS Jenkins bot, Ted Gould (a15a7ba2) 2015-06-18 Iain Lane * Update D-Bus interface versions for the testsuite (b3d51b5e) 2015-06-17 Charles Kerr * if older clock-app alarms don't have triggers, add them. (23dc0fd9) * add (failing) regression test for x-canonical-alarm components whose valarms have no triggers (25c99926) 2015-06-02 Robert Ancell * Build against libecal 3.16 (32ebc442) 2015-05-21 CI Train Bot * Releasing 13.10.0+15.04.20150521-0ubuntu1 (3c85ae61) 2015-05-21 Charles Kerr * Fix regression that caused nonrepeating alarms to go off at the wrong time. Fixes: #1456281 Approved by: PS Jenkins bot, Ted Gould (c07b11f4) * in eds-engine, add a occur-in-time-range sexp to handle events that are interesting but don't require user notification alarms (58efd72d) * in run-eds-ics-test.sh, slightly cleaner ics file copying (1b2b949e) * in engine-eds.cpp's on_object_list_ready(), always mark the subtask as finished even if the dbus call failed. (505d4fae) * in engine-eds.cpp's get_appointments(), clear the begin_str and end_str variables as soon as we're done with them. (105abe6c) 2015-05-20 Charles Kerr * remove a little more leftover code from the false starts (9e1f2db6) * copyediting (70ccd1ab) * remove detritus from the false starts. (44bd1414) * re-enable the tests that I disabled earlier in this branch while focusing on the EDS bugfix (cab736be) * Add an EDS test for nonrepeating alarms. Refactor the EDS testing structure slightly so that more of the basic config setup can be shared. (7577ad72) * fixed first test passing (45122eb2) * first eds test passing (c91b1cc8) * yes, generating alarms from the reference component, rather than the instance component, yields the right trigger timezones. Let's get to refactoring. (03ad3350) * what if we try calling generate_alarms() with the original component rather than the instance component... (13ec568f) * add stub for valarm repeat (14660dc8) 2015-05-19 Charles Kerr * work directly with ical to generate alarm instances (f9ac5ed3) * add tracers. (c0a9ccc0) * undo last Friday's timezone regression. (991d36f0) 2015-05-15 CI Train Bot * Releasing 13.10.0+15.04.20150515-0ubuntu1 (22084967) 2015-05-15 Charles Kerr * Honor the 'other vibrations' setting to enable/disable vibrations when alarm notifications are shown. Approved by: Rodney Dawes, PS Jenkins bot (398e4f20) 2015-05-15 CI Train Bot * Releasing 13.10.0+15.10.20150515-0ubuntu1 (854ca599) 2015-05-15 Charles Kerr * Honor the 'other vibrations' setting to enable/disable vibrations when alarm notifications are shown. Approved by: Rodney Dawes (116a5567) 2015-05-08 CI Train Bot * Releasing 13.10.0+15.04.20150508.2-0ubuntu1 (5a3c49ea) 2015-05-08 Charles Kerr * If the "X-CANONICAL-ACTIVATION-URL" x-prop is defined in the VTODO or VEVENT, use it for url delegation. Fixes: #1426519 Approved by: PS Jenkins bot, Ted Gould (d505d69d) 2015-05-07 Charles Kerr * in EngineEds' call to e_cal_util_generate_alarms_for_comp(), use nullptr as the default timezone so that we don't convert to local twice (once in _generate_alarms_for_comp, once in the DateTime ctor). Fixes the previous commit's failing test. (a24c4f33) * Add unit test that looks at ubuntu alarm triggers. Test currently fails on the trigger timezone issue reported by alesage. (4d94be8b) 2015-04-09 Charles Kerr * resolve minor shear with trunk (3ab790ed) * sync with trunk (8d282df3) 2015-04-08 Charles Kerr * honor the AccountsService 'other vibrations' setting. (9ee3e699) 2015-04-06 CI Train Bot * Releasing 13.10.0+15.04.20150406-0ubuntu1 (49f49d4c) 2015-04-06 Charles Kerr * Improve valarm support to honor calendar events' valarm triggers. Fixes: #1419001 Approved by: Ted Gould, PS Jenkins bot (227aa820) * in tests/run-eds-test.sh, only delete the tmpdir if the test passed. (10c574cc) * in the EDS engine, give a better explanation in the comments how we handle alarms with no triggers, and why (aa3ee9ce) * in EngineEds, make the ECalComponentAlarmAction 'omit' array a constexpr. (7feb7295) * in SimpleAlarmQueue, add a new method 'bool already_triggered() const' to reduce code overlapl between find_next_alarm() and appointment_get_current_alarm() (392788b1) * in SimpleAlarmQueue, make the signature for find_next_alarm() and appointment_get_current_alarm() suck less. (81f4d991) * in SimpleAlarmQueue, reduce a lambda capture to only the fields it needs (006858f8) * in Actions, sync DateTime API use by calling DateTime::Local(time_t) instead of DateTime::DateTime(time_t) (9977f16b) * in new EDS code, use timezones consistently (7e9b4645) * in new EDS tests, use timezones consistently (a3c896c8) * in DateTime class, make it harder to accidentally mix local and nonlocal timezones by replacing DateTime::DateTime(time_t) with two methods, DateTime::Local(time_t) and DateTime(GTimeZone*, time_t) (4438c3a5) * in the unit tests, add a PrintTo function for Alarms so that GTest can represent it as a string (af81477b) * in new code, use std::array rather than C style arrays (453a0947) * in debian/control, add evolution-data-server to the build-dep now that we're using it for live EDS tests. (29ba7597) 2015-04-05 Charles Kerr * remove some new bits that turned out to be unneeded after all (38a39c03) * in tests/run-eds-test.sh, improve the comments (13999bfb) * add EDS tests to confirm valarm attachments are loaded properly and trigger in the AlarmQueue (a0a6516e) * in SimpleAlarmQueue, use references instead of copies when copies aren't necessary (242bab53) * make DateTime::is_same_day() faster (32de6c5e) * fix misuse of ECalComponentAlarmInstance's fields. (62d68e64) 2015-04-03 Charles Kerr * in EdsEngine, use empty initializer lists in the new valarm code (e1aba742) * sync with trunk (456e5fa5) * add the new Alarm class as an argument to the alarm queue class (8c7daeeb) * add override keyword to Clock class (6e4367c0) * add override keyword to WakeupTimer (eab70c86) 2015-03-31 Charles Kerr * add an Alarm class to represent ical valarm components; change the Appointment class to hold an arbitrary number of Alarms. (fff19d70) 2015-03-31 CI Train Bot * Releasing 13.10.0+15.04.20150331-0ubuntu1 (9f48c647) 2015-03-31 Charles Kerr * Reduce the forced screen-on time for alarms to reduce battery consumption. Also, lower the default alarm duration from 30 minutes to 10 minutes. Fixes: #1434637 Approved by: Ted Gould, PS Jenkins bot (68054400) * simplify the awake display timeout code (845067b3) 2015-03-25 Charles Kerr * the previous commit made the Awake API too complicated... simplifying. (4bf70c7a) * 60 seconds after triggering an alarm, release our keepDisplayOn request (9e29a4fd) * change the default alarm duration from 30 minutes to 10. (432db089) 2015-03-24 Charles Kerr * make the string test case-insensitive (d5002c6b) * add support for an x-canonical-app-url x-prop when reading vtodos/vevents from EDS (b115811b) 2015-03-17 CI Train Bot * Releasing 13.10.0+15.04.20150317-0ubuntu1 (3c5eda14) 2015-03-17 Charles Kerr * Fix bug that prevented clicking on calendar days where DST sprang forward. Fixes: #1429388 Approved by: Ted Gould, PS Jenkins bot (ddde67df) 2015-03-16 Charles Kerr * add DateTime::end_of_month(), DateTime::end_of_day(). Add unit tests for them. (273c3b38) * in DateTime::is_set(), include timezone test (67510bd5) * in DateTime::DateTime(GTimeZone*,GDateTime*), don't allow either argument to be nullptr (76c4567c) * make utc variable name more sensible. (4dd066bb) 2015-03-14 Charles Kerr * fix GAction leakage found while testing new unit tests with valgrind (fb36c642) * in DateTime::Local() and DateTime::NowLocal(), avoid redundant construction of the local timezone. (61b00f51) * add regression test for bug #1429388 (b4e12a64) * sync the rest of the code with the changes to DateTime instantiation mentioned two commits ago (6481c0ec) * use the new DateTime::start_of_day() and DateTime::start_of_minute() functions. (c940b70c) * Add DateTime::start_of_day() to use instead of the add_hours(-hours()) trick, which doesn't work on days when DST changes. (db5b700c) 2015-03-01 CI Train Bot * Releasing 13.10.0+15.04.20150301.1-0ubuntu1 (15ec7f61) 2015-03-01 Charles Kerr * create a new timerfd each time we need to call timerfd_settime(). Fixes: #1424966 Approved by: Ted Gould (30b31616) 2015-03-01 CI Train Bot * Releasing 13.10.0+15.04.20150301-0ubuntu1 (c2939aac) 2015-03-01 Charles Kerr * Work around glib's type initialization deadlock. (39aaf980) 2015-02-28 Charles Kerr * prevent deadlocking when registering G_TYPE_DBUS_PROXY (90f2f521) 2015-02-27 Charles Kerr * create a new timerfd each time we need to call timerfd_settime(). (510111c8) 2015-02-13 CI Train Bot * Releasing 13.10.0+15.04.20150213.1-0ubuntu1 (595becf8) 2015-02-13 Charles Kerr * change the WallClock to detect time changes from TFD_TIMER_CANCEL_ON_SET, e.g. when ntp<-->manual is toggled Approved by: Ted Gould, PS Jenkins bot (5a19a872) 2015-02-12 Charles Kerr * add a g_message() when updating due to anything that's not a periodic timer (b6899cbf) * extract the timerfd_settime() code into its own method. Add a new call to it when we might have triggered via TFD_TIMER_CANCEL_ON_SET (de6bc91f) * add manual test: indicator-datetime/manual-time (5df08222) 2015-02-11 Charles Kerr * change the LiveClock's private impl to detect time changes from timerfd's TFD_TIMER_CANCEL_ON_SET, e.g. when ntp<-->manual is toggled (113b741b) 2015-01-28 CI Train Bot * Releasing 13.10.0+15.04.20150128.1-0ubuntu1 (049938fe) 2015-01-28 Charles Kerr * Don't play calendar alarm sounds if Silent Mode is enabled. Use the alarm sound role for both clock and calendar alarms. Fixes: #1410874 Approved by: Antti Kaijanmäki, PS Jenkins bot (e1f1be9e) 2015-01-27 CI Train Bot * Releasing 13.10.0+15.04.20150127-0ubuntu1 (fe5d8d46) 2015-01-27 Charles Kerr * Fix bug that misidentified repeating alarms as one-time alarms, causing them to be disabled after triggering. Fixes: #1411171 Approved by: PS Jenkins bot, Rodney Dawes (9753b270) 2015-01-21 Charles Kerr * bump to re-run CI. clumsy, but jenkins' rebuild button isn't working (16fe6ab0) * in Snap's Sound() ctor, use an 'alarm' role for the alarm clock and 'alert' for calendar events (12c74212) * require an explicit role for the sound so that we can differentiate between eg 'alarm' and 'alert' (c5f2b608) * tweak an overly-verbose variable name (ba986b60) * in Snap, fix the code that checks AccountsService.Sound for Silent Mode (9feba7c1) * new manual test, indicator-datetime/silent-mode (d82ebacc) * first stab at AccountsService proxy. WIP; pushing to test on devices (392487de) 2015-01-20 Charles Kerr * use a local temporary to avoid having to GST_MESSAGE_CAST() twice (a4ffa788) * remove the 'loop' test when deciding whether or not to set the audio role. (4c53579a) 2015-01-15 Charles Kerr * strengthen the test that decides if an icalcomponent is a one-shot or repeating. (14c515bd) 2014-12-08 CI Train Bot * Releasing 13.10.0+15.04.20141208-0ubuntu1 (f926c671) 2014-12-08 Charles Kerr * After a one-time Ubuntu alarm's notification is displayed, disable the alarm. Fixes: #1362341 Approved by: Ted Gould, PS Jenkins bot (b05f4115) * Change notifications for calendar events s.t. the sound is nonrepeating and the notification is temporary, not requiring user interaction to disappear. Fixes: #1320880 Approved by: Ted Gould (6de98acd) * Add support for x-canonical-alarm and x-canonical-disabled tags in VTODO categories so that disabled alarms will not be displayed. Fixes: #1387231 Approved by: Ted Gould, PS Jenkins bot (13688fe9) * Don't log an error if powerd isn't available on the system. Fixes: #1384714 Approved by: Ted Gould, PS Jenkins bot (5186d1c2) 2014-12-07 Charles Kerr * disable one-time alarms after their notifications are shown. (f84d3bdb) * for calendar events, use interactive notifications and a nonrepeating sound. (9f29b401) * ensure that disabled alarms aren't shown in indicator-datetime and that notifications aren't shown for them. (95bc85d1) 2014-11-04 Charles Kerr * add a comment explaining why it's okay to let that fail silently. (89bb6bbb) * silence 'com.canonical.powerd was not provided by any .service files' warning on desktop (b4db6b24) 2014-11-03 CI bot * Releasing 13.10.0+15.04.20141103-0ubuntu1 (56e88207) 2014-11-03 Ted Gould * Small tag typo in integration test Approved by: PS Jenkins bot (15c13f57) 2014-10-10 Ted Gould * Removing newlines because the sed script can't handle them. (fdc1a9ca) * Another typo (7d3da01b) * Small tag typo (70605d7e) 2014-10-09 CI bot * Releasing 13.10.0+14.10.20141009-0ubuntu1 (a4f6119d) 2014-10-09 Charles Kerr * Fix appointment comparison function to include the audio_url field in its test. Fixes: 1364949 Approved by: Antti Kaijanmäki (878c36fe) 2014-10-07 CI bot * Releasing 13.10.0+14.10.20141007-0ubuntu1 (3a93504e) 2014-10-07 Charles Kerr * Change title to read "Time & Date" Fixes: 1377286 Approved by: Ted Gould, PS Jenkins bot (568dc3df) * add a manual test case from dmorley's report in #1364949 (c1277f9e) * fix Appointment object's equality operator to also look at the audio_url field. (17b0b165) 2014-10-03 Charles Kerr * rename title from 'Upcoming events' to 'Time & Date' (61cdb8bd) 2014-09-19 CI bot * Releasing 13.10.0+14.10.20140919-0ubuntu1 (a74ced33) 2014-09-19 Charles Kerr * Make alarm notifications icons and button color match Design's specs. Fixes: 1370594 Approved by: Ted Gould, PS Jenkins bot, Nekhelesh Ramananthan (a35f8ed3) * Fix flint++ warnings Approved by: Ted Gould, PS Jenkins bot (16a4e034) * Move timezone code behind a private Impl class Approved by: Ted Gould, PS Jenkins bot (ac54aebe) * Adjust our floating alarms when the local timezone changes. Fixes: 1332095 Approved by: Ted Gould, PS Jenkins bot (a72a776c) 2014-09-17 Charles Kerr * fix tyop from previous commit (d18944bc) * use the new x-canonical-private-affirmative-tint key. (1369dc07) * work around a notifications bug that can't handle boolean hints (894b2e4a) * fix flint++ warnings (b3d8778a) 2014-09-16 Charles Kerr * copyediting: move line to remove unnecessary diff from trunk (8da361db) * add manual test indicator-datetime/alarm-timezone (b455f23b) * in SimpleRangePlanner, re-query the engine for appointments when the local timezone changes. (6863994f) * in main.cpp, reuse the existing FileTimezone so that we don't have an unneccessary extra one (13fd249f) * sync with trunk (2c4bfbbf) * LiveClock only needs one Timezone, so give it that instead of a Timezones object (dc501b4b) 2014-09-15 CI bot * Releasing 13.10.0+14.10.20140915-0ubuntu1 (790f43bc) 2014-09-15 Charles Kerr * Update the time strings when a powerd Wakeup signal is detected. Fixes: 1359802 Approved by: Ted Gould, PS Jenkins bot (851e7e14) * add unit tests for the powerd monitor (c0055ef9) * add manual test indicator-datetime/timestamp-wakeup (321873e4) * listen to powerd SysPowerStateChange instead of Wakeup (d52c7d1b) * add translator comments for the date format string in snap.cpp (a705cb47) 2014-09-13 Charles Kerr * get the system bus once instead of twice. (4416b039) * foo (b20b22f6) * hide the implementation detials of FileTimezone and GeoclueTimezone behind Impl classes (13d371f6) * update the time string when a powerd.Wakeup signal is seen. (187b660a) * hide Clock's implementation details into an Impl class. (5d753a34) 2014-09-08 CI bot * Releasing 13.10.0+14.10.20140908.1-0ubuntu1 (f337a0fd) 2014-09-08 Lars Uebernickel * Use unicode characters directly instead of escaping them. Fixes: 1350544 Approved by: Charles Kerr, Sebastien Bacher, PS Jenkins bot (e195b001) 2014-09-08 Charles Kerr * rename "Upcoming" -> "Upcoming events" Approved by: Sebastien Bacher (fcb4b9e7) * change header from 'Upcoming' to 'Upcoming events' (31af0d11) 2014-09-08 Lars Uebernickel * Use unicode characters directly instead of escaping them (1de66cfc) 2014-09-05 CI bot * Releasing 13.10.0+14.10.20140905-0ubuntu1 (f0763563) 2014-09-05 Charles Kerr * In the alarm's popup notifications' titlebars, don't show the seconds in the time format string. Fixes: 1364374 Approved by: Pete Woods, PS Jenkins bot (94f9ecf2) * Add the snooze feature Fixes: 1354400 Approved by: Jussi Pakkanen, PS Jenkins bot (7affbfb5) 2014-09-04 CI bot * Releasing 13.10.0+14.10.20140904.1-0ubuntu1 (d006b8d3) 2014-09-04 Ricardo Salveti de Araujo * sound: adding media role (alarm) when sink is pulsesink Approved by: PS Jenkins bot (f139f374) * sound: check for audio_sink and also unref after using the object (a471ebcd) * sound: adding media role (alarm) when sink is pulsesink (cd8738fe) 2014-09-02 Charles Kerr * remove the seconds from the alarms' snap decisions. (ea92c056) * minor copyediting: rename a variable for better clarity (593c16de) * remove the new code that we're not using yet (db764f32) * use the 'override' keyword in the new planner class declarations (a209741a) * update manual-test-snap's diagnostic text to reflect snooze/ok buttons (7b42ea11) * reverse OK/snooze button order (b0b9b942) * add manual test for snooze (84a8bb0d) * update Snap Decisions to include snooze (000f91ca) * add planner.cpp to the build (63493709) * add snooze properties to our schema; export it on the bus; add tests (d3732ff1) * add SnoozePlanner, AggregatePlanner (15a383a7) 2014-08-19 CI bot * Releasing 13.10.0+14.10.20140819-0ubuntu1 (31cb88dc) 2014-08-19 Charles Kerr * Use powerd's hardware wakeup API instead of of using the u_hardware_alarm_*() API directly. Approved by: Antti Kaijanmäki, PS Jenkins bot (341cbc19) 2014-08-18 Charles Kerr * use powerd for hardware wakeups (a144696c) * use powerd for hw alarm wakeups (2c77b7e1) 2014-08-08 CI bot * Releasing 13.10.0+14.10.20140808-0ubuntu1 (139454ce) 2014-08-08 Charles Kerr * Have the shared Translations.cmake file look for .c, .cc, .cpp, .cxx, and .vala files. Fixes: 1354058 Approved by: Ted Gould (346131bb) * Add haptic feedback support for alarms. Fixes: 1350017 Approved by: Antti Kaijanmäki, PS Jenkins bot, Nekhelesh Ramananthan (0777142b) * in notifications, don't ask the notification server for its capabilities until we need them. (9cc6380c) * in notifications.cpp, register for the 'closed' signal before calling notification_notify(). (91c7ce04) 2014-08-07 Charles Kerr * when building the potfile, include .cc, .cpp, and .cxx files. (a7ba9fc0) 2014-08-01 Charles Kerr * sync with prerequisite branch lp:~charlesk/indicator-datetime/notification-refactor (56fdc9ef) * refactor changes based on Antti's feedback (6da58726) 2014-07-31 Charles Kerr * in Haptic, make the looping logic easier to read. (d129112a) * sync with notification-refactor (f7563bed) * sync with trunk (3a49cbd3) * sync with trunk (03e9b947) * configurable haptic mode, part 3 of 3: expose the new haptic mode setting as a DBus property; sync exporter tests (56d88141) * configurable haptic mode, part 2 of 3: use the new haptic mode setting when popping up notifications; sync notification tests (8afa4ba3) * configurable haptic mode, part 1 of 3: add haptic feedback mode to the GSettings schema and to our Settings object (4148750e) * in haptic.cpp, better support for vibration patterns (43e0fb82) * add haptic feedback unit tests (e789710c) * drop the ubuntu-application-api middleman and call usensorsd directly: ua_sensors_haptic_new() crashes on desktop and ua_sensors_haptic_vibrate_once() makes blocking dbus calls. (af1b645d) * in haptic.cpp, better comments (0c8faf27) * in Haptic::Impl::~Impl(), call ua_sensors_haptic_disable(). h/t Antti (ad789d53) * in haptic.cpp, start vibrating immediately (5809e107) * in indicator::noficiations::Haptic, better naming of the Mode enum (9d32289f) * remove testing stub used by development (e2e25912) * sync with lp:~charlesk/indicator-datetime/notification-refactor (42034051) * in sound.cpp, fix tab damage (97e7d1b8) 2014-07-30 Charles Kerr * sync with trunk (00da2f91) * fix doxygen comments (5d6108ee) * add haptic feedback to the manual tests (cbb4e955) * in haptic.cpp, make sure to enable the sensor by calling ua_sensors_haptic_enable() (e4b663eb) * initial draft of haptic feedback when alarms play (559d185d) * move Snap's guts into an Impl class (d6b290fd) * remove testing stub (f6df9730) 2014-07-30 CI bot * Releasing 13.10.0+14.10.20140730-0ubuntu1 (23b0a5d6) 2014-07-30 Charles Kerr * Activate the phone's screen when an alarm is displayed. Fixes: 1340329 Approved by: Jussi Pakkanen, PS Jenkins bot (a2f643c2) 2014-07-27 Charles Kerr * copyediting: comments, use anonymous namespace (b0936139) * make close return void instead of bool, because after all what more can you do if the call fails? What's the point? (7271b213) * in sound.cpp, check the return value of gst_init_check() (31d63005) * copyediting (a1e8adda) 2014-07-26 Charles Kerr * refactor the Notifications / sound / awake code (fcd77b80) 2014-07-25 CI bot * Releasing 13.10.0+14.10.20140725-0ubuntu1 (18c9f881) 2014-07-25 Mirco Müller * Make use of the x-canonical-non-shaped-icon hint to suppress masking the symbolic icon with an UbuntuShape. Fixes: 1346925 Approved by: Charles Kerr, PS Jenkins bot (65ac3e29) 2014-07-24 Charles Kerr * add 'confirm that the screen comes on' to relevant manual tests (a7e8b219) * add tests to confirm that sleep gets inhibited, and the screen gets forced on, while a notification is shown. (d0e5dd99) * when a Snap object is destructed, delete any active Popups that it owns. This cleaner shutdown doesn't have any effect in production, but is needed to shut down the bus cleanly in the tests. (b9b3cfea) 2014-07-23 Charles Kerr * move the powerd and screen bus name, path, and interface strings into dbus-shared (909ccbc9) * remove tracer g_messages() that were used during development (e94fa94e) * handle Screen.keepDisplayOn() returning a cookie whose value is '0' (5235e604) * when an alarm is being shown, inhibit sleep and force the screen on. (2206a157) 2014-07-22 Mirco Müller * Make use of the x-canonical-non-shaped-icon hint to suppress masking the symbolic icon with an UbuntuShape. (2d702560) 2014-07-18 CI bot * Releasing 13.10.0+14.10.20140718-0ubuntu1 (3b3b4ba7) 2014-07-18 Charles Kerr * make the gcc version explicit in debian/control and debian/rules. Approved by: PS Jenkins bot (87ba2b55) 2014-07-16 CI bot * Releasing 13.10.0+14.10.20140716-0ubuntu1 (1a497059) 2014-07-16 Charles Kerr * Set a x-canonical-snap-decisions-timeout hint for the alarm snap decisions. Fixes: 1324580 Approved by: Sebastien Bacher, PS Jenkins bot, Ted Gould (1d4454b6) 2014-07-15 Charles Kerr * add a dbustest1 test to confirm that the snap decision's hint has the correct timeout interval. (013e9d6c) * Pair notify_init() with a shutdown call to notify_uninit() when the last Snap Decision is closed. (d2078fd4) * use std::chrono to get the milliseconds for notify_notification_set_hint() (eb8054f0) 2014-07-14 Charles Kerr * x-canonical-snap-decisions-timeout is int32 milliseconds (5b1f9d5e) * in debian/control, change Build-Depends to allow for different en-base language packs (86135a98) * add x-canonical-snap-decisions-timeout hint. (ff6f8c0c) * remove use of deprecated API notify_notification_set_hint_string() (0eaefcd9) * add a visual hint that the next unit test isn't stuck, it's just slow. (7c72153f) 2014-07-14 CI bot * Releasing 13.10.0+14.10.20140714.1-0ubuntu1 (5e559404) 2014-07-14 Charles Kerr * Use GStreamer's API directly to play sound instead of using libcanberra. Fixes: 1283065, 1337348 Approved by: Ted Gould, PS Jenkins bot (e213a80e) 2014-07-13 Charles Kerr * silence dead store assignment found by clang static analyzer (3c78427b) 2014-07-07 Charles Kerr * in snap.cpp, use std::call_once() as suggested by tedg (6979bfa2) * copyedit the new manual test for clarity. (19e94ca5) * use GStreamer's full volume range. (3255261d) 2014-07-03 Charles Kerr * add manual test (47e3db9d) * use the libgstreamer API instead of libcanberra to play audio sounds. (39ef7395) 2014-07-01 CI bot * Releasing 13.10.0+14.10.20140701-0ubuntu1 (2a28f458) 2014-07-01 Charles Kerr * Expose the new alarm settings as DBus properties. Fixes: 1318997 (6ad9b8d2) * Add the ability to have per-alarm custom sounds. Fixes: 1318997 (6880613b) 2014-06-30 Charles Kerr * Format the manual tests properly. Update the submitter/reviewer checklist. (194e7930) 2014-06-27 Charles Kerr * use unsigned ints for the alarm volume, duration properties (eebf8f91) * use intltool-merge to generate com.canonical.indicator.datetime.gschema.xml (a872431f) 2014-06-26 Charles Kerr * Design prefers to have a volume slider instead of presets, so remove the AlarmVolume enum and replace it with an int range. (8bb09ca0) * Expose the alarm settings via dbus properties. (c5081444) * fix test-menus.cpp build failure in clang++ (ff5881ac) * fix clang++ warning about unused private field in snap.cpp's Sound class (dda9044e) * fix clang++ warning about an unused private field in EdsEngine (90debef5) * Add Exporter's implementation to an Impl file because I'm about to shovel more methods and fields in there. (da980e33) 2014-06-25 Charles Kerr * make get_gain_level() a little easier to read. (ea8bedf5) * in snap.cpp, replace Sound::Properties with a SoundBuilder class to make the pattern use better. (f630aa9b) * omit unnecessary whitespace (c8714f2a) * make g++ 4.9 explicit (6c63582c) 2014-06-24 Charles Kerr * copyedit the new snap decision: fix linewraps, give some variables/methods clearer names, better grouping of related methods, etc. (5f59fce4) * in the snap decision code, handle sound custom loop durations (dd54649a) * add GSettings support for specifying an alarm loop duration (37383276) 2014-06-23 Charles Kerr * add support for per-alarm ringtone sounds set in EDS via E_CAL_COMPONENT_ALARM_AUDIO (0463fa76) * in the snap decision code, handle custom sounds and volume levels. (9c346273) * add GSettings support for specifying a default alarm sound and default alarm volume. (a85fd44e) 2014-06-12 Ricardo Salveti de Araujo * releasing package indicator-datetime version 13.10.0+14.10.20140611-0ubuntu3 (f6778e1c) * Migrading to Platform V2 (4faae95c) * Migrate to platform-api v2 (b7f15ec4) * releasing package indicator-datetime version 13.10.0+14.10.20140611-0ubuntu2 (26f6d14e) 2014-06-11 CI bot * Releasing 13.10.0+14.10.20140611-0ubuntu1 (0a450de5) 2014-06-11 Charles Kerr * Prefer to use ubuntu-platform-hardware-api for wakeups when possible s.t. user-defined alarms/appointments can wake up the phone from sleep to give a snap decision. Fixes: 1299916 (9eee6f01) * Use the Suru Arpeggio as the default alarm sound. Fixes: 1309063 (5e6083e7) 2014-06-11 Sergey Shnatsel Davidoff * Add Pantheon, the desktop environment of elementary Project, to OnlyShowIn lists in .desktop files. Fixes: 1301699 (e6bec351) 2014-06-11 Charles Kerr * when src/timezone-file.c reads the contents of a file, skip lines that begin with '#' Fixes: 1312775 (705c343c) 2014-06-10 Charles Kerr * remove a pair of #warning tracers (db2898b2) * Don't build the hw-alarms pieces if ubuntu/hardware/alarm.h can't be found. Don't require libplatform-hardware-api-* unless the arch is armhf, i386, or amd64. (3f7fad00) * in debian/control, remove 'Depends: libubuntu-platform-hardware-api1' as per ted's suggestion (49772635) * in MERGE-REVIEW, outline the steps needed to run hw alarm wakeup tests (f0e1d7da) * remove some debug tracers that shouldn't've been committed (a5e5f4cc) * in SimpleAlarmQueue, the 'alarms we don't want to trigger' list needs to be composed of uid + timestamp. Keying off of only timestamp doesn't work because UIDs can be recycled as users edit and reuse alarms. (03a7615f) * in UhaWakeupTimer, ensure the timeout signal gets emitted from inside a glib idle callback. (e32110f0) * in wakeup-timer-uha, sync with platform-api changes and add a safeguard to ensure the service doesn't try to sleep for an event that's already passed. (ce7397dc) * in wakeup-timer-uha, set idle wakeup to 1 day from now rather than 1 year from now. (79372164) * in engine-eds, add debug messages (3993fcd4) * in alarm-queue-simple, call requeue() if time skew is detected. (0e5acaed) * in wakeup-timer-mainloop, don't just cast to uint without checking sign. (h/t ted) (02319cb8) * in date-time.h, remove unnecessary get() call. (h/t ted) (9213d97f) * in debianl/control, add libplatform-hardware-api pieces to Depends and Build-Depends (806a7bb9) 2014-05-28 Charles Kerr * add ubuntu-touch-sounds to Recommends: b/c that provides 'Suru arpeggio.ogg' (32575799) * don't ca_context_cache() the default alarm sound, since we don't use it on desktop and caching fails on phone (170d4e9c) * use the Suru arpeggio as the default alarm sound. (9f7acc63) 2014-05-05 Charles Kerr * when src/timezone-file.c reads the contents of a file, skip lines that begin with '#' because they're comments. Add test. (2b112ebf) 2014-04-24 Charles Kerr * prefer to use ubuntu-platform-hardware-api for wakeups when possible s.t. user-defined alarms/appointments can wake up the phone from sleep to give a snap decision. (27b50030) * hw alarms (a396e6af) * rename 'clock-watcher' as 'alarm-queue' because the former name isn't very informative. (cff541ac) 2014-04-15 CI bot * Releasing 13.10.0+14.04.20140415.3-0ubuntu1 (4008e0a9) 2014-04-15 Charles Kerr * If there's a large batch of EDS events coming in, try to wait until the event storm has passed before running our requery. Fixes: 1306112 (c376385e) * copyediting: fix indentation/formatting (61af48e6) * sync with lp:~renatofilho/qtorganizer5-eds/fix-1284375's method of storing alarm urls. Happily this supercedes our code that used to call e_cal_client_get_attachment_uris(), so this means fewer round trip calls to EDS (dd8adf4f) * remove unused field Appointment.is_daily (61be4cf3) * remove unused field Appointment.is_event (0a097229) 2014-04-11 Charles Kerr * remove some extraneous EDS events on startup (0b6ccb49) * if we have a flood of EDS events coming in, wait a longer interval before requerying the EDS engine (2241aff4) 2014-04-08 CI bot * Releasing 13.10.0+14.04.20140408-0ubuntu1 (df8bb67b) 2014-04-08 Iain Lane * split_settings_location: Initialise the 'first' pointer, otherwise it points to random memory which leads to undefined behaviour. Fixes FTBFS in testsuite on arm64. (53fb2388) * split_settings_location: Initialise the 'first' pointer. (baf429be) 2014-04-04 Sergey Shnatsel Davidoff * Add Pantheon to OnlyShowIn list of the non-Upstart .desktop file (9b2ac37d) 2014-03-28 CI bot * Releasing 13.10.0+14.04.20140328-0ubuntu1 (56ae922c) 2014-03-28 Charles Kerr * Improved translator comments for better time/date localization. Fixes: 1001595 (09ea83b5) * Short-term workaround for the GIO GAppInfo wakeup bug discussed in bug 1296233 Fixes: 1296233 (2a62b1c0) 2014-03-27 Charles Kerr * add comments & examples for translators to help them to fix bug #1001595 for their locale. (7d5e6f35) 2014-03-25 Charles Kerr * work around gio wakeup bug (afc73ec8) 2014-03-24 CI bot * Releasing 13.10.0+14.04.20140324.1-0ubuntu1 (e5c36e2a) 2014-03-24 Charles Kerr * Change the desktop menu's settings menuitem's label to match the spec. Fixes: 1296585 (45abbf3d) * Remove unused dependencies from packaging. Fixes: 1120358 (7a6e36e5) * Point to the right object path for the phone greeter. Fixes: 1294832 (2176a55e) * When clicking onto a different calendar date on the Desktop, show the events for that calendar day starting at the beginning of the day, rather than the current time of day. Fixes: 1293646 (9ff3ab16) 2014-03-24 Ted Gould * Synchronize process management across indicators (6b2a9020) 2014-03-24 Charles Kerr * fix settings menuitem label on the desktop. (f88a1cf7) * restore 'override_dh_install: dh_install --fail-missing' based on seb128's feedback (thanks seb) (9b093e7c) 2014-03-23 Charles Kerr * in debian/rules, move unneeded intltool and .desktop file rules. (95e497e3) * in debian/control, remove unneeded Build-Depends libpolkit-gobject-1-dev (380b845e) * in debian/control, remove unneeded GNOME Build-Depends gnome-common, libgconf2-dev (8894e0f1) * in debian/control, remove unneeded GUI Build-Depends libcairo2-dev, libgtk-3-dev, libido3-0.1-dev, libxorg-gtest-dev (d2a5d451) * make geoclue recommended, rather than required. (ba4ba4c0) 2014-03-22 Charles Kerr * make the phone and desktop actions more consistent with each othe. eg, 'indicator.desktop.open-calendar-app' + 'indicator.phone.open-calendar-app' (18013dbb) 2014-03-21 Charles Kerr * give 'phone' and 'desktop' their own action namespaces. Fix documentation on 'activate-settings', since there are two forms of it, one for phone and one for desktop. (71f97cd0) * point to the right object path for the phone greeter. (def81465) * sync with trunk (006e75bc) 2014-03-21 CI bot * Releasing 13.10.0+14.04.20140321-0ubuntu1 (d148c14f) 2014-03-21 Charles Kerr * Add debug logging of what capabilities the notification server said it supports. Fixes: 1295271 (c776ee03) * If we notify_notification_show() fails, we shouldn't play the alarm sound. (c64ae006) 2014-03-20 Charles Kerr * sync unit tests with r325 (43196aee) * when clicking onto a different calendar date on the Desktop, show the events for that calendar day starting at the beginning of the day, rather than the current time of day. (f09e561c) * Don't play the alarm sound if we can't talk to libnotify. Otherwise we won't know when the notification's been closed to turn off the sound, and the sound will play forever. (821f2e1a) * add debug logging of what capabilities the notification server said it supports. (9c061ec3) 2014-03-14 CI bot * Releasing 13.10.0+14.04.20140314.1-0ubuntu1 (75729a4d) 2014-03-14 Charles Kerr * Don't show the "Add Event..." button if the calendar app can't be found. Fixes: 1250632 (5148b720) * Don't use EDS if we're in the greeter. Fixes: 1256130 (8c4067b5) * When the user clicks on a date in the calendar, update the "Upcoming Events" section to show events starting at that date. Fixes: 1290169, 1290171, 1291468 (9f3136ba) * slightly better testing for whether or not a date happened in the past at second granularity rather than usec (35b0a360) 2014-03-13 Charles Kerr * test for evolution with g_app_info_get_id() rather than g_app_info_get_name() (01dca64f) * sync the unit tests to the evolution startdate changes in r319 (1a8ea8bd) 2014-03-12 Charles Kerr * When invoking Evolution's calendar via the commandline and the 'startdate' argument, use a UTC argument for startdate. (78eb8516) 2014-03-11 CI bot * Releasing 13.10.0+14.04.20140311.1-0ubuntu1 (39d8fc60) 2014-03-11 Lars Uebernickel * add desktop_lockscreen profile (f5a27328) * Add desktop_lockscreen profile (684e6267) 2014-03-09 Charles Kerr * Don't list an 'Add Event…' button if there's not a calendar app available (379aeeed) * don't connect to EDS when running in the greeter. (462e8e6d) * decouple the planner's states; need three separate sets: upcoming-now (for alarms in the current time), upcoming-calendar (to show events coming from the selected calendar date), and calendar-month (all the appointments in the month displayed in the menu). (3f4d409f) * in utils.c's generate_full_format_string_at_time(), test to see if the event time occurred before the current time (375277fa) * sync unit tests (16b0ab32) * in EdsPlanner, use a Timezone instead of Timezones object (ed9d932e) 2014-03-06 Charles Kerr * In the Desktop profile, don't show the 'Add Event…' button if evolution can't be launched. (df650bec) 2014-03-02 Charles Kerr * sync with trunk (422401c1) 2014-02-27 CI bot * Releasing 13.10.0+14.04.20140227.1-0ubuntu1 (58dd68d0) 2014-02-27 Charles Kerr * When the notification engine is notify-osd, use bubble notifications instead of the phone's snap decisions. Fixes: 1283142 (7a2ac4c1) * when a notify action is activated, call stop_audio_loop() in case the notify server doesn't also send back a 'closed' signal. (00fcc7da) * when deciding whether to do a bubble or snap notification, see if the server supports actions. (e365214c) 2014-02-27 CI bot * Releasing 13.10.0+14.04.20140227-0ubuntu1 (719f3d30) 2014-02-27 Charles Kerr * In EdsPlanner's get_appointments(), sort 'em before returning them to the caller. Fixes: 1285249 (c8074804) * DateTime::format(), don't pass NULL to a std::string's assignment operator Fixes: 1285243 (e60d563f) * Don't log E_CLIENT_ERROR_NOT_SUPPORTED errors returned by e_cal_client_get_attachment_uris() -- we can silently interpret that as 'no attachments' Fixes: 1285212 (4359a9d0) 2014-02-26 Charles Kerr * when notifying of alarms on the desktop, use bubble notifications instead of a confirmation dialog + audio feedback. (a0d9eadc) * tie the stop-the-ringtone action to the notification being closed, so that it stops no matter which button was pressed. (11595598) * in EdsPlanner's get_appointments(), sort 'em before returning them to the caller. (69ed3bfc) * in DateTime::format(), don't assign NULL to a std::string (d857a4d1) 2014-02-26 Ted Gould * Update for gnome-fallback (c1f55991) 2014-02-26 Charles Kerr * don't log E_CLIENT_ERROR_NOT_SUPPORTED errors returned by e_cal_client_get_attachment_uris() -- we can silently interpret that as 'no attachments' (3ce3c805) * use the timezones object to set the ECalComponent's default timezone. This is needed to properly handle the 'floating' dates in the alarms (e5f71ea7) 2014-02-25 CI bot * Releasing 13.10.0+14.04.20140225-0ubuntu1 (bb4bb779) 2014-02-25 Charles Kerr * Fix g_assert_if_reached() in EdsPlanner::on_source_enabled(). Fixes: 1283610 (0bb962f6) * In the alarms menu, don't let iterations of recurring events drown out everything else. (653c7072) * Test the EDS component summary for NULL before using it in a std::string. Fixes: 1280341 (d31981af) * Test the EClient's color hint string for NULL before passing it to a std::string constructor. Fixes: 1283834 (3a379eaf) * don't pass a nulllptr into std::string's ctor if the EClient doesn't have a color hint. (d8dcf6f4) * In EdsPlanner::on_source_enabled(), don't use ESources that don't have calendars or tasks. (7c9e1197) 2014-02-24 Charles Kerr * test the ECalComponent's summary for NULL before passing it to our std::string. (cd7552c4) * fix typo in previous commit (936cd1a7) 2014-02-23 Charles Kerr * actually, why keep the local variable at all. Use g_menu_model_get_n_items() to see if we've reached MAX_APPTS yet. (5bae051d) * don't let each iteration of a recurring event/alarm spam out other upcoming event/alarms in the menu. (ce576453) 2014-02-19 Ted Gould * We just build it, now we're ignoring it (2ed92899) * Build an upstart override (e7842cdb) * Fix that we're starting up under Unity (516866f3) * Clean up the upstart config (c1aa03eb) 2014-02-19 CI bot * Releasing 13.10.0+14.04.20140219.1-0ubuntu1 (e3ce38f4) 2014-02-19 Ted Gould * Adding acceptance tests and merge review policies (bf7ca1ab) 2014-02-19 Charles Kerr * support for ubuntu-clock-app's alarms Fixes: 1233176, 1237752, 1255716 (359764b5) * sync with trunk (29ca2a55) 2014-02-17 CI bot * Releasing 13.10.0+14.04.20140217-0ubuntu1 (372b0a77) 2014-02-17 Robert Ancell * Move date/time panel into unity-control-center (d51b8833) 2014-02-12 Robert Ancell * Remove .install file - we have one binary package now (017cc814) * Remove gnome-control-center-datetime and unity-control-center-datetime - we don't need them (5f7bb3dd) 2014-02-11 Robert Ancell * Drop dependency on libtimezonemap1-dev (70adcb6a) * Move date/time panel into unity-control-center (50f17837) 2014-02-05 Charles Kerr * another pass at removing alarms from the menu once they're no longer upcoming. This version fixes the header's icon as well. (bf68bbe3) * when playing a sound in canberra, don't use CA_PROP_EVENT_ID if caching failed (dfd4f783) * remove upcoming events from the menu once they're no longer upcoming. (a75d4006) * revert r400; we can't block alarms by UID because that would hide recurring alarms (4f27e42b) * if an alarm doesn't have a URL associated with it, use 'appid://com.ubuntu.clock/clock/current-user-version' as a fallback url. (5c91c53c) * remove alarms from the menu once they've been shown in a snap decision. (613cbb1d) * add utils.c to POTFILES.in (131faf8f) * copyediting: make the Snap lambdas a little easier to read. (7137a652) 2014-02-05 CI bot * Releasing 13.10.0+14.04.20140205-0ubuntu1 (65eec541) 2014-02-05 Charles Kerr * Don't load the alarm icon until it's needed s.t. we don't hit click unnecessarily when starting up in the greeter. (fbe9e3b1) 2014-02-05 Sebastien Bacher * use the correct naming under unity-control-center (d9f80000) 2014-02-05 Charles Kerr * bugfix: when closing the snap decision, ensure there's not a timeout waiting to loop the ringtone (b96ba1be) 2014-02-04 Charles Kerr * add the alarm bell to the canberra cache before it gets played in a loop. (98eb9efe) * loop the ringtone until user acks the snap decision (7e2ad62f) * use %X for showing the appointment time in the title (4a563742) * Add audio notitication when the alarm is triggered. Add a manual test to tests/ to trigger a snap decision. (61581201) * use the appointment's beginning time in the title of the alarm Snap Decision (61accb9c) * pin the planner's upcoming appointments to the live clock time, rather than the calendar's time, so that they always update correctly in real-time (894c0c62) 2014-02-03 Charles Kerr * don't show snap decisions for appointments that don't have alarms. (7d1ec013) * when displaying alarms, use the 'alarm-clock' key matching the icon in ubuntu-mobile-icons (2893b128) * add src/snap.cpp to POTFILES.in (726ad7f9) * copyediting: remove a piece of dead code (86fb7d45) * add header file which should have been bzr add'ed last commit (8365f5e3) * from alarm dev branch: snap decision handler (35850dcd) * update the header state when the planner's appointments change (c4e010f1) 2014-02-02 Charles Kerr * when connecting to an ECalClient, use the proper source types for events/tasks (2934ddcc) * from alarm dev branch: add the alarm watcher and its unit tests (fcc1ab27) * aha! ubntu-ui-toolkit stores its alarms in E_SOURCE_EXTENSION_TASK_LIST instead of E_SOURCE_EXTENSION_CALENDAR. Let's handle both in indicator-datetime. (a0381136) * copyediting: use 'nullptr' instead of 'NULL' in c++ source (33425752) * copyediting: don't use camelCaseFunctionNames() in timezones-file (835daa77) * add an ECalClientView for each ECalClient to listen for changes to its components. (3e119374) 2014-01-31 Ted Gould * Switch to Upcoming (fe62f43c) * Adding merge review policy (f0a30d27) * Adding basic acceptance tests (781f69eb) 2014-01-31 Charles Kerr * use realpath() to dereference symbolic links when watching /etc/timezone. h/t pitti (5828562c) 2014-01-31 CI bot * Releasing 13.10.0+14.04.20140131-0ubuntu1 (d071e1fd) 2014-01-31 Charles Kerr * Finally land this. Other, still open bugs will be fixed in subsequent commits. Fixes: 793450, 1271484, 1274046 (089df7ae) 2014-01-30 Charles Kerr * copyediting: remove dead '#if 0''ed code (271b0fbf) * copyediting: as per review, use name_of_thing() instead of get_name_of_thing() or getNameOfThing() (a7a09a5c) * remove dead files (8564861a) * following on the review comment covered in the last commit, use shared_ptr instead of shared_ptr where possible. (19730946) * as per review, there were a few places that accidentally passed a shared_ptr& instead of a const shared_ptr& (0f384f4c) * as per review, constify getters where possible. This isn't always possible due to system APIs asking for non-const pointers. (b56293e7) * as per review, make explicit the dependency injection that was implicit in main() (fee34f52) * as per review, don't inline unless there are performance issues (cc2ad2ad) * as per review, don't inline getters (d2caa37e) * fix 'clock app' menuitem on phone profile reported by seb128 and update the corresponding unit tests (9752ca1c) 2014-01-30 Sebastien Bacher * use the correct naming under unity-control-center (bafa87ec) 2014-01-29 Charles Kerr * don't load the alarm icon until we need it, which in the case of the desktop greeter is never. (533f7c24) * remove unused old file (c0c764e0) * sync with trunk (3fb7488a) * fix disabled 'Add Event…' menuitem issue reported in testing by seb128; add a test for this regression (131f7512) * fix instant calendar toggle issue reported in testing by seb12. add a test for this regression (6b2c01ed) 2014-01-29 Sebastien Bacher * Use the correct location for datetime-dialog.ui. Fixes: https://bugs.launchpad.net/bugs/1274046. (cbb15a8f) 2014-01-29 Charles Kerr * sync with lp:~seb128/indicator-datetime/use-correct-gtkbuilder-location (a64c84b9) * sync with lp:~larsu/indicator-datetime/reset-date and add corresponding unit tests. (f07f97ef) 2014-01-29 Sebastien Bacher * Use the correct location for datetime-dialog.ui (4f30065c) 2014-01-29 Lars Uebernickel * Set calendar to the current date when the menu is popped up (c0a0b355) * Set calendar to the current date when the menu is popped up (4272a3e7) 2014-01-28 Charles Kerr * comment out unit tests that require a version of dbus-test-runner that hasn't landed yet. (9045a274) * add dbus-test-runner and python3-dbusmock to Build-Depends; they're needed by the unit tests. (81d4a258) * ensure the unit tests' default locale supports utf-8 (c3ee494e) * fix g_date_time_format() leak found by valgrind testing (a82d0fd7) * fix GDateTime leak found by valgrind testing (ae3ac73a) * fix Task leak found by valgrind testing (65b58035) * fix free-memory-read bug found by valgrind testing (416e1307) * fix bootstrap error in unit tests by ensuring we always use the local gschema instead of the one preinstalled on the system (793c6fb6) * cleanup from previous commit: since Formatter code was migrated to utils.c so that it could be used standalone by the panels, there's now code duplication between Utils and Formatter. Remove code duplication s.t. Formatter uses the Utils code as well. (fd92ac35) * make utils.cpp's generate_full_format_string_at_time() a standalone function so that the panels can use the utils functions without a libindicatordatetime dependency (ee9f4c7e) * silence compiler warning (e57a2e9b) * update POTFILES.in (1e90a7ec) * add libdbustest1-dev to debian/control's Build-Depends to pick up dbus-test-runner's dbusmock interface for the geoclue unit tests. (9aae79c6) 2014-01-27 Charles Kerr * sync with trunk (649f0174) * merge lp:~robert-ancell/indicator-datetime/call-ucc into lp:indicator-datetime (e9eb4115) * merge lp:~robert-ancell/indicator-datetime/unity-control-center2 into lp:indicator-datetime (ef84548e) * add test coverage for Exporter's name_lost signal (f320760f) * add unit tests for utils.cpp's get_timezone_name() (1c547710) * remove code duplication between formatter.cpp and utils.cpp (a268daf5) * re-enable coverage-html reports (c1ffb9cd) 2014-01-25 Charles Kerr * sync the exported calendar state with the #State backend (7b09a0ff) 2014-01-24 Automatic PS uploader * Releasing 13.10.0+14.04.20140124-0ubuntu1 (revision 294 from lp:indicator-datetime). (e099f058) * Releasing 13.10.0+14.04.20140124-0ubuntu1, based on r294 (f4599458) 2014-01-22 Charles Kerr * Alarms is going to need to know when the clock's minute changes. We already have a timer for that in Formatter, so move it from there to Clock and add a corresponding public signal Clock.minuteChanged that both Formatter and Alarms can use. Sync unit tests. (aad7e86a) * remove the local snapshot of properties-cpp and add a dependency for it in debian/control and CMakeLists.txt (e2fd6e62) 2014-01-22 Robert Ancell * Run the unity-control-center panel under Unity. Rename the unity panel to just "datetime". (fec43cc1) 2014-01-22 Charles Kerr * Remove the Timezones property from Clock; it's only needed by the subclass LiveClock (9ea8a269) * move planner-mock.h from include/datetime/ to tests/ because it's only needed by the tests. (08b1cfd6) * sync test-exporter with the greeter profile's header names that changed in r325 (063ff0ef) * copyediting: slightly better header comments/docs (0f6a8f9b) * fix r325 regression found by test-menus (039c43dc) * remove the State.timezones property. Timezones is a helper class for LiveClock and doesn't need to be public in State. (2db8f6e7) * follow-up to r326, if we can't get the alarm icon from click, use a sane fallback icon (47ab9ada) * copyediting: omit unnecessary #includes (b4a6c506) * silence a minor compiler warning in test-settings (57237747) * copyediting: rename the test/ directory's .cc files to .cpp for consistency with src/ (dd41db68) * add a broad overview of the codebase to make life easier for reviewers. (9415a7ce) * the clock icon should match the one used by the clock app, so use click to ask the clock app which icon it's using (56e03620) * plug in the greeter menus (6e447b7b) * in PlannerEds, replace g_message() console messages with g_debug() (bf30d05f) * in PlannerEds, wire in planner.thisMonth and planner.upcoming (0ec1731c) * fold repetitious unit test rules into CMake functions (f1027f7c) * add unit tests for the menu/action exporter (6d515551) * copyediting: rename Service as Exporter & tweak comments (f0fee18c) * extract LiveState to its own State subclass to make main()'s flow easier to follow (d6119296) * move DateTime's impl from the header to a cc file (2b857f6c) * remove unnecessary #includes (931e448b) * Fix GDateTime leak in DateTime::DateTime(time_t) (74fcc162) 2014-01-21 Charles Kerr * add LiveActions implementation and unit tests (74f88979) * Extract the MockState logic from state-fixture.h so that it can be reused for testing LiveActions (8910c3c2) 2014-01-22 Robert Ancell * Run the unity-control-center panel under Unity. Rename the unity panel to just "datetime" (012768da) 2014-01-16 Charles Kerr * get timezone, clock tests running again with Settings & State (2e9d3bb4) * sync with utils (6f2e235e) * fix minor -Wpedantic warnings (83dcdd84) * sync with new State class changes (06a51320) * fix minor -Wshadow warnings (5e7433aa) 2014-01-17 Robert Ancell * Support both gnome-control-center and unity-control-center. Fixes: https://bugs.launchpad.net/bugs/1257505. (4a8f2d77) 2014-01-16 Charles Kerr * update timezones-live to use Settings to tell when the user has enabled/disabled GeoClue lookups (40689ea3) * in utils.c, make a version of get_timezone_name() that doesn't require a GSettings argument. Update utils tests. (4cc19729) * Plug the Settings object into the State container s.t. menus and actions can update themselves when the user's settings change. (a2b5c791) * update SettingsLocations class to use the "Settings" class instead of using GSettings directly. (9c81a4d6) * update DesktopFormatter class to use the "Settings" class instead of using GSettings directly. (78d0a231) * Implement Settings, a properties-cpp wrapper around GSettings (bcff13b6) 2014-01-14 Charles Kerr * Function: add fully-tested ActionGroups, per-profile Menus, state object. Form: Add code annotations/comments. Remove dead code. Use Mir style guide. Todo: GSettings toggles, sync with new dbus-test-runner API, get GNOME Panel building again (ee64bb26) 2014-01-14 Robert Ancell * Recommend unity-control-center before gnome-control-center (ad761590) 2014-01-10 Robert Ancell * Support both gnome-control-center and unity-control-center (28299304) 2013-12-17 Charles Kerr * add geoclue, glib test fixtures (3b8833ef) * initial cut for syncing panel with c++ changes. this is broken. (81c3d4ca) * add other datetime header files (0e11a8ac) * add local copy of tvoss' cpp-properties. this will be removed when cpp-properties-dev lands in 14.04 (2690929a) * add locations + tests (db7b874b) * add planner + tests (38b87858) * add formatter + tests (172246c9) * add timezone-geoclue + tests (a1cb4d78) * add timezone-file + tests (36d8e8ee) * add clock + tests (060bc69d) * add cxx warnings, include/ into the include dirs (c834e012) 2013-12-17 Automatic PS uploader * Releasing 13.10.0+14.04.20131217-0ubuntu1 (revision 291 from lp:indicator-datetime). (2c8955bb) * Releasing 13.10.0+14.04.20131217-0ubuntu1, based on r291 (707292ed) 2013-12-13 Charles Kerr * Make the phone profile's header format sensitive to whether the phone is running in a 12h or 24h locale, and use a 12h or 24h notation accordingly. Fixes: https://bugs.launchpad.net/bugs/1256061. (79972de2) * try adding a build-dep of language-pack-en-base instead of configuring the locales in the unit test sandbox. (h/t seb) (b91dc2ac) * ensure that we have 12h and 24h locales installed at build time -- the unit tests need them (080af760) * let's see what g_warning jenkins found. (bb0c9077) * in test-formatter, the 12h/24h unit test doesn't need our gschema, so remove it from this MP (77608001) * in tests/, remove a couple of rules that got pulled in from the dev branch but aren't necessary here (54cf4f28) * Add tests to confirm the phone profile header's time format is sensitive to 12/24hr locales (bug #1256061) (8c89aa77) * in tests/, fix the include dirs to look at the source and binary dirs so we can pick up autogenerated headers (75b0a871) * in tests/, fix typo in schema generator rules (40f91368) * in tests/, add rules to make the Google Test library (5b5546a5) * fix minor naming error in the interim library that we link the unit tests and final product service against (358b551c) * move the phone & desktop common elements of header time format into a private util, get_default_header_time_format(), and have the phone & desktop functions call it. (5ed0920a) 2013-11-25 Automatic PS uploader * Releasing 13.10.0+14.04.20131125-0ubuntu1 (revision 289 from lp:indicator-datetime). (171d8c45) * Releasing 13.10.0+14.04.20131125-0ubuntu1, based on r289 (c9140d69) 2013-11-22 Timo Jyrinki * Add changelog entry for 13.10.0+13.10.20131023.2-0ubuntu2 (09f3c519) 2013-11-16 Charles Kerr * In src/clock-live.c, pass the right pointer to on_detect_location_changed(). Fixes: https://bugs.launchpad.net/bugs/1251460. (7c23de6a) 2013-11-14 Charles Kerr * in src/clock-live.c, pass the right pointer to on_detect_location_changed(). (2b3520c3) 2013-11-08 Charles Kerr * Use g_icon_serialize() output when setting menuitems' "icon" property. (163fdc20) * don't sink variants returned by g_icon_serialize(). Also, remove the overly complex dict_entry variants. (3802901e) * copyediting (70b6669f) * when setting a G_MENU_ATTRIBUTE_ICON property, use g_icon_serialize() output instead of a filename / themed icon name (063a6b3c) 2013-11-02 Charles Kerr * When in the desktop-greeter mode, don't allow clicking on calendar dates to launch evolution. Fixes: https://bugs.launchpad.net/bugs/1246812. (4c4adbcb) 2013-10-31 Charles Kerr * in the desktop greeter profile, don't allow the user to activate calendar dates. (833a759a) 2013-10-31 Ted Gould * Upstart Job. Fixes: https://bugs.launchpad.net/bugs/1185565. (718edebc) 2013-10-31 Charles Kerr * Don't generate g_critical() messages in the log when the timezone object is clearing its value. . Fixes: https://bugs.launchpad.net/bugs/1246532. (dec0ff40) 2013-10-31 Ted Gould * Autostart directory (49aa770c) * Merge trunk (eb47d698) 2013-10-31 Mathieu Trudel-Lapierre * Add changelog entry for +indicator-datetime (13.10.0+13.10.20131023.2-0ubuntu1) saucy-propose. urgency=low . (0439dc69) * Add changelog for 13.10.0+13.10.20131023.2-0ubuntu1 (b3740dcb) 2013-10-30 Charles Kerr * don't generate g_critical() messages in the log when the timezone object is clearing its value. (28d4e4fb) 2013-10-31 Charles Kerr * As per the spec, let users show the year in indicator-datetime. Fixes: https://bugs.launchpad.net/bugs/465689. (b5ed574e) 2013-10-30 Charles Kerr * Switch the build system to cmake. Fixes: https://bugs.launchpad.net/bugs/1237509. (bbc781d9) * remove a debug tracer that accidentally got committed (668658f3) * Add support for showing the year in indicator-datetime (19663dd8) * let service know how to launch gnome-control-center on the desktop (13cc8912) * fix DPKGDATADIR definition for locating the datetime-panel.ui file (ba22b5f0) * set GETTEXT_PACKAGE to an actual string to make dh_translations happier (074541f2) 2013-10-29 Charles Kerr * point the dbus service file at pkglibexecdir (e2bc8235) * look for indicator-datetime-service in usr/lib/*/indicator-datetime/indicator-datetime-service (ab91902a) * remove libtool reference from debian/rules (04611676) * update POTFILES.in to reflect that the g-c-c panel code's been moved to panel/ (6906984d) * remove the panel FIXME comments in data/CMakeLists.txt b/c the .ui and .desktop files are being installed now (02e2a8f9) 2013-10-28 Ted Gould * Ignore generated files (a4a5562f) * Install the autostart file (8cd9a9ca) * Add in support for XDG Autostart (83f4d6b7) * Merge trunk (26283de4) * Adding a phone_greeter profile. (19ba64b4) * Adding a phone_greeter profile (f5391531) 2013-10-28 Lars Uebernickel * datetime panel: don't try to add empty location names (d799095e) 2013-10-26 Lars Uebernickel * datetime panel: don't try to add empty location names (378c70c7) 2013-10-24 Charles Kerr * sync with trunk (24ae79c9) * Make timezone detection and localtime mockable. Fixes: https://bugs.launchpad.net/bugs/1237509. (9e2f2417) 2013-10-23 Charles Kerr * instead of keeping IndicatorDatetimeTimezone objects in separate fields, keep them in a list so they can be handled in a loop. (6da162ac) * make GObject a prerequisite of the IndicatorDatetimeClock interface. (a2f21a1d) 2013-10-18 Charles Kerr * fix a trio of pedantic gcc warnings (1e0cfb88) * tweak the default gcc warnings (88b1dfa5) * fix .desktop file generation in CMake (ad4f98ea) * replace autotools with cmake (62d01fc8) * copyediting: nobody uses this #define, so remove it (99f3bc06) * since we keep reusing the same GVariants again and again forever, cache them. (be37c5fe) 2013-10-17 Charles Kerr * when building the desktop header state, reuse the label variant (7fe0540b) * because is rarely changes, cache the GTimeZone used by indicator_datetime_clock_get_localtime() (0df37b0d) * because it rarely changes, cache the header_label_format_string. (2c63a8cd) * cache the timezone strv; lazy-rebuilding it when needed (1a898e4e) * cleanup: dead code removal, fix comments, smaller implementation of update_internal_localtime() (758a4880) * refactor the timezone and current time provider into a gobject Interface 'IndicatorDatetimeClock' (bcc04892) 2013-10-17 Lars Uebernickel * Work around glib's type initialization deadlock (f1fe8178) 2013-10-17 Charles Kerr * == Changes to planner-eds: (e38b6293) 2013-10-17 Marcus Tomlinson * Fixed datetime title text to read "Date and Time" rather than the day of the week (as per spec). Fixes: https://bugs.launchpad.net/bugs/1236400. (3cb74c56) 2013-10-16 Charles Kerr * in the alarm snap decision, add x-canonical-private-button-tint hint to highlight the 'Show' button (05c1039f) * change ok/cancel buttons to the slightly-more-informative show/dismiss (831b21bc) * sync with trunk (057066be) * use a two-button snap decision because one-button snap decisions don't show up. (42b338cd) * add a test mode for alarms. (a96e7143) * for testing purposes, fire off a snap decision as soon as the datetime indicator is started. this way one can test on phablet by running as user phablet (8dadf00b) 2013-10-16 Marcus Tomlinson * Replace "Date and Time" menu title on phone with "Upcoming" according to updated spec. (b2bdf943) 2013-10-16 Automatic PS uploader * Releasing 13.10.0+13.10.20131016.2-0ubuntu1 (revision 274 from lp:indicator-datetime). (973eb0a4) 2013-10-16 Marcus Tomlinson * Fixed date formatted string menu item to display the full name of current day rather than the shortend version. (32c75bdf) 2013-10-16 Automatic PS uploader * Releasing 13.10.0+13.10.20131016.2-0ubuntu1, based on r274 (fc8dba4e) 2013-10-16 Charles Kerr * Remove the g_error() call that caused an abort() in the call to on_name_lost() in our bus handler. Fixes: https://bugs.launchpad.net/bugs/1238737. (7de7356d) 2013-10-16 Marcus Tomlinson * Updated date formatted string in create_phone_calendar_section() from "%e %B %Y" to "%a, %e %B %Y". (a590af19) 2013-10-16 Didier Roche * remove invalid click recommends and downgrade to Suggests (a5eff35a) 2013-10-16 Charles Kerr * don't crash with a g_error() in on_bus_lost(). There's a valid case for this happening when the greeter's bus is force-shutdown (7034036e) 2013-10-16 Marcus Tomlinson * Fixed datetime title text to read "Date and Time" rather than the day of the week (as per spec). (ba2b68b8) 2013-10-16 Automatic PS uploader * Releasing 13.10.0+13.10.20131016-0ubuntu1 (revision 271 from lp:indicator-datetime). (d5c421bb) * Releasing 13.10.0+13.10.20131016-0ubuntu1, based on r271 (bd3296de) 2013-10-15 Charles Kerr * Changes the phone profile's "Clock" menuitem in two ways: (5a2e68f8) * make clock_app_icon_filename a field of IndicatorDatetimeServicePriv (6eb9b44c) * use the clock app's icon for the 'Clock' menuitem, and launch the clock app when it's clicked. (50dbb636) * cache our internal GTimeZone instead of constantly re-creating it. Fixes: https://bugs.launchpad.net/bugs/1238043. (51f27b49) * Use the Unity Mobile icon name for the alarm clock icon. (72a41485) * random fiddling: add G_UNLIKELY to the internal_timezone test (3097e267) 2013-10-14 Charles Kerr * tweak snap decision comments (8441fc4f) * ccache our internal GTimeZone instead of constantly re-creating it. (7095c0ea) * add an icon for alarm appointment menuitems (b702e834) * use ubuntu mobile's icon name for the alarm clock icon (1293e7fe) 2013-10-11 Automatic PS uploader * Releasing 13.10.0+13.10.20131011-0ubuntu1 (revision 267 from lp:indicator-datetime). (ad1a9ab5) * Releasing 13.10.0+13.10.20131011-0ubuntu1, based on r267 (b23d4229) 2013-10-09 Charles Kerr * extract-method: show_snap_decision_for_alarm (da87e44c) * more wiring in of mock objects (dae4fdd3) * preliminary implementation of snap decision (a52e3b86) * add a preliminary mock planner for testing alarms/appointments isolated apart from the EDS backend (b6b0c140) * planner-eds's is_configured() function should be private (c8a8c56f) * move the implementation of indicator_datetime_appt_free() from planner-eds.c to planner.c (bc40e6a7) * remove vestigal function declaration from planner-eds.h (ba639a9f) * move planner instantiation to main.c so that we can prepare to pass in a mock planner for testing (70487ccc) * add url activation for appointment menuitems on the phone profile. (1282befc) * remove debugging stubs (318c3e9c) * instead of testing for alarms once per minute, set a timer for the next alarm occurence. (de4e79a6) * in the case of recurring appointments, allow multiple entries with the same uid to be returned by get_appointments(). This is so the client can always find the timestamp of the instance that occurs next. (c1a34981) 2013-10-08 Charles Kerr * add a uri-searching subtask whenever we find an appointment (daccfe0b) * add a timer to periodically check to see if EDS alarms have been reached. (414c9ee4) * add a timer to test periodically to see if we've reached an EDS alarm (5485aef4) 2013-10-05 Charles Kerr * When an unsupported date format is being used, improve the error message to also include the unsupported date format so that users can include it in their bug reports. Fixes: https://bugs.launchpad.net/bugs/1196059. (5c5f6de1) 2013-10-04 Charles Kerr * fix typo in the potfile unit tests' error messages (5338030e) * don't use ascii quote marks. (866303a6) * when an unsupported date format is being used, tell what it is so that we can triage the issue. (c89170a3) * start tracking failure-to-connect-to-bus errors on indicator-datetime. Fixes: https://bugs.launchpad.net/bugs/1227519. (0437c2f1) * start tracking failure-to-connect-to-bus on indicator-datetime (4a65017c) 2013-10-04 Automatic PS uploader * Releasing 13.10.0+13.10.20131004-0ubuntu1 (revision 264 from lp:indicator-datetime). (b444d3f5) * Releasing 13.10.0+13.10.20131004-0ubuntu1, based on r264 (d3ae965a) 2013-10-03 Charles Kerr * Update settings URL to settings:///system. Fixes: https://bugs.launchpad.net/bugs/1231444. (0fb98691) * on the phone, show appointments at 1AM as '1 AM', clock times as '1:00 AM'. Fixes: https://bugs.launchpad.net/bugs/1220297. (14a60879) * phone: show appointments at 1AM as '1 AM', clock times as '1:00 AM' (d9deaaae) * Update settings URL to settings:///system (55108acd) * Change the tablet time format string to remove leading zeroes from the hour component of the time format (ie, H:MM rather than HH:MM). Fixes: https://bugs.launchpad.net/bugs/1234483. (8b4e75ea) * sync unit tests to not look for the leading zero (5b22711f) * remove the leading zero in the hour component of 'terse' time format. (68e0937c) 2013-09-30 Automatic PS uploader * Releasing 13.10.0+13.10.20130930-0ubuntu1 (revision 260 from lp:indicator-datetime). (ece762ee) * Releasing 13.10.0+13.10.20130930-0ubuntu1, based on r260 (0f52c0f5) 2013-09-26 Charles Kerr * Use url-dispatcher instead of invoking system-settings directly. Fixes: https://bugs.launchpad.net/bugs/1230819. (778244b4) 2013-09-25 Charles Kerr * Use url-dispatcher instead of invoking system-settings directly. (158a962c) 2013-09-24 Automatic PS uploader * Releasing 13.10.0+13.10.20130924.2-0ubuntu1 (revision 258 from lp:indicator-datetime). (25c81ec9) * Releasing 13.10.0+13.10.20130924.2-0ubuntu1, based on r258 (244b8007) 2013-09-23 Timo Jyrinki * Add X-Ubuntu-Gettext-Domain in .desktop file to use translations (LP: #1223498). Fixes: https://bugs.launchpad.net/bugs/1223498. (987a15c8) * Add X-Ubuntu-Gettext-Domain in .desktop file to use translations (LP: #1223498) (e221b04f) 2013-09-13 Automatic PS uploader * Releasing 13.10.0+13.10.20130913-0ubuntu1 (revision 256 from lp:indicator-datetime). (bf9d54ca) * Releasing 13.10.0+13.10.20130913-0ubuntu1, based on r256 (67f71fb0) 2013-09-11 Charles Kerr * Adds a title in the header's action state. Fixes: https://bugs.launchpad.net/bugs/1223635. (0c322f90) * in the phone profile, move the day-of-week entry from the first menuitem to the header action state's title as per the spec (9233c969) * add 'title' to the root action's state dict (06d21070) 2013-09-09 Charles Kerr * Remove code duplication between timezone-file and timezone-geoclue. (2da9d7c1) * fix typo (0b5af4ac) * name says it all; this branch is for improving indicator-datetime test coverage. (03b3c047) * in the Datetime base class, make a set_timezone() function for subclasses s.t. they don't have to reinvent the wheel. As a result, also remove the 'timezone changed' signale emitter helper (cd6fa3ba) * in utils.h, include gio/gio.h to ensure GSettings struct is declared (2bf6740a) * sync with trunk (605e4b63) 2013-09-08 Charles Kerr * This change adds a GSettings* arg to the utils functions so that they don't have to churn through temporary GSettings objects. (b7f625ed) 2013-09-08 Ted Gould * Protect against invalid begin or end dates. Fixes: https://bugs.launchpad.net/bugs/1216263. (0896192c) 2013-09-08 Charles Kerr * Minor changes that eliminate unnecessary temporary strings. (dd9d2e36) 2013-09-08 Ted Gould * Bad merge (fde292a8) 2013-09-07 Charles Kerr * get coverage reports working. We now have nonzero coverage, whoo (ecee9663) * add preliminary unit tests for utils (dd147887) * in service.c's create_locations_section(), remove an unnecessary temporary (05d0c98b) * remove unnecessary strdup/free of the location menuitems' labels (f1152966) * remove unnecessary strdup/free of the location menuitems' labels (88275c3a) * in service.c, use g_variant_new_take_string() instead of g_variant_new_string() where appropriate (ee8cd805) * in utils.c's T_(), avoid an unnecessary strdup/free (1e5db71b) * in the utils functions, add a GSettings argument for the functions that use a GSettings s.t. they don't have to keep reloading settings in a temporary every time they're called. (e2096aa3) * both service.c and utils.c have an enum for the time format mode, so share it in settings-shared.h (c81e028e) * in service.c, remove unnecessary function get_time_format_mode() (fd1d19cb) * copyediting: use G_VARIANT_TYPE_VARDICT instead of G_VARIANT_TYPE('a{sv}') (188c34d1) 2013-09-06 Ted Gould * Make all seconds a tenth of a second in bounds (dfc6f669) * Merge trunk (f5746cfe) * Making sure we have 0.1 between our bounds on the seconds (55ed2b1b) * Removing check for NULL items (f96fb5c4) 2013-09-06 Charles Kerr * Make the EDS planner nonblocking. Fixes: https://bugs.launchpad.net/bugs/1204532. (ddebe3c4) 2013-09-05 Charles Kerr * in update_appointment_lists(), safeguard against NULL GDateTimes. (f35c8eb3) * fix 'upcoming appointment' section menuitems issue reported by ted (a7d1945d) * in planner-eds, use g_atomic_int for enc/dec of the subtask_count (7eb56163) * in service.c, use g_variant_new_take_string() instead of g_variant_new_string() where appropriate (1272fff3) * in our private T_() function, avoid a couple of unnecessary strdup & frees (86333cb7) * use GSlice for allocating/freeing service's TimeLocation structs (fdd57db6) * use GSlice for allocating/freeing service's setlocation_data structs (d7940847) * use GSlice for allocating/freeing indicator appt structs (7ecf093c) * make the EDS planner completely nonblocking. (5882af6e) * update the service to use Planner's async API (f3271cfa) * change the Planner API s.t. get_appoinments() is an async function. Breaks everything (039722a9) 2013-09-04 Ted Gould * Fix GeoClue signal handler to have proper prototype. Fixes: https://bugs.launchpad.net/bugs/1195874. (c312fcce) 2013-09-03 Ted Gould * Don't unref NULLs (2a97f602) * Protect against invalid begin or end dates (9debe335) * Attaching bug (a94dccce) * Add a signal handler for the slightly different prototype. (e52036bc) 2013-09-03 Automatic PS uploader * Releasing 13.10.0+13.10.20130903-0ubuntu1 (revision 247 from lp:indicator-datetime). (f47b93ed) * Releasing 13.10.0+13.10.20130903-0ubuntu1, based on r247 (3dbb2943) 2013-09-02 Jeremy Bicha * Really don't install *.la file. (f4e0e8d8) * Don't install *.la files instead of deleting them (2f4de37b) 2013-09-01 Jeremy Bicha * Really delete *.la file (eed6a021) 2013-08-28 Automatic PS uploader * Releasing 13.10.0+13.10.20130828.2-0ubuntu1 (revision 245 from lp:indicator-datetime). (86596681) * Releasing 13.10.0+13.10.20130828.2-0ubuntu1, based on r245 (18a091e0) 2013-08-27 Ted Gould * Dropping debugging for system-wide support (0fa81384) * Adding into the package (daf88572) * Adding the upstart job configuration (beb91ed2) * Split out control center modules into its own package. (d6a96861) * Making sure we conflict with *other* packages not us (def2cbb6) * Update the version (d66258cf) * Updating version to make the Conflicts/Replace nicer; Split out gnome-control-center panel into it's own package (50dcd83d) * Clean up versions (ae5e28e5) * Change package name to 'gnome-control-center-datetime' (5b157efa) * Split out control center modules into its own package (f4031e6b) 2013-08-22 Automatic PS uploader * Releasing 12.10.3+13.10.20130822.1-0ubuntu1 (revision 243 from lp:indicator-datetime). (0226c530) * Releasing 12.10.3+13.10.20130822.1-0ubuntu1, based on r243 (f12d9e99) 2013-08-22 Iain Lane * Don't use deprecated g_simple_action_group_insert; use g_action_map_add_action instead. (a7052423) * Use month '1' when constructing the 'begin' range to decide which appointments to display. glib started validating the arguments to g_date_time_new and it turns out that '0' isn't a valid day of the month. (bb89b40d) * Don't use deprecated g_simple_action_group_insert; use g_action_map_add_action instead (26c1cfdf) * Use month '1' when constructing the 'begin' range to decide which appointments to display. (15dbc4de) 2013-07-31 Automatic PS uploader * Releasing 12.10.3+13.10.20130731-0ubuntu1 (revision 240 from lp:indicator-datetime). (67f0bb69) * Releasing 12.10.3+13.10.20130731-0ubuntu1, based on r240 (cb040694) 2013-07-30 Charles Kerr * add a phone menu as described at https://wiki.ubuntu.com/TimeAndDate#Indicator. (809982d3) * remove the leading zero from the terse time format string. (a60f5e91) * add i18n comments to get_terse_date_format_string() and get_terse_time_format_string() (d5aaabfd) * as per discussion in #systems, use 'Recommends: ubuntu-system-settings | gnome-control-center' (e94e06f6) 2013-07-26 Charles Kerr * add 'terse' time formats for phone menu to match the spec. (18012d5e) * add the phone's header action (2c8cf919) 2013-07-25 Charles Kerr * in the phone menu, add a 'Clock' menuitem above the alarm and appointment events. (23c79e10) * add a calendar icon to the todays-date menuitems as per spec (c79fd08f) * add calendar section for the phone menu (eb32ed8d) * split the phone and desktop flavors of the appointments section s.t. the phone menu doesn't have a 'Add Event…' menuitem (79bca62a) * in the appointments section, only show the next instance of recurring events. If the event is daily, say so in the time format string. (30d45a52) * Add support for displaying alarms. (7b4baac1) * for the phone menu, add a 'Time & Date settings...' menuitem to launch 'system-settings time-date' (7364cf8d) * add a (currently unimplemented) PROFILE_PHONE to our enum (909eac7b) 2013-07-25 Automatic PS uploader * Releasing 12.10.3+13.10.20130725-0ubuntu1 (revision 238 from lp:indicator-datetime). (fe279460) * Releasing 12.10.3+13.10.20130725-0ubuntu1, based on r238 (08d2503e) 2013-07-24 Charles Kerr * Add a phone entry in the datetime .indicator file. (ee9429e2) 2013-07-16 Charles Kerr * add phone profile to the .desktop file (ae8c7f0a) 2013-07-16 Automatic PS uploader * Releasing 12.10.3+13.10.20130716-0ubuntu1 (revision 236 from lp:indicator-datetime). (a33540a4) * Releasing 12.10.3+13.10.20130716-0ubuntu1, based on r236 (1e1a6ea7) 2013-07-12 Jeremy Bicha * Have 'Help' point to the Time & Date section of help. (bb64b541) 2013-07-11 Jeremy Bicha * Have 'Help' point to the Time & Date section of help (5a953385) 2013-07-08 Automatic PS uploader * Releasing 12.10.3+13.10.20130708-0ubuntu1 (revision 234 from lp:indicator-datetime). (376791bd) * Releasing 12.10.3+13.10.20130708-0ubuntu1, based on r234 (e74a1cdd) 2013-07-05 Charles Kerr * Make the desktop greeter's menu name 'desktop_greeter'. (adef10c4) * make the desktop greeter menu's name consistent across indicators: 'desktop_greeter' (8a283a4a) 2013-07-03 Automatic PS uploader * Releasing 12.10.3+13.10.20130703.1-0ubuntu1 to ubuntu. (492bfa54) * Releasing 12.10.3+13.10.20130703.1-0ubuntu1, based on r232 (0939980a) 2013-07-03 Lars Uebernickel * Set the desired position in the panel. Fixes: https://bugs.launchpad.net/bugs/1196650. (74bca3ec) 2013-07-02 Lars Uebernickel * Set the desired position in the panel (7cf97d23) 2013-07-02 Charles Kerr * make the greeter menu key consistent with indicator-session. (72afea8d) 2013-07-02 Automatic PS uploader * Releasing 12.10.3+13.10.20130702-0ubuntu1 to ubuntu. (d863966f) * Releasing 12.10.3+13.10.20130702-0ubuntu1, based on r229 (bae3c041) 2013-07-01 Charles Kerr * in service.c, use 'desktop_greeter' as the key instead of 'greeter' (3161d505) 2013-06-29 Charles Kerr * remove --enable-localinstall from this indicator, too. (67006cf8) 2013-06-28 Charles Kerr * remove --enable-localinstall options (5d05c0be) * at seb's request, use … directly in strings instead of the C octal escaped UTF-8. (64aa6445) 2013-06-28 Automatic PS uploader * Releasing 12.10.3+13.10.20130628-0ubuntu1 to ubuntu. (99a2a94d) 2013-06-28 Charles Kerr * use … directly in strings instead of the C octal escaped UTF-8. (399d653c) 2013-06-28 Automatic PS uploader * Releasing 12.10.3+13.10.20130628-0ubuntu1, based on r226 (f8b59ddf) 2013-06-21 Charles Kerr * This push extracts geoclue to its own self-contained module, fixes an errant g_critical, and merges ryan's timedate1 changes from the 13.04 branch. (854fb1a4) 2013-06-20 Charles Kerr * remove the --replace command-line argument and property as we're using upstart for that (51bd7465) 2013-06-19 Charles Kerr * in our async callbacks, don't call g_warning() when we get a G_IO_ERROR_CANCELLED (ee30bb04) * in configure.ac, add AM_PROG_AR to silence an autotools warning in the tests/ directory caused by making static local copies of libgtest (42cfd74d) 2013-06-19 Automatic PS uploader * Releasing 12.10.3daily13.06.19-0ubuntu1 to ubuntu. (05ba6fa0) 2013-06-19 Charles Kerr * in the gnome control center datetime panel, use g_bus_watch_name() to see if com.canonical.indicator.datetime is available. (22fb11bd) * put the service on the production busname (3bd2f559) * ensure datetime-dialog.ui makes it into the distribution (8efd873a) 2013-06-18 Charles Kerr * fix build breakage in tests/ (fff2cf6b) * sync po/POTFILES.in with the source code changes in src/ (07232499) * sync with lp:indicator-datetime trunk (2c0b562c) * remove TODO (c18a48d1) 2013-06-19 Automatic PS uploader * Releasing 12.10.3daily13.06.19-0ubuntu1, based on r224 (9c5c741a) 2013-06-18 Charles Kerr * rename the indicator bus file as 'com.canonical.indicator.datetime'; add it to data/Makefile (d1d65249) 2013-06-17 Łukasz 'sil2100' Zemczak * Include the missing version that got directly pushed to the distro... which is generally a bad idea. (50de20c5) 2013-06-17 Charles Kerr * make indicator_datetime_service_set_calendar_date() public. This is another one we'll need for unit tests (1d015b51) * copyediting: better variable names, function names, comments (556eb6bd) * in service.c, use GDateTime internally instead of time_t (d368216e) * in service.c, replace all calls to time(NULL) and g_date_time_new_now_local() with a call to the new 'indicator_datetime_service_get_localtime()' func. This is currently a passthrough to _new_now_local(), but we'll need this control point to override the system time in unit testing (72f23220) 2013-06-16 Charles Kerr * in planner.c, fix virtual finalize() function chaining up (49ee32fe) 2013-06-15 Charles Kerr * in src/Makefile.am, remove unnecessary gen-%.xml.[ch] rules (4ec7af23) * in service.c, fix virtual finalize() function chaining up (30dc0c76) 2013-06-14 Charles Kerr * add TODO to show status (06776754) * land the service implementation (fd12257b) * update documentation about the widgets and GActions (0fa80889) * add the .indicator file (18f93e6e) * remove build dependencies on dbusmenu, libindicator (ba84cae2) * remove the old indicator & service code (e392dd10) * minor copyediting (8002a463) * in geoclue's async callback functions, the caller owns the GErrors, we shouldn't free them. (02de1c63) * fix invocation of evolution's appointment editor (c0a3ba1c) * when we can't own the name, print a g_message saying so before exiting (bc63a95b) * remove gdk include; indicator-datetime-service no longer uses gdk (b7a6a66b) * in utils.c, remove unused function read_timezone() (eee67421) 2013-06-13 Łukasz 'sil2100' Zemczak * Fixing the changelog (360589fa) * Include the missing version that got directly pushed to the distro... which is generally a bad idea. (cf09eb8b) 2013-06-13 Iain Lane * Link test program in the right order. Importantly, make sure XORG_GTEST_LIBS comes after it as it uses pthread. (784025e4) * Link test program in the right order. Importantly, make sure XORG_GTEST_LIBS comes after it as it uses pthread. (adcf6754) 2013-06-07 Mathieu Trudel-Lapierre * Make sure we have the 12.10.3daily13.05.06.1-0ubuntu2 upload actually released. (397f360c) 2013-06-07 Automatic PS uploader * Releasing 12.10.3daily13.06.07-0ubuntu1 to ubuntu. (99c5a052) * Releasing 12.10.3daily13.06.07-0ubuntu1, based on r220 (1c5dd360) 2013-06-06 Jeremy Bicha * gnome-control-center 3.8 looks for .desktop files for native panels in the format gnome-NAMEOFPANEL-panel.desktop. (83a3f74e) 2013-06-05 Jeremy Bicha * Rename .desktop file for compatibility with gnome-control-center 3.8 (7e3cedd1) 2013-06-05 Timo Jyrinki * Mark 12.10.3daily13.05.06.1-0ubuntu2 as released. (8cef47d6) * Mark 12.10.3daily13.05.06.1-0ubuntu2 as released. (1c25791a) 2013-06-04 Mathieu Trudel-Lapierre * releasing version 12.10.3daily13.05.06.1-0ubuntu2 (98ae37d8) 2013-05-29 Iain Lane * The edataserverui library has gone away with evolution-data-server 3.8. It's unused in indicator-datetime anyway; drop the requirement. (ef91060f) * debian/control, configure.ac: Remove obsolete dependency on libedataserverui-3.0-dev (2be2bbd6) 2013-05-14 Charles Kerr * fix bzr diverged branches issue (ad29f45b) * add a service boilerplate similar to the one in indicator-session. This doesn't do anything yet; the sections will be added in subsequent commits (01bd6c3f) * document the service's actions and custom menuitems. This will also act as a workitem list for the upcoming GMenuification (358db84b) 2013-05-13 Charles Kerr * wrap globals into a struct as a precursor to turning the service code into a GObject (6bfac9d9) * minor tweak to properties array initialization (7779a357) 2013-05-12 Charles Kerr * g_object_unref doesn't require G_OBJECT() (36c6842f) * compile cleanly with -Wextra (ca06cb76) * extract EDS code into its own mockable class (b08ab642) * minor documentation & #include cleanups to the timezone classes (e897e7aa) 2013-05-06 Charles Kerr * in timezone-file, check to see if the new timezone differs from the old one before emitting a property-change notification (a2c380c8) * rename the 'DatetimeLocation' classes to the more accurate name 'DatetimeTimezone' (76422d49) * make location-file (the /etc/timezone monitor) a sibling of location-geoclue (the geoclue service monitor) (5d8b176a) * readability changes suggested by lars (cc92756a) * sync with trunk (c6db7037) 2013-05-06 Automatic PS uploader * Releasing 12.10.3daily13.05.06.1-0ubuntu1 to ubuntu. (276524d9) * Releasing 12.10.3daily13.05.06.1-0ubuntu1, based on r216 (b7c4f29f) 2013-05-04 Ryan Lortie * merge ryan's timedate1 fixes from the 13.04 branch. (34a7289c) 2013-05-03 Charles Kerr * merge ryan's timedate1 fixes from the 13.04 branch (0bc9835c) * make the flow in on_use_geoclue_changed_cb() a little easier to read (ec7db5b5) * avoid pointer comparisons in set_timezone() (ad4d799e) * merge ryan's timedate1 changes from trunk.13.04 (fde3000c) 2013-05-03 Iain Lane * Use logind instead of ConsoleKit to adjust the clock upon return from sleep. Fixes: https://bugs.launchpad.net/bugs/1156613. (aac7c2f2) 2013-05-03 Charles Kerr * fix a g_critical by calling gtk_init() before we try to get the icon size. (5e6762db) * refactor the geoclue code into its own class. (5b500193) 2013-05-03 Automatic PS uploader * Releasing 12.10.3daily13.05.02-0ubuntu1 to ubuntu. (0628bfa3) 2013-05-02 Automatic PS uploader * Releasing 12.10.3daily13.05.02-0ubuntu1, based on r213 (cba37f6b) 2013-05-02 Mathieu Trudel-Lapierre * Merge changes from /13.04 branch for saucy. (e0226f7a) * Merge changes for saucy: missing 12.10.3daily13.03.26-0ubuntu1. (228712eb) 2013-05-02 Charles Kerr * Since the calendar widget may not be created yet when visible_notify_cb() is triggered, call wrap its use in "if (IDO_IS_CALENDAR(foo))". Fixes: https://bugs.launchpad.net/bugs/1175392. (78effeb6) 2013-05-01 Charles Kerr * this is an assertion, so use g_assert() (e03ef8e4) * since we're just testing to see if the calendar's been created yet, test for NULL instead of using IDO_IS_CALENDAR_MENU_ITEM() (13b5da4c) * fix for the datetime g_critical reported by desrt (c5e72bba) * minor tyop fix: s/notfy/notify/ (8ef94b74) 2013-03-28 Mathieu Trudel-Lapierre * Merge Upload for +indicator-datetime (12.10.3daily13.03.26-0ubuntu1) raring; urgency=low + + * Use systemd's service backend, ffe lp: #1153567 + * debian/control: depends on systemd-services and systemd-shim + + -- Sebastien Bacher Tue, 26 Mar 2013 19:53:55 +0100 +. (956c8275) * merge back upload for 12.10.3daily13.03.26-0ubuntu1 (3f109ddf) 2013-03-26 Sebastien Bacher * Use systemd's service backend. Fixes: https://bugs.launchpad.net/bugs/1153567. (0c84c12d) 2013-03-26 Ryan Lortie * Port to timedated instead of gnome-settings-daemon datetime mechanism. (379d882a) 2013-03-26 Sebastien Bacher * Port to timedated instead of gnome-settings-daemon datetime mechanism (c43592ae) * Use systemd's service backend, ffe lp: #1153567; debian/control: depends on systemd-services and systemd-shim (da37d3e2) 2013-03-19 Iain Lane * Whitespace fixes (271cbd1d) * Use logind instead of UPower as the UPower interface we're relying on will go away (bfed1778) 2013-03-18 Iain Lane * Don't build with silent rules (11b887fe) * Use NotifyResume from UPower to trigger the clock adjustment on resume (a82bb8ab) 2013-03-07 Automatic PS uploader * Releasing 12.10.3daily13.03.07-0ubuntu1 to ubuntu. (139717ed) * Releasing 12.10.3daily13.03.07-0ubuntu1, based on r210 (716857aa) 2013-03-06 Michael Terry * Go back to ISO 8601 dates for the date-picker widget. This way we know how to parse it again when the user manually edits the string. Fixes: https://bugs.launchpad.net/bugs/1149696. (2a8eb08f) 2013-03-07 Michael Terry * Go back to ISO 8601 dates (52677180) 2013-03-06 Automatic PS uploader * Releasing 12.10.3daily13.03.06-0ubuntu1 to ubuntu. (0347c765) * Releasing 12.10.3daily13.03.06-0ubuntu1, based on r208 (20bb0ac5) 2013-03-05 Mathieu Trudel-Lapierre * Do the linking with -lpthread correctly. Fixes: https://bugs.launchpad.net/bugs/1126362. (6bb79c86) * Because larsu. (3e0a4a9b) * Make use of XORG_GTEST_LDFLAGS that xorg-gtest can export to know whether there are extra libraries we should link against. (7a59449e) 2013-03-04 Ryan Lortie * prefs: remove second signal connection for toggle_ntp (75073d4d) * preferences: Add CanNTP support (028e652e) * Send proper arguments for SetTime call (8b7e3b52) 2013-03-01 Ryan Lortie * Port to timedated instead of gnome-settings-daemon datetime mechanism (46cec6b8) 2013-02-06 Automatic PS uploader * Releasing 12.10.3daily13.02.06-0ubuntu1 to ubuntu. (c13de083) * Releasing 12.10.3daily13.02.06-0ubuntu1, based on r206 (b4cd547e) 2013-02-04 Colin Watson * Fix timezonefile reference leak in build_timezone. Fixes: https://bugs.launchpad.net/bugs/1111628. (87f884cb) 2013-02-01 Automatic PS uploader * Releasing 12.10.3daily13.02.01-0ubuntu1 to ubuntu. (0ae9cd39) * Releasing 12.10.3daily13.02.01-0ubuntu1, based on r204 (ae1690d1) 2013-01-31 Colin Watson * Fix timezonefile reference leak in build_timezone. (a3db7195) * Correct signatures of callbacks passed to g_object_connect. Fixes: https://bugs.launchpad.net/bugs/1110362. (9db0a7b0) * Check for NULL appointments in hide_all_appointments. Fixes: https://bugs.launchpad.net/bugs/1110398. (d65d439d) 2013-01-30 Colin Watson * Check for NULL appointments in hide_all_appointments. (70ca00dc) * Correct signatures of callbacks passed to g_object_connect. (85cad415) 2013-01-25 Automatic PS uploader * Releasing 12.10.3daily13.01.25-0ubuntu1 to ubuntu. (d5d29b4a) * Releasing 12.10.3daily13.01.25-0ubuntu1, based on r201 (3516d579) 2013-01-23 Mathieu Trudel-Lapierre * Update paths for gtest source files. (e86587ca) 2013-01-22 Mathieu Trudel-Lapierre * Update paths to gtest source. (8e878ce2) * Merge charles' branch (4e7380de) 2013-01-17 Charles Kerr * remove g_type_init() calls and bump glib minimum to 2.35.4, where g_type_init() is deprecated (0f7689e2) 2012-11-23 Automatic PS uploader * Releasing 12.10.3daily12.11.23-0ubuntu1 to ubuntu. (61f80b55) * Releasing 12.10.3daily12.11.23-0ubuntu1, based on r199 (1d5f574f) 2012-11-22 Didier Roche * Refresh copyright. (1e9fe8a7) * debian/copyright: - Update the copyright (e08ef24b) 2012-11-19 Mathieu Trudel-Lapierre * bootstrap automatic landing message. Fixes: https://bugs.launchpad.net/bugs/985060, https://bugs.launchpad.net/bugs/1064546, https://bugs.launchpad.net/bugs/1074999, https://bugs.launchpad.net/bugs/1075753. (bf614f3c) * Automatic snapshot from revision 197 (bootstrap): - Add scaffolding for Google Tests. (LP: #985060) - Add "check-news" to our AM_INIT_AUTOMAKE() call. (LP: #1075753) - Don't use geoclue until the user clicks the "Show time in auto-detected location" checkbox. (LP: #1074999) - Remove stray semicolon found by Coverity. (LP: #1064546) (5cf01331) 2012-11-16 Didier Roche * Inline package. (9c6b553f) 2012-11-16 Mathieu Trudel-Lapierre * Add libxorg-gtest-dev, libgtest-dev to Build-Depends. (233c3be5) * Override dh_autoreconf to make it use autogen.sh from upstream. (b562e831) * Add gnome-common to Build-Depends. (bf02832a) * debian/rules: - Switch to using the dh sequencer instead of cdbs rules, adjust targets accordingly. (b3c1c09b) * debian/compat: bump compat level to 9. (346b8038) * Update Vcs-Bzr and Vcs-Browser, add a notice for uploaders. (6f6b91b8) * - Reorganize Build-Depends for clarity. - Drop Build-Depends on cdbs, bump debhelper to (>= 9). (28841f9a) * debian/control: - Update to follow style like other indicator packages: use trailing commas at the end of lists. (89b3d7e2) * Specify to use split mode for building the package with bzr bd (0cfbe61c) * Import debian/ from lp:~ubuntu-desktop/indicator-datetime/ubuntu (c3a8cef3) 2012-11-07 Charles Kerr * Add scaffolding for Google Tests. Fixes: https://bugs.launchpad.net/bugs/985060. (2893be94) * one-liner to add "check-news" to our AM_INIT_AUTOMAKE() call. Fixes: https://bugs.launchpad.net/bugs/1075753. (d1bb8ca9) 2012-11-06 Charles Kerr * add check-news to AM_INIT_AUTOMAKE. (7298d24c) * add Google Test scaffolding to indicator-datetime: autotools rules, support for finding the uninstalled copy of the gsettings schema, and a 'hello world' test. (7ebd1bec) 2012-11-05 Charles Kerr * Don't use geoclue until the user clicks the "Show time in auto-detected location" checkbox. Fixes: https://bugs.launchpad.net/bugs/1074999. (ab006f93) 2012-11-05 Sebastien Bacher * releasing version 12.10.2-0ubuntu4 (d332852b) * Backported r192 and r193, fix: - "shows all-day events one day too early" (lp: #1000182) - "Bogus insensitive events after clicking on different date" (lp: #1069177) (0bc9c19a) 2012-11-04 Charles Kerr * minor copyediting in the geoclue section (e83ac166) * only use geoclue if com.canonical.indicator.datetime.show-auto-detected-location is true. honor GSettings changes for that variable to disable/enable our use of geoclue. (ce8ea326) * copyediting (b2d2e1ac) * new functions, geo_start() and geo_stop(), so that geo_client_invalid() and main() don't have to duplicate each other's code (f45aa8bf) * clarify variable names: the GeoclueMaster is 'geo_master'; the GeoclueMasterClient is 'geo_client' (e2589b09) * move geoclue variables to the geoclue section of the code (0a0f7705) * extract method geo_set_timezone() from geo_address_cb() and geo_client_invalid() s.t. modifying the geo_location variable always happens in just one place. (e0956b83) 2012-11-03 Charles Kerr * Display all-day events in localtime rather than utc. Fixes: https://bugs.launchpad.net/bugs/1000182. (60825ab6) * Fix the bug by ensuring that the dbusmenuitems in our appointment menuitem array are hidden if they're not currently in use. Fixes: https://bugs.launchpad.net/bugs/1069177. (5427edfb) 2012-11-01 Charles Kerr * in month_changed_cb(), remove the call to hide_all_appointments() to avoid flicker, same idea as previous commit. (a4700c3c) * express all-day events in the local timezone (eab1db18) 2012-10-29 Charles Kerr * in day_selected_cb(), remove the call to hide_all_appointments() to avoid flicker coming from the idle interval between this func and update_appointment_menu_items_idle(). Suggested by thjaeger. (1eaa2946) * make hide_all_appointments() do what its function name says it does. (59a7001d) 2012-10-24 Charles Kerr * fix off-by-one error in the appointments dbusmenuitem array (ef2b5d3c) 2012-10-11 Charles Kerr * remove stray semicolon found by Coverity. Fixes: https://bugs.launchpad.net/bugs/1064546. Approved by Lars Uebernickel, jenkins. (1fa395e1) 2012-10-09 Sebastien Bacher * releasing version 12.10.2-0ubuntu3 (5e96f180) * Backport "fix off-by-one error" leading to have the settings item run the calendar application rather than the control center (lp: #1064375) (324a0a5f) 2012-10-09 Charles Kerr * remove stray semicolon found by Coverity (f5dc3e7b) * fix off-by-one error in the appointments dbusmenuitem array (5c9f6467) 2012-10-05 larsu * Fix 12.10.0 bug that failed to check & see if e_cal_client_new() returned an error. (f9413135) 2012-10-05 Sebastien Bacher * releasing version 12.10.2-0ubuntu2 (f7ba1888) * Backport fix from Lars for a missing NULL check leading to segfault (lp: #1061867) (e69d16d1) 2012-10-05 Lars Uebernickel * Check return value of e_cal_client_new for NULL (618156d4) 2012-10-04 Sebastien Bacher * releasing version 12.10.2-0ubuntu1 (8e0e00ef) * New upstream release: - Fix 12.10.0 appointment calendar regression. (LP: #1060263) (8410e81a) * Import upstream version 12.10.2 (57e21f7a) 2012-10-04 Charles Kerr * 12.10.2 (afa16b90) * get i-datetime's use of the EDS 3.5 API working. (f1c8a718) * copyediting: tweak indentation (938d25fd) 2012-10-03 Charles Kerr * a timing issue was causing the appointment menuitems to be grouped into the wrong section. Resolve this by creating them at the same time as the 'Add Event...' menuitem in the same group. (33e222af) * fix r189 oops. This code would be cleaner if handled upstream in IDO... filed side ticket #1061364 for that side issue (b35e40ef) * Our client code for EDS 3.5 is triggering a periodic loop of rebuilds: (0048385e) * When showing/hiding the menu, don't change the calendar date if it's already what we want. This way we avoid unnecessary appointment rebuilds in the service. (6db1219e) * don't use gconf to see if evolution accounts are installed -- we can have calendars even if gconf returns empty (bf4edf2b) * fix populate_appointment_instances() to use ECalComponents instead of ECalClients. (82b87171) 2012-09-20 Didier Roche * releasing version 12.10.1-0ubuntu1 (d25d5903) * build-dep on newer e-d-s stack (0dadc70d) * - Gracefully handle clock skew (LP: #917236) - Raise the version number of our EDS dependency (LP: #1024437) - Fix X-Ubuntu-Gettext-Domain entries in the .desktop file (LP: #1048834) - Remove unnecessary watching for geoclue address provider changes (a0149aec) * New upstream release.; build-dep on newer libecal (f3556e6a) * Import upstream version 12.10.1 (52099c2f) 2012-09-20 Charles Kerr * 12.10.1 (3f6591ab) * When clock skew is detected, rebuild the date/time labels.. Fixes: https://bugs.launchpad.net/bugs/917236. Approved by jenkins, Lars Uebernickel. (cf60516d) * copyediting: typo tweak (3f413473) * Fix r190 typo. Yet another reminder to drink my morning coffee /before/ pushing. (b576f939) * for SKEW_DIFF_THRESHOLD_SEC and SKEW_CHECK_INTERVAL_SEC, use #define instead of enum (38c2ed7d) * move declaration of SKEW_CHECK_INTERVAL_SEC and SKEW_DIFF_THRESHOLD_SEC to the top of the file. (1ffd5307) 2012-09-19 Charles Kerr * clocks don't skew very often, so let's reduce the frequency that we test for this. (1a48f285) * in datetime-service, add a seconds timer that watches for clock skew and rebuilds the labels when it finds it (6145a631) * rename 'timer' as 'day_timer' to make room in the namespace for a second timer (69aed01b) * update all of the indicator's labels when the menu's visibility changes to true (409f65de) 2012-09-13 Ted Gould * No longer watch if the address provider changes. Approved by Charles Kerr, jenkins. (4e28e95f) 2012-09-12 Ted Gould * Stop watching the address provider change, we don't really care (eedc75e2) 2012-09-11 Ken VanDine * Removed stray lines from the desktop file, it's causing duplicate X-Ubuntu-Gettext-Domain to get added. (LP: #1048834). Fixes: https://bugs.launchpad.net/bugs/1048834. Approved by Omer Akram. (f761233c) * releasing version 12.10.0-0ubuntu2 (9414aa3c) * Removed stray lines from the desktop file, it's causing duplicate X-Ubuntu-Gettext-Domain to get added. (LP: #1048834) (5829bb99) 2012-07-24 Charles Kerr * merge lp:~charlesk/indicator-datetime/bump-eds-requirement to sync configure.ac's EDS version requirement with the EDS API level being used in the code (3655b7b5) 2012-07-13 Charles Kerr * bump eds, ical requirements to reflect new API use (d8a53546) 2012-07-13 Sebastien Bacher * releasing version 12.10.0-0ubuntu1 (a393346e) * New upstream release: - Support EDS 3.6's API - Apply an 'en space' between the date and time strings. (LP #749847) - Sort locations as spec'ed by https://wiki.ubuntu.com/TimeAndDate - Fix a bug that caused location settings to be re-saved each 2 second. debian/patches/port-eds-3.5.patch: included in the new version (ed0feadc) * New upstream release.; debian/control, debian/indicator-datetime.install, debian/rules: - drop GTK2 build it's deprecate. debian/patches/port-eds-3.5.patch: - dropped, the patch is in the new version (7cd686ac) * Import upstream version 12.10.0 (ed02493a) * releasing version 0.3.94-0ubuntu4 (d4f6a1ea) 2012-07-12 Charles Kerr * bump version to 12.10.0 (e2e14906) * cyphermox patch to support EDS 3.6's API (eb1b4aa7) 2012-06-18 Charles Kerr * merge lp:~bobowen/indicator-datetime/fix-for-749847 to apply an 'en space' between the date string and time string. (08fe1c78) 2012-05-25 Jeremy Bicha * releasing version 0.3.94-0ubuntu3 (f08a6599) 2012-05-25 Bob Owen * src/utils.c - generate_format_string_full - Changed space between date and time to Unicode en space. Added using UTF-8 hex encoding (0xE28082) to avoid the need to mess with CFLAGS to add std=c99. (LP: #749847) (0ec41cb0) 2012-05-21 Charles Kerr * merge lp:~charlesk/indicator-datetime/lp-833325 to have locations follow the sort order specified in https://wiki.ubuntu.com/TimeAndDate (a93b2144) * merge lp:~charlesk/indicator-datetime/unnecessary-saves to fix a bug that caused the location settings to re-saved every time update_times() was called (which is periodically every 2 seconds). (12a756e9) 2012-05-17 Charles Kerr * Modify the timezone location sorting to follow mpt's design at https://wiki.ubuntu.com/TimeAndDate (b5131502) * Add the "Time in auto-detected location" setting described in https://wiki.ubuntu.com/TimeAndDate (da61c2a6) * fix a bug that caused the location settings to re-saved every time update_times() was called (which is periodically every 2 seconds). (fa15f08c) 2012-05-08 Charles Kerr * raise the minimum gtk version to 3 (bb897860) * remove AC_ARG_WITH (f07f4e17) 2012-05-07 Charles Kerr * require gtk3 (8c6f9586) 2012-04-23 Charles Kerr * sync with lp:indicator-datetime (4b554f02) * merge lp:~ted/indicator-datetime/lp773987 to switch the parsing of the lat and long to be non-locale based as it's returned from the webservice in C, we want to parse it using the decimal instead of a comma. (bd456c3b) * merge lp:~charlesk/indicator-datetime/shush to silence a couple of console warnings when the calendar app is disabled. (2ec7b1e0) * merge lp:~charlesk/indicator-datetime/lp-986881 so that indicator_datetime_panel's dispose() method will call the superclass' dispose() method. (d3b9fd16) 2012-04-22 Charles Kerr * minor: silence two console warnings when the calendar app is disabled. (51d32ea7) * indicator_datetime_panel's dispose() method needs to chain up to the superclass' dispose() method (6ea86411) 2012-04-18 Ken VanDine * releasing version 0.3.94-0ubuntu2 (b952244e) 2012-04-18 Ted Gould * Use the same function here as well, just to ensure we're consistent (31125e1a) * Make it so that we parse the long and lat in a locale independent way (bb58a4eb) * Attaching bug (077263a4) 2012-04-05 Sebastien Bacher * releasing version 0.3.94-0ubuntu1 (5683a5c3) 2012-04-04 Charles Kerr * releasing version 0.3.94-0ubuntu1~ppa1 (dd5e0995) * New upstream release. * Fix location timezone sorting issue. * Clicking the systems settings window shouldn't close the Locations dialog. (LP: #947315) * Add gcov targets to autotools build for code-coverage reporting. (be334e9a) * Import upstream version 0.3.94 (75d3c8be) * Sync from Ubuntu Desktop (fdd6962b) * 0.3.94 (5a12bc3c) (tag: 0.3.94) 2012-04-03 Charles Kerr * merge lp:~allanlesage/indicator-datetime/TDD to remove a dependency on gcovr, move gcov targets to their own makefile, and clean up .gcno files. (425513bc) 2012-04-02 Charles Kerr * merge lp:~charlesk/indicator-datetime/fiz-tz-offset to fix a timezone sorting issue reported by seb128 and diagnosed by desrt. (6e1ebe98) * clicking the systems settings window shouldn't close the Locations dialog. (89775c23) * fix timezone sorting issue reported by seb128 and diagnosed by desrt (d89b4e7c) 2012-03-29 Charles Kerr * clicking the systems settings window shouldn't close the 'Locations' dialog. (6bf7c1c7) 2012-03-29 Ken VanDine * releasing version 0.3.93-0ubuntu1 (8f8841c3) * releasing version 0.3.93-0ubuntu1 (903b02b9) * New upstream release. * Fix g-c-c crash caused by datetime's prefs panel (LP: #942450) * Fix several memory leaks in datetime's preferences page (LP: #965533) (ff0bb754) 2012-03-28 Charles Kerr * releasing version 0.3.93-0ubuntu1~ppa1 (87272094) * New upstream release. * Fix g-c-c crash caused by datetime's prefs panel (LP: #942450) * Fix several memory leaks in datetime's preferences page (LP: #965533) (e36470f0) * Import upstream version 0.3.93 (5261e7f8) * Sync from Ubuntu Desktop (ed69123d) * 0.3.93 (249fa0ac) (tag: 0.3.93) * on shutdown, free icaltimezone's builtin timezones. (0a3662be) * ensure that our ntp_query_answered() and tz_query_answered() dbus callbacks are cancelled when the datetime prefs page is disposed (da5768e5) 2012-03-27 Charles Kerr * cancel the ntp_query_answered() and tz_query_answered() callbacks when the prefs panel is disposed. (073a3f7b) 2012-03-27 Allan LeSage * Removed gcovr dependency, moved coverage targets to own makefile, cleaning up *.gcno. (a7f9455d) 2012-03-27 Charles Kerr * free icaltimezone's list of builtin timezones when shutting down (9f7477e2) 2012-03-26 Charles Kerr * merge lp:~charlesk/indicator-datetime/fix-location-leak to fix several memory leaks in datetime's preferences ui reported in lp bug #965533 (c98bbd86) 2012-03-21 Ken VanDine * releasing version 0.3.92-0ubuntu1 (1ee82f0d) * New upstream release. * Fix several memory leaks (LP: #772340, LP: #957320) (deda5d1a) 2012-03-21 Charles Kerr * releasing version 0.3.92-0ubuntu1~ppa1 (60d841f8) * New upstream release. * Fix several memory leaks (LP: #772340, LP: #957320) (ebb2aa10) * Import upstream version 0.3.92 (7eb6ba32) * Sync from Ubuntu Desktop (827c79ed) * 0.3.92 (bee48b66) (tag: 0.3.92) 2012-03-20 Charles Kerr * fix more leaks related to getting strings from COL_NAME and COL_ZONE... these columns are of type G_TYPE_STRING, so we need to g_free() the copies that we pull from the model with gtk_tree_model_get()... (c1941306) * improvements based on feedback from desrt (ae3ad074) * merge lp:~charlesk/indicator-datetime/lp-772340 to fix some memory leaks related to appointments in indicator-datetime (c09df946) 2012-03-18 Charles Kerr * leak: fix ESourceList leak in update_appointment_menu_items() (763210ba) * leak: fix GdkPixbuf leak when setting up appointments (e17c55cf) * minor: fix inefficient GSList walking -- only walk a GSList once instead of twice per node (c31a4b20) * leak: fix the comp_instance struct leaks allocated in populate_appointment_instances() from update_appointment_menu_items(). The list was freed, but not the structs pointed to by the list. (881607df) * don't subtract one time_t from another (69995999) * leak: plug leaks related to use of gconf_client_get_list() (15233237) * minor: use g_clear_error() instead of g_error_free() (54b21fbd) * leak: fix GError leaks (2b461cba) 2012-03-16 Charles Kerr * fix memory leak when saving user-specified timezone locations (1f055482) * plug a string leak when updating the appointments (343fa368) * minor: remove unnecessary nesting (f281d28d) * plug a string leak when updating appointments (7e07badc) 2012-03-09 Sebastien Bacher * releasing version 0.3.91-0ubuntu1 (ad979590) 2012-03-08 Ted Gould * releasing version 0.3.91-0ubuntu1~ppa1 (fa7f146f) * New upstream release. * Make GSettings readonly to fix DConf service starting on boot * Explicitly give types to GVariant Builder * Confirm scanf usage for Coverity (LP: #943747) * Remove unused code (LP: #943746) * Fix timezone ordering in the menu (LP: #833325, LP: #833337) (3c12ac55) * Import upstream version 0.3.91 (b5c19e04) * 0.3.91 (4d71bb4b) (tag: 0.3.91) * Change GSetting bindings to be read only (7a2e7cc2) * Specify types explicitly to GVariantBuilder (918e8e37) 2012-03-07 Ryan Lortie * Establish read-only bindings to GSettings from the indicator (562575c9) * more GVariantBuilder vs. G_VARIANT_TYPE_ARRAY fixes (79e0a6fd) 2012-03-05 Charles Kerr * merge lp:~charlesk/indicator-datetime/fix-943747 to silence the Coverity warning reported in bug #943747 (82434d1e) * merge lp:~charlesk/indicator-datetime/lp-943746 to fix the warning that Coverity reported in bug #943746 (cf0bf58d) 2012-03-03 Charles Kerr * In Bug #943747, Coverity reported that use of sscanf() needed to be inspected by a human to verify there aren't buffer overruns. This commit adds /* coverity[secure_coding] */ to the lines before the calls to tell Coverity that they've been checked. (daa799fa) * remove unused code in populate_appointment_instances(). (ad84560f) * merging lp:~charlesk/indicator-datetime/fix-833337 and lp:~charlesk/indicator-datetime/fix-leaks (a7ffebd9) 2012-03-02 Charles Kerr * simplify the code by removing special handling for geo_location and current_location, and adding them to the same 'locations' list that we use when pruning duplicates from the user-specified list of locations (ad8b10b4) * use g_return_if_fail() instead of g_assert() in the new code (25994587) * remove duplicate timezone entries (ece0242d) 2012-03-01 Charles Kerr * rename dconflocations as location_menu_items (53b0569f) * make update_timezone_menu_items() a void function; its args and return value were unused (817baff6) * make the private fields 'conf' and 'gconf' static and init them to NULL (e2cd4896) * more use of g_clear_object() where appropriate (176b64b5) * in dispose(), add g_clear_object() for priv.ido_calendar and priv.service_proxy_cancel (8be0daf8) * tweak: use g_clear_object() in dispose() (4586df05) * fix potential minor memory leak in update_timezone_menu_items() (cf8ba28a) * remove unnecessary strdup+free in update_appointment_menu_items() (a8a5a791) * fix memory leak in update_appointment_menu_items() (9e8aae21) * fix memory leaks in day_selected_double_click_cb() (25e9f143) * extract method on common code (37e796d3) 2012-02-20 Sebastien Bacher * releasing version 0.3.90-0ubuntu1 (39bc08ed) 2012-02-17 Ted Gould * releasing version 0.3.90-0ubuntu1~ppa1 (ade1e121) * debian/patches: Removed, all upstream. (b55ef2ff) * debian/control: * Bumping libdbusmenu requirement to 0.5.90 * Added dependency on libtimezonemap (b37ad747) * New upstream release. * Still need to distribute these files even if we're not building it * Adding some extra ignore stuff in * Adding in code coverage calculation * Allow ccpanel to be optional * Move to use libtimezone map * Add a name hint on the indicator * Build fixes for updated dependencies * Fixing Geoclue support (f8ca95b2) * Import upstream version 0.3.90 (52d15e40) * 0.3.90 (59ade0a5) (tag: 0.3.90) * Still need to distribute these files even if we're not building it (fdbd2204) * Adding some extra ignore stuff in (951e07bf) * Merging in Ubuntu Desktop (6e60a40e) * Adding in code coverage calculation (f050e7bc) 2012-02-15 Charles Kerr * lp:~ballogy/indicator-datetime/make-ccpanel-optional (b18a7b81) * lp:~mterry/indicator-datetime/libtimezonemap (ed432b43) * lp:~charlesk/indicator-datetime/refix-844741 (9756029c) * lp:~jjardon/indicator-datetime/fix-836017 (891f491a) * re-fix bug #84471 for trunk (4727ba29) 2012-02-14 Charles Kerr * merging Treviño's lp:~3v1n0/indicator-datetime/add-name-hint (e89e4271) * Charles Kerr 2012-02-14 Fix FTB when deprecation warnings are enabled (ecaf8726) * Fix FTB when deprecation warnings are enabled (895a0a2c) * merge ted's indicator-datetime-trunk build fixes (6749bbb5) 2012-01-31 Ted Gould * Fixing include paths (460b479a) * Updating dbusmenu-gtk to 0.5.90 (d5ba046b) 2012-01-25 Ken VanDine * releasing version 0.3.1-0ubuntu5 (4a217579) 2012-01-24 Ken VanDine * no change rebuild for libindicator7 (bf6cda68) 2012-01-23 Martin Pitt * releasing version 0.3.1-0ubuntu4 (772115cb) * Add disable_Werror.patch: Disable -Werror, causes build failures due to deprecated symbols. (6104c44c) * Migrate from libpolkit-gtk-1-dev to libpolkit-gobject-1-dev. (666184e6) 2012-01-13 Mathieu Trudel-Lapierre * releasing version 0.3.1-0ubuntu3 (d7f6dc74) * Rebuild for the new e-d-s libraries. debian/patches/gtk_box_api.patch: port gtk_hbox_new() to gtk_box_new() if building for GTK3, no change if building against GTK2. (91fead52) 2012-01-09 Michael Terry * and move TimezoneCompletion to libtimezonemap too (fe58c785) * use libtimezonemap (49965d03) * use notdir when generating the .gir to allow out-of-tree builds (c5e62b64) * fix deprecation warnings (dd5f403c) 2011-12-13 Ted Gould * Fixing Geoclue support (b9836332) 2011-12-06 Allan LeSage * Added coverage reporting via gcov config and targets. (4b4a2a0b) 2011-11-23 György Balló * Make Control Center panel optional (78e08268) 2011-11-08 Marco Trevisan (Treviño) * Export the name_hint (17b9be58) 2011-10-28 Ken VanDine * releasing version 0.3.1-0ubuntu2 (2839a028) 2011-10-23 Ted Gould * Attaching bugs. Uhg (fd7d20aa) * Fixing a bad check for GeoIP object validity. Adding an error check which is better anyway. (59ea5c3b) 2011-10-13 Ken VanDine * releasing version 0.3.1-0ubuntu1 (d6920670) * New upstream release. * Drop an unused icon (LP: #746176) * Fix showing a timezone that we're currently set to (LP: #833337) * Remove check for libunique as it's unuse. debian/control: Drop libunique requirements, it was unused (98632255) * releasing version 0.3.0-0ubuntu3 (b2d90212) 2011-10-13 Ted Gould * releasing version 0.3.1-0ubuntu1~ppa1 (9f5bd6e8) * debian/control: Drop libunique requirements (10c82dba) * New upstream release. * Drop an unused icon (LP: #746176) * Fix showing a timezone that we're currently set to (LP: #833337) * Remove check for libunique as it's unused (4a0a5d5f) * Import upstream version 0.3.1 (09dcfec3) * 0.3.1 (ba87e5cb) (tag: 0.3.1) * Removing unused libunique (023fa26a) * Checking to see if the timezones match (c8c930ff) 2011-10-12 Ted Gould * Check to see if we're in the same timezone as default (14bd650e) 2011-10-11 Ted Gould * Removing icon from window. (010d4d2c) 2011-10-06 Javier Jardón * Remove use of window icon (6f78eb0a) 2011-10-05 Ken VanDine * releasing version 0.3.0-0ubuntu2 (e86b7139) 2011-10-05 Javier Jardón * Remove libunique dependency as Its not needed anymore (28cacfec) 2011-10-04 Javier Jardón * datetime-service: Be sure to free the returned list (c6a2cec0) 2011-10-03 Javier Jardón * datetime-service: Free accounts list in the correct place (d17c6fcb) * datetime-service.c: Only show "Add Event..." if we have an email account (e3d99cf9) 2011-09-29 Ken VanDine * releasing version 0.3.0-0ubuntu1 (2f51b432) * New upstream release. * Fix corrupt environment when LANGUAGE not set (LP: #861123) * Measure string size with GLib (LP: #730476) * Free ECals when they have errors (LP: #774071) * Fix untranslated string (LP: #853130) (31bf779f) 2011-09-29 Ted Gould * releasing version 0.3.0-0ubuntu1~ppa1 (e569f3e9) * New upstream release. * Fix corrupt environment when LANGUAGE not set (LP: #861123) * Measure string size with GLib (LP: #730476) * Free ECals when they have errors (LP: #774071) * Fix untranslated string (LP: #853130) (521526d7) * Import upstream version 0.3.0 (4e2dc05c) * Merge from Ubuntu Desktop (d6dcd673) 2011-09-29 Ken VanDine * debian/control - Added recommends for e-d-s (95fcdc5a) 2011-09-29 Ted Gould * 0.3.0 (c2fbaa0a) (tag: 0.3.0) * Unref Cals in error situations (fc770e95) 2011-09-29 Antti Kaijanmäki * Fix 100% CPU usage (LP: #774071) (8c01596f) 2011-09-29 Ted Gould * Protect setting or unseting the env if we don't have it already. (6e9eb952) 2011-09-28 Robert Ancell * Don't call setenv when value is NULL (43a5a69e) 2011-09-21 Jörn Horstmann * Use g_datetime() to measure string (6 LOC) (b1bbe3c1) 2011-09-21 Ted Gould * Moving setting the translation domain for builder to earlier (92cfa6c3) 2011-09-18 Gabor Kelemen * Set translation domain before gtk_builder_add_from_file, in the other file too. LP: #853130 (d42f49e0) 2011-09-15 Didier Roche * releasing version 0.2.95-0ubuntu1 (1fc2f7a8) * debian/control: - bump the libglib build-dep (c56d9e2e) 2011-09-15 Ted Gould * releasing version 0.2.95-0ubuntu1~ppa1 (b2dfc107) * Update to release 0.2.95 (3b73d2cf) * Import upstream version 0.2.95 (1e2f73f7) * 0.2.95 (1272ced6) (tag: 0.2.95) * Dropping the wall clock branch. Bad touch. (8a4ba277) * New upstream release. * Set default timezone on events without (LP: #837359) * Update docs to specify correct custom formats (LP: #775113) * Use GNOME wall clock interface for time (LP: #837440) * Remove add event when using greeter (LP: #836521) * Fix gettext domain for builder files (LP: #845473) * Update date correctly when opening menu (LP: #793450) (34a42266) * Import upstream version 0.2.94 (59a60d1e) * Merge in Ubuntu Desktop fixes (8f8de9ac) * 0.2.94 (d6580b42) (tag: 0.2.94) * Use the GNOME Wall Clock interface (5f8e3e3e) * Set the builder language before opening the file (1231071a) * Update comments to discuss the new format options in glib (19191707) 2011-09-09 Gabor Kelemen * Set translation domain before the gtk_builder_add_from_file call. LP: #845473 (65fc1568) 2011-09-06 Ted Gould * Some optimizations to the private pointers and a const (ee903973) * Remove unused code (372e5dc7) * Checking for pow (8cb82dda) 2011-09-06 Javier Jardón * Remove death code: calendar-menu-item (34acc7b2) * configure.ac: Check for 'pow' in math library (3ea3c06f) * indicator-datetime.c: Use G_GNUC_CONST in the type declaration (46ab5ac5) * indicator-datetime.c: Use private pointer instead GET_PRIV macro (5a40e16a) * timezone-completion: Use private pointer instead GET_PRIV macro (c46efc32) 2011-09-05 Javier Jardón * indicator-datetime: Update the desktop schema when showing seconds (87eaa8d2) * indicator-datetime.c: Fix typo (ef6479a9) * datetime-service: Fix typo (b36e02a7) * indicator-datetime.c: Use GnomeWallClock instead of periodic timeout (805b0b28) * configure.ac: Bump glib required version (5638139a) * Bump gnome-desktop required version to 3.1.91 (b9e51f01) * Use GnomeWallClock instead of periodic timeout (e4fed018) 2011-09-02 Javier Jardón * Warning when the user use a date format not supported (0fad515e) 2011-09-01 Espen Wiborg * Set default timezone on events (1ab5a36d) 2011-08-31 Ted Gould * Remove visibility check so we can update the date before we're visible. (a748ceb9) * Check for greeter mode to whether we should show Evolution options. (cfd56b9c) 2011-08-31 Michael Terry * disable evolution functionality when in greeter mode (59d57493) 2011-08-26 Ken VanDine * releasing version 0.2.93-0ubuntu2 (ba160425) (tag: 0.2.93-0ubuntu2) 2011-08-25 Javier Jardón * Update the date when open the indicator-datetime menu (4207f22a) 2011-08-18 Ken VanDine * releasing version 0.2.93-0ubuntu1 (08c0fb72) (tag: 0.2.93-0ubuntu1) * New upstream release. ∘ Use cleaner GDateTime API ∘ Use locale preferred date format (LP: #729056) ∘ Use real ellipsis (LP: #621339) (823c619a) 2011-08-18 Ted Gould * releasing version 0.2.93-0ubuntu1~ppa1 (4cf539ba) * Adding a bug number (9247ad12) * New upstream release. ∘ Use cleaner GDateTime API ∘ Use locale preferred date format ∘ Use real ellipsis (LP: #621339) (aa0da73e) * Import upstream version 0.2.93 (70ef2f0a) * Sync from U. Desktop (45d0776e) * 0.2.93 (5298a395) (tag: 0.2.93) 2011-08-17 Ted Gould * Use cleaner gdatetime (09f6c57c) * Use locale prefered date format (d6387351) * Fixing ellipsis to be true ellipsis (1ade3ddc) 2011-08-17 Javier Jardón * Set the correct month number (ac74e3a3) 2011-08-16 Ken VanDine * releasing version 0.2.92-0ubuntu1 (8b224a3a) (tag: 0.2.92-0ubuntu1) * New upstream release. * Adding in a new greeter mode * Fixing autotools (c1c8b40a) 2011-08-16 Javier Jardón * Use the new GDateTime glib API to deal with time (8d74e5b4) * Show the preferred date representation for the current locale (d8c9e950) 2011-08-12 Ken VanDine * releasing version 0.2.91-0ubuntu3 (5e71d57c) (tag: 0.2.91-0ubuntu3) 2011-08-11 Ted Gould * releasing version 0.2.92-0ubuntu1~ppa1 (5c578868) * New upstream release. * Adding in a new greeter mode * Fixing autotools (31f6c68e) * Import upstream version 0.2.92 (9edb75b4) * Update to U. Desktop (a60db303) * 0.2.92 (535f3a15) (tag: 0.2.92) 2011-08-10 Ted Gould * Add a greeter mode (67a67488) 2011-08-05 Jeremy Bicha * Use real ellipsis (LP: #621339) (c287dc42) * Spell out "and" to match other System Settings panels (ecd294fa) 2011-08-03 Michael Terry * don't show timezones or settings links when used in a greeter (ed5958ee) 2011-07-22 Ted Gould * Autotools cleanup (f356334f) 2011-07-20 Javier Jardón * Update autotools configuration a bit (470d4229) 2011-07-14 Michael Terry * don't unref a NULL GDateTime object; original patch by Dave Gilbert (a1d45648) 2011-07-12 Ken VanDine * releasing version 0.2.91-0ubuntu2 (6457fa33) (tag: 0.2.91-0ubuntu2) 2011-07-08 Ken VanDine * releasing version 0.2.91-0ubuntu1 (cae607b7) (tag: 0.2.91-0ubuntu1) * New upstream release. * libindicator 0.4 transition * Making preferences a gnome-control-center plugin * Calling gnome-control-center from the menu * Fixing timezone setting with new gsd; Dropped debian/patches/fix-timezones.patch: merged upstream (5b77a3ae) 2011-07-07 Ted Gould * releasing version 0.2.91-0ubuntu1~ppa1 (af8dd737) * Dropped debian/patches/fix-timezones.patch: merged upstream (5061c7ab) * New upstream release. * libindicator 0.4 transition * Making preferences a gnome-control-center plugin * Calling gnome-control-center from the menu * Fixing timezone setting with new gsd (732b5f6b) * Import upstream version 0.2.91 (1819f029) * Merging U. Desktop (64b44289) * 0.2.91 (51c6800c) (tag: 0.2.91) * Making the preferences a gnome-control-center plugin instead of a stand alone app (b6485447) * Making the preferences call gnome-control-center and the datetime panel (62a1ba2b) * Fix timezone setting and reading (68f2f981) 2011-06-29 Michael Terry * port preferences to be a control-center panel (5d36567c) 2011-06-29 Rodrigo Moya * Use gnome-control-center datetime panel for settings (6cc4cde6) 2011-06-28 Michael Terry * No change rebuild to fix badly packaged diff.gz from last tim. debian/rules, debian/control: - Arg, this wasn't source format 3.0, so add quilt so that the patch applies. (33d9b7f2) * debian/control: - Drop -gtk2 recommends for the gtk3 indicator * debian/rules: - Use dh-autorecon. debian/patches/fix-timezones.patch: - Add patch to handle g-s-d DBus API change for timezones and to be more robust about querying what the current timezone is (5e9dc546) (tag: 0.2.90-0ubuntu2) * update to handle latest gnome-settings-daemon dbus API for setting timezones; be more fool-proof when looking up current timezone in indicator (f57128ca) 2011-06-22 Ken VanDine * releasing version 0.2.90-0ubuntu1 (4a2c7a22) (tag: 0.2.90-0ubuntu1) * New upstream release. - Set minimum width for appointments to prevent continuous resizing when the calendar is hiden and ensure there is enough of the event description visible (LP: #762976) - ellipsize long appointment descriptions (LP: #750671) - GTK3 build; Dropping debian/patches/lp_762976.patch and debian/patches/lp_750671.patch as merged upstream. debian/control: Switching dep to libedataserverui-3.0-dev * Upstream Merge * Ellipsize calendar entries that are too long (LP: #750671) (be0557bd) 2011-06-21 Ted Gould * releasing version 0.2.90-0ubuntu1~ppa1 (d84d6a67) * debian/control: Switching dep to libedataserverui-3.0-dev (c17c99de) * - Set minimum width for appointments to prevent continuous resizing when the calendar is hiden and ensure there is enough of the event description visible (LP: #762976) - ellipsize long appointment descriptions (LP: #750671) - GTK3 build; Dropping debian/patches/lp_762976.patch and debian/patches/lp_750671.patch as merged upstream. (7c382b43) * New upstream release. (e8e11172) * Import upstream version 0.2.90 (7cb01301) * Merge Ubuntu Desktop (f23f3aee) * 0.2.90 (3c5f6a06) (tag: 0.2.90) * Spelling fix (9ff173cc) * GTK 3 Support (4102a7b9) 2011-06-15 Michael Terry * finish port to gtk3 (7f2f5fbb) 2011-06-05 Evgeni Golov * fix two spelling mistakes spotted by lintian (5325c7a9) 2011-04-18 Ken VanDine * releasing version 0.2.3-0ubuntu3 (5b1027bd) (tag: 0.2.3-0ubuntu3) 2011-04-18 Ted Gould * Ensuring the minimum width if there is no calendar. (7b878caf) 2011-04-18 karl-qdh * indentation (969771d6) * merge back in with old branch (15f8a533) * min/max width for appointments (00518ac9) 2011-04-15 Ted Gould * releasing version 0.2.3-0ubuntu2~ppa1 (548daa53) 2011-04-15 Ken VanDine * releasing version 0.2.3-0ubuntu2 (ae1d80c9) (tag: 0.2.3-0ubuntu2) 2011-04-15 Ted Gould * Upstream Merge * Ellipsize calendar entries that are too long (LP: #750671) (cf82ce1c) * Merge U. Desktop (a8c851e1) * Short appointment names (9f48d2fd) 2011-04-15 karl-qdh * Prevent long appointment titles making the menu too wide (446385cf) 2011-04-14 Ken VanDine * releasing version 0.2.3-0ubuntu1 (2894eed6) (tag: 0.2.3-0ubuntu1) 2011-04-14 Ted Gould * releasing version 0.2.3-0ubuntu1~ppa1 (0a0c90e6) * New upstream release. ∘ Use GTK directly for detecting when the menu appears and disappears ∘ Handle items being removed from the locations list by choosing ∘ Check for resume in the service and update the label as well (LP: #759854) (653faaea) * Import upstream version 0.2.3 (c187878a) * 0.2.3 (b5bb5856) (tag: 0.2.3) * Check for resume in the service and update the label as well (9c71fd07) 2011-04-13 Michael Terry * watch for resume in the service, not the indicator; update today's menu label after resume (0ecb2dd4) 2011-04-12 Ted Gould * releasing version 0.2.2-0ubuntu2~ppa1 (980177af) * Upstream Merge * Use GTK directly for detecting when the menu appears and disappears to reset the date (LP: #649800) * Handle items being removed from the locations list by choosing another item in the list (LP: #740948) (6e96a11f) * Crazy distro people have revisions too. (d4dc8fa6) * If an item is removed, make sure we choose one. (8603d94b) * Work around libindicator not sending a close event by looking for it directly in the indicator (bf82669e) 2011-04-11 karl-qdh * Fixed niggles (ea0c8c5e) * syntax fail (54a4bf27) * Improve debug messages and only react when hiding (22a5e34e) * Calendar reset, should work for mike (9e768e97) * Make selection change on remove item (ee7a2230) 2011-04-07 Ken VanDine * releasing version 0.2.2-0ubuntu1 (5389f657) (tag: 0.2.2-0ubuntu1) 2011-04-07 Ted Gould * releasing version 0.2.2-0ubuntu1~ppa1 (adea7dfe) * New upstream release. ∘ Add language and proper distro version to geonames URL to allow for proper server side fixes ∘ Give full day events the day name instead of a time ∘ Make sure the calendar follows the user setting (LP: #748772) ∘ Ensure that events handle month boundaries correctly (LP: #746713) ∘ Only show calendars the user has configured (LP: #729033) ∘ Reenable clicking on the timezone in the menu to set it. (8028b594) * Import upstream version 0.2.2 (ab9c66b7) * 0.2.2 (6d42bcca) (tag: 0.2.2) * Set timezone from the menuitems in the indicator (0ad54990) 2011-04-07 Michael Terry * when user clicks a timezone location, switch to that timezone (and support showing user's preferred name for the current timezone in the menu) (20aee32a) 2011-04-06 Ted Gould * Adds language, country and version information to the URL (01d3c313) 2011-04-06 Michael Terry * whoops, remove debug comment (f62a2a67) * pass locale to server; dynamically determine version (3b6b878b) 2011-04-06 Ted Gould * releasing version 0.2.1-0ubuntu2~ppa2 (27c56bd9) * Upstream Merge * Give full day events the day name instead of a time (d917059d) * Adding support for making full day items just have the day name (6549c406) 2011-04-05 Ted Gould * Use gmtime for full day events. (76760205) * Use stack memory instead of the global to avoid it getting modified (db8896f8) * Pull the full day into a boolean and reformat (9744a2f8) * Translator comment (3a5ab9e6) * Detect a full day event and print it differently (4b281e9a) 2011-04-04 Ted Gould * releasing version 0.2.1-0ubuntu2~ppa1 (7d3e1503) * Upstream Merge * Make sure the calendar follows the user setting (LP: #748772) * Ensure that events handle month boundries correctly (LP: #746713) * Only show calendars the user has configured (LP: #729033) (805b690c) * Merge U. Desktop (8f93ef6b) * Using GConf to find out which calendars are shown or not. (c6d23b37) * Ensure the calendar is correctly shown (16b7cebb) * Making it so that months boundries can't block our events. (3802e410) 2011-04-04 karl-qdh * Working patch! YAY (f6af2cf7) * Added a change which _could_ work if evolution URI's were correct, however local:system is not a valid URI, effectively this will stop showing all calendars right now (26edf58f) 2011-04-03 Dylan McCall * Follow show-calendar setting regardless of whether Evolution is present (LP: #748772) Visibility of upcoming events is no longer tied to show-calendar setting. (3bcb5d1b) 2011-04-01 karl-qdh * Set a minimum number of days to look for appointments for, allowed it to extend past month end by 1 week. (41321ee0) 2011-03-31 Ken VanDine * releasing version 0.2.1-0ubuntu1 (16d1f086) (tag: 0.2.1-0ubuntu1) 2011-03-31 Ted Gould * releasing version 0.2.1-0ubuntu1~ppa1 (73c2d5d5) * New upstream release. * Add tooltips on the error icons * Fix marking to refresh as the calendar changes * Recycle old entries to make the refresh cleaner * Use day when timezone is set to 'locale' * Reset time when coming back from suspend (LP: #726053) (b455c2a2) * Import upstream version 0.2.1 (a38d01ac) * 0.2.1 (dc9ee534) (tag: 0.2.1) * Switching to using SystemIdleHintChanged (e45dba38) 2011-03-31 karl-qdh * Switched to using SystemIdleHintChanged from ActiveState, appears ConsoleKit might have changed recently. (00aca04c) * Merged back with head (54e0f63b) 2011-03-30 Ted Gould * releasing version 0.2.0-0ubuntu2~ppa2 (73d5ba38) * Upstream Merge * Add tooltips on the error icons * Fix marking to refresh as the calendar changes * Recycle old entries to make the refresh cleaner * Use day when timezone is set to 'locale' (ed20abdc) * Fix up icons and give them tool tips (51f85a5e) * Fix marking and clean up event handling in the indicator and service (1938deda) * Removing a warning that will occur on the default GTK properties (99044a57) * Be a bit smarter about handling the the locale (e8d074ff) * Syncing with Karl's branch (0716a8cb) * Setting the default _WITH_DAY to be 12_WITH_DAY (b690f644) * Changing code to recycle the appointment menu items for a cleaner switching of days (d331e300) * Disable the appointments on date or month change to make it show that they're being updated and aren't currently valid (cdf13963) * Ensure that the marks get cleared on day changes that go across monthly boundries as well (49ffaa6c) * Protecting against the widgets being NULL at startup (c0166121) * Check for the signal name in the handler (b9355e5f) * Moving the registration of the type handlers into the init so that they'll not execute more than once. (6be8ddad) * Update the appointments in the idle loop so we can get those signals returned promptly! (0e435a01) * Clear marks on month changes (88d10f2b) * Protecting against NULL values (fbd5c581) * Cleaning up debug output (07371555) * Making the right size group more real to remove an annoying error (8e1ab0d6) * Making sure to get the inital values of the calendar properties (ce0945b1) * Some debugging info (b7c7b708) * Switching to one variable with all the marks in it (fb7e5a07) 2011-03-30 karl-qdh * Might not like that signal notation (f8923be6) * Potential fix for suspend issue suggested by njpatel (afdaa937) * Move start timer into an idle so we have a chance to actually create the menu items (019db0b5) 2011-03-30 Michael Terry * add error icon to main timezone entry (642c67ed) * add tooltip to error icon (af19585a) 2011-03-30 karl-qdh * Made marking work when you change month, still needs more work to get it to do it on startup properly. (851b7395) 2011-03-29 Ted Gould * releasing version 0.2.0-0ubuntu2~ppa1 (6f360756) * Upstream Merge * indicator-datetime-preferences crashed with SIGSEGV in g_utf8_normalize() (LP: #727089) * Uninstalling Evolution removes calendar from clock applet (LP: #691953) * clock doesn't update on timezone change (LP: #735445) * Cannot change main location (LP: #729029) * indicator-datetime-preferences crashed with SIGSEGV in g_simple_async_result_complete() (LP: #734951) * Time zone map looks identical when sensitive vs. insensitive (LP: #740846) * "Locations" window behaves like a modal dialog (LP: #740924) * Added location for clock menu isn't used or remembered (LP: #740930) * Time not displayed for added location in "Locations" window (LP: #740931) * "UTC" location can be removed but not re-added (LP: #740938) * "Locations" window bottom bar is missing a border (LP: #740941) * Add and Remove buttons in "Locations" window have unnecessary tooltips (LP: #740944) * No separator between "Add Event" and locations (LP: #740971) * indicator-datetime-preferences crashed with SIGSEGV in g_atomic_int_exchange_and_add() (LP: #740978) * inicator-datetime dosen't show corretly the time when changing from 24 hours format to 12 hours (LP: #743394) (c5309d7e) * Update from U. Desktop (7aa23563) * Adding a preferences for prefered timezone (d455a0cf) * Adding a error icon (ebdf2a04) 2011-03-29 Michael Terry * remember user's preferred location name for main timezone (095bf269) * show error icon if user focuses out of location entry when it has an non-location value (348285a8) 2011-03-29 Ted Gould * Protect against not having an entry (1c91ca45) * Handle enter on the default case by selecting the first entry instead of entering a blank item. (9f61fa02) 2011-03-29 Michael Terry * don't call complete() unless we have an entry (37106c9e) 2011-03-29 Ted Gould * A11y text (20bbf39b) * Make the locations dialog non-modal but resurface when needed. (0a840957) * Fix crash with GVariantBuilder, unref a timedate and ensure that we always have a separator (5d401d9c) * Put in timeouts to save settings on idle (6185b56b) * Update to map to make it lovely and UTC fixes (5e0da43a) 2011-03-29 Michael Terry * use background color for insensitive map (143f495a) 2011-03-29 Ted Gould * Protect our privates when being cancelled (72b47b90) * Fix case statement brackets (1efaecaa) * Ensure calendar is always shown (26497848) * Adjusting the timer so it appears more consistent (927bc60a) 2011-03-29 Michael Terry * treat locations dialog not as a modal dialog, but rather one that can be dismissed by interacting with the main dialog (18ea5194) 2011-03-29 karl-qdh * Adding tedg's suggested change to the property sending, no change in signals being received by the other side. (26fddf95) 2011-03-28 Ted Gould * Clean up tree model usage and sort the items in the popup list (9f4c4935) 2011-03-28 Michael Terry * Don't allow enter presses to leave non-timezone content in the model (3f00f0b2) * add missing a11y descriptions (e4733095) 2011-03-28 karl-qdh * Make switch statement more consistent might fix bug #743394 seems to be a weirdness in C related t. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37231 (09ad161f) * Show calendar widget always (6f4d5f0e) 2011-03-25 karl-qdh * Try splitting the function see if that works (37128f74) * Merged (107888ae) 2011-03-24 Michael Terry * don't access priv pointer if we've cancelled an async operation (47f80624) * fix memory leak that also prevented us noticing when the timezone got updated (b86cc254) * show location separator even if no locations (since we always have the current location (acfa619b) * fix crash when emptying location list (0b0b94a4) * update locations gsettings as soon as changes as made, not just when the dialog is closed (594bff89) 2011-03-24 karl-qdh * Change timer to 999ms (4298b95b) 2011-03-24 Michael Terry * make map look insensitive if it is (cbc7a7cd) 2011-03-24 karl-qdh * Merged mterry's changes (0b93383b) 2011-03-24 Michael Terry * drop debugging line and update times when user selects a zone (f76208b2) 2011-03-23 Ken VanDine * releasing version 0.2.0-0ubuntu1 (e5ab7b2f) (tag: 0.2.0-0ubuntu1) 2011-03-23 Michael Terry * add utc to relevant results (2021a955) * add bevel above location buttons (44cde000) 2011-03-23 Ted Gould * releasing version 0.2.0-0ubuntu1~ppa1 (d4f78436) * debian/control: Dropping liboobs (66623a95) * Merge with U. Desktop (5f261fbc) * New upstream release. ∘ Remove unused liboobs ∘ Add translator comments and make strings translatable (LP: #737326) ∘ Remove password dialog for calendars not the keyring ∘ Use default matching when geonames aren't available (LP: #740870) ∘ UI Cleanups and naming fixes (LP: #740806, LP: #740819) ∘ Free JSON parser data ∘ Avoid duplicates in GeoNames data (LP: #740884) ∘ Make location completion more robust (28842334) * Import upstream version 0.2.0 (34527b09) 2011-03-23 Michael Terry * cleanup another instance of GValue (7df6b791) 2011-03-23 Ted Gould * 0.2.0 (1daab282) (tag: 0.2.0) 2011-03-23 Michael Terry * sort locations by name, starting with prefixes (64d76856) * cleanup locations dialog column usage (736dde41) 2011-03-23 Ted Gould * Make completion more robust (5449dfc1) 2011-03-23 Michael Terry * make location completions a bit more robust in terms of when the popup is shown or not (6173eb97) 2011-03-23 Ted Gould * Ensure no duplicate entries (6e9e1719) * Properly free'ing memory allocated in JSON structures (1685931d) 2011-03-23 karl-qdh * merged back with sniffles branch and added some changes to the resetdate, which also effects the marked days. (438f4a55) 2011-03-23 Ted Gould * Strings and sniffle fixes for the best Canonical designer from New Zealand! (181fedbc) * Handle cases of not being online, so we shouldn't complete (96734371) 2011-03-23 Michael Terry * use default matching algorithm when using initial_model (i.e. no internet) (4e06269d) * one more free (531bbc3f) * free json memory and sink model ref (03660972) * avoid duplicates in geonames data (09dc8ae0) 2011-03-23 karl-qdh * Removed comma from date time indicator (74fe3165) * Date and time -> Date and month *sniffles* (445b748b) * String change and small behaviour change mpt tagged "sniffles" (890d5bb4) * changes for bug #649800 - requires dbusmenu to be released (f436da0a) 2011-03-22 Ted Gould * Removing the password dialog (ff7b647f) * Translator comments and making the string translatable (ea287c19) * Adding additional translator comments (1cf7b6cd) 2011-03-21 David Planella * Added translator comments to strftime strings (e3b43db5) 2011-03-21 Gabor Kelemen * Mark date format string as translatable, and add translator comment. (13c3a183) Fixes: LP:737326 2011-03-20 Ted Gould * Translator comment from answers (847357e2) 2011-03-17 karl-qdh * Unused variable (f46b11e2) * Never prompt for password, causes segfault (a8cdacf0) 2011-03-16 Ken VanDine * releasing version 0.1.98-0ubuntu1 (28103d19) (tag: 0.1.98-0ubuntu1) 2011-03-16 Ted Gould * Sadly, no more oobs for us. (5f78edb1) * releasing version 0.1.98-0ubuntu1~ppa1 (27e02c43) * New upstream release. ∘ Make appointments match calendar month ∘ Fix time format of appointments ∘ Get date change signals from calendar and adjust based on them. ∘ Crash fixes (LP: #733833, LP: #729444) ∘ Valgrind invalid read (LP: #729175) ∘ Translation fixes to date label (LP: #729632) (b9470a56) * Import upstream version 0.1.98 (5df5bfcc) * 0.1.98 (3c59d086) (tag: 0.1.98) * Updating to required IDO version (da12c283) * Get more signals from the calendar and use them for good. (d473b4c3) 2011-03-15 Ken VanDine * New upstream release. * Fix handling of reoccruing events * Handle settings in the indicator * Allow for hiding the calendar and the clock (dad04c02) 2011-03-15 karl-qdh * Fixed up much of the calendar browsing (3f94b4c6) * Fixed missed build error, caused by sync problems between netbook and laptop. (05e4b574) 2011-03-14 Ted Gould * releasing version 0.1.97-0ubuntu1~ppa2 (9f4692c7) * Upstream Merge * Fix appointment time format * Change appointments with selected date in calendar (d1f61817) * Fix appointment time format (f9f137df) * Commenting out value as we're not using it yet. (13993858) * Change the appointments so that they're modified by the calendar month (7b3db506) 2011-03-14 karl-qdh * Merged back with the pre-requisite branch and updated to include ted's suggested _()'s in strftime (0de507c3) * Fixing ted's comments (3cf4b8ae) 2011-03-10 Ted Gould * releasing version 0.1.97-0ubuntu1~ppa1 (66c8394d) * New upstream release. * Fix handling of reoccruing events * Handle settings in the indicator * Allow for hiding the calendar and the clock (d5704c20) * Import upstream version 0.1.97 (2fd5f32d) * Merging U. Desktop (1177ae9d) * 0.1.97 (444370e9) (tag: 0.1.97) * Making it so the clock can be hidden entirely. Adding a desktop file to get to the preferences when it is hidden. (f4135733) * Make showing the calendar into a property in the indicator (154354ac) * Check to see if the service is running (a8b050e0) * Use the shared header file for the service and interface names. (1fe486f1) 2011-03-10 Michael Terry * prefs: only let user change clock prefs if the clock is runnin. don't connect to response signal, it's no longer a dialog (6b45333c) * make show-clock work (721aa2d3) * make 'show monthly calendar' checkbox work (ab979ed1) 2011-03-08 Ted Gould * Show the week numbers if configured to do so. (c455c75c) 2011-03-08 karl-qdh * Fixed time format of appointments not respecting the configuration (6ff10245) * Fixed calendar browsing with month-changed and removed bogus off by one error (7d8535da) * Changed update appointment items so there's less of a delay when refreshing between no-appointments and appointments loaded. Fixed the handle_event signalling from the client to the service. Started hooking up calendar browsing. (fb0dd849) * Fixed incorrect year in tm struct for indicator-datetime.c:month_changed_cb, still receiving a segfault in datetime-service.c when we try to use the variant. Checked the variant value over dbus and its fine. (3bd84133) 2011-03-07 Ted Gould * Fix the icon size lookup (4bc20927) 2011-03-06 karl-qdh * Tried using uint but still segfaulting in variant code (7823baf6) * Hooking up the signals from the calendar and getting it working on service side (9485b01a) 2011-03-04 karl-qdh * Fixed #729020 - Week numbers not respecting configuration on startup (4ce8247b) * Fix for gtk lookup icon size returning negative numbers (860726f3) * Few more minor cleanups (17068224) * Merging back with trunk (4af06d03) * Cleaning up a few dead comments and code (3f720df7) 2011-03-03 Ken VanDine * releasing version 0.1.96-0ubuntu1 (e7b28fce) (tag: 0.1.96-0ubuntu1) 2011-03-03 Ted Gould * releasing version 0.1.96-0ubuntu1~ppa1 (96ca6cb8) * New upstream release. * Perference UI cleanups * Fix color rendering for appointments * Fix spin buttons to behave properly (4ed21c3d) * Import upstream version 0.1.96 (b4f9e083) * Merge for U. Desktop (dc4a5be2) * 0.1.96 (8a5b40e9) (tag: 0.1.96) * White space and include fixes (e9cfa504) * Close window on close button press (8dd02d2c) 2011-03-03 Ken VanDine * quit when the close putton is clicked (cd4699a9) 2011-03-03 Ted Gould * Colored icons make me smile (58677087) * UI Fixes (aa8b0618) * Improve spin button behavior (dcb521cd) 2011-03-03 karl-qdh * Width appears to be repeatedly overwritten with zero (3aa4316f) * Added some small fixes to make sure the pixbuf redraws everytime. There may be some memory leaks corrupting data somewhere. (76825a8e) 2011-03-03 Michael Terry * add back missing unref (55736aa9) 2011-03-03 karl-qdh * Added decent conversion from cairo context to pixbuf and updated the colour code so it works. Currently we show a rectangle, but we could equally use a mask. (27e4da12) 2011-03-03 Michael Terry * merge from trunk; fix utc time always being displayed in manual time spin button (d1596921) * fix some visual issues mpt found; drop libmap/Makefile.in from bzr (8dbd819c) 2011-03-03 karl-qdh * This actually gets the current recurrance times etc... properly - we're close to getting colours too ;) (64fe32bf) 2011-03-02 Ted Gould * Use the query language to specify the dates instead of building them ourselves (c11d4e24) 2011-03-02 karl-qdh * Remove items from menu when the show events key changes (44bd4d29) * Fixed adding/removing locations not triggering update; Improved update appointment menu items code; Improved populate_appointment_instances; Opened up objects generation to include marking days (7b2980b7) * Better handling of recurring items get_dtstart returns the same date for all items unfortunately (3abcff12) 2011-03-01 Michael Terry * let date spin buttons work (6ee562ac) * merge from trunk (ae98ec99) 2011-03-01 karl-qdh * Fixes for the recurring tasks and events settings change, the pointers are currently a bit chewed up as I try to figure out the right way round to get this. (4ebd048f) * These changes should fix the problems with the recurring appointments and dconf changes for show/hide events (cf5abb9a) 2011-02-28 Ken VanDine * Simplify calendar query, we don't need to compute times for the range. The query system has a built in way to specify a relative range. (2de6f443) 2011-02-28 karl-qdh * Minor change for kenvandine to test sorting (bbd56b11) 2011-02-28 Michael Terry * New upstream release. - New preference dialog - Improved EDS support - Improved timezone support; debian/control: - Update Build-Depends (e7442e09) (tag: 0.1.95-0ubuntu1) * Import upstream version 0.1.95 (bb010c63) 2011-02-28 David Barth * bumping release number (b7966573) (tag: 0.1.95) * karl's remote cal support patch; and support for settings of the new prefs dialog (5888e539) 2011-02-25 Michael Terry * add in some fixes from karl's branch (938ba5dc) * merge with trunk (6d8cd569) 2011-02-25 karl-qdh * Updated to newest trunk needs more merging (0188356e) 2011-02-25 David Barth * merging in mterry's branch with the new preferences dialog (6f103ce2) 2011-02-25 Michael Terry * fix a couple memory leaks noted by MacSlow (42125be0) 2011-02-25 karl-qdh * Updated to free errors just in case(tm) at dbarths request shortened the update time to 5 minutes for calendars (d0e5a69a) * Get ido calendar and dbusmenu the right way around (03eafa31) 2011-02-25 Michael Terry * remove week-start preference (2a6b56d0) 2011-02-25 karl-qdh * Fixing up indicator-datetime * Config options * Calendar update signals from calendar widget - should update appointments/marks not working at present (398154d3) 2011-02-25 Michael Terry * add missing olsen_map.png (350271ee) 2011-02-24 Michael Terry * have spinners work in unison -- only save when neither is focused (486ad362) * make sure user always sees new model from geonames when we get it (ef1648ee) * don't update locations dialog's times when editing (671bcdaf) * have location column expand (e1ed5129) 2011-02-23 Michael Terry * don't have the map draw a highlight if no zone selected (7ef18655) * add geonames watermark (ad847471) * show admin1 and country in completion dropdown (e2fa62d9) * skip duplicate completions (d38ff688) * some cleanup; when map changes, update entry too (66f988fe) * disable clicking on locations; use pretty zone names in indicator (02a56bbe) * make map larger (3488f854) * hook show-locations up (cf3ae1ad) * whoops, uncomment polkit bits (415577b3) * add week-start controls and settings (b3a34d48) * grab timezone names from geomaps; flesh out support for timezone completion in main map and locations dialog; show times in locations dialog (b4a4c968) 2011-02-22 Michael Terry * beginnings of completion support (deafbc1d) * make remove button insensitive if nothing selected (07c5056f) * make locations dialog editable (74cf8fa3) * drop some unused code from libmap (92657997) * add initial timezone map implementation, borrowed from gnome-control-center (45b1165f) * re-sync with trunk (8754d980) 2011-02-18 Michael Terry * start of locations dialog (1e274bb1) * mark prefs dialog as translatable (6dda4370) * make manual date/time fields work (da3962a5) * add polkit support and use new gnome-settings-daemon ntp-setting support (354fc2c0) 2011-02-17 Ken VanDine * releasing version 0.1.94-0ubuntu1 (6b80729a) (tag: 0.1.94-0ubuntu1) 2011-02-17 Michael Terry * first pass at preferences dialog (a10f2076) 2011-02-17 Ted Gould * releasing version 0.1.94-0ubuntu1~ppa1 (e7e3df4f) * New upstream release. ∘ Timezone support ∘ Multiple calendar support ∘ Accessible description (a7ca6c98) * Import upstream version 0.1.94 (3a611344) * Sync to U. Desktop (67f7a54a) * Merging trunk? not sure how we got out of sync. Fixed. (124ef53b) * 0.1.94 (b72c7d76) (tag: 0.1.94) * Adding in timezone support and more calendar support (2de3a45c) * Adding in timezone support and more calendar support (0fe6bcab) * Adding in accessible description support (799a8c9f) * Bump to indicator 0.3.19 (8cb18a50) * Encapsulating the updating of the description into a function (a764938d) 2011-02-17 karl-qdh * Rewrote auth_func at tedg's request. (7a70d572) * Testing eds signal (FAIL) seems when evolution changes an entry no signal is emitted to eds clients (7d4571cc) * Merged in mterrys time updates (e3ed3f23) 2011-02-17 Luke Yelavich * Get the indicator entry data into a separate variable, adn and free it after we signal a change in the accessible description, to avoid a memory leak. (4bc78d5d) 2011-02-16 Michael Terry * show current time in each timezone (336d4f32) 2011-02-16 karl-qdh * The last free -> unref (2aea0129) * Another probable cause of a segfault (d4584e52) * Probable cause of segfault identified, trying to get dates from types without dates most likely cause (f6fa7241) * Added debugging to figure out a segfault on kenvandine's machine (4feb65c9) * Added authentication function, and another minor fix to the sources iteration (1676d621) * Minor changes to objects freeing and NULLing the gerror (6bc3639d) * Missing g_error_free (fafc296c) * Minor change to continue if getting source fails (auth required is returned by ecal) (942fb6b5) * Syncup (bef945a6) * Removed unnoticed conflict and fixed some issues (3d413661) * Merged back with trunk (aaca2ea0) * Added myerrys branch (97a6b5ae) * Added ecal for all sources, untested as yet, need to merge in mterry's branch (af5f67f6) 2011-02-15 Michael Terry * whoops, don't connect destroyed signal as swapped (37fc0a31) * make sure gmi-radio-active state is always in sync with the dbusmenu-radio-active state (9bb32e21) * ignore timezone switches if nothing to do (02fcae95) * record which gmi goes with with dbusmenuitem and use that to properly watch radio-active property changes (07e4b46e) * in prop_cb, value is a GVariant, not a string, which explains why we sometimes get bogus strings in the menu (fe51dffd) * re-enable setting the timezone when clicking (6bc13b2d) * start with current timezone selected (67264a79) * add preference zones in order, after current timezone (02f8926f) * show current or geo location if we are going to use them (f704c617) * fix typo that prevented old locations from being deleted (030ba768) * use a GtkCheckMenuItem, not a GtkRadioButton, to render timezone items (36b4e937) * fix typo so timezone labels show up (d0f273eb) 2011-02-15 karl-qdh * Added a partially working timezone menu items code, there are some difficulties in menu labels which aren't showing, and radio menu items. Also, it's incomplete as the time calculation is waiting until the labels work. (09bfd842) 2011-02-14 Luke Yelavich * Add accessible description support. (5b018bff) 2011-02-10 Ken VanDine * releasing version 0.1.93-0ubuntu1 (80782dcf) (tag: 0.1.93-0ubuntu1) 2011-02-09 Ted Gould * releasing version 0.1.93-0ubuntu1~ppa1 (7b97bf9b) * New upstream release. (f7f6954f) * Import upstream version 0.1.93 (620668fc) * 0.1.93 (4c31081c) (tag: 0.1.93) * Merging in U. Desktop changes (298635b8) 2011-02-09 Ken VanDine * New upstream snapshot; debian/control - New build deps for eds integration, libecal1.2-dev, libical-dev, libgtk2.0-dev, libcairo2-dev, libedataserver1.2-dev (c7df3f69) 2011-02-08 Ted Gould * Checking for NULL clients and giving a message (d0e0e20e) * releasing version 0.1.92-0ubuntu5~ppa1 (3162d34a) * Sync to trunk (7841e7b3) * Upstream Merge * Merging in first EDS branch; debian/rules: Adding in autoreconf (abb5cdb9) * Merging in U. Desktop (a2e3af0a) * Commenting out unused code for now (088c1f4c) * Adding in basic EDS appointment support. (0762db0f) * releasing version 0.1.92-0ubuntu2~ppa1~apnt4 (8899ada0) * Comments for compiling (742c0dd2) * Upstream Merge * Adding some color support along with times (57162375) * Made translatable as it's a user focused message. (c721c1d4) * Changing warning. (a0328a7c) 2011-02-08 Ken VanDine * releasing version 0.1.92-0ubuntu4 (ab79902d) (tag: 0.1.92-0ubuntu4) * releasing version 0.1.92-0ubuntu3 (1574cb58) (tag: 0.1.92-0ubuntu3) 2011-02-08 karl-qdh * Re-adding tedg's changes (d59aaf9c) * Merging ted's branch (68d701af) 2011-02-08 Ken VanDine * releasing version 0.1.92-0ubuntu2 (6d21d078) (tag: 0.1.92-0ubuntu2) 2011-02-07 Ted Gould * Check to make sure we can allocate a client. (21d4207e) 2011-02-07 karl-qdh * Updated datetime service slightly to draw coloured dots for evolution colours, evolution is still slightly broken at doing it's part here and returns null colours. Updated configure.ac (hope this doesn't break merge), and added the radio menu item with a right aligned time to the indicator so we can have location/timezone entries. (2b9d7908) 2011-02-04 Ted Gould * releasing version 0.1.92-0ubuntu2~ppa1~apnt3 (bde608a3) * Upstream Merge * Debugging statements and cleaning code a bit (d5548587) * Reshuffle some code and add a couple of debug statements (88558942) * Removing comment (6076c79d) * releasing version 0.1.92-0ubuntu2~ppa1~apnt2 (f4a727b6) * Upstream Merge * Unreffing the menu item (f178717c) * Removing a ref on the item (6da530ab) * releasing version 0.1.92-0ubuntu2~ppa1~apnt1 (6fe7de54) * debian/rules: Adding in autoreconf (bd06bdfc) * Upstream Merge * Merging in first EDS branch (dcb2783f) * Merging from U. Desktop (cd61d9f8) 2011-02-04 karl-qdh * Added ESource Colours a circle drawn onto a cairo surface, however this code has one caveat, it's un-testable with evolution as evolutions color peek is currently broken. However I've used a very similar method of exchanging GdkDrawables and cairo_surface_t before and it worked... Lets see this time :/ (b4f0c229) * Added the timezone/location menu item code. (85ace9f8) * Updated the service, better memory handling, menu item sorting, triggered by about to show signal, discovered a new bug in dbusmenu https://bugs.launchpad.net/dbusmenu/+bug/713041 (9c3aeee0) 2011-02-03 Ken VanDine * releasing version 0.1.92-0ubuntu1 (b0053ad9) (tag: 0.1.92-0ubuntu1) * New upstream release. * Increase robustness of GeoClue error handling * Remove g_error()'s from the .so; New upstream release. * Change to canonical.com for naming * Fixing a type callback * Switching to GDbus and dbusmenu-0.4 * Supporting a wider range of custom strings for time and support seconds in the custom time strings. * Fixing to take time settings from LC_TIME (81ad3347) 2011-02-03 Ted Gould * releasing version 0.1.92-0ubuntu1~ppa1 (c5b44032) * New upstream release. * Increase robustness of GeoClue error handling * Remove g_error()'s from the .so (d2c49977) * Import upstream version 0.1.92 (82d679de) * 0.1.92 (cc86c810) (tag: 0.1.92) 2011-02-02 karl-qdh * Getting the menu working almost correctly (5734c96d) 2011-02-01 Ted Gould * Try to be better at cleaning up geoclue objects. (0ec3e4b5) * Forgot to bring up the prototypes. (c67f5091) * Putting the clear functions in shutdown so the objects get cleaned up nicely there as well. (e5e4415f) * Changing the clean up of the client to be in a function and drop the signals as well. (5de989fb) * Put the geo_address clean up in a small helper function. (96ab5fe4) * Adding more comments (004f4632) * Changing a g_error to a g_warning in the .so (af210c6c) 2011-01-31 Ted Gould * Make sure to clear the address when clients change. (10fb9c74) * Make no proxy a warning (ac1f538f) 2011-01-31 karl-qdh * Removed all buggy code from the datetime-service to push for A2 (e0718f36) * Updated add type handler functions (12f38653) * Added mterry's merge (93a2d0e1) 2011-01-27 Ted Gould * releasing version 0.1.91-0ubuntu1~ppa1 (eff9a42c) * New upstream release. * Change to canonical.com for naming * Fixing a type callback * Switching to GDbus and dbusmenu-0.4 * Supporting a wider range of custom strings for time and support seconds in the custom time strings. * Fixing to take time settings from LC_TIME (ce47d386) * Import upstream version 0.1.91 (28f84ee5) * 0.1.91 (aaae5863) (tag: 0.1.91) * Fixing type callback prototype and bumping dbusmenu version (2fdb3398) * Merge U. Desktop (b7eb7118) 2011-01-26 Ted Gould * Change to com.canonical and adding a log domain. (4dac0073) 2011-01-26 Michael Terry * fix some crashes (c023a16e) 2011-01-24 karl-qdh * Final few fixes making it buildable (665f9ece) 2011-01-20 karl-qdh * Minor fix from blotted out version numbers (d747c851) 2011-01-19 karl-qdh * Merged gdbus etc... from trunk (648676e3) * Updated the eds code to use ecalcomponents rather than ical so we get colours etc... (add30ba3) 2011-01-17 Ted Gould * Adding a log domain (5d546ac1) * Switching the file name around (f7078682) * Changing the interface and path for the settings (bb143866) * Changing the GSettings interface (b52833fe) * Switching dbus names and interfaces (9c6c6273) * Switching service to canonical.com (bec8488e) 2011-01-14 Ted Gould * Switching over to dbusmenu 0.4 and GDBus (cd14524e) * Allowing more custom strings for formatting time and making sure they update correctly. (b96ba2ae) 2011-01-12 karl-qdh * Added missing stuff, getting it ready to be buildable (b54626d4) * Added most likely broken URI callback, but at least our debugging messages will show us something :) (afdb6966) * Updated configure with ecal/ical (038f58b5) 2011-01-11 Michael Terry * use dbusmenu 0.4 (no actual code changes) (a30b2caf) 2011-01-11 karl-qdh * Updated some minor things, the last commit wasn't exactly great, still untested, looking for a way to pull the evolution URI out of the events. (ed67c38f) * Added initial support for ecal (untested) (feb60b19) 2011-01-10 Michael Terry * fix signal emission; g-signal receiver parameter definition (cef82e73) * first, untested pass at gdbus port (4132432b) 2011-01-06 Ted Gould * A couple of slight cleanups (9402dbec) * Fixing time to be taken from time settings instead of message settings. (edecf345) 2010-12-23 Marco Trevisan (Treviño) * Add markup support to clock label (1231e651) * Reset the label max width when guessing it. (0ce656f7) * Set label justification to center, and connect to "screen-changed" signal (0c85942b) * Check if the custom time format string shows seconds (0a7a6816) 2010-12-15 Michael Terry * use LC_TIME to look up date-related translations (4cab2afb) 2010-12-09 Ken VanDine * releasing version 0.1.90-0ubuntu2 (62471dbe) (tag: 0.1.90-0ubuntu2) 2010-12-07 Ken VanDine * releasing version 0.1.90-0ubuntu1 (9ea1956c) (tag: 0.1.90-0ubuntu1) 2010-12-03 Ted Gould * releasing version 0.1.90-0ubuntu1~ppa1 (04f95aab) * New upstream release. * Add support for building GTK2 and GTK3 versions; debian/control: Add recommends for geoclue-ubuntu-geoip (9054f7eb) * Import upstream version 0.1.90 (8e1fbde3) * 0.1.90 (803f8f9c) (tag: 0.1.90) * Merging in support for GTK3 (efd1930c) 2010-11-15 Ted Gould * releasing version 0.0.6-0ubuntu4~ppa2 (709a6335) * debian/control: Adjusting requirement from ubuntu-geoip to geoclue-ubuntu-geoip to match distro change. (b242c9d4) 2010-11-11 Ted Gould * Using the different packages depending on the version of GTK we want to link to. (a8641088) * Splitting out the dependencies (d9ed7b0e) * Adding a separate pkgcheck line for the service vs. the indicator (a1601926) 2010-10-24 Ted Gould * releasing version 0.0.6-0ubuntu4~ppa1 (9db3d453) * Upstream Merge * Generate the format string at init (1475e7bf) * Generate format string at init to run through locale (13be17f5) * releasing version 0.0.6-0ubuntu1~ppa2 (4c2ef2a4) * Upstream Merge * Add in Geoclue support for setting proper timezone; debian/control: Add recommends for ubuntu-geoip * debian/control: Adding dependencies on Geoclue and OOBS (8c7b43fe) * Sync to trunk (b177ae16) * Adding in support for determining timezone via GeoClue (e1ceb9d3) 2010-10-22 Ted Gould * releasing version 0.0.6-0ubuntu1~ppa2~geo3 (5d6e1fc0) * Upstream Merge * Cleaning up whitespace and callbacks (3fc03ebb) * Setting up a callback for the address changing. (1149b84d) * Filling out the changing callbacks (1fdf3875) * Setting up callbacks for the signals off of the clients (cc5d5780) 2010-10-21 Ted Gould * Whitespace (d2886daf) 2010-10-08 Ted Gould * releasing version 0.0.6-0ubuntu1~ppa2~geo2 (57b28fe0) * debian/control: Add recommends for ubuntu-geoip (bff4b447) * releasing version 0.0.6-0ubuntu1~ppa2~geo1 (1c7c20e3) * Stupid comma (d912f723) * debian/control: Adding dependencies on Geoclue and OOBS (b8dc0d28) * Autogen (c6d36a66) 2010-10-07 Ted Gould * Upstream Merge * Add in Geoclue support for setting proper timezone (3006f361) * Make a little more robust and actually commit our results. (95d2587e) * Setting the geoclue timezone quickly (62f947b4) * Setting up a callback for clicking ot set the timezone (30be9336) * Adding in OOBS support (4fff55e0) * Make it so that we don't hcange the menuitem if we don't have one, but also, after it's built check it's state. (ab293db1) * Create a way for to see if the timezones are the same. (27bd0190) * Caching the geoclue timezone (a60a4a59) * Timezone changed, recache (d929aed8) * Caching the system timezone so we can compare against it (32c2357c) * Make a menuitem for setting a specific timezone (90339ca5) 2010-10-06 Ted Gould * Setting up our requirements for providers (2fb4d576) * Putting in some error catches (54eacfe3) * Setting up a basic address callback (a385a3e6) * Create the address link in a callback as well (9e8f668b) * Start setting up the connection (bbd7c80b) * Adding in the geoclue lib (02b7ccf7) * Add the locale includes (e0ad7bd7) 2010-10-06 Sebastien Bacher * include locale.h since that's where setlocale is defined (1548eabf) 2010-09-30 Didier Roche * releasing version 0.0.6-0ubuntu3 (974563dd) (tag: 0.0.6-0ubuntu3) * Cherry-picked from upstream: - Fix date string format (12/24h) not taken from translation (LP: #579134) (f37658a9) 2010-09-30 Ted Gould * Generate at startup (45f862ce) 2010-09-22 Didier Roche * releasing version 0.0.6-0ubuntu2 (1c8015f0) (tag: 0.0.6-0ubuntu2) * releasing version 0.0.6-0ubuntu2 (033e0760) * Rebuild for libindicator ABI change (LP: #637692. debian/control: depends on latest libindicator-dev (853418a9) 2010-09-21 Ted Gould * Setting up generating the AUTHORS and ChangeLog at dist (08276c9c) 2010-09-09 Ken VanDine * releasing version 0.0.6-0ubuntu1 (56cbcb5f) (tag: 0.0.6-0ubuntu1) 2010-09-09 Ted Gould * releasing version 0.0.6-0ubuntu1~ppa1 (c10092cc) * New upstream release. (9f44db88) * Import upstream version 0.0.6 (83b6ed95) * 0.0.6 (d79e2326) (tag: 0.0.6) 2010-09-07 Ted Gould * releasing version 0.0.5-0ubuntu3~ppa1 (50a929d4) * * Fixing distcheck; Autogen (e2213732) * Distributing the schema XML (de2c8ed0) * Update the date daily (lp: #614529) (07b0183f) * Upstream Merge * Refresh times on timezone change * Update the date daily (61bbb77c) * Fix for make dist (5e369fb1) * Sync with ubuntu-desktop (1820b996) * New upstream release. (6b455017) * Import upstream version 0.0.5 (029d2cfd) 2010-09-07 Sebastien Bacher * releasing version 0.0.5-0ubuntu2 (b9ce676a) * releasing version 0.0.5-0ubuntu2 (60c2bd35) (tag: 0.0.5-0ubuntu2) 2010-09-07 Ted Gould * Sync to trunk (e3cc7258) * Update appropriately (ad735617) 2010-08-31 Ted Gould * Updating to trunk (a2176c0f) 2010-08-30 Ted Gould * Copyright stuffs (5c882ecc) * releasing version 0.0.4-0ubuntu2~ppa2~update1 (ad7305f8) * Upstream Merge * Refresh times on timezone change * Update the date daily (dc304670) * If the timezone changes we need to setup a different timer. (e22fcc15) * Set a timer to update the date once a day. (94264e50) * Add in a signal handler for the update time signal (7890c71c) * Create the service proxy and give it a lifecycle (e156eaea) * Watching the timezone file and updating based on it (3e00412e) * Adding a way to emit the signal (48830abd) * Adding in the update time signal (9a852c72) * Building us a dbus interface (b798978d) * Connecting onto the dbus (ffe6f9fb) * Whitespace cleanup (1b7857c9) * Adding an object to be the interface object for dbus (088f7d08) * Adding in a dbus interface file. (60d66c4e) * Putting the timezone file into the build line (6ca39e51) 2010-07-22 David Barth * version 0.0.5 (d0f7670c) (tag: 0.0.5) * merging the new calendar widget branch (293ef57a) * updates the label for changing settings (2564f852) * add a calendar widget to the menu (f1e55693) * make sure we get the new IDO calendar menu item (497a7116) * make sure we get the right glib version with gsettings support (e8979406) 2010-07-19 Ted Gould * releasing version 0.0.4-0ubuntu2~ppa1 (3ce9af60) * Upstream Merge * Making time format configurable via translations and gsettings.; debian/control: Adding in a glib dependency to get gsettings; Autogen update (f345a780) * Sync to trunk (4f161374) * Making the timeformat configurable via translations and gsettings. (b9345354) 2010-07-16 Ted Gould * releasing version 0.0.3-0ubuntu2~ppa1~confmat4 (bae1864b) * Upstream Merge * Whew. Now it does everything, just choose your format! (eafd2533) * In the timer function we're recycling the pointer to struct tm (e4a11109) * Making it so that update_label can return struct tm (2dd11040) * Making it so that ltime can be a parameter. (7f0199e5) * Starting to smartly choose when to update the time. (e4773774) * Protecting the timer from setting up more than one and having it setup when the properties change. (98978e04) * Adding a level of indirection to encapsulate the setting up of the timer func (648b7cc1) * Don't check the size of a label we don't have. (f5de0401) * Ah, dumb bug (bf397394) * Debug message to check posibilities. (81b745b7) * Making the posibility of huge arrays testing length of month names and weekday names, and posibily both. (f0a6d972) * Bring in the measuring tape. (621f199b) * Starting to build up our new measuring algorithm. Now with just AM/PM in it. (d231f790) * Generating the bitmask of posibilities from the format string. (c51a8c3c) * A big ass table of the strftime() format strings and what they effect, now we can calculate the max length. (62067c9b) * Building up the date string. (6ce780af) * Setting the properties only changes things if we're not in custom mode. (fc454b3d) * Adding in an update on changing the format string. (929dd21b) * Gets us somewhere of coming up with a time string. Wow, complex. (b197777c) 2010-07-15 Ted Gould * Filling out set too. (4da93424) * Getting some guts into get (d0f7773e) * Fleshing out the set and get enum functions. (189a8a9f) * Adding a mapping function to pull in the enum value. (56197266) * releasing version 0.0.3-0ubuntu2~ppa1~confmat3 (f0b07afe) * Upstream Merge * Moving around the preferences to have something more flexible and updating code. (be38ec81) * Clearing set and get property as we're going to have to start from scratch there. (4de10d0c) * Moving all these properties into the private structure. (533863c2) * Binding the properties into the settings database. (8fb0d0bf) * Whoa, we got lots of properties now. (6d7a5eeb) * Turning the time format string into custom time format. (a5fe313e) * Getting defines for all the new settings and making things compile again. (c3563f86) * I swear, there were somethings I didn't change! Getting some final settings that make sense. (3575d726) * Sync from Ubuntu Desktop (f315167e) 2010-07-15 Ken VanDine * releasing version 0.0.4-0ubuntu1 (c7f41179) (tag: 0.0.4-0ubuntu1) 2010-07-15 Ted Gould * releasing version 0.0.4-0ubuntu1~ppa1 (fb316fcd) * New upstream release. (28f1d0ac) * Import upstream version 0.0.4 (cc5ecca1) * 0.0.4 (b695b559) (tag: 0.0.4) 2010-07-14 Ted Gould * Ignoring the tramp stamp (ae783472) * releasing version 0.0.3-0ubuntu2~ppa1~confmat2 (fc3ab772) * Rebuilding for new glib (6ad83a19) * releasing version 0.0.3-0ubuntu2~ppa1~confmat1 (72a86387) 2010-07-13 Ted Gould * releasing version 0.0.3-0ubuntu2~ppa1 (9343fb92) * Merge upstream * Change menus to come from the servic. Autogen update (127dd570) * Sync to trunk (dcdce69d) * Adjusting indicator to be service based. (57f863b8) 2010-07-12 Ted Gould * Autogen update (826f0582) * debian/control: Adding in a glib dependency to get gsettings (450c1e83) * Merge upstream * Adding in GSettings for configuring the format on the panel. (fe6129a2) * Going into the gsettings world. (a994c55b) * Moving the default format into a define and using our new variable. (5c0172d8) * Setting up a 'time_format' variable and pulling it into a property. (72de11cc) * Setting up basic property stuff and making a husk of a first property. (a173af97) * Getting the schema to validate. (4f6a9880) * Renaming file (3ef7359d) * Bringing in the gesttings love. (89692e24) * Trying to build the first gschema file. (667f56dc) * As a basis we need to have a service based architecture. (ad70535d) * releasing version 0.0.3-0ubuntu2~ppa1~service1 (d051dbe5) * Autogen update (f1cf5b2a) * Merge upstream * Change menus to come from the service (1725fc46) * Update to trunk to resolve conflicts (0a0f9d00) * Legal stuffs (df30f437) * Adding a check for dbusmenu gtk as well. (24057387) * Setting up checking for time-admin as well. (16a8df4b) * Removing some now service provided code. (f257b20a) * Setting up the update of the label for the date. (4117028f) * Adding some good debugging messages. (4edb23e4) * Adding in a check for the calendar application. (03e448f0) 2010-07-07 Ted Gould * Ignoring the generated service file. (f18df835) * Activating the settings (515a3e5f) * Making the separator and the settings item. (4a8b1c17) * Make date and time menu items. (cfef5b08) 2010-06-25 Ted Gould * Sync to Ubuntu Desktop (dbcc98fc) 2010-06-08 Didier Roche * releasing version 0.0.3-0ubuntu1 (f0e88ea4) (tag: 0.0.3-0ubuntu1) 2010-06-07 Didier Roche * Recommends: indicator-applet | indicator-renderer (a80ffd8d) * remove uneeded pkg-config build-dep (d55ceb3b) * fix homepage url (a40dac60) * debian/control: - bump Standards-Version to latest (f724c18f) 2010-06-03 Ted Gould * Updating to ubuntu-desktop branch (a5560024) * New upstream release. * Copyright fixes * Adding translations * Fix translation domain; New upstream release. * Making label guess and reasonable width starting out. debian/control: Adding libdbusmenu-gtk as a build dep (ec9fa208) 2010-06-03 Didier Roche * releasing version 0.0.2-0ubuntu1 (c2ff294e) * Merging from upstream packaging branch (d7276ccb) 2010-06-03 Ted Gould * releasing version 0.0.3-0ubuntu1~ppa1 (43138ce7) * New upstream release. * Copyright fixes * Adding translations * Fix translation domain (0cc5a340) * Import upstream version 0.0.3 (2c467063) * 0.0.3 (7e526de2) (tag: 0.0.3) * Adding copyright headers (6fccc69c) * Adding in copyright headers (a0b2eab6) 2010-05-19 Ted Gould * Comments (33799d8b) * Now we have a menu, whoo ha! (e66edab1) * Switching the menu to be from the service. (69996154) 2010-05-18 Ted Gould * Adding a service manager to start the service. (8d461077) * Building the basic service structure (fe614872) * Adding a shared version number (12731f4f) * Deping on the header (497c15b8) * Some shared names for our dbus stuff (b26f447d) * Adding a dbus service file. (37f7969c) 2010-03-15 Ted Gould * Fixing internationalization by using library interface. (5c688452) 2010-03-12 Ted Gould * Use library i18n support so that we get translations from our own domain. (3d3dff5a) 2010-03-10 Ted Gould * Translations from OEM (df6034a6) 2010-03-10 Kyle Nitzsche * add LINGUAS and translated po files for target languages (ecec726a) 2010-03-04 Ted Gould * releasing version 0.0.2-0ubuntu1~ppa1 (650a34e3) * New upstream release. * Making label guess and reasonable width starting out. (37e61f8d) * Import upstream version 0.0.2 (bc3b3672) * Merge with ubuntu desktop (903f9acd) * 0.0.2 (2d516823) (tag: 0.0.2) 2010-03-02 Ted Gould * A patch to make it so the label is of fixed size. No jiggle! (aafe3184) 2010-03-01 Ted Gould * Fixing time to remove leading zero (1c2a7abb) * Reacting to changes in style. (a526efc8) * Adding translation comments. (303bc1f3) * Debug message. (6c63187e) * Providing a good guess at what the label size will be. (20a40047) * Adding in an idle function to try and make it so the label never shrinks (5f455da1) 2010-02-26 Didier Roche * releasing version 0.0.1-0ubuntu1 (c16b4688) * debian/control: - add libdbusmenu-gtk-dev build-dep (/!\ not in configure.ac) (48277066) * New upstream release. (e390ca6a) * Import upstream version 0.0.1 (8f5b8f3d) 2010-02-25 Ted Gould * Changing SVN to GIT (21c86eba) * releasing version 0.0.1-0ubuntu1 (de70f9ad) (tag: 0.0.1-0ubuntu1) * Small change to get autogen.sh back in this tree. (696a294d) * Small change (2aeb6943) * Initial Upstream Release (61ce438f) * 0.0.1 (8485bb2d) (tag: 0.0.1) 2010-02-22 Ted Gould * Fix build to include the source files (56866b0f) 2010-02-18 Ted Gould * releasing version 0.0.1~r2-0ubuntu3 (9646023a) * Adding autogen.sh to dist (f595e945) * debian/control: Adding libdbusmenu-gtk as a build dep (286d9727) * Merge from ubuntu-desktop (481f29d7) 2010-02-17 Ted Gould * releasing version 0.0.1~dev-0ubuntu1~ppa5 (9844a4bd) * Upstream Merge * Date menuitem, calendar menuitem and settings menuitem (9101e1fd) * Date menuitem, calendar menuitem and time settings menuitem. (17cc7e00) 2010-02-17 David Barth * checks for evolution and provides a calendar option (fe779752) 2010-02-15 David Barth * add date & settings option (56c99c75) 2010-02-11 Didier Roche * releasing version 0.0.1~r2-0ubuntu2 (86c5b217) * debian/control: - fix build-dep (8fb2b5aa) 2010-02-10 Didier Roche * releasing version 0.0.1~r2-0ubuntu1 (d127f5f4) * update copyright (404882ad) * remove .la and .a file (565a60a3) * new upstream version (4b0dea13) * Import upstream version 0.0.1~r2 (2c193e71) * Initial packaging (988a0e6c) 2010-02-08 Ted Gould * releasing version 0.0.1~dev-0ubuntu1~ppa4 (ccfb12b5) * Bumping for rebuild with new dbusmenu (1f8793ed) 2010-02-04 Ted Gould * releasing version 0.0.1~dev-0ubuntu1~ppa3 (6cd5505e) * Bump version for rebuild (a0a7e9b7) 2010-01-07 Ted Gould * releasing version 0.0.1~dev-0ubuntu1~ppa2 (b5a0bb59) * Upstream merge * Adding in an indicator (4add38ce) * Sync to trunk (824e6d9e) * Adding the loadable indicator. (d1e6eaaa) 2010-01-06 Ted Gould * releasing version 0.0.1~dev-0ubuntu1~ppa2~indicator1 (bee422b4) * Upstream merge * Adding in an indicator (9709b21b) * releasing version 0.0.1~dev-0ubuntu1~ppa1 (c7ec96e9) * Initial release. (1e28496f) * Building a simple menu. (5c079eaf) 2010-01-05 Ted Gould * Initalizing and disposing of the label and timer (51208eb3) * Adding in a timer to update (a324b57d) * Adding comments. (e154d9e9) * Updating the label with the time (1b1e0989) 2010-01-04 Ted Gould * Making a label (81c0869a) * Linking in the get_label function (881335a5) * Adding in the indicator defines (0479341e) * The base object for the indicator (7c0f72c6) * Building a very basic indicator. (9434c8a9) * Boot strap (82381c6a) ayatana-indicator-datetime-25.4.0/cmake/GdbusCodegen.cmake0000644000000000000000000000246614773244555020315 0ustar cmake_minimum_required(VERSION 3.13) if(POLICY CMP0011) cmake_policy(SET CMP0011 NEW) endif(POLICY CMP0011) find_program(GDBUS_CODEGEN NAMES gdbus-codegen DOC "gdbus-codegen executable") if(NOT GDBUS_CODEGEN) message(FATAL_ERROR "Excutable gdbus-codegen not found") endif() macro(add_gdbus_codegen outfiles name prefix service_xml) add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.h" "${CMAKE_CURRENT_BINARY_DIR}/${name}.c" COMMAND "${GDBUS_CODEGEN}" --interface-prefix "${prefix}" --generate-c-code "${name}" "${service_xml}" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${ARGN} "${service_xml}" ) list(APPEND ${outfiles} "${CMAKE_CURRENT_BINARY_DIR}/${name}.c") endmacro(add_gdbus_codegen) macro(add_gdbus_codegen_with_namespace outfiles name prefix namespace service_xml) add_custom_command( OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${name}.h" "${CMAKE_CURRENT_BINARY_DIR}/${name}.c" COMMAND "${GDBUS_CODEGEN}" --interface-prefix "${prefix}" --generate-c-code "${name}" --c-namespace "${namespace}" "${service_xml}" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} DEPENDS ${ARGN} "${service_xml}" ) list(APPEND ${outfiles} "${CMAKE_CURRENT_BINARY_DIR}/${name}.c") endmacro(add_gdbus_codegen_with_namespace) ayatana-indicator-datetime-25.4.0/CMakeLists.txt0000644000000000000000000001040414773244555016431 0ustar cmake_minimum_required (VERSION 3.16) project (ayatana-indicator-datetime VERSION 25.4.0 LANGUAGES C CXX) list (APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) SET(CMAKE_INSTALL_PREFIX "/usr" CACHE PATH "..." FORCE) endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (PACKAGE ${CMAKE_PROJECT_NAME}) # Options option(ENABLE_TESTS "Enable all tests and checks" OFF) option(ENABLE_COVERAGE "Enable coverage reports (includes enabling all tests and checks)" OFF) option(ENABLE_WERROR "Treat all build warnings as errors" OFF) option(ENABLE_LOMIRI_FEATURES "Build with Lomiri-specific libraries, schemas, media and backend" OFF) if(ENABLE_COVERAGE) set(ENABLE_TESTS ON) set(CMAKE_BUILD_TYPE "Coverage") else() set(CMAKE_BUILD_TYPE "Release") endif() if(ENABLE_WERROR) add_definitions("-Werror") endif() if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") add_definitions("-Weverything") else() add_definitions("-Wall") endif() add_definitions("-Wno-sign-compare") # Needed for GTest on Ubuntu ## ## GNU standard installation directories ## include (GNUInstallDirs) ## ## Gettext ## set (GETTEXT_PACKAGE "ayatana-indicator-datetime") add_definitions (-DGETTEXT_PACKAGE="${GETTEXT_PACKAGE}" -DLOCALEDIR="${CMAKE_INSTALL_FULL_LOCALEDIR}") ## ## Check for prerequisites ## find_package (PkgConfig REQUIRED) include (CheckIncludeFile) include (FindPkgConfig) set ( SERVICE_DEPS libayatana-common>=0.9.3 glib-2.0>=2.36 gio-unix-2.0>=2.36 gstreamer-1.0>=1.2 libnotify>=0.7.6 properties-cpp>=0.0.1 libaccounts-glib>=1.18 messaging-menu>=0.8.2 uuid>=2.25 ) if (ENABLE_LOMIRI_FEATURES) list ( APPEND SERVICE_DEPS lomiri-url-dispatcher>=0 lomiri-sounds lomiri-schemas libmkcal-qt5 ) pkg_get_variable(ALARM_DEFAULT_SOUND lomiri-sounds alarm_default_sound) pkg_get_variable(CALENDAR_DEFAULT_SOUND lomiri-sounds calendar_default_sound) string(JOIN " " ALARM_DEFAULT_SOUND ${ALARM_DEFAULT_SOUND}) string(JOIN " " CALENDAR_DEFAULT_SOUND ${CALENDAR_DEFAULT_SOUND}) add_definitions ( -DLOMIRI_FEATURES_ENABLED -DALARM_DEFAULT_SOUND="${ALARM_DEFAULT_SOUND}" -DCALENDAR_DEFAULT_SOUND="${CALENDAR_DEFAULT_SOUND}" ) find_package (ECM REQUIRED NO_MODULE) list (APPEND CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) find_package (KF5 COMPONENTS CalendarCore REQUIRED) else () list ( APPEND SERVICE_DEPS libecal-2.0>=3.16 libedataserver-1.2>=3.5 libical>=0.48 ) add_definitions ( -DALARM_DEFAULT_SOUND="dummy" -DCALENDAR_DEFAULT_SOUND="dummy" ) set (ALARM_DEFAULT_SOUND "dummy") endif () pkg_check_modules (SERVICE_DEPS REQUIRED ${SERVICE_DEPS}) include_directories (SYSTEM ${SERVICE_DEPS_INCLUDE_DIRS}) ## ## custom targets ## set (ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${PROJECT_VERSION}) add_custom_target (dist COMMAND bzr export --root=${ARCHIVE_NAME} ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar.gz WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) add_custom_target (cppcheck COMMAND cppcheck --enable=all -q --error-exitcode=2 --inline-suppr ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/tests) ## ## Actual building ## include_directories (${CMAKE_CURRENT_SOURCE_DIR}/include) include_directories (${CMAKE_CURRENT_BINARY_DIR}/include) # actually build things add_subdirectory(include) add_subdirectory(src) add_subdirectory(data) add_subdirectory(po) # testing & coverage if (ENABLE_TESTS) include(CTest) pkg_check_modules (DBUSTEST REQUIRED dbustest-1>=14.04.0) enable_testing() add_subdirectory(tests) if (ENABLE_COVERAGE) find_package(CoverageReport) ENABLE_COVERAGE_REPORT( TARGETS indicatordatetimeservice ayatana-indicator-datetime-service TESTS ${COVERAGE_TEST_TARGETS} FILTER /usr/include ${CMAKE_BINARY_DIR}/* ) endif() endif() # Display config info message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") message(STATUS "Unit tests: ${ENABLE_TESTS}") message(STATUS "Build with -Werror: ${ENABLE_WERROR}") message(STATUS "Build with Lomiri features: ${ENABLE_LOMIRI_FEATURES}") ayatana-indicator-datetime-25.4.0/COPYING0000644000000000000000000010451314773244555014731 0ustar GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ayatana-indicator-datetime-25.4.0/data/ayatana-indicator-datetime.desktop.in0000644000000000000000000000043714773244555023771 0ustar [Desktop Entry] Type=Application Name=Ayatana Indicator Date & Time Exec=@CMAKE_INSTALL_FULL_LIBEXECDIR@/ayatana-indicator-datetime/ayatana-indicator-datetime-service OnlyShowIn=MATE;Unity;XFCE;Pantheon;Budgie NoDisplay=true StartupNotify=false Terminal=false Icon=@messaging_menu_icon@ ayatana-indicator-datetime-25.4.0/data/ayatana-indicator-datetime.service.in0000644000000000000000000000045314773244555023756 0ustar [Unit] Description=Ayatana Indicator DateTime Service PartOf=graphical-session.target PartOf=ayatana-indicators.target [Service] ExecStart=@CMAKE_INSTALL_FULL_LIBEXECDIR@/ayatana-indicator-datetime/ayatana-indicator-datetime-service Restart=on-failure [Install] WantedBy=ayatana-indicators.target ayatana-indicator-datetime-25.4.0/data/CMakeLists.txt0000644000000000000000000000455614773244555017355 0ustar ## ## indicator variant ## if (ENABLE_LOMIRI_FEATURES) set (INDICATOR_VARIANT_NAME "lomiri-indicator-datetime") else () set (INDICATOR_VARIANT_NAME "${CMAKE_PROJECT_NAME}") endif () ## ## GSettings schema ## set (SCHEMA_NAME "org.ayatana.indicator.datetime.gschema.xml") set (SCHEMA_FILE_IN "${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NAME}.in") set (SCHEMA_FILE "${CMAKE_CURRENT_BINARY_DIR}/${SCHEMA_NAME}") # generate the .xml.in file so cmake constants are included configure_file(${SCHEMA_FILE_IN} ${SCHEMA_FILE}) # let GSettings do the rest find_package(GSettings REQUIRED) add_schema (${SCHEMA_NAME}) ## ## Systemd Unit File ## pkg_check_modules(SYSTEMD systemd) if (${SYSTEMD_FOUND}) pkg_get_variable(SYSTEMD_USER_DIR systemd systemduserunitdir) message (STATUS "${SYSTEMD_USER_DIR} is the systemd user unit file install dir") set (SYSTEMD_USER_NAME "${INDICATOR_VARIANT_NAME}.service") set (SYSTEMD_USER_FILE "${CMAKE_CURRENT_BINARY_DIR}/${SYSTEMD_USER_NAME}") set (SYSTEMD_USER_FILE_IN "${CMAKE_CURRENT_SOURCE_DIR}/${SYSTEMD_USER_NAME}.in") # build it configure_file ("${SYSTEMD_USER_FILE_IN}" "${SYSTEMD_USER_FILE}") # install it install (FILES "${SYSTEMD_USER_FILE}" DESTINATION "${SYSTEMD_USER_DIR}") endif() ## ## XDG Autostart File ## if (NOT ENABLE_LOMIRI_FEATURES) # where to install set (XDG_AUTOSTART_DIR "/etc/xdg/autostart") message (STATUS "${XDG_AUTOSTART_DIR} is the DBus Service File install dir") set (XDG_AUTOSTART_NAME "${CMAKE_PROJECT_NAME}.desktop") set (XDG_AUTOSTART_FILE "${CMAKE_CURRENT_BINARY_DIR}/${XDG_AUTOSTART_NAME}") set (XDG_AUTOSTART_FILE_IN "${CMAKE_CURRENT_SOURCE_DIR}/${XDG_AUTOSTART_NAME}.in") # build it configure_file ("${XDG_AUTOSTART_FILE_IN}" "${XDG_AUTOSTART_FILE}") # install XDG autostart install (FILES "${XDG_AUTOSTART_FILE}" DESTINATION "${XDG_AUTOSTART_DIR}") endif() ## ## Ayatana Indicator File ## # where to install set (AYATANA_INDICATOR_DIR "${CMAKE_INSTALL_FULL_DATAROOTDIR}/ayatana/indicators") message (STATUS "${AYATANA_INDICATOR_DIR} is the Ayatana Indicator install dir") set (AYATANA_INDICATOR_NAME "org.ayatana.indicator.datetime") set (AYATANA_INDICATOR_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${AYATANA_INDICATOR_NAME}") install (FILES "${AYATANA_INDICATOR_FILE}" DESTINATION "${AYATANA_INDICATOR_DIR}") ayatana-indicator-datetime-25.4.0/data/lomiri-indicator-datetime.service.in0000644000000000000000000000044614773244555023635 0ustar [Unit] Description=Lomiri Indicator DateTime Service PartOf=graphical-session.target PartOf=lomiri-indicators.target [Service] ExecStart=@CMAKE_INSTALL_FULL_LIBEXECDIR@/lomiri-indicator-datetime/lomiri-indicator-datetime-service Restart=on-failure [Install] WantedBy=lomiri-indicators.target ayatana-indicator-datetime-25.4.0/data/org.ayatana.indicator.datetime0000644000000000000000000000071414773244555022502 0ustar [Indicator Service] Name=ayatana-indicator-datetime ObjectPath=/org/ayatana/indicator/datetime Position=20 [desktop] ObjectPath=/org/ayatana/indicator/datetime/desktop [desktop_greeter] ObjectPath=/org/ayatana/indicator/datetime/desktop_greeter [desktop_lockscreen] ObjectPath=/org/ayatana/indicator/datetime/desktop_greeter [phone] ObjectPath=/org/ayatana/indicator/datetime/phone [phone_greeter] ObjectPath=/org/ayatana/indicator/datetime/phone_greeter ayatana-indicator-datetime-25.4.0/data/org.ayatana.indicator.datetime.AlarmProperties.xml0000644000000000000000000000321114773244555026404 0ustar The default alarm sound's filename. What kind of haptic feedback, if any, to trigger with an alarm. Two modes are currently supported: 'pulse', 'none'. How loudly to play alarm sounds. [Range: 1-100] How long an alarm's sound should be looped. How many minutes to wait when the Snooze button is pressed. [Range: 1-15] ayatana-indicator-datetime-25.4.0/data/org.ayatana.indicator.datetime.gschema.xml.in0000644000000000000000000002011414773244555025310 0ustar 'locale-default' What the time format should be? Controls the time format that is displayed in the indicator. For almost all users this should be the default for their locale. If you think the setting is wrong for your locale please join or talk to the translation team for your language. If you just want something different you can adjust this to be either 12 or 24 time. Or, you can use a custom format string and set the custom-time-format setting. "%l:%M %p" The format string passed to strftime The format of the time and/or date that is visible on the panel when using the indicator. For most users this will be a set of predefined values as determined by the configuration utility, but advanced users can change it to anything strftime can accept. Look at the man page on strftime for more information. false Show the number of seconds in the indicator Makes the datetime indicator show the number of seconds in the indicator. It's important to note that this will cause additional battery drain as the time will update 60 times as often, so it is not recommended. Also, this setting will be ignored if the time-format value is set to custom. false Show the day of the week in the indicator Puts the day of the week on the panel along with the time and/or date depending on settings. This setting will be ignored if the time-format value is set to custom. false Show the month and date in the indicator Puts the month and the date in the panel along with the time and/or day of the week depending on settings. This setting will be ignored if the time-format value is set to custom. false Show the year in the indicator Puts the year in the panel along with the month and the date. This setting will be ignored if either the time-format value is set to custom or if show-date is set to false. true Show the monthly calendar in the indicator Puts the monthly calendar in indicator-datetime's menu. false Show week numbers in calendar Shows the week numbers in the monthly calendar in indicator-datetime's menu. true Show events in the indicator Shows events from Evolution in indicator-datetime's menu. true Show alarms in the indicator Shows alarms in the events list in indicator-datetime's menu. false Show the auto-detected location in the indicator Shows your current location (determined from geoclue and /etc/timezone) in indicator-datetime's menu. false Show locations in the indicator Shows custom defined locations in indicator-datetime's menu. ['UTC'] A List of locations Adds the list of locations the user has configured to display in the indicator-datetime menu. '' The name of the current timezone Some timezones can be known by many different cities or names. This setting describes how the current zone prefers to be named. Format is "TIMEZONE NAME" (e.g. "America/New_York Boston" to name the New_York zone Boston). 'pulse' What kind of haptic feedback, if any, to trigger with an alarm. What kind of haptic feedback, if any, to trigger with an alarm. Two modes are currently supported: 'pulse', 'none'. '@CALENDAR_DEFAULT_SOUND@' The calendar's default sound file. If a calendar or reminder event doesn't specify its own sound file, this file will be used as the fallback sound. '@ALARM_DEFAULT_SOUND@' The alarm's default sound file. If an alarm doesn't specify its own sound file, this file will be used as the fallback sound. 50 The alarm's default volume level. The volume at which alarms will be played. 10 The alarm's duration. How long the alarm's sound will be looped if its snap decision is not dismissed by the user. 5 The snooze duration. How long to wait when the user hits the Snooze button. ayatana-indicator-datetime-25.4.0/include/CMakeLists.txt0000644000000000000000000000007314773244555020055 0ustar add_subdirectory(datetime) add_subdirectory(notifications) ayatana-indicator-datetime-25.4.0/include/datetime/actions.h0000644000000000000000000000441114773244555020722 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_ACTIONS_H #define INDICATOR_DATETIME_ACTIONS_H #include #include #include // shared_ptr #include #include // GSimpleActionGroup namespace ayatana { namespace indicator { namespace datetime { /** * \brief Interface for all the actions that can be activated by users. * * This is a simple C++ wrapper around our GActionGroup that gets exported * onto the bus. Subclasses implement the actual code that should be run * when a particular action is triggered. */ class Actions { public: virtual bool desktop_has_calendar_app() const =0; virtual std::string open_alarm_app() =0; virtual std::string open_appointment(const Appointment&, const DateTime&) =0; virtual std::string open_calendar_app(const DateTime&) =0; virtual std::string open_settings_app() =0; virtual void set_location(const std::string& zone, const std::string& name)=0; void set_calendar_date(const DateTime&, bool bUpdateCalendar); GActionGroup* action_group(); const std::shared_ptr state() const; protected: explicit Actions(const std::shared_ptr& state); virtual ~Actions(); private: std::shared_ptr m_state; GSimpleActionGroup* m_actions = nullptr; void update_calendar_state(); // we've got raw pointers in here, so disable copying Actions(const Actions&) =delete; Actions& operator=(const Actions&) =delete; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_ACTIONS_H ayatana-indicator-datetime-25.4.0/include/datetime/actions-live.h0000644000000000000000000000323314773244555021660 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_ACTIONS_LIVE_H #define INDICATOR_DATETIME_ACTIONS_LIVE_H #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief Production implementation of the Actions interface. * * Delegates URLs, sets the timezone via org.freedesktop.timedate1, etc. * * @see MockActions */ class LiveActions: public Actions { public: explicit LiveActions(const std::shared_ptr& state_in); virtual ~LiveActions() =default; bool desktop_has_calendar_app() const override; std::string open_alarm_app() override; std::string open_appointment(const Appointment&, const DateTime&) override; std::string open_calendar_app(const DateTime&) override; std::string open_settings_app() override; void set_location(const std::string& zone, const std::string& name) override; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_ACTIONS_H ayatana-indicator-datetime-25.4.0/include/datetime/alarm-queue.h0000644000000000000000000000257714773244555021513 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_ALARM_QUEUE_H #define INDICATOR_DATETIME_ALARM_QUEUE_H #include #include #include #include #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ /** * \brief Watches the clock and appointments to notify when an * appointment's time is reached. */ class AlarmQueue { public: AlarmQueue() =default; virtual ~AlarmQueue() =default; virtual core::Signal& alarm_reached() =0; }; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_ALARM_QUEUE_H ayatana-indicator-datetime-25.4.0/include/datetime/alarm-queue-simple.h0000644000000000000000000000314614773244555022773 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_ALARM_QUEUE_SIMPLE_H #define INDICATOR_DATETIME_ALARM_QUEUE_SIMPLE_H #include // std::shared_ptr #include #include #include #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief A #AlarmQueue implementation */ class SimpleAlarmQueue: public AlarmQueue { public: SimpleAlarmQueue(const std::shared_ptr& clock, const std::shared_ptr& upcoming_planner, const std::shared_ptr& timer); ~SimpleAlarmQueue(); core::Signal& alarm_reached() override; private: class Impl; friend class Impl; std::unique_ptr impl; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_ALARM_QUEUE_H ayatana-indicator-datetime-25.4.0/include/datetime/appointment.h0000644000000000000000000000351014773244555021617 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #ifndef INDICATOR_DATETIME_APPOINTMENT_H #define INDICATOR_DATETIME_APPOINTMENT_H #include #include #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief Basic information required to raise a notification about some Appointment. */ struct Alarm { std::string text; std::string audio_url; DateTime time; bool operator== (const Alarm& that) const; bool has_sound() const; bool has_text() const; }; /** * \brief An instance of an appointment; e.g. a calendar event or clock-app alarm * * @see Planner */ struct Appointment { public: enum Type { EVENT, ALARM }; Type type = EVENT; bool is_alarm() const { return type == ALARM; } std::string uid; std::string source_uid; std::string color; std::string summary; DateTime begin; DateTime end; std::vector alarms; bool operator== (const Appointment& that) const; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_APPOINTMENT_H ayatana-indicator-datetime-25.4.0/include/datetime/clock.h0000644000000000000000000000424614773244555020363 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_CLOCK_H #define INDICATOR_DATETIME_CLOCK_H #include #include #include #include // std::shared_ptr, std::unique_ptr namespace ayatana { namespace indicator { namespace datetime { /** * \brief A clock. */ class Clock { public: virtual ~Clock(); virtual DateTime localtime() const =0; /** \brief A signal which fires when the clock's minute changes */ core::Signal<> minute_changed; /** \brief A signal which fires when the clock's date changes */ core::Signal<> date_changed; protected: Clock(); /** \brief Compares old and new times, emits minute_changed() or date_changed() signals if appropriate */ void maybe_emit (const DateTime& a, const DateTime& b); private: class Impl; friend class Impl; std::unique_ptr m_impl; // we've got raw pointers and GSignal tags in here, so disable copying Clock(const Clock&) =delete; Clock& operator=(const Clock&) =delete; }; /*** **** ***/ class Timezone; /** * \brief A live #Clock that provides the actual system time. */ class LiveClock: public Clock { public: LiveClock (const std::shared_ptr& zones); virtual ~LiveClock(); virtual DateTime localtime() const override; private: class Impl; std::unique_ptr p; }; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_CLOCK_H ayatana-indicator-datetime-25.4.0/include/datetime/clock-mock.h0000644000000000000000000000330214773244555021302 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_CLOCK_MOCK_H #define INDICATOR_DATETIME_CLOCK_MOCK_H #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ /** * \brief A clock that uses a client-provided time instead of the system time. */ class MockClock: public Clock { public: explicit MockClock(const DateTime& dt): m_localtime(dt) {} ~MockClock() =default; DateTime localtime() const override { return m_localtime; } void set_localtime(const DateTime& dt) { const auto old = m_localtime; set_localtime_quietly(dt); if (!DateTime::is_same_minute(old, m_localtime)) minute_changed(); if (!DateTime::is_same_day(old, m_localtime)) date_changed(); } void set_localtime_quietly(const DateTime& dt) { m_localtime = dt; } private: DateTime m_localtime; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_CLOCK_MOCK_H ayatana-indicator-datetime-25.4.0/include/datetime/CMakeLists.txt0000644000000000000000000000000214773244555021641 0ustar ayatana-indicator-datetime-25.4.0/include/datetime/date-time.h0000644000000000000000000000576214773244555021145 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_DATETIME_H #define INDICATOR_DATETIME_DATETIME_H #include // GDateTime #include #include // time_t #include // std::shared_ptr namespace ayatana { namespace indicator { namespace datetime { /** * \brief A simple C++ wrapper for GDateTime to simplify ownership/refcounts */ class DateTime { public: static DateTime NowLocal(); static DateTime Local(time_t); static DateTime Local(int year, int month, int day, int hour, int minute, double seconds); DateTime(); DateTime(GTimeZone* tz, time_t t); DateTime(GTimeZone* tz, GDateTime* dt); DateTime(GTimeZone* tz, int year, int month, int day, int hour, int minute, double seconds); DateTime& operator=(const DateTime& in); DateTime& operator+=(const std::chrono::minutes&); DateTime& operator+=(const std::chrono::seconds&); DateTime to_timezone(const std::string& zone) const; DateTime start_of_month() const; DateTime start_of_day() const; DateTime start_of_minute() const; DateTime end_of_day() const; DateTime end_of_month() const; DateTime add_days(int days) const; DateTime add_full(int year, int month, int day, int hour, int minute, double seconds) const; GDateTime* get() const; GDateTime* operator()() const {return get();} std::string format(const std::string& fmt) const; void ymd(int& year, int& month, int& day) const; int day_of_month() const; int hour() const; int minute() const; double seconds() const; int64_t to_unix() const; bool operator<(const DateTime& that) const; bool operator>(const DateTime& that) const; bool operator<=(const DateTime& that) const; bool operator>=(const DateTime& that) const; bool operator!=(const DateTime& that) const; bool operator==(const DateTime& that) const; int64_t operator- (const DateTime& that) const; static bool is_same_day(const DateTime& a, const DateTime& b); static bool is_same_minute(const DateTime& a, const DateTime& b); bool is_set() const { return m_tz && m_dt; } private: void reset(GTimeZone*, GDateTime*); std::shared_ptr m_tz; std::shared_ptr m_dt; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_DATETIME_H ayatana-indicator-datetime-25.4.0/include/datetime/dbus-shared.h0000644000000000000000000000375214773244555021472 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould * Charles Kerr */ #ifndef INDICATOR_DATETIME_DBUS_SHARED_H #define INDICATOR_DATETIME_DBUS_SHARED_H #define BUS_DATETIME_NAME "org.ayatana.indicator.datetime" #define BUS_DATETIME_PATH "/org/ayatana/indicator/datetime" #define BUS_POWERD_NAME "com.lomiri.Repowerd" #define BUS_POWERD_PATH "/com/lomiri/Repowerd" #define BUS_POWERD_INTERFACE "com.lomiri.Repowerd" namespace Bus { namespace Timedate1 { static constexpr char const * BUSNAME {"org.freedesktop.timedate1"}; static constexpr char const * ADDR {"/org/freedesktop/timedate1"}; static constexpr char const * IFACE {"org.freedesktop.timedate1"}; namespace Properties { static constexpr char const * TIMEZONE {"Timezone"}; } namespace Methods { static constexpr char const * SET_TIMEZONE {"SetTimezone"}; } } namespace Properties { static constexpr char const * IFACE {"org.freedesktop.DBus.Properties"}; namespace Methods { static constexpr char const * GET {"Get"}; } namespace Signals { static constexpr char const * PROPERTIES_CHANGED {"PropertiesChanged"}; } } } #endif /* INDICATOR_DATETIME_DBUS_SHARED_H */ ayatana-indicator-datetime-25.4.0/include/datetime/engine-eds.h0000644000000000000000000000376614773244555021314 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #ifndef INDICATOR_DATETIME_ENGINE_EDS_H #define INDICATOR_DATETIME_ENGINE_EDS_H #include #include #include #include #include #include namespace ayatana { namespace indicator { namespace datetime { /**** ***** ****/ class Myself; /** * Class wrapper around EDS so multiple #EdsPlanners can share resources * * @see EdsPlanner */ class EdsEngine: public Engine { public: EdsEngine(const std::shared_ptr &myself); ~EdsEngine(); void get_appointments(const DateTime& begin, const DateTime& end, const Timezone& default_timezone, std::function&)> appointment_func) override; void disable_alarm(const Appointment&) override; core::Signal<>& changed() override; private: class Impl; std::unique_ptr p; // we've got a unique_ptr here, disable copying... EdsEngine(const EdsEngine&) =delete; EdsEngine& operator=(const EdsEngine&) =delete; }; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_ENGINE_EDS_H ayatana-indicator-datetime-25.4.0/include/datetime/engine.h0000644000000000000000000000340114773244555020525 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #ifndef INDICATOR_DATETIME_ENGINE_H #define INDICATOR_DATETIME_ENGINE_H #include #include #include #include #include namespace ayatana { namespace indicator { namespace datetime { /**** ***** ****/ /** * Class wrapper around the backend that generates appointments * * @see EdsEngine * @see EdsPlanner */ class Engine { public: virtual ~Engine() =default; virtual void get_appointments(const DateTime& begin, const DateTime& end, const Timezone& default_timezone, std::function&)> appointment_func) =0; virtual void disable_alarm(const Appointment&) =0; virtual core::Signal<>& changed() =0; protected: Engine() =default; }; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_ENGINE_H ayatana-indicator-datetime-25.4.0/include/datetime/engine-mock.h0000644000000000000000000000340414773244555021457 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #ifndef INDICATOR_DATETIME_ENGINE_MOCK_H #define INDICATOR_DATETIME_ENGINE_MOCK_H #include namespace ayatana { namespace indicator { namespace datetime { /**** ***** ****/ /** * A no-op #Engine * * @see Engine */ class MockEngine: public Engine { public: MockEngine() =default; ~MockEngine() =default; void get_appointments(const DateTime& /*begin*/, const DateTime& /*end*/, const Timezone& /*default_timezone*/, std::function&)> appointment_func) override { appointment_func(m_appointments); } core::Signal<>& changed() override { return m_changed; } void disable_alarm(const Appointment&) override { } private: core::Signal<> m_changed; std::vector m_appointments; }; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_ENGINE_MOCK_H ayatana-indicator-datetime-25.4.0/include/datetime/exporter.h0000644000000000000000000000312614773244555021134 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_EXPORTER_H #define INDICATOR_DATETIME_EXPORTER_H #include #include #include #include #include // std::shared_ptr #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief Exports actions and menus to DBus. */ class Exporter { public: explicit Exporter(const std::shared_ptr&); ~Exporter(); core::Signal<>& name_lost(); void publish(const std::shared_ptr& actions, const std::vector>& menus); private: class Impl; std::unique_ptr p; // disable copying Exporter(const Exporter&) =delete; Exporter& operator=(const Exporter&) =delete; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_EXPORTER_H ayatana-indicator-datetime-25.4.0/include/datetime/formatter.h0000644000000000000000000001004614773244555021266 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_FORMATTER_H #define INDICATOR_DATETIME_FORMATTER_H #include #include #include #include #include // is_locale_12h() #include #include #include namespace ayatana { namespace indicator { namespace datetime { class Clock; class DateTime; /*** **** ***/ /** * \brief Provide the strftime() format strings * * This is a simple goal, but getting there has a lot of options and edge cases: * * - The default time format can change based on the locale. * * - The user's settings can change or completely override the format string. * * - The time formats are different on the Phone and Desktop profiles. * * - The time format string in the Locations' menuitems uses (mostly) * the same time format as the header, except for some changes. * * - The 'current time' format string in the Locations' menuitems also * prepends the string 'Yesterday' or 'Today' if it differs from the * local time, so Formatter needs to have a Clock for its state. * * So the Formatter monitors system settings, the current timezone, etc. * and upate its time format properties appropriately. */ class Formatter { public: /** \brief The time format string for the menu header */ core::Property header_format; /** \brief The time string for the menu header. (eg, the header_format + the clock's time */ core::Property header; /** \brief Signal to denote when the relativeFormat has changed. When this is emitted, clients will want to rebuild their menuitems that contain relative time strings (ie, the Appointments and Locations menuitems) */ core::Signal<> relative_format_changed; /** \brief Generate a relative time format for some time (or time range) from the current clock's value. For example, a full-day interval starting at the end of the current clock's day yields "Tomorrow" */ std::string relative_format(GDateTime* then, GDateTime* then_end=nullptr) const; protected: explicit Formatter(const std::shared_ptr&); virtual ~Formatter(); static const char* default_header_time_format(bool twelvehour, bool show_seconds); private: Formatter(const Formatter&) =delete; Formatter& operator=(const Formatter&) =delete; class Impl; std::unique_ptr p; }; /** * \brief A Formatter for the Desktop and DesktopGreeter profiles. */ class DesktopFormatter: public Formatter { public: DesktopFormatter(const std::shared_ptr&, const std::shared_ptr&); private: std::shared_ptr m_settings; void rebuildHeaderFormat(); const gchar* getFullTimeFormatString() const; std::string getHeaderLabelFormatString() const; const gchar* getDateFormat(bool show_day, bool show_date, bool show_year) const; }; /** * \brief A Formatter for Phone and PhoneGreeter profiles. */ class PhoneFormatter: public Formatter { public: explicit PhoneFormatter(const std::shared_ptr& clock): Formatter(clock) { header_format.set(default_header_time_format(is_locale_12h(), false)); } }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_CLOCK_H ayatana-indicator-datetime-25.4.0/include/datetime/locations.h0000644000000000000000000000360614773244555021262 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_LOCATIONS_H #define INDICATOR_DATETIME_LOCATIONS_H #include #include #include #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief A physical place and its timezone; eg, "America/Chicago" + "Oklahoma City" * * @see Locations */ class Location { public: Location (const std::string& zone, const std::string& name); const std::string& zone() const; const std::string& name() const; bool operator== (const Location& that) const; private: /** timezone; eg, "America/Chicago" */ std::string m_zone; /* human-readable location name; eg, "Oklahoma City" */ std::string m_name; /** offset from UTC in microseconds */ int64_t m_offset = 0; }; /** * Container which holds an ordered list of Locations * * @see Location * @see State */ class Locations { public: Locations() =default; virtual ~Locations() =default; /** \brief an ordered list of Location items */ core::Property> locations; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_LOCATIONS_H ayatana-indicator-datetime-25.4.0/include/datetime/locations-settings.h0000644000000000000000000000324014773244555023112 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_SETTINGS_LOCATIONS_H #define INDICATOR_DATETIME_SETTINGS_LOCATIONS_H #include // base class #include #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief #Locations implementation which builds its list from the #Settings. */ class SettingsLocations: public Locations { public: /** * @param[in] settings the #Settings whose locations property is to be used * @param[in] timezones the #Timezones to always show first in the list */ SettingsLocations (const std::shared_ptr& settings, const std::shared_ptr& timezones); private: std::shared_ptr m_settings; std::shared_ptr m_timezones; void reload(); }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_SETTINGS_LOCATIONS_H ayatana-indicator-datetime-25.4.0/include/datetime/menu.h0000644000000000000000000000467514773244555020242 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_MENU_H #define INDICATOR_DATETIME_MENU_H #include #include #include #include // std::shared_ptr #include #include // GMenuModel namespace ayatana { namespace indicator { namespace datetime { /** * \brief A menu for a specific profile; eg, Desktop or Phone. * * @see MenuFactory * @see Exporter */ class Menu { public: enum Profile { Desktop, DesktopGreeter, Phone, PhoneGreeter, NUM_PROFILES }; enum Section { Calendar, Appointments, Locations, Settings, NUM_SECTIONS }; const std::string& name() const; Profile profile() const; GMenuModel* menu_model(); static std::vector get_display_appointments( const std::vector&, const DateTime& start, unsigned int max_items=5, const bool include_alarms=true); protected: Menu (Profile profile_in, const std::string& name_in); virtual ~Menu() =default; GMenu* m_menu = nullptr; private: const Profile m_profile; const std::string m_name; // we've got raw pointers in here, so disable copying Menu(const Menu&) =delete; Menu& operator=(const Menu&) =delete; }; /** * \brief Builds a Menu for a given state and profile * * @see Menu * @see Exporter */ class MenuFactory { public: MenuFactory (const std::shared_ptr& actions, const std::shared_ptr& state); std::shared_ptr buildMenu(Menu::Profile profile); private: std::shared_ptr m_actions; std::shared_ptr m_state; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_MENU_H ayatana-indicator-datetime-25.4.0/include/datetime/myself.h0000644000000000000000000000275414773244555020571 0ustar /* * Copyright 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho */ #ifndef INDICATOR_DATETIME_MYSELF_H #define INDICATOR_DATETIME_MYSELF_H #include #include #include #include #include typedef struct _AgManager AgManager; namespace ayatana { namespace indicator { namespace datetime { class Myself { public: Myself(); const core::Property>& emails() { return m_emails; } bool isMyEmail(const std::string &email); private: std::shared_ptr m_accounts_manager; core::Property > m_emails; static void on_accounts_changed(AgManager*, guint, Myself*); void reloadEmails(); }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_MYSELF_H ayatana-indicator-datetime-25.4.0/include/datetime/planner-aggregate.h0000644000000000000000000000254714773244555022655 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_PLANNER_AGGREGATE_H #define INDICATOR_DATETIME_PLANNER_AGGREGATE_H #include #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief Aggregates one or more Planners */ class AggregatePlanner: public Planner { public: AggregatePlanner(); virtual ~AggregatePlanner(); void add(const std::shared_ptr&); core::Property>& appointments() override; protected: class Impl; std::unique_ptr impl; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_PLANNER_AGGREGATE_H ayatana-indicator-datetime-25.4.0/include/datetime/planner.h0000644000000000000000000000246314773244555020726 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_PLANNER_H #define INDICATOR_DATETIME_PLANNER_H #include #include #include #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief Simple collection of appointments */ class Planner { public: virtual ~Planner(); virtual core::Property>& appointments() =0; protected: Planner(); static void sort(std::vector&); }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_PLANNER_H ayatana-indicator-datetime-25.4.0/include/datetime/planner-month.h0000644000000000000000000000310014773244555022036 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_PLANNER_MONTH_H #define INDICATOR_DATETIME_PLANNER_MONTH_H #include #include #include #include // std::shared_ptr namespace ayatana { namespace indicator { namespace datetime { /** * \brief A #Planner that contains appointments for a specified calendar month */ class MonthPlanner: public Planner { public: MonthPlanner(const std::shared_ptr& range_planner, const DateTime& month_in); ~MonthPlanner() =default; core::Property>& appointments(); core::Property& month(); private: std::shared_ptr m_range_planner; core::Property m_month; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_PLANNER_MONTH_H ayatana-indicator-datetime-25.4.0/include/datetime/planner-range.h0000644000000000000000000000451014773244555022013 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_PLANNER_RANGE_H #define INDICATOR_DATETIME_PLANNER_RANGE_H #include #include #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief A #Planner that contains appointments in a specified date range * * @see Planner */ class RangePlanner: public Planner { public: virtual ~RangePlanner() =default; virtual core::Property>& range() =0; protected: RangePlanner() =default; }; /** * \brief A #RangePlanner that uses an #Engine to generate appointments * * @see Planner */ class SimpleRangePlanner: public RangePlanner { public: SimpleRangePlanner(const std::shared_ptr& engine, const std::shared_ptr& timezone); virtual ~SimpleRangePlanner(); core::Property>& appointments(); core::Property>& range(); private: // rebuild scaffolding void rebuild_soon(); virtual void rebuild_now(); static gboolean rebuild_now_static(gpointer); guint m_rebuild_tag = 0; std::shared_ptr m_engine; std::shared_ptr m_timezone; core::Property> m_range; core::Property> m_appointments; // we've got a GSignal tag here, so disable copying explicit SimpleRangePlanner(const RangePlanner&) =delete; SimpleRangePlanner& operator=(const RangePlanner&) =delete; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_PLANNER_RANGE_H ayatana-indicator-datetime-25.4.0/include/datetime/planner-snooze.h0000644000000000000000000000277214773244555022244 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_PLANNER_SNOOZE_H #define INDICATOR_DATETIME_PLANNER_SNOOZE_H #include #include #include #include namespace ayatana { namespace indicator { namespace datetime { /** * A planner to hold 'Snooze' copies of other appointments */ class SnoozePlanner: public Planner { public: SnoozePlanner(const std::shared_ptr&, const std::shared_ptr&); ~SnoozePlanner(); core::Property>& appointments() override; void add(const Appointment&, const Alarm&); protected: class Impl; friend class Impl; std::unique_ptr impl; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_PLANNER_H ayatana-indicator-datetime-25.4.0/include/datetime/planner-upcoming.h0000644000000000000000000000312114773244555022535 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_PLANNER_UPCOMING_H #define INDICATOR_DATETIME_PLANNER_UPCOMING_H #include #include #include #include // std::shared_ptr namespace ayatana { namespace indicator { namespace datetime { /** * \brief A collection of upcoming appointments starting from the specified date */ class UpcomingPlanner: public Planner { public: UpcomingPlanner(const std::shared_ptr& range_planner, const DateTime& date); ~UpcomingPlanner() =default; core::Property>& appointments(); core::Property& date(); private: std::shared_ptr m_range_planner; core::Property m_date; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_PLANNER_UPCOMING_H ayatana-indicator-datetime-25.4.0/include/datetime/settings.h0000644000000000000000000000474114773244555021130 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_SETTINGS_H #define INDICATOR_DATETIME_SETTINGS_H #include #include #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief Interface that represents user-configurable settings. * * See the descriptions in data/org.ayatana.indicator.datetime.gschema.xml * for more information on specific properties. */ class Settings { public: Settings() =default; virtual ~Settings() =default; core::Property custom_time_format; core::Property> locations; core::Property show_calendar; core::Property show_date; core::Property show_day; core::Property show_detected_location; core::Property show_events; core::Property show_alarms; core::Property show_locations; core::Property show_seconds; core::Property show_week_numbers; core::Property show_year; core::Property time_format_mode; core::Property timezone_name; core::Property calendar_sound; core::Property alarm_sound; core::Property alarm_haptic; core::Property alarm_volume; core::Property alarm_duration; core::Property snooze_duration; core::Property cal_notification_enabled; core::Property cal_notification_sounds; core::Property cal_notification_vibrations; core::Property cal_notification_bubbles; core::Property cal_notification_list; core::Property vibrate_silent_mode; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_SETTINGS_H ayatana-indicator-datetime-25.4.0/include/datetime/settings-live.h0000644000000000000000000000542414773244555022064 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_SETTINGS_LIVE_H #define INDICATOR_DATETIME_SETTINGS_LIVE_H #include // parent class #include // GSettings namespace ayatana { namespace indicator { namespace datetime { /** * \brief #Settings implementation which uses GSettings. */ class LiveSettings: public Settings { public: LiveSettings(); virtual ~LiveSettings(); private: static void on_changed_ccid(GSettings*, gchar*, gpointer); static void on_changed_cal_notification(GSettings*, gchar*, gpointer); static void on_changed_general_notification(GSettings*, gchar*, gpointer); void update_key_ccid(const std::string& key); void update_key_cal_notification(const std::string& key); void update_key_general_notification(const std::string& key); void update_custom_time_format(); void update_locations(); void update_show_calendar(); void update_show_date(); void update_show_day(); void update_show_detected_locations(); void update_show_events(); void update_show_alarms(); void update_show_locations(); void update_show_seconds(); void update_show_week_numbers(); void update_show_year(); void update_time_format_mode(); void update_timezone_name(); void update_calendar_sound(); void update_alarm_sound(); void update_alarm_volume(); void update_alarm_duration(); void update_alarm_haptic(); void update_snooze_duration(); void update_cal_notification_enabled(); void update_cal_notification_sounds(); void update_cal_notification_vibrations(); void update_cal_notification_bubbles(); void update_cal_notification_list(); void update_vibrate_silent_mode(); GSettings* m_settings; GSettings* m_settings_cal_notification; GSettings* m_settings_general_notification; // we've got a raw pointer here, so disable copying LiveSettings(const LiveSettings&) =delete; LiveSettings& operator=(const LiveSettings&) =delete; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_SETTINGS_LIVE_H ayatana-indicator-datetime-25.4.0/include/datetime/settings-shared.h0000644000000000000000000000557514773244555022402 0ustar /* * Copyright 2010 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould * Charles Kerr */ #ifndef INDICATOR_DATETIME_SETTINGS_SHARED #define INDICATOR_DATETIME_SETTINGS_SHARED typedef enum { TIME_FORMAT_MODE_LOCALE_DEFAULT, TIME_FORMAT_MODE_12_HOUR, TIME_FORMAT_MODE_24_HOUR, TIME_FORMAT_MODE_CUSTOM } TimeFormatMode; #define SETTINGS_INTERFACE "org.ayatana.indicator.datetime" #define SETTINGS_TIME_FORMAT_S "time-format" #define SETTINGS_SHOW_SECONDS_S "show-seconds" #define SETTINGS_SHOW_DAY_S "show-day" #define SETTINGS_SHOW_DATE_S "show-date" #define SETTINGS_SHOW_YEAR_S "show-year" #define SETTINGS_CUSTOM_TIME_FORMAT_S "custom-time-format" #define SETTINGS_SHOW_CALENDAR_S "show-calendar" #define SETTINGS_SHOW_WEEK_NUMBERS_S "show-week-numbers" #define SETTINGS_SHOW_EVENTS_S "show-events" #define SETTINGS_SHOW_ALARMS_S "show-alarms" #define SETTINGS_SHOW_LOCATIONS_S "show-locations" #define SETTINGS_SHOW_DETECTED_S "show-auto-detected-location" #define SETTINGS_LOCATIONS_S "locations" #define SETTINGS_TIMEZONE_NAME_S "timezone-name" #define SETTINGS_CALENDAR_SOUND_S "calendar-default-sound" #define SETTINGS_ALARM_SOUND_S "alarm-default-sound" #define SETTINGS_ALARM_VOLUME_S "alarm-default-volume" #define SETTINGS_ALARM_DURATION_S "alarm-duration-minutes" #define SETTINGS_ALARM_HAPTIC_S "alarm-haptic-feedback" #define SETTINGS_SNOOZE_DURATION_S "snooze-duration-minutes" #define SETTINGS_NOTIFY_APPS_SCHEMA_ID "com.lomiri.notifications.settings.applications" #define SETTINGS_VIBRATE_SILENT_KEY "vibrate-silent-mode" #define SETTINGS_NOTIFY_SCHEMA_ID "com.lomiri.notifications.settings" #define SETTINGS_NOTIFY_CALENDAR_PATH "/com/lomiri/NotificationSettings/com.lomiri.calendar/calendar/" #define SETTINGS_NOTIFY_ENABLED_KEY "enable-notifications" #define SETTINGS_NOTIFY_SOUNDS_KEY "use-sounds-notifications" #define SETTINGS_NOTIFY_VIBRATIONS_KEY "use-vibrations-notifications" #define SETTINGS_NOTIFY_BUBBLES_KEY "use-bubbles-notifications" #define SETTINGS_NOTIFY_LIST_KEY "use-list-notifications" #endif // INDICATOR_DATETIME_SETTINGS_SHARED ayatana-indicator-datetime-25.4.0/include/datetime/snap.h0000644000000000000000000000356214773244555020231 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_SNAP_H #define INDICATOR_DATETIME_SNAP_H #include #include #include #include #include // GDBusConnection #include #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief Pops up Snap Decisions for appointments */ class Snap { public: Snap(const std::shared_ptr& engine, const std::shared_ptr& sound_builder, const std::shared_ptr& settings, GDBusConnection* system_bus); virtual ~Snap(); enum class Response { None, Snooze, ShowApp }; typedef std::function response_func; void operator()(const Appointment& appointment, const Alarm& alarm, response_func on_response); private: class Impl; std::unique_ptr impl; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_SNAP_H ayatana-indicator-datetime-25.4.0/include/datetime/state.h0000644000000000000000000000474314773244555020412 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_STATE_H #define INDICATOR_DATETIME_STATE_H #include #include #include #include #include #include #include #include // std::shared_ptr namespace ayatana { namespace indicator { namespace datetime { /** * \brief Aggregates all the classes that represent the backend state. * * This is where the app comes together. It's a model that aggregates * all of the backend appointments/alarms, locations, timezones, * system time, and so on. The "view" code (ie, the Menus) need to * respond to Signals from the State and update themselves accordingly. * * @see Menu * @see MenuFactory * @see Timezones * @see Clock * @see Planner * @see Locations * @see Settings */ struct State { /** \brief The current time. Used by the header, by the date menuitem, and by the locations for relative timestamp */ std::shared_ptr clock; /** \brief The locations to be displayed in the Locations section of the #Menu */ std::shared_ptr locations; /** \brief Appointments in the month that's being displayed in the calendar section of the #Menu */ std::shared_ptr calendar_month; /** \brief The next appointments that follow highlighed date highlighted in the calendar section of the #Menu (default date = today) */ std::shared_ptr calendar_upcoming; /** \brief Configuration options that modify the view */ std::shared_ptr settings; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_STATE_H ayatana-indicator-datetime-25.4.0/include/datetime/timezone-geoclue.h0000644000000000000000000000275114773244555022542 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2022 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #ifndef INDICATOR_DATETIME_GEOCLUE_TIMEZONE_H #define INDICATOR_DATETIME_GEOCLUE_TIMEZONE_H #include // base class namespace ayatana { namespace indicator { namespace datetime { /** * \brief A #Timezone that gets its information from asking GeoClue */ class GeoclueTimezone: public Timezone { public: GeoclueTimezone(); ~GeoclueTimezone(); private: class Impl; std::unique_ptr impl; // we've got pointers in here, so don't allow copying GeoclueTimezone(const GeoclueTimezone&) =delete; GeoclueTimezone& operator=(const GeoclueTimezone&) =delete; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_GEOCLUE_TIMEZONE_H ayatana-indicator-datetime-25.4.0/include/datetime/timezone.h0000644000000000000000000000223414773244555021115 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_TIMEZONE_H #define INDICATOR_DATETIME_TIMEZONE_H #include #include namespace ayatana { namespace indicator { namespace datetime { /** \brief Base a timezone, such as "America/Chicago". */ class Timezone { protected: Timezone() =default; public: core::Property timezone; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_TIMEZONE_H ayatana-indicator-datetime-25.4.0/include/datetime/timezones.h0000644000000000000000000000274314773244555021305 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_TIMEZONES_H #define INDICATOR_DATETIME_TIMEZONES_H #include #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief Helper class which aggregates one or more timezones * * @see LiveClock * @see SettingsLocations */ class Timezones { public: Timezones() =default; virtual ~Timezones() =default; /** * \brief the current timezone */ core::Property timezone; /** * \brief all the detected timezones. * The count is >1 iff the detection mechamisms disagree. */ core::Property > timezones; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_TIMEZONES_H ayatana-indicator-datetime-25.4.0/include/datetime/timezones-live.h0000644000000000000000000000314614773244555022240 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_LIVE_TIMEZONES_H #define INDICATOR_DATETIME_LIVE_TIMEZONES_H #include #include #include #include // shared_ptr<> namespace ayatana { namespace indicator { namespace datetime { /** * \brief #Timezones object that uses a #TimedatedTimezone and #GeoclueTimezone * to detect what timezone we're in */ class LiveTimezones: public Timezones { public: LiveTimezones(const std::shared_ptr& settings, const std::shared_ptr& primary_timezone); private: void update_geolocation(); void update_timezones(); std::shared_ptr m_primary_timezone; std::shared_ptr m_settings; std::shared_ptr m_geo; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_LIVE_TIMEZONES_H ayatana-indicator-datetime-25.4.0/include/datetime/timezone-timedated.h0000644000000000000000000000307014773244555023052 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_TIMEDATED_TIMEZONE_H #define INDICATOR_DATETIME_TIMEDATED_TIMEZONE_H #include // base class #include // GDBusConnection* #include // std::string namespace ayatana { namespace indicator { namespace datetime { /** * \brief A #Timezone that gets its information from org.freedesktop.timedate1 */ class TimedatedTimezone: public Timezone { public: TimedatedTimezone(GDBusConnection* connection); ~TimedatedTimezone(); private: class Impl; friend Impl; std::unique_ptr impl; // we have pointers in here, so disable copying TimedatedTimezone(const TimedatedTimezone&) =delete; TimedatedTimezone& operator=(const TimedatedTimezone&) =delete; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_TIMEDATED_TIMEZONE_H ayatana-indicator-datetime-25.4.0/include/datetime/utils.h0000644000000000000000000000416414773244555020427 0ustar /* * Copyright 2010, 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Michael Terry * Charles Kerr */ #ifndef INDICATOR_DATETIME_UTILS_H #define INDICATOR_DATETIME_UTILS_H #include #include /* GSettings */ G_BEGIN_DECLS /** \brief Returns true if the current locale prefers 12h display instead of 24h */ gboolean is_locale_12h (void); void split_settings_location (const char * location, char ** zone, char ** name); gchar * get_timezone_name (const char * timezone, GSettings * settings); gchar * get_beautified_timezone_name (const char * timezone, const char * saved_location); gchar * generate_full_format_string_at_time (GDateTime * now, GDateTime * then_begin, GDateTime * then_end); /** \brief Translate the string based on LC_TIME instead of LC_MESSAGES. The intent of this is to let users set LC_TIME to override their other locale settings when generating time format string */ const char* T_ (const char * msg); G_END_DECLS #endif /* INDICATOR_DATETIME_UTILS_H */ ayatana-indicator-datetime-25.4.0/include/datetime/wakeup-timer.h0000644000000000000000000000250414773244555021675 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_WAKEUP_TIMER_H #define INDICATOR_DATETIME_WAKEUP_TIMER_H #include #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ /** * \brief A one-shot timer that emits a signal when its timeout is reached. */ class WakeupTimer { public: WakeupTimer() =default; virtual ~WakeupTimer() =default; virtual void set_wakeup_time (const DateTime&) =0; virtual core::Signal<>& timeout() =0; }; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_WAKEUP_TIMER_H ayatana-indicator-datetime-25.4.0/include/datetime/wakeup-timer-mainloop.h0000644000000000000000000000317114773244555023512 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_WAKEUP_TIMER_MAINLOOP_H #define INDICATOR_DATETIME_WAKEUP_TIMER_MAINLOOP_H #include #include #include // std::unique_ptr, std::shared_ptr namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ /** * \brief a WakeupTimer implemented with g_timeout_add() */ class MainloopWakeupTimer: public WakeupTimer { public: explicit MainloopWakeupTimer(const std::shared_ptr&); ~MainloopWakeupTimer(); void set_wakeup_time (const DateTime&) override; core::Signal<>& timeout() override; private: MainloopWakeupTimer(const MainloopWakeupTimer&) =delete; MainloopWakeupTimer& operator= (const MainloopWakeupTimer&) =delete; class Impl; std::unique_ptr p; }; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_WAKEUP_TIMER_MAINLOOP_H ayatana-indicator-datetime-25.4.0/include/datetime/wakeup-timer-powerd.h0000644000000000000000000000314514773244555023175 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_WAKEUP_TIMER_POWERD_H #define INDICATOR_DATETIME_WAKEUP_TIMER_POWERD_H #include #include #include // std::unique_ptr, std::shared_ptr namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ /** * \brief a WakeupTimer implemented with g_timeout_add() */ class PowerdWakeupTimer: public WakeupTimer { public: explicit PowerdWakeupTimer(const std::shared_ptr&); ~PowerdWakeupTimer(); void set_wakeup_time(const DateTime&) override; core::Signal<>& timeout() override; private: PowerdWakeupTimer(const PowerdWakeupTimer&) =delete; PowerdWakeupTimer& operator=(const PowerdWakeupTimer&) =delete; class Impl; std::unique_ptr p; }; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_WAKEUP_TIMER_MAINLOOP_H ayatana-indicator-datetime-25.4.0/include/notifications/awake.h0000644000000000000000000000246014773244555021431 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef AYATANA_INDICATOR_NOTIFICATIONS_AWAKE_H #define AYATANA_INDICATOR_NOTIFICATIONS_AWAKE_H #include #include namespace ayatana { namespace indicator { namespace notifications { /*** **** ***/ /** * A class that forces the screen display on and inhibits sleep */ class Awake { public: explicit Awake(GDBusConnection* system_bus, const std::string& app_name); ~Awake(); private: class Impl; std::unique_ptr impl; }; /*** **** ***/ } // namespace notifications } // namespace indicator } // namespace ayatana #endif // AYATANA_INDICATOR_NOTIFICATIONS_AWAKE_H ayatana-indicator-datetime-25.4.0/include/notifications/CMakeLists.txt0000644000000000000000000000000014773244555022714 0ustar ayatana-indicator-datetime-25.4.0/include/notifications/dbus-shared.h0000644000000000000000000000265414773244555022547 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Ted Gould * Charles Kerr * Robert Tari */ #ifndef AYATANA_INDICATOR_NOTIFICATIONS_DBUS_SHARED_H #define AYATANA_INDICATOR_NOTIFICATIONS_DBUS_SHARED_H #define BUS_SCREEN_NAME "com.canonical.Unity.Screen" #define BUS_SCREEN_PATH "/com/canonical/Unity/Screen" #define BUS_SCREEN_INTERFACE "com.canonical.Unity.Screen" #define BUS_POWERD_NAME "com.lomiri.Repowerd" #define BUS_POWERD_PATH "/com/lomiri/Repowerd" #define BUS_POWERD_INTERFACE "com.lomiri.Repowerd" #define BUS_HAPTIC_NAME "com.lomiri.hfd" #define BUS_HAPTIC_PATH "/com/lomiri/hfd" #define BUS_HAPTIC_INTERFACE "com.lomiri.hfd.Vibrator" #endif /* INDICATOR_NOTIFICATIONS_DBUS_SHARED_H */ ayatana-indicator-datetime-25.4.0/include/notifications/haptic.h0000644000000000000000000000247714773244555021621 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #ifndef AYATANA_INDICATOR_NOTIFICATIONS_HAPTIC_H #define AYATANA_INDICATOR_NOTIFICATIONS_HAPTIC_H #include namespace ayatana { namespace indicator { namespace notifications { /*** **** ***/ /** * Tries to emit haptic feedback to match the user-specified mode. */ class Haptic { public: explicit Haptic(bool repeat = false); ~Haptic(); private: class Impl; std::unique_ptr impl; }; /*** **** ***/ } // namespace notifications } // namespace indicator } // namespace ayatana #endif // AYATANA_INDICATOR_NOTIFICATIONS_HAPTIC_H ayatana-indicator-datetime-25.4.0/include/notifications/notifications.h0000644000000000000000000000760214773244555023215 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef AYATANA_INDICATOR_NOTIFICATIONS_NOTIFICATIONS_H #define AYATANA_INDICATOR_NOTIFICATIONS_NOTIFICATIONS_H #include #include #include #include namespace ayatana { namespace indicator { namespace notifications { class Engine; /** * Helper class for showing notifications. * * Populate the builder, then pass it to Engine::show(). * * @see Engine::show(Builder) */ class Builder { public: Builder(); ~Builder(); void set_title (const std::string& title); void set_body (const std::string& body); void set_icon_name (const std::string& icon_name); void set_start_time(uint64_t time); /* Set an interval, after which the notification will automatically be closed. If not set, the notification server's default timeout is used. */ void set_timeout (const std::chrono::seconds& duration); /* Add a notification hint. These keys may be dependent on the notification server. */ void add_hint (const std::string& name); static constexpr char const * HINT_SNAP {"x-lomiri-snap-decisions"}; static constexpr char const * HINT_NONSHAPED_ICON {"x-lomiri-non-shaped-icon"}; static constexpr char const * HINT_AFFIRMATIVE_HINT {"x-lomiri-private-affirmative-tint"}; static constexpr char const * HINT_REJECTION_TINT {"x-lomiri-private-rejection-tint"}; static constexpr char const * HINT_INTERACTIVE {"x-lomiri-switch-to-application"}; /* Add an action button. This may fail if the Engine doesn't support actions. @see Engine::supports_actions() */ void add_action (const std::string& action, const std::string& label); /** Sets the closed callback. This will be called exactly once. After notification disappears */ void set_closed_callback (std::function); /** Sets the time-out callback. This will be called exactly once. */ void set_timeout_callback (std::function); /** Sets if a notification bubble should be displayed. */ void set_show_notification_bubble (bool show); /** Sets if notification should be posted to messaging menu after it is closed. */ void set_post_to_messaging_menu (bool post); private: friend class Engine; class Impl; std::unique_ptr impl; }; /** * Manages Notifications and the connection to the notification server. * * When this class is destroyed, any remaining notifications it created * will be closed and their closed() callbacks will be invoked. */ class Engine { public: explicit Engine(const std::string& app_name); ~Engine(); /** @see Builder::set_action() */ bool supports_actions() const; /** Show a notification. @return zero on failure, or a key that can be passed to close() */ int show(const Builder& builder); /** Close a notification. @param key the int returned by show() */ void close(int key); /** Close all remaining notifications. */ void close_all(); const std::string& app_name() const; private: class Impl; std::unique_ptr impl; }; } // namespace notifications } // namespace indicator } // namespace ayatana #endif // AYATANA_INDICATOR_NOTIFICATIONS_NOTIFICATIONS_H ayatana-indicator-datetime-25.4.0/include/notifications/sound.h0000644000000000000000000000401514773244555021467 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef AYATANA_INDICATOR_NOTIFICATIONS_SOUND_H #define AYATANA_INDICATOR_NOTIFICATIONS_SOUND_H #include #include namespace ayatana { namespace indicator { namespace notifications { /*** **** ***/ /** * Plays a sound, possibly looping. * * @param uri the file to play * @param volume the volume at which to play the sound, [0..100] * @param loop if true, loop the sound for the lifespan of the object */ class Sound { public: Sound(const std::string& role, const std::string& uri, unsigned int volume, bool loop); ~Sound(); private: class Impl; std::unique_ptr impl; }; /*** **** ***/ class SoundBuilder { public: SoundBuilder() =default; virtual ~SoundBuilder() =default; virtual std::shared_ptr create(const std::string& role, const std::string& uri, unsigned int volume, bool loop) =0; }; class DefaultSoundBuilder: public SoundBuilder { public: DefaultSoundBuilder() =default; ~DefaultSoundBuilder() =default; virtual std::shared_ptr create(const std::string& role, const std::string& uri, unsigned int volume, bool loop) override { return std::make_shared(role, uri, volume, loop); } }; /*** **** ***/ } // namespace notifications } // namespace indicator } // namespace ayatana #endif // AYATANA_INDICATOR_NOTIFICATIONS_SOUND_H ayatana-indicator-datetime-25.4.0/INSTALL.md0000644000000000000000000000211214773244555015316 0ustar # Build and installation instructions ## Compile-time build dependencies - cmake (>= 3.13) - cmake-extras - libayatana-common (>= 0.9.3) - glib-2.0 (>= 2.36) - libical (>=0.48) - libecal-2.0 (>=3.16) - libedataserver-1.2 (>=3.5) - gstreamer-1.0 (>=1.2) - libnotify (>=0.7.6) - properties-cpp (>=0.0.1) - libaccounts-glib (>=1.18) - gettext (>= 0.18) - dbus - gcovr (>= 2.4) - lcov (>= 1.9) - gtest (>= 1.6.0) - dbus-test-runner - libdbustest1 - python3-dbusmock - glibc-locales - gvfs-daemons - systemd ## For end-users and packagers ``` cd ayatana-indicator-datetime-X.Y.Z mkdir build cd build cmake .. make sudo make install ``` **The install prefix defaults to `/usr`, change it with `-DCMAKE_INSTALL_PREFIX=/some/path`** ## For testers - unit tests only ``` cd ayatana-indicator-datetime-X.Y.Z mkdir build cd build cmake .. -DENABLE_TESTS=ON make make test make cppcheck ``` ## For testers - both unit tests and code coverage ``` cd ayatana-indicator-datetime-X.Y.Z mkdir build-coverage cd build-coverage cmake .. -DENABLE_COVERAGE=ON make make coverage-html ``` ayatana-indicator-datetime-25.4.0/NEWS0000644000000000000000000003461114773244555014376 0ustar Overview of changes in ayatana-indicator-datetime 25.4.0 - Add mkCal backend (to support Lomiri's calendar app backend). - tests/test-timezones.cpp: Avoid potential null pointer. - tests/run-eds-ics-test.sh: Quote file paths. - tests/run-mkcal-db-test.sh: Make test script executable. - CMake: Support building datetime indicator in two variants with different service executable names and systemd service files. - Translation updates. Overview of changes in ayatana-indicator-datetime 24.5.1 - Fix calendar not refreshed on month range change. - Fix missing notification icon with libnotify 0.8.4. - Translation updates. Overview of changes in ayatana-indicator-datetime 24.5.0 - data/ayatana-indicator-datetime.service.in: Become part of lomiri-indicators.target. - Translation updates. Overview of changes in ayatana-indicator-datetime 24.2.0 - src, tests: enable notification code path without Lomiri deps. - tests/test-menus: Fix build. - Tests: Fix show_alarms tests. - Fix tests relying on the default EDS appointment colour. - tests/CMakeLists.txt: Run test-notification only when building with Lomiri features. - tests/: Fix test-sound. Drop parameterized test run for now. Needs more investigation. - src/CMakeLists.txt: suppress Wenum-constexpr-conversion in engine-eds.cpp. Overview of changes in ayatana-indicator-datetime 24.2.0 - src, tests: enable notification code path without Lomiri deps. - tests/test-menus: Fix build. - Tests: Fix show_alarms tests. - Fix tests relying on the default EDS appointment colour. - tests/CMakeLists.txt: Run test-notification only when building with Lomiri features. - tests/: Fix test-sound. Drop parameterized test run for now. Needs more investigation. - src/CMakeLists.txt: suppress Wenum-constexpr-conversion in engine-eds.cpp - Translation updates. Overview of changes in ayatana-indicator-datetime 23.10.1 - Also apply show-events to Phone profile. - Add option to show/hide alarms. Overview of changes in ayatana-indicator-datetime 23.10.0 - tests/run-eds-ics-test: don't eat away test's result. - Remove osd-notify remnants and use native notification timeout. - Fix gschema file translation. - Fix failing tests. - Enable all tests. - CMakeLists.txt: Minor CMake warning fix. - update-pot.sh: Adjust to rename .gschema.xml file. - Update translations. Overview of changes in ayatana-indicator-datetime 23.6.0 - engine-eds: fix retrieving custom alarm sound path ECal 2.0 returns the list of attachments as a GSList (a singly linked list). I'm not sure why, but the logic for iterating the list is completely incorrect. Fixing that fixes custom alarm sound. A test is added to catch this case. - Translation updates. Overview of changes in ayatana-indicator-datetime 22.9.1 - engine-eds: fix retrieving custom alarm sound path. - Translation updates. Overview of changes in ayatana-indicator-datetime 22.9.1 - src/haptic.cpp: Fix data type sent to hfd-service - Fix build failure due to missing #include - Translation updates. Overview of changes in ayatana-indicator-datetime 22.9.0 - Add tooltip support. - Translation updates. Overview of changes in ayatana-indicator-datetime 22.2.0 - CMakeLists.txt: Read default sounds from lomiri-sounds pkg-config file. - Drop pkglibexecdir and use native CMake file configuration. - Fix build warnings. - Clean up compilation flags. - Fix cppcheck errors/warnings. - Some code removals. - Make Lomiri features configurable at build time. - Check for lomiri-schemas package instead of individual files. - Remove C(++) std version constraint. - Check for the lomiri-sounds package. - Translation updates. Overview of changes in ayatana-indicator-datetime 0.9.0 - Re-enable haptic using hfd-service. - Rename Lomiri-specific properties to x-lomiri. - include/datetime/settings-shared.h: Rename com.ubuntu.calendar. - Fix ringtones path + drop unused definition. - Rename HAVE_UT_ACCTSERVICE_SYSTEMSOUND_SETTINGS to HAS_LOMIRI_ACCTSERVICE_SOUND. - Rename com.ubuntu.touch.AccountsService.Sound to com.lomiri.touch.AccountsService.Sound. - Use lomiri-phablet instead of ubuntu. - Remove com.canonical.usensord and disable haptic. - Remove the activation_url from the Appointment class. - Drop the 'ubuntu' prefix from the alarm types and functions. - Rename com.ubuntu.notifications to com.lomiri.notifications. - Rename x-canonical properties to x-ayatana. - data/CMakeLists.txt: Do not use automatic GSchema compilation. - Use native CMake GSettings module. - Allow autostart for Budgie Desktop. - tests/test-live-actions: Handle case when the test is run on Lomiri. - Link to lomiri-url-dispatcher where needed. - src/snap.cpp: Create Sound object via SoundBuilder. - src/settings-live.cpp: Check for schema instead of Lomiri. - include/notifications/sound.h: Add SoundBuider class. - src/snap.cpp: Add m_sound_builder variable. - src/main.cpp: Fix uin -> ain typo. - CMakeLists.txt: Add uuid dependency. - tests/CMakeLists.txt: Build DBusMock tests with -no-pie. - po/CMakeLists.txt: Don't update .pot file during builds. - Some fixes in UBports patches after a review. - Rename com.canonical.powerd -> com.lomiri.Repowerd. - Add -DENABLE_WERROR CMake option. - Calls 'calendar://eventId=' when clicking on an event in the indicator. - Resolve some test timing issues by deferring Snap object creation until it's needed - src/actions-live.cpp: Make open_alarm_app, open_appointment, open_calendar_app and open_settings_app return the uri/command. - tests/test-live-actions.cpp: Drop last_cmd and last_url variables + use return values of actions-live functions for testing + test phone functions on Lomiri only. - tests/test-live-actions.cpp: test phone functions after setting XDG_CURRENT_DESKTOP. - tests/test-settings.cpp: Use SETTINGS_NOTIFY_SCHEMA_ID only if it exists. - tests/run-eds-ics-test.sh: Remove return statement. - tests/CMakeLists.txt: Enable the timezone unit tests. - tests/CMakeLists.txt: Catch race condition while attempting to copy schemas. - tests/CMakeLists.txt: Exclude blocking tests on Travis for now. - tests/tests-timezones.cpp: Use MockTimezone to construct LiveTimezones + drop section expecting changes after /timezone is modified (not monitored) - tests/test-formater: Change warning to plain message otherwise it can crash the test. - tests/CMakeLists.txt: add -no-pie compile flag. - src/settings-live.cpp: initialise m_settings_cal_notification and m_settings_general_notification to NULL if we are not on Lomiri. - Alarm snoozes after timeout. - Snooze starts from the current minute. - Fix the EDS tests that were failing. - Replace ual with url-dispatcher. - Fix clock app URL. - Use cmake-extras intltool module, and keep pot file in vcs. - Use cmake-extras for coverage support and always enable testing. - Switch to using gmock module from cmake-extras. - UpcomingPlanner: don't get events from the day before of the selected one. - Should not use sounds notifications for calendar in silent mode. - If in silent mode should only vibrate if the settings say so. - Only wake device if bubbles notifications are enabled. - Do not fail tests if schema is not installed. - Make sure that calendar settings do not affect alarm notifications. - Set calendar notification settings to true in case GSettings schema is not available. Make sure calendar notification settings are correct during tests. - Detect desktop to launch applications. - Only create messaging menu if calendar app is installed. Update tests. - Update notifications to use the new calendar icon. - Vibrate only once when notification about calendar events. - Fix memory leak on messaging_menu. - Only play sounds for alarms. - Fixed crash when clicking on messaging menu. - Post message on messaging menu if the notification get timeout. - Pull the timezone from timedate1 regardless of whether it appears on the bus before or after we startup - Do not play sound for events without a sound set. - Rebuild events list in case of accounts changed. - Create a constructor for Alarm class. - Only play a sound alert if the event contains a SOUND reminder. - Ignore alarms for events marked as not attending. - Make sure that the ocurrence time is used to build the url to launch external application. - Lauch calendar app using the event start time. - Get event selection up-to-date with the spec, including showing in-progress events. Add unit tests to cover event priority and display order. - Call 'calendar://eventId=' when clicking on an event in the indicator. - Resolve some test timing issues by deferring Snap object creation until it's needed. - In test-notifications we do need one wait() wart after all, because the Snap is building its impl proxies asynchronously and hasn't any public way of notifying when they're built. - Update notification tests to wait for the needed bus events instead of waiting for arbitrary time intervals. - Add a DBusMock test Fixture with helper functions to wait for arbitrary bus method calls. - Add notification title, icon checks to test-notification's battery of test combinations. - Adjust title and notification icon according to the event type. - Move notifications tests into a new unit test. Extract notifications test fixture into a reusable header. - Various fixes for test-snap. - tests/CMakeLists.txt: Try to fix build failure on Debian Testing where cp -f is performed. - Add install instructions + update documentation. - If possible, avoid deprecated g_time_zone_new. - src/myself.cpp: Fix libaccounts-glib.h include warning. - src/menu.cpp: Pipe appointment strings through ayatana_common_utils_ellipsize and add GSettings watcher for max-menu-text-length. - CMakeLists.txt: Add libayatana-common (>= 0.9.3) dependency. - tests/test-dbus-fixture.h: Turn TestDBusFixture::TestDBusFixture into an explicitly declared constructor. - tests/test-eds-ics-missing-trigger.cpp: Include engine-eds.h prio to alarm-queue-simple.h. - Various tests fixes. (Thanks to Nicholas Guriev). - CMakeLists.txt: Drop GNUInstallDirs. Use PREFIX initialization hack. - CMakeLists.txt: Rename CMake options 'enable_tests' to 'ENABLE_TESTS' and 'enable_lcov' to 'ENABLE_COVERAGE' (both defaulting to 'OFF') - src/clock-live.cpp: Replace 'signed size_t' by 'ssize_t'. - CMakeLists.txt: Add Clang support. - CMakeLists.txt: Fix GTest path - Translation updates. Overview of changes in ayatana-indicator-datetime 0.8.3 - Rename Lomiri-specific properties to x-lomiri. - Re-enable haptic using hfd-service. - Rename com.ubuntu.calendar. - tests/manual: Update and fix text. - Fix ringtones path + drop unused definition. - Rename HAVE_UT_ACCTSERVICE_SYSTEMSOUND_SETTINGS to HAS_LOMIRI_ACCTSERVICE_SOUND. - Drop local file and generate code from system-wide installed com.lomiri.touch.AccountsService.Sound.xml. - Rename com.ubuntu.touch.AccountsService.Sound to com.lomiri.touch.AccountsService.Sound. - Use lomiri-phablet instead of ubuntu-phablet. - Remove com.canonical.usensord and disable haptic. - tests/test-live-actions: Handle case when the test is run on Lomiri. - Resolve problems with some unit tests. - Link to lomiri-url-dispatcher where needed. - src/snap.cpp: Create Sound object via SoundBuilder. - src/settings-live.cpp: Check for schema instead of Lomiri. - tests/CMakeLists.txt: Build DBusMock tests with -no-pie. - po/CMakeLists.txt: Don't update .pot file during builds. - Rename com.canonical.powerd -> com.lomiri.Repowerd. - Add a DBusMock test Fixture with helper functions to wait for arbitrary bus method calls - Move notifications tests into a new unit test. Extract notifications test fixture into a reusable header. - Replace deprecated pre-processor symbols. - Alarm snoozes after timeout. - Snooze starts from the current minute. - Replace lal with lomiri-url-dispatcher. - Fix clock app URL. - Remove the hard-coding of -g compiler flag. - Use cmake-extras intltool module, and keep pot file in vcs. - Switch to using gmock module from cmake-extras. - UpcomingPlanner: don't get events from the day before of the selected one. - Various backports from UBports' indicator-datetime originated from Unity8 development at Canonical Ltd. (see ChangeLog file for details). - Drop myself.[h|cpp]. - src/settings-live.cpp: initialise m_settings_cal_notification and m_settings_general_notification to NULL if we are not on Lomiri - Add install instructions + update documentation. - If possible, avoid deprecated g_time_zone_new. - src/menu.cpp: Pipe appointment strings through ayatana_common_utils_ellipsize + add GSettings watcher for max-menu-text-length. - tests/test-dbus-fixture.h: Turn TestDBusFixture::TestDBusFixture into an explicitly declared constructor. - tests/test-eds-ics-missing-trigger.cpp: Include engine-eds.h prio to alarm-queue-simple.h. - src/clock-live.cpp: Replace 'signed size_t' by 'ssize_t'. - Add Travis CI configuration. - Translation updates. Overview of changes in ayatana-indicator-datetime 0.8.3 - Fix a couple of build failures on Ubuntu hirsute (due to updated evolution-data-server). - Port from URL Dispatcher to Lomiri URL Dispatcher. - Translation updates. Overview of changes in ayatana-indicator-datetime 0.8.2 - Translation updates. Overview of changes in ayatana-indicator-datetime 0.8.1 - Drop the 'show-clock' gsetting, the clock is now always shown in the panel. - DEB packaging: Make sure to Break: and Replace: indicator-datetime. - Translation updates. Overview of changes in ayatana-indicator-datetime 0.8.0 - Version bump to bring all system indicator (and the renderer libraries to the same version level). - Rename 'x-canonical-type' attribute to 'x-ayatana-type' (and others) to allow using system indicators from Ayatana Indicators on Ubuntu. - Start the indicator with the ayatana-indicators.target. - Some minor phrases changes. - Drop upstart support. - Translation updates. Overview of changes in ayatana-indicator-datetime 0.4.1 - Fix calendar going into update loop. Overview of changes in ayatana-indicator-datetime 0.4.0 - Fork form Ubuntu's indicator-datetime. - Port to libecal-2.0. ayatana-indicator-datetime-25.4.0/NEWS.Canonical0000644000000000000000000000141014773244555016253 0ustar 12.10.2 - Fix 12.10.0 appointment calendar regression. (LP: #1060263) 12.10.1 - Gracefully handle clock skew (LP: #917236) - Raise the version number of our EDS dependency (LP: #1024437) - Fix X-Ubuntu-Gettext-Domain entries in the .desktop file (LP: #1048834) - Remove unnecessary watching for geoclue address provider changes 12.10.0 - Support EDS 3.6's API (cyphermox) - Apply an 'en space' between the date and time strings. (LP #749847) lp:~bobowen/indicator-datetime/fix-for-749847 - Sort locations as spec'ed by https://wiki.ubuntu.com/TimeAndDate (LP #833325) lp:~charlesk/indicator-datetime/lp-833325 - Fix a bug that caused location settings to be re-saved each 2 seconds lp:~charlesk/indicator-datetime/unnecessary-saves - Drop GTK+ 2 support ayatana-indicator-datetime-25.4.0/po/aa.po0000644000000000000000000000363514773244555015240 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: aa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/af.po0000644000000000000000000000675714773244555015255 0ustar # Afrikaans translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2020-05-10 11:12+0000\n" "Last-Translator: iNetRoos \n" "Language-Team: Afrikaans \n" "Language: af\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Voeg Gebeurtenis in…" #: src/menu.cpp:448 msgid "Clock" msgstr "Horlosie" #: src/menu.cpp:500 #, fuzzy msgid "Time and Date Settings…" msgstr "Tyd & Datum instellings…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Datum en Tyd" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 #, fuzzy msgid "Time and Date" msgstr "Tyd & Datum" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (het alarms)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %H:%M" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Sluimer" #~ msgid "The calendar's default sound file." #~ msgstr "Die kalender se verstek audio lêer." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "As 'n kalender- of herinneringgebeurtenis nie sy eie klanklêer " #~ "spesifiseer nie, sal hierdie lêer as die verstekklank gebruik word." #~ msgid "%l:%M:%S %p" #~ msgstr "%H:%M:%S" #~ msgid "%l:%M %p" #~ msgstr "%H:%M" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Vandag" #~ msgid "Tomorrow" #~ msgstr "Môre" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Môre %H:%M" #~ msgid "%a %l:%M %p" #~ msgstr "Môre %H:%M" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %H:%M" #~ msgid "Tomorrow %H:%M" #~ msgstr "Môre %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" ayatana-indicator-datetime-25.4.0/po/am.po0000644000000000000000000000365214773244555015253 0ustar # Amharic translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: am\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/an.po0000644000000000000000000000365414773244555015256 0ustar # Aragonese translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: an\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ar.po0000644000000000000000000000365114773244555015257 0ustar # Arabic translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ar\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/as.po0000644000000000000000000000363514773244555015262 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: as\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ast.po0000644000000000000000000000365414773244555015447 0ustar # Asturian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ast\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ayatana-indicator-datetime.pot0000644000000000000000000003532314773244555022224 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/org.ayatana.indicator.datetime.gschema.xml:1 msgid "What the time format should be?" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:2 msgid "" "Controls the time format that is displayed in the indicator. For almost all " "users this should be the default for their locale. If you think the setting " "is wrong for your locale please join or talk to the translation team for " "your language. If you just want something different you can adjust this to " "be either 12 or 24 time. Or, you can use a custom format string and set the " "custom-time-format setting." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:3 msgid "The format string passed to strftime" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:4 msgid "" "The format of the time and/or date that is visible on the panel when using " "the indicator. For most users this will be a set of predefined values as " "determined by the configuration utility, but advanced users can change it to " "anything strftime can accept. Look at the man page on strftime for more " "information." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:5 msgid "Show the number of seconds in the indicator" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:6 msgid "" "Makes the datetime indicator show the number of seconds in the indicator. " "It's important to note that this will cause additional battery drain as the " "time will update 60 times as often, so it is not recommended. Also, this " "setting will be ignored if the time-format value is set to custom." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:7 msgid "Show the day of the week in the indicator" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:8 msgid "" "Puts the day of the week on the panel along with the time and/or date " "depending on settings. This setting will be ignored if the time-format value " "is set to custom." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:9 msgid "Show the month and date in the indicator" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:10 msgid "" "Puts the month and the date in the panel along with the time and/or day of " "the week depending on settings. This setting will be ignored if the time-" "format value is set to custom." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:11 msgid "Show the year in the indicator" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:12 msgid "" "Puts the year in the panel along with the month and the date. This setting " "will be ignored if either the time-format value is set to custom or if show-" "date is set to false." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:13 msgid "Show the monthly calendar in the indicator" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:14 msgid "Puts the monthly calendar in indicator-datetime's menu." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:15 msgid "Show week numbers in calendar" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:16 msgid "" "Shows the week numbers in the monthly calendar in indicator-datetime's menu." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:17 msgid "Show events in the indicator" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:18 msgid "Shows events from Evolution in indicator-datetime's menu." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:19 msgid "Show the auto-detected location in the indicator" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:20 msgid "" "Shows your current location (determined from geoclue and /etc/timezone) in " "indicator-datetime's menu." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:21 msgid "Show locations in the indicator" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:22 msgid "Shows custom defined locations in indicator-datetime's menu." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:23 msgid "A List of locations" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:24 msgid "" "Adds the list of locations the user has configured to display in the " "indicator-datetime menu." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:25 msgid "The name of the current timezone" msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:26 msgid "" "Some timezones can be known by many different cities or names. This setting " "describes how the current zone prefers to be named. Format is \"TIMEZONE " "NAME\" (e.g. \"America/New_York Boston\" to name the New_York zone Boston)." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:27 msgid "What kind of haptic feedback, if any, to trigger with an alarm." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:28 msgid "" "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " "are currently supported: 'pulse', 'none'." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:29 msgid "The calendar's default sound file." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:30 msgid "" "If a calendar or reminder event doesn't specify its own sound file, this " "file will be used as the fallback sound." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:31 msgid "The alarm's default sound file." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:32 msgid "" "If an alarm doesn't specify its own sound file, this file will be used as " "the fallback sound." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:33 msgid "The alarm's default volume level." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:34 msgid "The volume at which alarms will be played." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:35 msgid "The alarm's duration." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:36 msgid "" "How long the alarm's sound will be looped if its snap decision is not " "dismissed by the user." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:37 msgid "The snooze duration." msgstr "" #: data/org.ayatana.indicator.datetime.gschema.xml:38 msgid "How long to wait when the user hits the Snooze button." msgstr "" #. TRANSLATORS: a strftime(3) format for 12hr time w/seconds #: src/formatter.cpp:234 msgid "%l:%M:%S %p" msgstr "" #. TRANSLATORS: a strftime(3) format for 12hr time #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. This format string is used for showing, on a 12-hour clock, events/appointments that happen today. #. en_US example: "%l:%M %p" --> "1:00 PM" #: src/formatter.cpp:237 src/utils.c:304 msgid "%l:%M %p" msgstr "" #. TRANSLATORS: a strftime(3) format for 24hr time w/seconds #: src/formatter.cpp:240 msgid "%H:%M:%S" msgstr "" #. TRANSLATORS: a strftime(3) format for 24hr time #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. This format string is used for showing, on a 24-hour clock, events/appointments that happen today. #. en_US example: "%H:%M" --> "13:00" #: src/formatter.cpp:243 src/utils.c:344 msgid "%H:%M" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) #. This format string shows the abbreviated weekday, day, abbreviated month, and year. #. en_US example: "%a %b %e %Y" --> "Sat Oct 31 2020" #. en_GB example: "%a %e %b %Y" --> "Sat 31 Oct 2020" #. zh_CN example(?): "%Y年%m月%d日 周%a" --> "2020年10月31日 周六" #: src/formatter-desktop.cpp:138 msgid "%a %b %e %Y" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) #. This format string shows the abbreviated weekday, day, and abbreviated month. #. en_US example: "%a %b %e" --> "Sat Oct 31" #. en_GB example: "%a %e %b" --> "Sat 31 Oct" #. zh_CN example(?): "%m月%d日 周%a" --> "03月27日 周六" #: src/formatter-desktop.cpp:147 msgid "%a %b %e" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) #. This format string shows the abbreviated weekday. #. zh_CN example(?): "周%a" --> "周六" #: src/formatter-desktop.cpp:154 #, c-format msgid "%a" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) #. This format string shows the day, abbreviated month, and year. #. en_US example: "%b %e %Y" --> "Oct 31 2020" #. en_GB example: "%e %b %Y" --> "31 Oct 2020" #. zh_CN example(?): "%Y年%m月%d日" --> "2020年10月31日" #: src/formatter-desktop.cpp:163 msgid "%b %e %Y" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) #. This format string shows the abbreviated month and day. #. en_US example: "%b %e" --> "Mar 27" #. en_GB example: "%e %b" --> "27 Mar" #. zh_CN example(?): "%m月%d日" --> "03月27日" #: src/formatter-desktop.cpp:172 msgid "%b %e" msgstr "" #. This strftime(3) format string shows the year. #: src/formatter-desktop.cpp:176 msgid "%Y" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #: src/utils.c:274 msgid "Today" msgstr "" #: src/utils.c:278 msgid "Tomorrow" msgstr "" #. This is a strftime(3) format string indicating the unabbreviated weekday. #: src/utils.c:283 #, c-format msgid "%A" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. This format string is used for showing full-day events that are over a week away. #. en_US example: "%a %b %d" --> "Sat Oct 31" #. en_GB example: "%a %d %b" --> "Sat 31 Oct" #. zh_CN example(?): "%m月%d日 周%a" --> "10月31日 周六" #: src/utils.c:292 msgid "%a %d %b" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. This format string is used for showing, on a 12-hour clock, events/appointments that happen tomorrow. #. (Note: the space between the day and the time is an em space (unicode character 2003), which is #. slightly wider than a normal space.) #. en_US example: "Tomorrow %l:%M %p" --> "Tomorrow 1:00 PM" #: src/utils.c:313 msgid "Tomorrow %l:%M %p" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. This format string is used for showing, on a 12-hour clock, events/appointments that happen this week. #. (Note: the space between the day and the time is an em space (unicode character 2003), which is #. slightly wider than a normal space.) #. en_US example: "Tomorrow %l:%M %p" --> "Fri 1:00 PM" #: src/utils.c:322 msgid "%a %l:%M %p" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. This format string is used for showing, on a 12-hour clock, events/appointments that happen over a week from now. #. (Note: the space between the day and the time is an em space (unicode character 2003), which is #. slightly wider than a normal space.) #. en_US example: "%a %b %d %l:%M %p" --> "Fri Oct 31 1:00 PM" #. en_GB example: "%a %d %b %l:%M %p" --> "Fri 31 Oct 1:00 PM" #: src/utils.c:332 msgid "%a %d %b %l:%M %p" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. This format string is used for showing, on a 24-hour clock, events/appointments that happen tomorrow. #. (Note: the space between the day and the time is an em space (unicode character 2003), which is #. slightly wider than a normal space.) #. en_US example: "Tomorrow %l:%M %p" --> "Tomorrow 13:00" #: src/utils.c:353 msgid "Tomorrow %H:%M" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. This format string is used for showing, on a 24-hour clock, events/appointments that happen this week. #. (Note: the space between the day and the time is an em space (unicode character 2003), which is #. slightly wider than a normal space.) #. en_US example: "%a %H:%M" --> "Fri 13:00" #: src/utils.c:362 msgid "%a %H:%M" msgstr "" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. This format string is used for showing, on a 24-hour clock, events/appointments that happen over a week from now. #. (Note: the space between the day and the time is an em space (unicode character 2003), which is #. slightly wider than a normal space.) #. en_US example: "%a %b %d %H:%M" --> "Fri Oct 31 13:00" #. en_GB example: "%a %d %b %H:%M" --> "Fri 31 Oct 13:00" #: src/utils.c:372 msgid "%a %d %b %H:%M" msgstr "" ayatana-indicator-datetime-25.4.0/po/az.po0000644000000000000000000000365614773244555015274 0ustar # Azerbaijani translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: az\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/bem.po0000644000000000000000000000365114773244555015420 0ustar # Bemba translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: bem\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/be.po0000644000000000000000000003350714773244555015246 0ustar # Belarusian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2020-09-26 17:41+0000\n" "Last-Translator: Viktar Vauchkevich \n" "Language-Team: Belarusian \n" "Language: be\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.3-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Дадаць падзею…" #: src/menu.cpp:448 msgid "Clock" msgstr "Гадзіннік" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Налады часу і даты…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Дата і час" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Час і дата" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (будзільнік)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Будзільнік %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Добра" #: src/snap.cpp:169 msgid "Snooze" msgstr "Задрамаць" #~ msgid "The calendar's default sound file." #~ msgstr "Стандартны гукавы файл каляндара." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Калі ў каляндара няма ўласнага гукавога файлу, гэты файл будзе " #~ "выкарыстаны як запасны." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a, %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a, %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Сёння" #~ msgid "Tomorrow" #~ msgstr "Учора" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Заўтра %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a, %b %d %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Заўтра %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a, %b %d %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Паказаць гадзіннік у панэлі" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Кантралюе ці з'явіцца гадзіннік у панэлі, ці не." #~ msgid "What the time format should be" #~ msgstr "Які фармат часу павінен быць" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Кіруе фарматам часу, які адлюстроўваецца на індыкатары. Для большасці " #~ "карыстальнікаў гэта павінна быць агаданым для іх лакалізацыі. Калі вы " #~ "лічыце, што ўстаноўка з'яўляецца няправільнай для вашай мясцовасці, калі " #~ "ласка, далучыцеся або пагаварыце з камандай перакладу на вашу мову. Калі " #~ "вы проста хочаце нешта іншае, вы можаце змяніць гэта. Ці вы можаце " #~ "выкарыстаць асабісты фармат і задаць наладу custom-time-format." #~ msgid "The format string passed to strftime" #~ msgstr "Радок фармату перадаецца ў strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Фармат часу і/ці даты, які бачны на панэлі пры выкарыстанні індыкатара. " #~ "Для большасці карыстальнікаў гэта будзе набор агаданых значэнняў, якія " #~ "вызначаныя з дапамогай утыліты канфігурацыі, але прасунутыя карыстальнікі " #~ "могуць змяніць яго на што-небудзь, што прымае strftime. Паглядзіце на " #~ "man-старонцы strftime для атрымання дадатковай інфармацыі." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Паказваць секунды на індыкатары" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Робіць так, што індыкатар даты і часу паказвае колькасць секунд. Важна " #~ "адзначыць, што гэта прывядзе да дадатковай разрадцы акумулятара, бо час " #~ "будзе абнаўляцца 60 разоў часцей, і таму не рэкамендуюцца. Акрамя таго, " #~ "гэты параметр будзе ігнаравацца, калі значэнне фармату часу " #~ "карыстальніцкае." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Паказваць дзень тыдня на індыкатары" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Размяшчае дзень тыдня на панэлі разам з часам і/ці дата ў залежнасці ад " #~ "налад. Гэты параметр ігнаруецца, калі значэнне фармату часу " #~ "карыстальніцкае." #~ msgid "Show the month and date in the indicator" #~ msgstr "Паказваць месяц і дзень на індыкатары" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Размяшчае месяц і дату на панэлі разам з часам і/ці дзнём тыдня ў " #~ "залежнасці ад налад. Гэты параметр ігнаруецца, калі значэнне фармату часу " #~ "карыстальніцкае." #~ msgid "Show the year in the indicator" #~ msgstr "Паказваць год на індыкатары" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Размяшчае год на панэлі разам з месяцам і датай. Гэты параметр " #~ "ігнаруецца, калі значэнне фармату часу карыстальніцкае або show-date " #~ "устаноўлены ў «не»." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Паказваць месячны каляндар у індыкатары" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Размяшчае месячны каляндар у меню індыкатара даты і часу." #~ msgid "Show week numbers in calendar" #~ msgstr "Паказваць нумары тыдняў у календары" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Паказвае нумары тыдняў у месячным календары ў меню індыкатара даты і часу." #~ msgid "Show events in the indicator" #~ msgstr "Паказваць падзеі на індыкатары" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Паказвае падзеі з Evolution у меню індыкатара даты і часу." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Паказваць аўтаматычна вызначанае месцазнаходжанне ў індыкатары" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Паказвае ваша цяперашняе месцазноходжанне (вызначанае з geoclue і /etc/" #~ "timezone) у меню індыкатара даты і часу." #~ msgid "Show locations in the indicator" #~ msgstr "Паказваць месцы ў індыкатары" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "Паказвае карыстальніцкія мясціны ў меню індыкатара даты і часу." #~ msgid "A List of locations" #~ msgstr "Спіс мясцін" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Дадае спіс мясцін, што карыстальнік задаў для адлюстравання ў меню " #~ "індыкатара даты і часу." #~ msgid "The name of the current timezone" #~ msgstr "Назва цяперашняй часавой зоны" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Некаторыя часавыя зоны вядомыя пад рознымі назвамі ці гарадамі. Гэтая " #~ "налада апісвае, як цяперашняя зона будзе названая. Фармат «ЧАСАВАЯ_ЗОНА " #~ "НАЗВА» (напрыклад, «Europe/Minsk Гродна» называе зону «Minsk» як " #~ "«Гродна»)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "" #~ "Які тып тактыльнага эфекту, калі прысутнічае, выкарыстоўваецца з " #~ "будзільнікам." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Які тып тактыльнага эфекту, калі прысутнічае, выкарыстоўваецца з " #~ "будзільнікам. Два тыпы цяпер падтрымліваюцца: «pulse», «none»." #~ msgid "The alarm's default volume level." #~ msgstr "Агаданы ўзровень гучнасці будзільніка." #~ msgid "The volume at which alarms will be played." #~ msgstr "Гучнасць, з якой будзе прайгравацца будзільнік." #~ msgid "The alarm's duration." #~ msgstr "Працягласць будзільніка." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Як доўга гук будзільніка будзе паўтарацца, калі карыстальнік не адхіляе " #~ "яго." #~ msgid "The snooze duration." #~ msgstr "Працягласць адтэрміноўкі." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "" #~ "Як доўга чакаць пасля таго, як карыстальнік націсне на кнопку " #~ "адтэрміноўкі." ayatana-indicator-datetime-25.4.0/po/bg.po0000644000000000000000000003061414773244555015244 0ustar # Bulgarian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2020-04-14 12:11+0000\n" "Last-Translator: geni \n" "Language-Team: Bulgarian \n" "Language: bg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.0-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "The calendar's default sound file." #~ msgstr "Стандартният звуков файл на календара." #, fuzzy #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Ако алармата не указва свой собствен звуков файл, ще се използва този " #~ "звуков файл." #~ msgid "Show the clock in the panel" #~ msgstr "Покажи часовника на панела" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Управлява дали да се показва часовник на панела или не." #~ msgid "What the time format should be" #~ msgstr "Какъв да бъде формата за време" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Управляа формата за време показван в индикатора. За повечето потребители " #~ "това би следвало да е \"по подразбиране\" за тяхната локализация. Ако " #~ "смятате, че настройката е грешна за локализацията ви, моля свържете се и " #~ "сигнализирайте на групата преводачи за вашия език. Ако просто желаете " #~ "нещо различно, можете да изберете 12 или 24 часа формат. Или можете да " #~ "използвате ваш потребителски формат за настройка." #~ msgid "The format string passed to strftime" #~ msgstr "Структурата на формата се предава на strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Форматът на времето и / или датата, които се виждат на панела, когато " #~ "използвате индикатора. За повечето потребители това ще бъде набор от " #~ "предварително определени стойности, определени от помощната програма за " #~ "конфигуриране, но напредналите потребители могат да я променят за всичко, " #~ "което strftime може да приеме. Погледнете страницата man strftime за " #~ "повече информация." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Показване на секунди в индикатора" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Принуждава индикатора за датата да показва броя секунди. Важно е да " #~ "отбележите, че това ще доведе до допълнително изтичане на батерията, тъй " #~ "като времето ще се актуализира 60 пъти по-често, затова не се препоръчва. " #~ "Също така, тази настройка ще бъде пренебрегната, ако стойността на " #~ "формата на време е зададена като персонализирана." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Показване на деня от седмицата в индикатора" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Поставя деня от седмицата на панела заедно с времето и/или датата, в " #~ "зависимост от настройките. Тази настройка ще бъде пренебрегната, ако " #~ "стойността на формата на време е зададена като персонализирана." #~ msgid "Show the month and date in the indicator" #~ msgstr "Показване на месец и дата в индикатора" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Поставя месеца и датата в панела заедно с времето и/или деня на седмицата " #~ "в зависимост от настройките. Тази настройка ще бъде пренебрегната, ако " #~ "стойността на формата на време е зададена като персонализирана." #~ msgid "Show the year in the indicator" #~ msgstr "Показване на година в индикатора" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Поставя годината в панела заедно с месеца и датата. Тази настройка ще " #~ "бъде пренебрегната, ако стойността на формата за време е зададена като " #~ "персонализирана или ако датата на показване е зададена като неактивна." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Показване на месечния календар в индикатора" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Поставя месечния календар в менюто на индикатора-дата." #~ msgid "Show week numbers in calendar" #~ msgstr "Показване на номерата на седмиците в календара" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Показва номерата на седмиците в месечния календар в менюто на индикатора-" #~ "дата." #~ msgid "Show events in the indicator" #~ msgstr "Показване на събитията в индикатора" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Показва събития от Evolution в менюто на индикатора-дата." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Показва автоматично откритото местоположение в индикатора" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Показва текущото ви местоположение (определено от geoclue и /etc/" #~ "timezone) в менюто indicator-datetime." #~ msgid "Show locations in the indicator" #~ msgstr "Показване на местоположенията в индикатора" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "" #~ "Показва персонализирани дефинирани места в менюто на индикатора-дата." #~ msgid "A List of locations" #~ msgstr "Списък на местоположенията" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Добавя списъка с местоположенията, които потребителят е конфигурирал да " #~ "показва в менюто индикатор-дата-време." #~ msgid "The name of the current timezone" #~ msgstr "Името на текущата часова зона" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Някои часови зони могат да се разпознават по използваните различни имена " #~ "и градове. Тази настройка описва как се предпочита указване на " #~ "наименованието на текущата зона. Форматът е \"NAME TIMEZONE\" (например " #~ "\"America / New_York Boston\", за да назове зоната New_York Boston)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "" #~ "Какъв вид обратна връзка, ако има такава, за да се задейства с аларма." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Какъв вид обратна връзка, ако има такава, за да се задейства с аларма. " #~ "Понастоящем се поддържат два режима: \"импулс\", \"нищо\"." #~ msgid "The alarm's default volume level." #~ msgstr "Стандартното ниво на звука на алармата." ayatana-indicator-datetime-25.4.0/po/bn.po0000644000000000000000000000365214773244555015255 0ustar # Bengali translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: bn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/bo.po0000644000000000000000000000365214773244555015256 0ustar # Tibetan translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: bo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/br.po0000644000000000000000000000365114773244555015260 0ustar # Breton translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: br\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/bs.po0000644000000000000000000000365214773244555015262 0ustar # Bosnian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: bs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ca.po0000644000000000000000000000706614773244555015244 0ustar # Catalan translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2023-06-23 22:48+0000\n" "Last-Translator: Joan CiberSheep \n" "Language-Team: Catalan \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.18.1\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Afegeix un esdeveniment…" #: src/menu.cpp:448 msgid "Clock" msgstr "Rellotge" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Paràmetres de la data i l'hora…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Data i hora" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Paràmetres d'hora i data, accés ràpid al calendari" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Hora i data" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (té alarmes)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarma %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Esdeveniment %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "D'acord" #: src/snap.cpp:169 msgid "Snooze" msgstr "Ajorna" #~ msgid "The calendar's default sound file." #~ msgstr "El fitxer de so per defecte del calendari." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Si un esdeveniment de calendari o recordatori no especifica el seu propi " #~ "fitxer de so, s'utilitzarà aquest." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%H:%M" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %b %e %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Avui" #~ msgid "Tomorrow" #~ msgstr "Demà" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Demà %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Demà %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" ayatana-indicator-datetime-25.4.0/po/ca@valencia.po0000644000000000000000000000366314773244555017046 0ustar # Catalan translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ca@valencia\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ce.po0000644000000000000000000000365214773244555015245 0ustar # Chechen translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ce\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ckb.po0000644000000000000000000000366014773244555015414 0ustar # Language ckb translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ckb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/CMakeLists.txt0000644000000000000000000000016114773244555017046 0ustar find_package(Intltool REQUIRED) intltool_install_translations( ALL GETTEXT_PACKAGE ${GETTEXT_PACKAGE} ) ayatana-indicator-datetime-25.4.0/po/co.po0000644000000000000000000000365314773244555015260 0ustar # Corsican translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: co\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/crh.po0000644000000000000000000000366114773244555015432 0ustar # Crimean Tatar translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: crh\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/csb.po0000644000000000000000000000363614773244555015427 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: csb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/cs.po0000644000000000000000000001135414773244555015261 0ustar # Czech translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2023-10-10 17:03+0000\n" "Last-Translator: Tomáš Marný \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Weblate 5.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e. %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Přidat událost…" #: src/menu.cpp:448 msgid "Clock" msgstr "Hodiny" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Nastavení data a času…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Datum a čas" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Nastavení času a data, rychlý přístup ke kalendáři" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Čas a datum" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (má alarmy)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Budík %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Události %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Odložit" #~ msgid "The calendar's default sound file." #~ msgstr "Výchozí zvukový soubor pro upozornění." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Pokud událost kalendáře nebo připomenutí neurčí svůj vlastní zvukový " #~ "soubor, bude tento soubor použit jako záložní zvuk." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %b %e %Y" #~ msgid "%a %b %e" #~ msgstr "%a %b %e" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%b %e %Y" #~ msgid "%b %e" #~ msgstr "%b %e %Y" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Dnes" #~ msgid "Tomorrow" #~ msgstr "Zítra" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Zítra %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Zítra %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %b %d %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Zobrazovat hodiny na panelu" #~ msgid "What the time format should be" #~ msgstr "Jaký by měl být formát času" #~ msgid "Show the day of the week in the indicator" #~ msgstr "Zobrazovat v indikátoru den" #~ msgid "Show the month and date in the indicator" #~ msgstr "Zobrazovat v indikátoru měsíc a datum" #~ msgid "Show the year in the indicator" #~ msgstr "Zobrazovat v indikátoru rok" #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Zobrazovat v indikátoru měsíční kalendář" #~ msgid "Show week numbers in calendar" #~ msgstr "Zobrazovat v kalendáři čísla týdnů" #~ msgid "Show events in the indicator" #~ msgstr "Zobrazovat v indikátoru událostí" #~ msgid "Show locations in the indicator" #~ msgstr "Zobrazovat v indikátoru umístění" #~ msgid "A List of locations" #~ msgstr "Seznam umístění" #~ msgid "The name of the current timezone" #~ msgstr "Název stávající časové zóny" #~ msgid "The alarm's default volume level." #~ msgstr "Výchozí hlasitost upozornění." #~ msgid "The alarm's duration." #~ msgstr "Trvání upozornění." ayatana-indicator-datetime-25.4.0/po/cv.po0000644000000000000000000000365214773244555015266 0ustar # Chuvash translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: cv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/cy.po0000644000000000000000000000365014773244555015267 0ustar # Welsh translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: cy\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/da.po0000644000000000000000000000573114773244555015242 0ustar # Danish translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2020-07-04 23:41+0000\n" "Last-Translator: Tobias p \n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.2-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "tilføj Hændelse…" #: src/menu.cpp:448 msgid "Clock" msgstr "Ur" #: src/menu.cpp:500 #, fuzzy msgid "Time and Date Settings…" msgstr "Tid & Dato indstillinger…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Dato og Tid" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 #, fuzzy msgid "Time and Date" msgstr "Tid og Dato" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (har alarmer)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, fuzzy, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Slumre" #~ msgid "The calendar's default sound file." #~ msgstr "Kalenderens standard lydfil." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Hvis en kalender- eller påmindelsesbegivenhed ikke specificerer sin egen " #~ "lydfil, bruges denne fil som en tilbagevendende lyd." #, fuzzy #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M" #~ msgid "%H:%M:%S" #~ msgstr "%H:%I:%s" #~ msgid "%H:%M" #~ msgstr "%H:%i" #~ msgid "%a %b %e %Y" #~ msgstr "%D %d %M %Y" #~ msgid "%a %b %e" #~ msgstr "%D %d %M" #~ msgid "%b %e %Y" #~ msgstr "%d %M %Y" #~ msgid "Today" #~ msgstr "I dag" #~ msgid "Tomorrow" #~ msgstr "I morgen" ayatana-indicator-datetime-25.4.0/po/de.po0000644000000000000000000002655314773244555015253 0ustar # German translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2022-09-14 11:45+0000\n" "Last-Translator: Mike Gabriel \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.14.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Ereignis hinzufügen…" #: src/menu.cpp:448 msgid "Clock" msgstr "Uhr" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Zeit und Datum einstellen …" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Datum und Uhrzeit" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Zeit- & Datumseinstellungen, Schnellzugriff auf den Kalender" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Zeit und Datum" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s1 (hat einen Alarm)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Termin %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Schlummertaste" #~ msgid "The calendar's default sound file." #~ msgstr "Die Standard-Audiodatei des Kalenders." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Wenn ein Kalender- oder Erinnerungsereignis keine eigene Audiodatei " #~ "angibt, wird stattdessen diese Datei verwendet." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%H:%M" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Heute" #~ msgid "Tomorrow" #~ msgstr "Morgen" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "Sat 31 Oct" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Morgen %H:%M" #~ msgid "%a %l:%M %p" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %b. %d %H:%M" #~ msgid "Tomorrow %H:%M" #~ msgstr "Morgen um %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %b %d %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Die Uhr auf dem Panel anzeigen" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Steuert ob die Zeiger auf dem Panel angezeigt werden oder nicht." #~ msgid "What the time format should be" #~ msgstr "Welches Zeit Format sie gerne hätten" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Kontrolliert, welches Zeit Format angezeigt wird. Für fast alle Nutzer " #~ "sollte das ihre Standartzeit sein. Wenn du glaubst das die Anzeige falsch " #~ "ist, rede bitte mit dem Übersetztungs Team. Wenn du einfach etwas anderes " #~ "willst, kannst du zwischen 12h und 24h wechseln. Oder du kannst einen " #~ "angepassten Format String in den Einstellungen festlegen." #~ msgid "The format string passed to strftime" #~ msgstr "Die an strftime übergebene Formatzeichenkette" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Das Format der Uhrzeit und/oder des Datums, das auf dem Bedienfeld bei " #~ "Verwendung der Anzeige sichtbar ist. Für die meisten Benutzer ist dies " #~ "eine Reihe von vordefinierten Werten, wie sie vom Konfigurationsprogramm " #~ "festgelegt wurden, aber fortgeschrittene Benutzer können sie in alles " #~ "ändern, was strftime akzeptiert. Für weitere Informationen schauen Sie " #~ "sich die Manpage für strftime an." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Zeigt die Zeit in Sekunden" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Lässt die Datumsanzeige die Anzahl der Sekunden lang in der Anzeige " #~ "anzeigen. Da die Zeit 60-mal so oft aktualisiert wird, ist zu beachten, " #~ "dass dies zu einem zusätzlichen Batterieverbrauch führt, weshalb es nicht " #~ "empfohlen wird. Außerdem wird diese Einstellung ignoriert, wenn der " #~ "Zeitformatwert auf benutzerdefiniert gesetzt ist." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Zeigt den Tag der Woche" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Stellt den Wochentag zusammen mit der Uhrzeit und/oder dem Datum auf dem " #~ "Bedienfeld ein, je nach Einstellung. Diese Einstellung wird ignoriert, " #~ "wenn der Zeitformatwert auf Custom gesetzt ist." #~ msgid "Show the month and date in the indicator" #~ msgstr "Zeigt den Monat und das Datum" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Stellt den Monat und das Datum sowie die Uhrzeit und/oder den Wochentag " #~ "je nach Einstellung im Panel ein. Diese Einstellung wird ignoriert, wenn " #~ "der Zeitformatwert auf Custom gesetzt ist." #~ msgid "Show the year in the indicator" #~ msgstr "Zeigt das Jahr" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Setzt das Jahr in das Feld zusammen mit dem Monat und dem Datum. Diese " #~ "Einstellung wird ignoriert, wenn entweder der Zeitformatwert auf " #~ "benutzerdefiniert gesetzt ist oder wenn das Anzeigedatum auf falsch " #~ "gesetzt ist." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Zeigt den Monatskalender" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Platziert den Monatskalender in das Datum Anzeige Menü." #~ msgid "Show week numbers in calendar" #~ msgstr "Kalenderwochen im Kalender anzeigen" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Zeigt die Anzahl der Wochen in dem Monatskalender in dem Datum Anzeige " #~ "Menü." #~ msgid "Show events in the indicator" #~ msgstr "Zeigt die Ereignisse" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Zeigt die Ereignisse von der Evolution in dem Datum Anzeige Menü." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Zeigt die Automatisch erkannte Position" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "Zeigt deine aktuelle Position in dem Datum Anzeige Menü." #~ msgid "Show locations in the indicator" #~ msgstr "Standorte auf der Anzeige anzeigen" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "Zeigt die selbst angepasste Position im Datum Anzeige Menü." #~ msgid "A List of locations" #~ msgstr "Eine liste von Orten" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Fügt die Liste der Orte hinzu, die der Benutzer für die Anzeige im Menü " #~ "indicator-datetime konfiguriert hat." #~ msgid "The name of the current timezone" #~ msgstr "Der Name der Aktuellen Zeitzone" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Einige Zeitzonen können über viele verschiedene Städte oder Namen " #~ "bezeichnet werden. Diese Einstellung beschreibt, wie die aktuelle Zone " #~ "benannt werden soll. Das Format ist \"TIMEZONE NAME\" (z.B. \"America/" #~ "New_York Boston\", um die New_York Zone Boston zu benennen)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "" #~ "Welche Art haptischer Rückmeldung, falls vorhanden, soll bei einem Alarm " #~ "ausgelöst werden." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Welche Art haptischer Rückmeldung, falls vorhanden, soll mit einem Alarm " #~ "ausgelöst werden. Derzeit werden zwei Modi unterstützt: \"Puls\", " #~ "\"keine\"." #~ msgid "The alarm's default volume level." #~ msgstr "Die Standard Alarm Lautstärke." #~ msgid "The volume at which alarms will be played." #~ msgstr "Die Lautstärke bei welcher die Alarme ertönen." #~ msgid "The alarm's duration." #~ msgstr "Die Länge des Alarms." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Wie lange der Ton des Alarms zu hören sein wird, wenn die Snap-" #~ "Entscheidung nicht vom Benutzer verworfen wird." #~ msgid "The snooze duration." #~ msgstr "Die Länge der Schlummertaste." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "" #~ "Wie lange man warten soll, wenn der Nutzer die Schlummertaste drückt." ayatana-indicator-datetime-25.4.0/po/dv.po0000644000000000000000000000363514773244555015270 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: dv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/el.po0000644000000000000000000000463614773244555015261 0ustar # Greek translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2021-02-05 22:42+0000\n" "Last-Translator: Michalis \n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.5-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Εντάξει" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "Show the clock in the panel" #~ msgstr "Εμφάνιση του ρολογιού στον πίνακα" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Ελέγχει εάν η ένδειξη ρολογιού εμφανίζεται στον πίνακα ή όχι." ayatana-indicator-datetime-25.4.0/po/en_AU.po0000644000000000000000000002602314773244555015642 0ustar # English translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2020-10-11 01:26+0000\n" "Last-Translator: Rob Pearson \n" "Language-Team: English (Australia) \n" "Language: en_AU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.3-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Add Event…" #: src/menu.cpp:448 msgid "Clock" msgstr "Clock" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Time and Date Settings…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Date and Time" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Time and Date" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (has alarms)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Snooze" #~ msgid "The calendar's default sound file." #~ msgstr "The calendar's default sound file." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Today" #~ msgid "Tomorrow" #~ msgstr "Tomorrow" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Tomorrow %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Tomorrow %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Show the clock in the panel" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Controls whether the clock indicator appears in the panel or not." #~ msgid "What the time format should be" #~ msgstr "What the time format should be" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgid "The format string passed to strftime" #~ msgstr "The format string passed to strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Show the number of seconds in the indicator" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Show the day of the week in the indicator" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgid "Show the month and date in the indicator" #~ msgstr "Show the month and date in the indicator" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgid "Show the year in the indicator" #~ msgstr "Show the year in the indicator" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Show the monthly calendar in the indicator" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Puts the monthly calendar in indicator-datetime's menu." #~ msgid "Show week numbers in calendar" #~ msgstr "Show week numbers in calendar" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgid "Show events in the indicator" #~ msgstr "Show events in the indicator" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Shows events from Evolution in indicator-datetime's menu." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Show the auto-detected location in the indicator" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgid "Show locations in the indicator" #~ msgstr "Show locations in the indicator" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "Shows custom defined locations in indicator-datetime's menu." #~ msgid "A List of locations" #~ msgstr "A List of locations" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgid "The name of the current timezone" #~ msgstr "The name of the current timezone" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgid "The alarm's default volume level." #~ msgstr "The alarm's default volume level." #~ msgid "The volume at which alarms will be played." #~ msgstr "The volume at which alarms will be played." #~ msgid "The alarm's duration." #~ msgstr "The alarm's duration." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgid "The snooze duration." #~ msgstr "The snooze duration." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "How long to wait when the user hits the Snooze button." ayatana-indicator-datetime-25.4.0/po/en_CA.po0000644000000000000000000002601414773244555015620 0ustar # English translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2020-12-31 03:29+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: English (Canada) \n" "Language: en_CA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.4.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Add Event…" #: src/menu.cpp:448 msgid "Clock" msgstr "Clock" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Time and date settings…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Date and Time" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Time and Date" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (has alarms)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Snooze" #~ msgid "The calendar's default sound file." #~ msgstr "The calendar's default sound file." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %b %e %Y" #~ msgid "%a %b %e" #~ msgstr "%a %b %e" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%b %e %Y" #~ msgid "%b %e" #~ msgstr "%b %e" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Today" #~ msgid "Tomorrow" #~ msgstr "Tomorrow" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Tomorrow %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Tomorrow %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Show the clock in the panel" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Controls whether the clock indicator appears in the panel or not." #~ msgid "What the time format should be" #~ msgstr "What the time format should be" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgid "The format string passed to strftime" #~ msgstr "The format string passed to strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Show the number of seconds in the indicator" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Show the day of the week in the indicator" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgid "Show the month and date in the indicator" #~ msgstr "Show the month and date in the indicator" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgid "Show the year in the indicator" #~ msgstr "Show the year in the indicator" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Show the monthly calendar in the indicator" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Puts the monthly calendar in indicator-datetime's menu." #~ msgid "Show week numbers in calendar" #~ msgstr "Show week numbers in calendar" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgid "Show events in the indicator" #~ msgstr "Show events in the indicator" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Shows events from Evolution in indicator-datetime's menu." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Show the auto-detected location in the indicator" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgid "Show locations in the indicator" #~ msgstr "Show locations in the indicator" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "Shows custom defined locations in indicator-datetime's menu." #~ msgid "A List of locations" #~ msgstr "A List of locations" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgid "The name of the current timezone" #~ msgstr "The name of the current timezone" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgid "The alarm's default volume level." #~ msgstr "The alarm's default volume level." #~ msgid "The volume at which alarms will be played." #~ msgstr "The volume at which alarms will be played." #~ msgid "The alarm's duration." #~ msgstr "The alarm's duration." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgid "The snooze duration." #~ msgstr "The snooze duration." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "How long to wait when the user hits the Snooze button." ayatana-indicator-datetime-25.4.0/po/en_GB.po0000644000000000000000000002603014773244555015623 0ustar # English translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2020-10-11 01:26+0000\n" "Last-Translator: Rob Pearson \n" "Language-Team: English (United Kingdom) \n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.3-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Add Event…" #: src/menu.cpp:448 msgid "Clock" msgstr "Clock" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Time and Date Settings…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Date and Time" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Time and Date" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (has alarms)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Snooze" #~ msgid "The calendar's default sound file." #~ msgstr "The calendar's default sound file." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %b %e %Y" #~ msgid "%a %b %e" #~ msgstr "%a %b %e" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Today" #~ msgid "Tomorrow" #~ msgstr "Tomorrow" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Tomorrow %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Tomorrow %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Show the clock in the panel" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Controls whether the clock indicator appears in the panel or not." #~ msgid "What the time format should be" #~ msgstr "What the time format should be" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgid "The format string passed to strftime" #~ msgstr "The format string passed to strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Show the number of seconds in the indicator" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Show the day of the week in the indicator" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgid "Show the month and date in the indicator" #~ msgstr "Show the month and date in the indicator" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgid "Show the year in the indicator" #~ msgstr "Show the year in the indicator" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Show the monthly calendar in the indicator" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Puts the monthly calendar in indicator-datetime's menu." #~ msgid "Show week numbers in calendar" #~ msgstr "Show week numbers in calendar" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgid "Show events in the indicator" #~ msgstr "Show events in the indicator" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Shows events from Evolution in indicator-datetime's menu." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Show the auto-detected location in the indicator" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgid "Show locations in the indicator" #~ msgstr "Show locations in the indicator" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "Shows custom defined locations in indicator-datetime's menu." #~ msgid "A List of locations" #~ msgstr "A List of locations" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgid "The name of the current timezone" #~ msgstr "The name of the current timezone" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgid "The alarm's default volume level." #~ msgstr "The alarm's default volume level." #~ msgid "The volume at which alarms will be played." #~ msgstr "The volume at which alarms will be played." #~ msgid "The alarm's duration." #~ msgstr "The alarm's duration." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgid "The snooze duration." #~ msgstr "The snooze duration." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "How long to wait when the user hits the Snooze button." ayatana-indicator-datetime-25.4.0/po/eo.po0000644000000000000000000000703214773244555015255 0ustar # Esperanto translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2021-11-24 14:50+0000\n" "Last-Translator: phlostically \n" "Language-Team: Esperanto \n" "Language: eo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.10-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, la %ea de %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Skribi eventon…" #: src/menu.cpp:448 msgid "Clock" msgstr "Horloĝo" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Agordoj pri horo kaj dato…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Dato kaj horo" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Horo kaj dato" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (havas alarmojn)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %P" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarmo %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Bone" #: src/snap.cpp:169 msgid "Snooze" msgstr "Dormeti" #~ msgid "The calendar's default sound file." #~ msgstr "La implicita sondosiero de la kalendaro." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Se kalendara aŭ memoriga evento ne specifas sian propran sondosieron, ĉi " #~ "tiu dosiero estos implicita." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %P" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %P" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %ea de %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %ea de %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%ea de %b %Y" #~ msgid "%b %e" #~ msgstr "%ea de %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Hodiaŭ" #~ msgid "Tomorrow" #~ msgstr "Morgaŭ" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %da de %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Morgaŭ %l:%M %P" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %P" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %da de %b %l:%M %P" #~ msgid "Tomorrow %H:%M" #~ msgstr "Morgaŭ %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %da de %b %H:%M" ayatana-indicator-datetime-25.4.0/po/es.po0000644000000000000000000002731114773244555015263 0ustar # Spanish translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2023-03-04 14:40+0000\n" "Last-Translator: gallegonovato \n" "Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.16.2-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Añadir evento…" #: src/menu.cpp:448 msgid "Clock" msgstr "Reloj" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Configuración de fecha y hora…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Fecha y hora" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Configuración de hora y fecha, acceso rápido al calendario" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Hora y fecha" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (tiene alarmas)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarma %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Evento %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Aceptar" #: src/snap.cpp:169 msgid "Snooze" msgstr "Repetición" #~ msgid "The calendar's default sound file." #~ msgstr "Archivo de sonido predeterminado de la alarma." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Si un evento de recordatorio o alarma no especifica su propio archivo de " #~ "sonido, este archivo se utilizará como sonido de reserva." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Hoy" #~ msgid "Tomorrow" #~ msgstr "Mañana" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Mañana %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %b %d %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Mañana %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %b %d %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Mostrar el reloj en el panel" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Controla si el indicador del reloj aparece en el panel o no." #~ msgid "What the time format should be" #~ msgstr "Cuál debería ser el formato de la hora" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Controla el formato de la hora que es mostrado en el indicador. Para la " #~ "mayoría de los usuarios este debería ser el predeterminado para su zona. " #~ "Si piensa que la configuración es errónea para su zona, por favor únase o " #~ "hable con el equipo de traducción para su idioma. Si solo quiere algo " #~ "diferente puede ajustarlo para que sea de formato 12 o 24 horas. O puede " #~ "usar una cadena de formato personalizada y seleccionar la opción de " #~ "formato de horario personalizado." #~ msgid "The format string passed to strftime" #~ msgstr "La cadena de formato se envió a strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "El formato de hora y/o fecha que es visible en el panel cuando se utiliza " #~ "el indicador. Para la mayoría de los usuarios será un conjunto de valores " #~ "predefinidos determinado por la utilidad de configuración, pero los " #~ "usuarios avanzados pueden cambiarlo a cualquier cosa que strftime pueda " #~ "aceptar. Consulte la página man de strftime para más información." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Mostrar el número de segundos en el indicador" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Hace que el indicador de hora y fecha muestre el número de segundos en el " #~ "indicador. Es importante tener en cuenta que esto causará un mayor " #~ "consumo de batería ya que el tiempo se actualizará 60 veces más a menudo, " #~ "por lo que no se recomienda. Además este ajuste será ignorado si el valor " #~ "del formato de hora está personalizado." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Mostrar el día de la semana en el indicador" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Pone el día de la semana en el panel junto con la hora y/o fecha " #~ "dependiendo de la configuración. Este ajuste será ignorado si el valor " #~ "del formato de hora está personalizado." #~ msgid "Show the month and date in the indicator" #~ msgstr "Mostrar el mes y la fecha en el indicador" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Pone el mes y la fecha en el panel junto con la hora y/o el día de la " #~ "semana dependiendo de la configuración. Este ajuste será ignorado si el " #~ "valor del formato de hora está personalizado." #~ msgid "Show the year in the indicator" #~ msgstr "Mostrar el año en el indicador" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Pone el año en el panel junto con el mes y la fecha. Este ajuste será " #~ "ignorado tanto si el valor del formato de la fecha está personalizado o " #~ "si la opción de mostrar la fecha está deshabilitada." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Mostrar el calendario mensual en el indicador" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "" #~ "Pone el calendario mensual en el menú del indicador de fecha y hora." #~ msgid "Show week numbers in calendar" #~ msgstr "Mostrar los números de la semana en el calendario" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Muestra los números de la semana del calendario mensual en el menú del " #~ "indicador de fecha y hora." #~ msgid "Show events in the indicator" #~ msgstr "Mostrar los eventos en el indicador" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "" #~ "Muestra los eventos de Evolution en el menú del indicador de fecha y hora." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Mostrar la ubicación detectada automáticamente en el indicador" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Muestra su ubicación actual (determinada desde geoclue y /etc/timezone) " #~ "en el menú del indicador de fecha y hora." #~ msgid "Show locations in the indicator" #~ msgstr "Mostrar las ubicaciones en el indicador" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "" #~ "Muestra ubicaciones personalizadas en el menú del indicador de fecha y " #~ "hora." #~ msgid "A List of locations" #~ msgstr "Una lista de ubicaciones" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Añade la lista de ubicaciones que el usuario ha configurado para que se " #~ "muestren en el menú del indicador de fecha y hora." #~ msgid "The name of the current timezone" #~ msgstr "El nombre de la zona horaria actual" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Algunas zonas horarias pueden conocerse por diferentes ciudades o " #~ "nombres. Esta configuración describe como la zona actual prefiere ser " #~ "nombrada. El formato es «ZONA HORARIA NOMBRE» (p.ej. «América/Nueva_York " #~ "Boston» para nombrar la zona Nueva_York Boston)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "Qué clase de reacción háptica, si la hay, activar con una alarma." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Qué clase de reacción háptica, si la hay, activar con una alarma. Se " #~ "admiten dos modos actualmente: «vibrar» y «ninguno»." #~ msgid "The alarm's default volume level." #~ msgstr "Nivel de volumen predeterminado de la alarma." #~ msgid "The volume at which alarms will be played." #~ msgstr "El volumen al que sonarán las alarmas." #~ msgid "The alarm's duration." #~ msgstr "Duración de la alarma." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Durante cuánto tiempo sonará la alarma en bucle si su activación " #~ "inmediata no es rechazada por el usuario." #~ msgid "The snooze duration." #~ msgstr "La duración de la repetición." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "" #~ "Durante cuánto tiempo esperar cuando el usuario pulsa el botón de " #~ "repetición." ayatana-indicator-datetime-25.4.0/po/et.po0000644000000000000000000002544314773244555015270 0ustar # Estonian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2022-10-20 10:06+0000\n" "Last-Translator: Kristjan Räts \n" "Language-Team: Estonian \n" "Language: et\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.14.2-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Lisa sündmus…" #: src/menu.cpp:448 msgid "Clock" msgstr "Kell" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Aja ja kuupäeva seaded…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Kuupäev ja aeg" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Kella ja kuupäeva seaded, kiire juurdepääs kalendrile" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Aeg ja kuupäev" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (alarmidega)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %I:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Sündmus %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "ÕK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Korda" #~ msgid "The calendar's default sound file." #~ msgstr "Kalendri vaikimisi helifail." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Kui kalendris või alarmis ei ole määratud kohandatud heli, siis " #~ "kasutatakse seda faili vaikimisi heliks." #~ msgid "%l:%M:%S %p" #~ msgstr "%I:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%I:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a, %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a, %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Täna" #~ msgid "Tomorrow" #~ msgstr "Homme" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a, %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Tomorrow %I:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %I:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a, %b %d %I:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Homme %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %b %d %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Kuva kellaaeg paneelil" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Kontrollib kella indikaatori kuvatamist paneelil." #~ msgid "What the time format should be" #~ msgstr "Milline peaks olema aja vorming" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Kontrollib aja vormingut, mida kuvatakse indikaatoril. Enamikule " #~ "kasutajatest peaks see olema nende vaikelokaadis. Kui sule tundub, et " #~ "sätted on su lokaadile valed, siis palun liitu või räägi oma keele " #~ "tlketiimiga. Kui sa soovid midagi erinevat, siis saad kohandada, kas " #~ "kasutatakse 12 või 24 tunnist kella. Samuti saad kasutada kohandatud " #~ "vormingustringi ja määrata kohandatud aja vormingu sätte." #~ msgid "The format string passed to strftime" #~ msgstr "Aja vormingu string funktsioonile strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Aja ja/või kuupäeva vorming, mis kuvatakse indikaatori kasutamisel " #~ "paneelile. Enamikule kasutajatest on see kogum etteantud väärtuseid, " #~ "mille määramiseks on seadistusprogramm, kuid edasijõudnud kasutajad " #~ "saavad seda muuta milleks iganes, mida funktsioon strftime toetab. " #~ "Lisainfot vaata strftime manuaalist." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Kuva indikaatoril sekundeid" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Juhib sekundite kuvamist kuupäeva kellaaja indikaatoril. Oluline on " #~ "märkida, et see põhjustab täiendavat aku tühjenemist, sest kellaaega " #~ "uuendatakse60 korda tihedamalt, seega ei ole see soovitatav. Seda sätet " #~ "ei rakendata, kui kasutusel on kohandatud ajavorming." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Kuva nädalapäev indikaatoril" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Lisab paneelile kuupäeva ja kellaaja juurde ka nädalapäeva. See muudatus " #~ "ei rakendu, kui kasutusel on kohandatud ajavorming." #~ msgid "Show the month and date in the indicator" #~ msgstr "Kuva kuu ja päev indikaatoril" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Lisab paneelile kellaaja ja nädalapäevaga kõrvale ka kuu ja päeva. See " #~ "muudatus ei rakendu, kui kasutusel on kohandatud ajavorming." #~ msgid "Show the year in the indicator" #~ msgstr "Kuva aasta indikaatoril" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Lisab paneelile kuu ja päeva juurde ka aasta. See muudatus ei rakendu, " #~ "kui kasutusel on kohandatud ajavorming või kuupäeva kuvamine on keelatud." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Kuva indikaatoril terve kuu kalender" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Lisab kalendri kuuvaate indikaatori menüüse aeg." #~ msgid "Show week numbers in calendar" #~ msgstr "Kuva kalendris nädala number" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Kuvab nädalate numbrid kuu kalendris, mis lisatakse indikaatori menüüsse " #~ "aeg." #~ msgid "Show events in the indicator" #~ msgstr "Kuva sündmused indikaator" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Kuvab Evolutioni sündmused inikaatori menüs aeg." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Kuva indikaatoril automaatselt tuvastatud asukoht" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Kuvab su praeguse asukoha (kasutades geoclue teenust ja faili /etc/" #~ "timezone) indikaatori menüüs aeg." #~ msgid "Show locations in the indicator" #~ msgstr "Kuvab indikaatoril asukohad" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "Kuvab kohandatud asukohad indikaatori menüüs aeg." #~ msgid "A List of locations" #~ msgstr "Asukohtade loetelu" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Lisab kasutaja häälestatud asukohtade loetelu indikaatori menüüsse aeg." #~ msgid "The name of the current timezone" #~ msgstr "Praeguse ajatsooni nimi" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Mõned ajatsoonid on tuntud mitme erineva linna või nimega. See säte " #~ "kirjeldab tsoonide eelisnimed. Vorming on: \"AJATSOON NIMI\" (nt. rea " #~ "\"Europe/Tallinn Tartu\" lisamines kuvatakse Ida-Euroopa ajatsooni asemel " #~ "Tartu)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "Milline puutetundlik tagasiside, kui üldse, tekitada alarmi korral." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Milline puutetundlik tevitus anda alarmi korral, kui üldse. Hetkel on " #~ "toetatud kaks režiimi: pulseeriv ja mitte midagi." #~ msgid "The alarm's default volume level." #~ msgstr "Alarmi vaikimisi helitugevus." #~ msgid "The volume at which alarms will be played." #~ msgstr "Alarmi mängimise helitugevus." #~ msgid "The alarm's duration." #~ msgstr "Alarmi pikkus." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Kui pikalt korrata alarmi heli, kui kasutaja ei tühista ta meeldetuletust." #~ msgid "The snooze duration." #~ msgstr "Korduse vahemik." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "Kui kaua oodata, kui kasutaja on vajutanud kordamise nuppu." ayatana-indicator-datetime-25.4.0/po/eu.po0000644000000000000000000000365114773244555015266 0ustar # Basque translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:54+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/fa.po0000644000000000000000000000541114773244555015237 0ustar # Persian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2020-08-04 18:32+0000\n" "Last-Translator: Abbas Baharforoosh \n" "Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.2-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "افزودن رویداد…" #: src/menu.cpp:448 msgid "Clock" msgstr "ساعت" #: src/menu.cpp:500 #, fuzzy msgid "Time and Date Settings…" msgstr "تنظیمات زمان و تاریخ…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "تاریخ و زمان" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 #, fuzzy msgid "Time and Date" msgstr "زمان و تاریخ" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (هشدار دارد)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "The calendar's default sound file." #~ msgstr "فایل صدای پیش فرض تقویم." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "در صورتی که برای تقدیم یا یادآور هیچ فایل صدایی مشخص نشده باشد، از این " #~ "فایل صدا استفاده خواهد شد." #~ msgid "Today" #~ msgstr "امروز" #~ msgid "Tomorrow" #~ msgstr "فردا" ayatana-indicator-datetime-25.4.0/po/fil.po0000644000000000000000000000365414773244555015432 0ustar # Filipino translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: fil\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/fi.po0000644000000000000000000000373114773244555015252 0ustar # Finnish translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/fo.po0000644000000000000000000000373114773244555015260 0ustar # Faroese translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: fo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/fr_CA.po0000644000000000000000000000700114773244555015620 0ustar # French translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2020-12-31 03:29+0000\n" "Last-Translator: J. Lavoie \n" "Language-Team: French (Canada) \n" "Language: fr_CA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.4.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Ajouter un évènement…" #: src/menu.cpp:448 msgid "Clock" msgstr "Horloge" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Paramètres de date et d'heure…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Date et heure" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Heure et date" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (a des alarmes)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarme %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Répéter" #~ msgid "The calendar's default sound file." #~ msgstr "Fichier sonore par défaut du calendrier." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Si une alarme ne spécifie pas son propre fichier sonore, ce fichier sera " #~ "utilisé comme son de secours." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Aujourd'hui" #~ msgid "Tomorrow" #~ msgstr "Demain" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Demain %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Demain %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" ayatana-indicator-datetime-25.4.0/po/fr.po0000644000000000000000000002755214773244555015272 0ustar # French translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2024-03-25 13:01+0000\n" "Last-Translator: Steve \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.5-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Ajouter un évènement…" #: src/menu.cpp:448 msgid "Clock" msgstr "Horloge" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Paramètres de date et d'heure…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Date et heure" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Réglage de l'heure et de la date, accès rapide au calendrier" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Heure et date" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (a des alarmes)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarme %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Événements %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Répéter" #~ msgid "The calendar's default sound file." #~ msgstr "Fichier sonore par défaut du calendrier." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Si une alarme ne spécifie pas son propre fichier sonore, ce fichier sera " #~ "utilisé comme son de secours." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Aujourd'hui" #~ msgid "Tomorrow" #~ msgstr "Demain" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Demain %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %b %d %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Demain %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %b %d %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Montrer l'horloge dans les panneau" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Contrôle si l'indicateur d'horloge apparaît dans le panneau ou non." #~ msgid "What the time format should be" #~ msgstr "Ce que le format d'heure devrait être" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Contrôle le format d'heure qui est affiché dans l'indicateur. Pour " #~ "presque tous les utilisateurs, ceci devrait être la valeur par défaut " #~ "pour leur lieu de résidenve. Si vous pensez que la valeur est incorrecte " #~ "pour votre lieu de résidence, veuillez contacter ou vous joindre à " #~ "l'équipe de traduction pour votre langue. Si vous voulez simplement " #~ "quelque chose de différent, vous pouvez ajuster la valeur sur le format " #~ "12 ou 24 heures. Ou, vous pouvez utiliser une chaîne de format " #~ "personnalisée et définir le paramètre de format d'heure." #~ msgid "The format string passed to strftime" #~ msgstr "La chaîne de format passée à strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Le format de l'heure ou de la date qui est visible sur le panneau lors de " #~ "l'utilisation de l'indicateur. Pour la plupart des utilisateurs, il " #~ "s'agira d'un ensemble de valeurs prédéfinies déterminées par l'utilitaire " #~ "de configuration, mais les utilisateurs avancés peuvent le modifier en " #~ "tout ce que strftime peut accepter. Regardez la page principale sur " #~ "strftime pour plus d'informations." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Afficher le nombre de secondes dans l'indicateur" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "L'indicateur d'heure et de date indique le nombre de secondes dans " #~ "l'indicateur. Il est important de noter que ceci entraînera une " #~ "consommation supplémentaire de la batterie car le temps sera mis à jour " #~ "60 fois plus souvent ; ce n'est donc pas recommandé. En outre, ce " #~ "paramètre sera ignoré si la valeur du format de l'heure est définie sur « " #~ "personnalisé »." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Afficher le jour de la semaine dans l'indicateur" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Met le jour de la semaine sur le panneau avec l'heure ou la date en " #~ "fonction des paramètres. Ce paramètre sera ignoré si la valeur du format " #~ "de l'heure est personnalisée." #~ msgid "Show the month and date in the indicator" #~ msgstr "Afficher le mois et la date dans l'indicateur" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Met le mois et la date dans le panneau avec l'heure ou le jour de la " #~ "semaine en fonction des paramètres. Ce paramètre sera ignoré si la valeur " #~ "du format de l'heure est personnalisée." #~ msgid "Show the year in the indicator" #~ msgstr "Afficher l'année dans l'indicateur" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Met l'année dans le panneau avec le mois et la date. Ce paramètre sera " #~ "ignoré si la valeur du format de l'heure est personnalisée ou si " #~ "l'affichage de la date est paramétré sur faux." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Afficher le calendrier mensuel dans l'indicateur" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Met le calendrier mensuel dans le menu de l'indicateur." #~ msgid "Show week numbers in calendar" #~ msgstr "Afficher le numéro de la semaine dans le calendrier" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Affiche le numéro de la semaine dans le calendrier mensuel dans le menu " #~ "de l'indicateur." #~ msgid "Show events in the indicator" #~ msgstr "Afficher les évènements dans l'indicateur" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Affiche les évènements d'Évolution dans le menu de l'indicateur." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Afficher l'emplacement détecté automatiquement dans l'indicateur" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Affiche votre emplacement actuel (déterminé à partir de geoclue et /etc/" #~ "fuseau horaire) dans le menu de l'indicateur." #~ msgid "Show locations in the indicator" #~ msgstr "Afficher les emplacements dans l'indicateur" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "" #~ "Affiche des emplacements personnalisés dans le menu de l'indicateur." #~ msgid "A List of locations" #~ msgstr "Une liste d'emplacements" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Ajoute la liste des emplacements que l'utilisateur \n" #~ "a configurée à afficher dans le menu de l'indicateur." #~ msgid "The name of the current timezone" #~ msgstr "Le nom du fuseau horaire actuel" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Certains fuseaux horaires peuvent être connus par de nombreuses villes ou " #~ "noms différents. Ce paramètre décrit comment la zone actuelle préfère " #~ "être nommée. Le format est « TIMEZONE NAME » (p. ex. « America/New_York " #~ "Boston » pour nommer la zone New_York Boston)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "" #~ "Quel genre de rétroaction haptique, le cas échéant, à déclencher avec une " #~ "alarme." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Quel genre de rétroaction haptique, le cas échéant, à déclencher avec une " #~ "alarme. Deux modes sont actuellement pris en charge : « pulsation », « " #~ "aucune »." #~ msgid "The alarm's default volume level." #~ msgstr "Volume sonore par défaut de l'alarme." #~ msgid "The volume at which alarms will be played." #~ msgstr "Le volume auquel les alarmes seront." #~ msgid "The alarm's duration." #~ msgstr "La durée de l'alarme." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Combien de temps le son de l'alarme sera en boucle si sa décision rapide " #~ "n'est pas rejetée par l'utilisateur." #~ msgid "The snooze duration." #~ msgstr "La durée de la mise en pause." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "" #~ "Combien de temps attendre quand l'utilisateur appuie sur le bouton " #~ "Répéter." ayatana-indicator-datetime-25.4.0/po/frp.po0000644000000000000000000000366014773244555015444 0ustar # Language frp translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: frp\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/fur.po0000644000000000000000000000363614773244555015454 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: fur\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/fy.po0000644000000000000000000000366214773244555015275 0ustar # Western Frisian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: fy\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ga.po0000644000000000000000000000374614773244555015251 0ustar # Irish translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ga\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/gd.po0000644000000000000000000000427414773244555015251 0ustar # Scottish Gaelic translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2021-11-17 14:52+0000\n" "Last-Translator: Phil Clifford \n" "Language-Team: Gaelic \n" "Language: gd\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : " "(n > 2 && n < 20) ? 2 : 3;\n" "X-Generator: Weblate 4.9.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Ceann-latha agus àm" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/gl.po0000644000000000000000000002663314773244555015264 0ustar # Galician translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2018-10-24 16:29+0000\n" "Last-Translator: Iván Seoane \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.3-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Engadir acontecemento…" #: src/menu.cpp:448 msgid "Clock" msgstr "Reloxo" #: src/menu.cpp:500 #, fuzzy msgid "Time and Date Settings…" msgstr "Axustes da data e hora…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Data e hora" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 #, fuzzy msgid "Time and Date" msgstr "Hora e data" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (ten alarmas)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarma %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Feito" #: src/snap.cpp:169 msgid "Snooze" msgstr "Repetición" #, fuzzy #~ msgid "The calendar's default sound file." #~ msgstr "Ficheiro de son predeterminado da alarma." #, fuzzy #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Se unha alarma non especifica o seu propio ficheiro de son, este ficheiro " #~ "empregarase coma o son da reserva." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Hoxe" #~ msgid "Tomorrow" #~ msgstr "Mañá" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Mañá %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %b %d %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Mañá %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %b %d %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Amosa-lo reloxo no panel" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Controla se o indicador do reloxo aparece no panel ou non." #~ msgid "What the time format should be" #~ msgstr "Cal debería se-lo formato da hora" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Controla o formato da hora á que é amosado no indicador. Para a maioría " #~ "dos usuarios este debería se-lo predeterminado para a súa zona. Se pensa " #~ "que a configuración é un erro para a súa zona, por favor únase ou fale ca " #~ "equipa da tradución para a súa lingua. Se só desexa algo diferente pode " #~ "axustalo para que sexa do formato 12 ou 24 horas. Ou pode empregar unha " #~ "cadea de formato persoalizada e elixi-la opción de formato do horario " #~ "persoalizado." #~ msgid "The format string passed to strftime" #~ msgstr "A cadea de formato enviouse ó 'strftime'" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "O formato da hora e/ou data que é visíbel no panel cando se emprega o " #~ "indicador. Para a maioría dos usuarios será un conxunto de valores " #~ "predefinidos determinados pola utilidade da configuración, pero os " #~ "usuarios avanzados poden mudalo a calquera cousa que o strftime poida " #~ "aceptar. Olle a páxina 'man' do 'strftime' para máis información." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Amosa-lo número de segundos no indicador" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Fai que o indicador da hora e data amose o número de segundos no " #~ "indicador. É importante ter en conta que isto xerará un maior consumo da " #~ "batería xa que o tempo actualizarase 60 veces máis a miúdo, polo que non " #~ "se recomenda. Ademais este axuste será ignorado se o valor do formato da " #~ "hora está persoalizado." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Amosa-lo día da semana no indicador" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Pon o día da semana no panel xunto ca hora e/ou data dependendo da " #~ "configuración. Este axuste será ignorado se o valor do formato da hora " #~ "está persoalizado." #~ msgid "Show the month and date in the indicator" #~ msgstr "Amosa-lo mes e a data no indicador" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Pon o mes e a data no panel xunto ca hora e/ou o día da semana dependendo " #~ "da configuración. Este axuste será ignorado se o valor do formato da hora " #~ "está persoalizado." #~ msgid "Show the year in the indicator" #~ msgstr "Amosa-lo ano no indicador" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Pon o ano no panel xunto co mes e a data. Este axuste será ignorado tanto " #~ "se o valor do formato da data está persoalizado ou se a opción de amosa-" #~ "la data está definida coma falsa." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Amosa-lo calendario mensual no indicador" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Pon o calendario mensual no menú do indicador da data e hora." #~ msgid "Show week numbers in calendar" #~ msgstr "Amosa-los números da semana no calendario" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Amosa-los números da semana do calendario mensual no menú do indicador da " #~ "data e hora." #~ msgid "Show events in the indicator" #~ msgstr "Amosa-los acontecementos no indicador" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "" #~ "Amosa-los acontecementos do 'Evolution' no menú do indicador da data e " #~ "hora." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Amosa-la ubicación detectada de xeito automático no indicador" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Amosa-la súa ubicación actual (determinada dende o 'geoclue' e /etc/" #~ "timezone) no menú do indicador da data e hora." #~ msgid "Show locations in the indicator" #~ msgstr "Amosa-las ubicacións no indicador" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "" #~ "Amosa-las ubicacións persoalizadas no menú do indicador da data e hora." #~ msgid "A List of locations" #~ msgstr "Unha listaxe das ubicacións" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Engade a listaxe das ubicacións que o usuario configurou para que se " #~ "amosen no menú do indicador da data e hora." #~ msgid "The name of the current timezone" #~ msgstr "O nome do fuso horario actual" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Algúns fusos horarios poden coñecerse por diferentes cidades ou nomes. " #~ "Esta configuración describe de que xeito o fuso actual prefire ser " #~ "nombrado. O formato é «FUSO HORARIO NOME» (p.ex. «América/Nova_York " #~ "Boston» para nomea-lo fuso Nova_York Boston)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "Que clase de reacción táctil, se a hai, activar cunha alarma." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Que clase de reacción táctil, se a hai, activar cunha alarma. Admítense " #~ "dous modos actualmente: «vibrar» e «ningún»." #~ msgid "The alarm's default volume level." #~ msgstr "Nivel do volume predeterminado da alarma." #~ msgid "The volume at which alarms will be played." #~ msgstr "O volume ó que soarán as alarmas." #~ msgid "The alarm's duration." #~ msgstr "Dura da alarma." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Durante canto tempo soará a alarma de xeito indefinido se a súa " #~ "activación inmediata non é rexeitada polo usuario." #~ msgid "The snooze duration." #~ msgstr "A dura da repetición." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "" #~ "Durante canto tempo agardar cando o usuario preme o botón da repetición." ayatana-indicator-datetime-25.4.0/po/gu.po0000644000000000000000000000365314773244555015272 0ustar # Gujarati translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:31+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: gu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/gv.po0000644000000000000000000000363514773244555015273 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: gv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/he.po0000644000000000000000000000776514773244555015263 0ustar # Hebrew translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2022-09-23 06:18+0000\n" "Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Weblate 4.14.1\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e ב%B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "הוספת אירוע…" #: src/menu.cpp:448 msgid "Clock" msgstr "שעון" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "הגדרות שעה ותאריך…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "תאריך ושעה" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "הגדרות שעה ותאריך, גישה מהירה ללוח השנה" #: src/menu.cpp:613 msgid "Time and Date" msgstr "שעה ותאריך" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (יש התראות)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %H:%M" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "התראה %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "אירוע %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "אישור" #: src/snap.cpp:169 msgid "Snooze" msgstr "נודניק" #~ msgid "The calendar's default sound file." #~ msgstr "קובץ השמע של לוח השנה כבררת מחדל." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "אם אירוע בלוח השנה או תזכורת לא ציין קובץ שמע משל עצמו, הקובץ הזה יושמע " #~ "במקום." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%H:%M" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %b ב%e %Y" #~ msgid "%a %b %e" #~ msgstr "%a %b ב%e" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%b ב%e %Y" #~ msgid "%b %e" #~ msgstr "%b ב%e" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "היום" #~ msgid "Tomorrow" #~ msgstr "מחר" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d ב%b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "מחר ב־%H:%M" #~ msgid "%a %l:%M %p" #~ msgstr "%a ב־%H:%M" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d ב%b ב־%H:%M" #~ msgid "Tomorrow %H:%M" #~ msgstr "מחר %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a ב־%H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d ב%b ב־%H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "הצגת השעון בחלונית" #~ msgid "Error getting time" #~ msgstr "שגיאה בקבלת השעה" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d PM" #~ msgid "Open Calendar" #~ msgstr "פתח לוח שנה" ayatana-indicator-datetime-25.4.0/po/hi.po0000644000000000000000000000445714773244555015262 0ustar # Hindi translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2010-03-03 10:06-0500\n" "Last-Translator: Canonical OEM\n" "Language-Team: Hindi\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 #, fuzzy msgid "Time and Date" msgstr "समय और तिथि सेट करें..." #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "Error getting time" #~ msgstr "समय प्राप्त करने में त्रुटि" #~ msgid "%d%d:%d%d AM" #~ msgstr "प्रातः %d%d:%d%d बजे" #~ msgid "%d%d:%d%d PM" #~ msgstr "सायं %d%d:%d%d बजे" #~ msgid "Open Calendar" #~ msgstr "कैलेंडर खोलें" ayatana-indicator-datetime-25.4.0/po/hr.po0000644000000000000000000000755014773244555015270 0ustar # Croatian translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2022-12-31 15:49+0000\n" "Last-Translator: Milo Ivir \n" "Language-Team: Croatian \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.15.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e. %B. %Y." #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Dodaj događaj …" #: src/menu.cpp:448 msgid "Clock" msgstr "Sat" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Postavke za vrijeme i datum …" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Datum i vrijeme" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Postavke za vrijeme i datum. Brz pristup kalendaru" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Vrijeme i datum" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (ima alarme)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %H:%M" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Događaj %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "U redu" #: src/snap.cpp:169 msgid "Snooze" msgstr "Odgodi alarm" #~ msgid "The calendar's default sound file." #~ msgstr "Standardna zvučna datoteka kalendara." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Ako kalendar ili događaj podsjetnika ne određuju vlastitu zvučnu " #~ "datoteku, ova će se datoteka koristiti kao rezervni zvuk." #~ msgid "%l:%M:%S %p" #~ msgstr "%H:%M:%S" #~ msgid "%l:%M %p" #~ msgstr "%H:%M" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e. %m. %Y." #~ msgid "%a %b %e" #~ msgstr "%a %e. %m." #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e. %m. %Y." #~ msgid "%b %e" #~ msgstr "%e. %m." #~ msgid "%Y" #~ msgstr "%Y." #~ msgid "Today" #~ msgstr "Danas" #~ msgid "Tomorrow" #~ msgstr "Sutra" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d. %m." #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Sutra %H:%M" #~ msgid "%a %l:%M %p" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d. %m %H:%M" #~ msgid "Tomorrow %H:%M" #~ msgstr "Sutra %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d. %m. %H:%M" #~ msgid "Error getting time" #~ msgstr "Greška pri dohvaćanju vremena" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d%d%d PM" #~ msgid "Open Calendar" #~ msgstr "Otvori kalendar" ayatana-indicator-datetime-25.4.0/po/ht.po0000644000000000000000000000365214773244555015271 0ustar # Haitian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ht\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/hu.po0000644000000000000000000001273614773244555015275 0ustar # Hungarian translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2022-01-08 13:54+0000\n" "Last-Translator: wigy \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.10.1\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Esemény hozzáadása…" #: src/menu.cpp:448 msgid "Clock" msgstr "Óra" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Idő és dátum beállítások…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Dátum és idő" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Idő és dátum" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (riasztásokkal rendelkezik)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "%s riasztás" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Szundi" #~ msgid "The calendar's default sound file." #~ msgstr "A naptár alapértelmezett hangfájlja." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Ha egy naptár vagy eseményemlékeztető nem határoz meg saját hangfájlt, " #~ "akkor ez a fájl lesz használva tartalék hangként." #~ msgid "%l:%M:%S %p" #~ msgstr "%p %l:%M:%S" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%b %e, %a %Y" #~ msgid "%a %b %e" #~ msgstr "%b %e, %a" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%Y %b %e" #~ msgid "%b %e" #~ msgstr "%b %e" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Ma" #~ msgid "Tomorrow" #~ msgstr "Holnap" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%b %d, %a" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Holnap %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%b %d, %a %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Holnap %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%b %d, %a %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Mutassa az órát a panelen" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Szabályozza hogy az óra megjelenjen-e a panelen vagy nem." #~ msgid "What the time format should be" #~ msgstr "Milyen legyen a megjelenített időformátum" #~ msgid "The format string passed to strftime" #~ msgstr "Az strftime-nak küldött formátumstring" #~ msgid "Show the month and date in the indicator" #~ msgstr "A hónap és nap mutatása az indikátoron" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Beteszi a hónapot és a napot a panelra, beállításoktól függően az idő és/" #~ "vagy a hét napjával együtt. Ez a beállítás figyelmen kívül lesz hagyva, " #~ "ha az időformátum értéke egyedire van állítva." #~ msgid "Show the year in the indicator" #~ msgstr "Az év mutatása az indikátoron" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Beteszi az évet a panelra, a hónap és a nappal együtt. Ez a beállítás " #~ "figyelmen kívül lesz hagyva, ha az időformátum értéke egyedire van " #~ "állítva vagy ha a dátum mutatása le van tiltva." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "A havi naptár mutatása az indikátoron" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Beteszi a havi naptárt az dátum-idő indikátor menüjébe." #~ msgid "Error getting time" #~ msgstr "Hiba az idő lekérésekor" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d de." #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d du." #~ msgid "Open Calendar" #~ msgstr "Naptár megnyitása" ayatana-indicator-datetime-25.4.0/po/hy.po0000644000000000000000000000447314773244555015300 0ustar # Armenian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2020-04-02 21:09+0000\n" "Last-Translator: Davit Mayilyan \n" "Language-Team: Armenian \n" "Language: hy\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.0-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "Ժամ" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Լավ" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "Today" #~ msgstr "Այսօր" #~ msgid "Tomorrow" #~ msgstr "Վաղը" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Վաղը %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Վաղը %H:%M" ayatana-indicator-datetime-25.4.0/po/ia.po0000644000000000000000000000365614773244555015253 0ustar # Interlingua translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ia\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/id.po0000644000000000000000000000676514773244555015262 0ustar # Indonesian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2021-03-18 17:29+0000\n" "Last-Translator: Reza Almanda \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.5.2-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Tambah acara…" #: src/menu.cpp:448 msgid "Clock" msgstr "Jam" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Pengaturan waktu dan tanggal…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Tanggal dan Waktu" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Waktu dan Tanggal" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (memiliki alarm)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Oke" #: src/snap.cpp:169 msgid "Snooze" msgstr "Senyap" #~ msgid "The calendar's default sound file." #~ msgstr "Berkas suara standar kalender." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Jika kalender atau pengingat acara tidak menentukan berkas suaranya " #~ "sendiri, berkas ini akan digunakan sebagai pengganti." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %b %e %Y" #~ msgid "%a %b %e" #~ msgstr "%a %b %e" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%b %e %Y" #~ msgid "%b %e" #~ msgstr "%b %e" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Hari ini" #~ msgid "Tomorrow" #~ msgstr "Besok" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Besok %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Besok %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" ayatana-indicator-datetime-25.4.0/po/is.po0000644000000000000000000000365414773244555015273 0ustar # Icelandic translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: is\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/it_CARES.po0000644000000000000000000000364314773244555016207 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: it_CARES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/it.po0000644000000000000000000002222714773244555015271 0ustar # Italian translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2023-06-28 10:51+0000\n" "Last-Translator: Sylke Vicious \n" "Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.18.1\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Aggiungi un evento…" #: src/menu.cpp:448 msgid "Clock" msgstr "Orologio" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Impostazioni ora e data…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Data e ora" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Impostazioni data e ora, accesso rapido al calendario" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Ora e data" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (ha allarmi)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Allarme %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Evento %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Rimanda" #~ msgid "The calendar's default sound file." #~ msgstr "Il file audio di default del calendario." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Se un calendario o un promemoria non specifica il proprio file audio, " #~ "questo file sarà usato come suono." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Oggi" #~ msgid "Tomorrow" #~ msgstr "Domani" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Domani %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Domani %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" #~ msgid "What the time format should be" #~ msgstr "Quale dovrebbe essere il formato orario" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Controlla quale formato orario viene mostrato nell'indicatore. Per quasi " #~ "tutti gli utenti dovrebbe essere impostato come il valore predefinito per " #~ "la propria regione. Se pensi che quest'impostazione sia errata nella tua " #~ "regione per favore contatta od entra nel gruppo che traduce nella tua " #~ "lingua. Se vuoi solo modificare il formato puoi impostarlo a 12 o 24 ore. " #~ "In alternativa, puoi usare una stringa personalizzata attraverso " #~ "l'impostazione custom-time-format." #~ msgid "The format string passed to strftime" #~ msgstr "La stringa di formato passata a strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Il formato di ora e/o data visibile nel pannello quando viene usato " #~ "l'indicatore. Per molti degli utenti sarà un insieme di valori " #~ "predefiniti determinati dall'utilità di configurazione, ma gli utenti più " #~ "avanzati possono modificarla ad una qualsiasi stringa accettata da " #~ "strftime. Per ulteriori informazioni a riguardo, consultare la pagina del " #~ "manuale relativa a strftime." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Mostra i secondi nell'indicatore" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Fa in modo che l'indicatore mostri le cifre dei secondi. Si tenga conto " #~ "che quest'opzione non è consigliata poiché aumenta il consumo di " #~ "batteria, dato che l'indicatore dell'ora dovrà essere aggiornato 60 volte " #~ "più spesso. Inoltre, se il valore time-format è regolato su \"custom\", " #~ "quest'impostazione verrà ignorata." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Mostra il giorno della settimana nell'indicatore" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Mostra il giorno della settimana nel pannello assieme a data ed/od ora, a " #~ "seconda delle impostazioni. Se il valore time-format è regolato su " #~ "\"custom\", quest'impostazione verrà ignorata." #~ msgid "Show the month and date in the indicator" #~ msgstr "Mostra mese e data nell'indicatore" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Mostra il mese e la data nel pannello assieme ad ora e/o giorno della " #~ "settimana, a seconda delle impostazioni. Se il valore time-format è " #~ "regolato su \"custom\", quest'impostazione verrà ignorata." #~ msgid "Show the year in the indicator" #~ msgstr "Mostra l'anno nell'indicatore" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Mostra l'anno nel pannello assieme a mese e/o data, a seconda delle " #~ "impostazioni. Se il valore time-format è regolato su \"custom\", o show-" #~ "data su \"false\", quest'impostazione verrà ignorata." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Mostra il calendario mensile nell'indicatore" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Mostra il calendario mensile nel menù di indicator-datetime." #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Mostra i numeri delle settimane nel calendario mensile all'interno del " #~ "menù di indicator-datetime." #~ msgid "Show events in the indicator" #~ msgstr "Mostra eventi nell'indicatore" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "" #~ "Mostra gli eventi provenienti da Evolution nel menù di indicator-datetime." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Mostra la posizione rilevata automaticamente nell'indicatore" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Mostra la tua posizione corrente (determinata da geoclue e /etc/timezone) " #~ "nel menu indicator-datetime." #~ msgid "Show locations in the indicator" #~ msgstr "Mostra posizioni nell'indicatore" #~ msgid "Error getting time" #~ msgstr "Errore nell'acquisizione dell'orario" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d PM" #~ msgid "Open Calendar" #~ msgstr "Apri calendario" ayatana-indicator-datetime-25.4.0/po/ja.po0000644000000000000000000000763014773244555015250 0ustar # Japanese translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2024-08-14 08:09+0000\n" "Last-Translator: umesaburo sagawa \n" "Language-Team: Japanese \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.7-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%Y年%m月%d日 (%A)" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "イベントを追加…" #: src/menu.cpp:448 msgid "Clock" msgstr "時計" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "時間と日付の設定…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "日時" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "時刻と日付" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (アラームあり)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a %H:%M" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "アラーム %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "了解" #: src/snap.cpp:169 msgid "Snooze" msgstr "スヌーズ" #~ msgid "The calendar's default sound file." #~ msgstr "カレンダーのデフォルトのサウンドファイル." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "カレンダーやリマインダーイベントが独自のサウンドファイルを指定していない場" #~ "合、このファイルがフォールバックサウンドとして使用されます." #~ msgid "%l:%M:%S %p" #~ msgstr "%H:%M:%S" #~ msgid "%l:%M %p" #~ msgstr "%H:%M" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%Y年%m月%d日 (%a)" #~ msgid "%a %b %e" #~ msgstr "%m月%d日 (%a)" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%Y年%m月%d日" #~ msgid "%b %e" #~ msgstr "%m月%d日" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "今日" #~ msgid "Tomorrow" #~ msgstr "明日" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%m月%d日 (%a)" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "明日 %H:%M" #~ msgid "%a %l:%M %p" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%m月%d日 (%a) %H:%M" #~ msgid "Tomorrow %H:%M" #~ msgstr "明日 %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%m月%d日 (%a) %H:%M" #~ msgid "Error getting time" #~ msgstr "時刻を取得できません" #~ msgid "%d%d:%d%d AM" #~ msgstr "午前 %d%d:%d%d" #~ msgid "%d%d:%d%d PM" #~ msgstr "午後 %d%d:%d%d" #~ msgid "Open Calendar" #~ msgstr "カレンダーを開く" ayatana-indicator-datetime-25.4.0/po/ka.po0000644000000000000000000000517114773244555015247 0ustar # Georgian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2025-02-17 04:59+0000\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.10\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "მოვლენის დამატება…" #: src/menu.cpp:448 msgid "Clock" msgstr "საათი" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "დროისა და თარიღის მორგება…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "თარიღი და დრო" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "დროისა და თარიღის მორგება, სწრაფი წვდომა კალენდართან" #: src/menu.cpp:613 msgid "Time and Date" msgstr "დრო და თარიღი" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (აქვს განგაშები)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "განგაში %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "მოვლენა %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "დიახ" #: src/snap.cpp:169 msgid "Snooze" msgstr "დროებით დადუმება" ayatana-indicator-datetime-25.4.0/po/kk.po0000644000000000000000000000365114773244555015262 0ustar # Kazakh translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: kk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/kl.po0000644000000000000000000000365614773244555015270 0ustar # Kalaallisut translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: kl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/km.po0000644000000000000000000000366014773244555015264 0ustar # Central Khmer translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: km\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/kmr.po0000644000000000000000000000363614773244555015451 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: kmr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/kn.po0000644000000000000000000000365214773244555015266 0ustar # Kannada translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: kn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ko.po0000644000000000000000000000747014773244555015271 0ustar # Korean translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2022-09-30 18:15+0000\n" "Last-Translator: 이정희 \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.14.1\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "이벤트 추가…" #: src/menu.cpp:448 msgid "Clock" msgstr "시계" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "시간 및 날짜 설정…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "날짜 및 시간" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "시간 및 날짜 설정, 빠른 달력 액세스" #: src/menu.cpp:613 msgid "Time and Date" msgstr "시간 및 날짜" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (알람 있음)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "알람 %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "이벤트 %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "확인" #: src/snap.cpp:169 msgid "Snooze" msgstr "졸기" #~ msgid "The calendar's default sound file." #~ msgstr "일정관리의 기본 사운드 파일입니다." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "일정관리 또는 미리 알림 이벤트가 자체 사운드 파일을 지정하지 않으면 이 파" #~ "일이 대체 사운드로 사용됩니다." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %b %e %Y" #~ msgid "%a %b %e" #~ msgstr "%a %b %e" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%b %e %Y" #~ msgid "%b %e" #~ msgstr "%b %e" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "오늘" #~ msgid "Tomorrow" #~ msgstr "내일" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "내일 %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "내일 %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" #~ msgid "Error getting time" #~ msgstr "시간 가져오기 오류" #~ msgid "%d%d:%d%d AM" #~ msgstr "오전 %d%d:%d%d" #~ msgid "%d%d:%d%d PM" #~ msgstr "오후 %d%d:%d%d" #~ msgid "Open Calendar" #~ msgstr "일정 열기" ayatana-indicator-datetime-25.4.0/po/ku.po0000644000000000000000000000365214773244555015275 0ustar # Kurdish translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ku\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/kw.po0000644000000000000000000000365214773244555015277 0ustar # Cornish translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: kw\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ky.po0000644000000000000000000000365214773244555015301 0ustar # Kirghiz translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ky\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/la.po0000644000000000000000000000365014773244555015250 0ustar # Latin translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: la\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/lb.po0000644000000000000000000000366014773244555015252 0ustar # Letzeburgesch translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: lb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/LINGUAS0000644000000000000000000000072414773244555015340 0ustar af am an ar ast az bem be bg bn bo br bs ca ca@valencia ce ckb co crh cs cv cy da de el en_AU en_CA en_GB eo es et eu fa fil fi fo fr_CA fr frp fy ga gd gl gu he hi hr ht hu hy ia id is it ja ka kk kl km kn ko ku kw ky la lb lo lt lv mg mhr mi ml mr ms my nb ne nl nn oc os pa pl ps pt_BR pt ro ru sa sc sd se shn si sk sl sq sr sv sw szl ta te tg th ti tr ug uk ur uz vi wae zh_CN zh_HK zh_TW ny aa as wo gv fur it_CARES dv mk vec csb tt ta_LK zh_LATN@pinyin kmr sdh ayatana-indicator-datetime-25.4.0/po/lo.po0000644000000000000000000000365214773244555015270 0ustar # Laotian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: lo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/lt.po0000644000000000000000000002713214773244555015274 0ustar # Lithuanian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2022-10-18 19:03+0000\n" "Last-Translator: Gediminas Murauskas \n" "Language-Team: Lithuanian \n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 1 && (n % 100 < 11 || n % 100 > " "19)) ? 0 : ((n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) ? " "1 : 2);\n" "X-Generator: Weblate 4.15-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%Y %B %e, %A" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Pridėti įvykį…" #: src/menu.cpp:448 msgid "Clock" msgstr "Laikrodis" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Laiko ir datos nustatymai…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Data ir laikas" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Laiko ir datos nustatymai, greita prieiga prie kalendoriaus" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Laikas ir data" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (yra signalų)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Signalas %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Įvykis %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Gerai" #: src/snap.cpp:169 msgid "Snooze" msgstr "Snūstelėti" #~ msgid "The calendar's default sound file." #~ msgstr "Kalendoriaus numatytasis garso failas." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Jeigu kalendorius ar priminimo įvykis nenurodo savo asmeninio garso " #~ "failo, tuomet šis failas bus naudojamas kaip atsarginis garsas." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%Y %b %e, %a" #~ msgid "%a %b %e" #~ msgstr "%b %e, %a" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%Y %b %e" #~ msgid "%b %e" #~ msgstr "%b %e" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Šiandien" #~ msgid "Tomorrow" #~ msgstr "Rytoj" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%b %d, %a" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Rytoj %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%b %d, %a %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Rytoj %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%b %d, %a %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Rodyti skydelyje laikrodį" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Valdo ar laikrodžio indikatorius pasirodys skydelyje ar ne." #~ msgid "What the time format should be" #~ msgstr "Koks turėtų būti laiko formatas" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Valdo laiko formatą, kuris yra rodomas indikatoriuje. Beveik visiems " #~ "naudotojams tai turėtų būti numatytasis jų lokalės formatas. Jei " #~ "galvojate, kad šis nustatymas jūsų lokalei yra neteisingas, tuomet " #~ "prisijunkite ar susisiekite su savo kalbos vertimo komanda. Jei, tiesiog, " #~ "norite kažkokio kitokio formato, galite jį reguliuoti į 12 arba 24 " #~ "valandų laiką. Arba galite naudoti pasirinktinio formato eilutę ir " #~ "nusistatyti custom-time-format nustatymą." #~ msgid "The format string passed to strftime" #~ msgstr "Formato eilutė, perduodama į strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Laiko ir/ar datos formatas, kuris yra matomas skydelyje, naudojant " #~ "indikatorių. Daugumai naudotojų tai bus iš anksto nustatytų reikšmių " #~ "rinkinys, apibrėžtas konfigūracijos paslaugų programos, tačiau patyrę " #~ "naudotojai gali tai pakeisti į bet ką, ką gali priimti strftime. " #~ "Išsamesnei informacijai, žiūrėkite strftime žinyno puslapius." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Rodyti indikatoriuje sekundžių skaičių" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Padaro taip, kad datos ir laiko indikatorius rodytų sekundžių skaičių. " #~ "Svarbu pastebėti, kad tai sukels papildomą baterijos iškrovimą, nes " #~ "laikas bus atnaujinamas 60 kartų dažniau, taigi, tai nėra rekomenduojama. " #~ "Taip pat šio nustatymo bus nepaisoma, jei laiko formatas yra nustatytas į " #~ "pasirinktinį." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Rodyti indikatoriuje savaitės dieną" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Priklausomai nuo nustatymų, skydelyje šalia laiko ir/ar datos įterpia " #~ "savaitės dieną. Šio nustatymo bus nepaisoma, jei laiko formatas yra " #~ "nustatytas į pasirinktinį." #~ msgid "Show the month and date in the indicator" #~ msgstr "Rodyti indikatoriuje mėnesį ir datą" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Priklausomai nuo nustatymų, skydelyje šalia laiko ir/ar savaitės dienos " #~ "įterpia mėnesį ir datą. Šio nustatymo bus nepaisoma, jei laiko formatas " #~ "yra nustatytas į pasirinktinį." #~ msgid "Show the year in the indicator" #~ msgstr "Rodyti indikatoriuje metus" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Skydelyje šalia mėnesio ir datos įterpia metus. Šio nustatymo bus " #~ "nepaisoma, jei laiko formatas yra nustatytas į pasirinktinį, arba jei " #~ "show-date yra nustatyta į neteisingą." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Rodyti indikatoriuje mėnesio kalendorių" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Įterpia į datos ir laiko indikatoriaus meniu mėnesio kalendorių." #~ msgid "Show week numbers in calendar" #~ msgstr "Rodyti kalendoriuje savaičių numerius" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Rodo mėnesio kalendoriuje, datos ir laiko indikatoriaus meniu, savaičių " #~ "numerius." #~ msgid "Show events in the indicator" #~ msgstr "Rodyti indikatoriuje įvykius" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Rodo datos ir laiko indikatoriaus meniu įvykius iš Evolution." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Rodyti indikatoriuje automatiškai aptiktą vietą" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Rodo datos ir laiko indikatoriaus meniu jūsų esamą vietą (nustatytą iš " #~ "geoclue ir /etc/timezone)." #~ msgid "Show locations in the indicator" #~ msgstr "Rodyti indikatoriuje vietas" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "" #~ "Rodo datos ir laiko indikatoriaus meniu tinkintas apibrėžtas vietas." #~ msgid "A List of locations" #~ msgstr "Vietų sąrašas" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Prideda ir rodo naudotojo sukonfigūruotą vietų sąrašą į datos ir laiko " #~ "indikatoriaus meniu." #~ msgid "The name of the current timezone" #~ msgstr "Dabartinės laiko juostos pavadinimas" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Kai kurios laiko juostos gali būti žinomos pagal daugelį įvairių miestų " #~ "ar pavadinimų. Šis nustatymas aprašo, kaip dabartinė laiko juosta " #~ "pageidauja būti pavadinta. Formatas yra toks: \"LAIKO_JUOSTA " #~ "PAVADINIMAS\" (pvz., \"Europe/Vilnius Alytus\" pavadins laiko juosta " #~ "\"Vilnius\" kaip \"Alytus\")." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "Kokį kontaktinį grįžtamąjį ryšį sukelti su signalu." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Kokį kontaktinį grįžtamąjį ryšį sukelti su signalu. Šiuo metu yra " #~ "palaikomos dvi veiksenos: \"pulse\", \"none\"." #~ msgid "The alarm's default volume level." #~ msgstr "Signalo numatytasis garsio lygis." #~ msgid "The volume at which alarms will be played." #~ msgstr "Garsis, kuriuo bus atkuriamas signalas." #~ msgid "The alarm's duration." #~ msgstr "Signalo trukmė." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Kiek laiko bus cikliškai grojamas signalo garsas, jeigu naudotojas " #~ "neatmes signalo sprendimo." #~ msgid "The snooze duration." #~ msgstr "Snūstelėjimo trukmė." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "" #~ "Kiek laiko laukti po to, kai naudotojas spustelėjo mygtuką \"Snūstelėti\"." ayatana-indicator-datetime-25.4.0/po/lv.po0000644000000000000000000000377714773244555015307 0ustar # Latvian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/mg.po0000644000000000000000000000423514773244555015257 0ustar # Malagasy translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2020-04-20 22:11+0000\n" "Last-Translator: HuNteR GaMinG \n" "Language-Team: Malagasy \n" "Language: mg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.0.2-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "The calendar's default sound file." #~ msgstr "Pubg uc" ayatana-indicator-datetime-25.4.0/po/mhr.po0000644000000000000000000000366014773244555015443 0ustar # Language mhr translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: mhr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/mi.po0000644000000000000000000000365014773244555015261 0ustar # Maori translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: mi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/mk.po0000644000000000000000000000436414773244555015266 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2021-11-04 17:36+0000\n" "Last-Translator: ElectrifiedSpeed \n" "Language-Team: Macedonian \n" "Language: mk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n" "X-Generator: Weblate 4.9-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "The calendar's default sound file." #~ msgstr "Стандардната звучна датотека на календарот." ayatana-indicator-datetime-25.4.0/po/ml.po0000644000000000000000000000365414773244555015270 0ustar # Malayalam translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ml\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/mr.po0000644000000000000000000000365214773244555015274 0ustar # Marathi translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: mr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ms.po0000644000000000000000000000365014773244555015273 0ustar # Malay translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ms\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/my.po0000644000000000000000000000365214773244555015303 0ustar # Burmese translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: my\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/nb.po0000644000000000000000000002644014773244555015255 0ustar # Norwegian Bokmal translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2020-09-01 21:36+0000\n" "Last-Translator: klausade \n" "Language-Team: Norwegian Bokmål \n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.2.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Legg til hendelse…" #: src/menu.cpp:448 msgid "Clock" msgstr "Klokke" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Tids- og dato-innstillinger…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Dato og tid" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Angi dato og klokkeslett" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (har alarmer)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 #, fuzzy msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 #, fuzzy msgid "%a, %H:%M" msgstr "%a. %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Slumre" #, fuzzy #~ msgid "The calendar's default sound file." #~ msgstr "Forvalgt lydfil for alarm." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "Hvis en alarm ikke har egen lyd angitt, vil denne fila bli brukt." #, fuzzy #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #, fuzzy #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e.%b %Y" #~ msgid "%b %e" #~ msgstr "%e. %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "I dag" #~ msgid "Tomorrow" #~ msgstr "I morgen" #, fuzzy, c-format #~ msgid "%A" #~ msgstr "%A" #, fuzzy #~ msgid "%a %d %b" #~ msgstr "%a. %d %b." #, fuzzy #~ msgid "Tomorrow %l:%M %p" #~ msgstr "I morgen %l:%M %p" #, fuzzy #~ msgid "%a %l:%M %p" #~ msgstr "%a. %l:%M %p" #, fuzzy #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a. %b %d. %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "I morgen %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a. %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a. %d. %b %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Vis klokken i panelet" #, fuzzy #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Hvorvidt klokken skal vises i panelet." #~ msgid "What the time format should be" #~ msgstr "Hva tidsformatet skal være" #, fuzzy #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Kontrollerer tidsformatet som vises i indikatoren. For nesten alle " #~ "brukere vil dette være forvalget for deres lokale. Hvis synes " #~ "innstillingen er gal for ditt lokale, ta del i, eller snakk til " #~ "oversettelseslaget for ditt språk. Hvis du ønsker noe annet kan du " #~ "justere dette til å være enten 12 eller 24-timers klokke. Eller, du kan " #~ "bruke en egendefinert streng og sette custom-time-format -innstillingen." #~ msgid "The format string passed to strftime" #~ msgstr "Formatstrengen som blir sendt til strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Tid og/eller dato-formatet synlig i panelet når indikatoren brukes. For " #~ "de fleste brukere er dette et knippe forhåndsdefinerte verdier bestemt av " #~ "oppsettsverktøyet, men avanserte brukere kan bruke det til å endre alt " #~ "strftime godtar. Sjekk man-siden for strftime for mer informasjon." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Vis antall sekunder i indikatoren" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Får datotidsindikatoren til å vise antall sekunder i indikatoren. Det er " #~ "viktig å mrke seg at dette vil føre til mindre batteritid, siden tiden " #~ "vil oppdatere seg 60 ganger så ofte, så det anbefales ikke. Denne " #~ "innstillingen vil ignoreres hvis tidsformatsverdien er satt til " #~ "egendefinert." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Vis ukedagen i indikatoren" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Putter ukedagen på panelet, sammen med tid og/eller dato, avhengig av " #~ "innstillinger. Denne innstillingen vil ses bort fra hvis " #~ "tidsformatsverdien er satt til egendefinert." #~ msgid "Show the month and date in the indicator" #~ msgstr "Vis måned og dato i indikatoren" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Putter måneden og datoen i panelet, sammen med tid og/eller ukedagen, " #~ "avhengig av innstillingene. Denne innstillingene ses bor fra hvis " #~ "tidsformatverdien er satt til egendefinert." #~ msgid "Show the year in the indicator" #~ msgstr "Vis året i indikatoren" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Putter året i panelet, sammen med måned og dato. Denne innstillingene ses " #~ "bort fra hvis tidsformatverdien er satt til egendefinert." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Vis månedlig kalender i indikatoren" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Putter månedlig kalender i indikatorens datotidsmeny." #~ msgid "Show week numbers in calendar" #~ msgstr "Viser ukenummer i kalender" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Viser ukenummer i i den månedlige kalenderen i indikatorens datotidsmeny." #~ msgid "Show events in the indicator" #~ msgstr "Vis hendelser i indikatoren" #, fuzzy #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Viser hendelser fra Evolution i indikatorens datotidsmeny." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Vis automatisk oppdaget plassering i indikatoren" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Viser din nåværende plassering (bestemt av geoclue og /etc/timezone) i " #~ "indikatorens datotidsmeny." #~ msgid "Show locations in the indicator" #~ msgstr "Viser plasseringer i indikatoren" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "Viser egendefinerte plasseringer i indikatorens datotidsmeny." #, fuzzy #~ msgid "A List of locations" #~ msgstr "En liste over plasseringer" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Legger til en liste over plasseringen brukeren har satt opp til visning i " #~ "indikatorens datotidsmeny." #, fuzzy #~ msgid "The name of the current timezone" #~ msgstr "Navnet på gjeldende tidssone" #, fuzzy #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Noen tidssoner kan utredes av mange forskjellige byer eller navn. Denne " #~ "innstillingen beskriver foretrukket navn på nåværende sone. Formatet er " #~ "\"TIDSSONE NAVN\" (f.eks. \"Europa/Sør_Trøndelag Trondheim\" for å navngi " #~ "Sør_Trøndelag sonen Trondheim)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "" #~ "Hva slags fysisk tilbakemelding, hvis noen, skal utløses sammen med en " #~ "alarm." #, fuzzy #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Hva slags fysisk tilbakemelding, hvis noen, skal utløses sammen med en " #~ "alarm. To modus støttes: \"pulserende\", \"ingen" #~ msgid "The alarm's default volume level." #~ msgstr "Alarmens forvalgte lydnivå." #~ msgid "The volume at which alarms will be played." #~ msgstr "Lydstyrken for alarmen." #~ msgid "The alarm's duration." #~ msgstr "Alarmens varighet." #, fuzzy #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Hvor lenge alarmens lyd vil gå i reprise, hvis dens snap-handling ikke " #~ "avbrytes av brukeren." #~ msgid "The snooze duration." #~ msgstr "Slumringsvarighet." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "Ventetid før brukeren trykker på slumreknappen." #~ msgid "Error getting time" #~ msgstr "Feil under henting av klokkeslett" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d PM" #~ msgid "Open Calendar" #~ msgstr "Åpne kalender" ayatana-indicator-datetime-25.4.0/po/ne.po0000644000000000000000000000365114773244555015257 0ustar # Nepali translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ne\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/nl.po0000644000000000000000000002707014773244555015267 0ustar # Dutch translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2023-03-17 11:37+0000\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.16.2-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%a %e %b %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Afspraak toevoegen…" #: src/menu.cpp:448 msgid "Clock" msgstr "Klok" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Datum- en tijdinstellingen…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Datum en tijd" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Datum- en tijdinstellingen, snelle agendatoegang" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Datum en tijd" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (bevat wekkers)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Wekker %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Afspraak %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Oké" #: src/snap.cpp:169 msgid "Snooze" msgstr "Uitstellen" #~ msgid "The calendar's default sound file." #~ msgstr "Het standaard geluidsbestand van de agenda." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Als een agenda of herinnering geen eigen geluidsbestand heeft, dan wordt " #~ "dit bestand gebruikt om op terug te vallen." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %b %e %Y" #~ msgid "%a %b %e" #~ msgstr "%a %b %e" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%b %e %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Vandaag" #~ msgid "Tomorrow" #~ msgstr "Morgen" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Morgen %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Morgen %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Tonen klok in paneel" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Of de klokindicator moet worden weergegeven op het paneel." #~ msgid "What the time format should be" #~ msgstr "Wat de tijdopmaak moet zijn" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Beheert hoe de tijdopmaak moet zijn op de indicator. Voor de nagenoeg " #~ "alle gebruikers moet dit gelijk zijn aan de standaard van hun taal. Als u " #~ "vermoedt dat de instelling onjuist is voor uw taal, wordt dan lid van het " #~ "vertaalteam van uw taal of neem contact op met het team. Als u simpelweg " #~ "iets anders wilt, dan kunt u kiezen tussen 12- en 24-uurstijd. Of u kunt " #~ "een aangepaste opmaak opgeven en de instelling custom-time-format " #~ "gebruiken." #~ msgid "The format string passed to strftime" #~ msgstr "De opmaak die wordt doorgegeven aan strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "De opmaak van de tijd en/of datum die zichtbaar is op het paneel als de " #~ "indicator in gebruik is. Voor de meeste gebruikers is dit een verzameling " #~ "van vooringestelde waarden, zoals ondervonden door het " #~ "configuratiehulpmiddel. Gevorderde gebruikers kunnen dit wijzigen naar " #~ "alles dat strftime kan accepteren. Bekijk de man-pagina van strftime voor " #~ "meer informatie." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Het aantal seconden weergeven op de indicator" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Zorgt ervoor dat het aantal seconden wordt weergegeven op de indicator. " #~ "Belangrijk: dit kan zorgen voor extra batterijgebruik omdat de tijd 60 " #~ "keer sneller wordt bijgewerkt. Deze instelling wordt afgeraden. Deze " #~ "instelling wordt tevens genegeerd als de waarde time-format is ingesteld " #~ "op aangepast." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Weekdag weergeven op de indicator" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Plaatst de weekdag op het paneel, tegelijk met de tijd en/of datum " #~ "(afhankelijk van uw instellingen). Deze instelling wordt genegeerd als de " #~ "waarde time-format is ingesteld op aangepast." #~ msgid "Show the month and date in the indicator" #~ msgstr "Maand en datum weergeven op de indicator" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Plaatst de maand en datum op het paneel, tegelijk met de tijd en/of " #~ "weekdag (afhankelijk van uw instellingen). Deze instelling wordt " #~ "genegeerd als de waarde time-format is ingesteld op aangepast." #~ msgid "Show the year in the indicator" #~ msgstr "Jaar weergeven op de indicator" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Plaatst het jaar op het paneel, tegelijk met de maand en datum " #~ "(afhankelijk van uw instellingen). Deze instelling wordt genegeerd als de " #~ "waarde show-format is ingesteld op false." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Maandkalender weergeven in de indicator" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Plaatst een maandkalender in het menu van de indicator." #~ msgid "Show week numbers in calendar" #~ msgstr "Weeknummers weergeven in de kalender" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Toont de weeknummers in de maandkalender in het menu van de indicator." #~ msgid "Show events in the indicator" #~ msgstr "Gebeurtenissen weergeven in de indicator" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Toont gebeurtenissen uit Evolution in het menu van de indicator." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Toont de automatisch gedetecteerde locatie in de indicator" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Toont uw huidige locatie (zoals opgevraagd door geoclue en /etc/timezone) " #~ "in het menu van de indicator." #~ msgid "Show locations in the indicator" #~ msgstr "Locaties weergeven in de indicator" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "Aangepaste locaties weergeven in het menu van de indicator." #~ msgid "A List of locations" #~ msgstr "Een lijst met locaties" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Voegt een lijst toe met door de gebruiker opgegeven locaties in het menu " #~ "van de indicator." #~ msgid "The name of the current timezone" #~ msgstr "De naam van de huidige tijdzone" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Sommige tijdzones kunnen meerdere namen of steden bevatten. Deze " #~ "instelling omschrijft de voorkeursnaam van de huidige tijdzone. De opmaak " #~ "is \"TIJDZONE NAAM\" (bijv. \"America/New_York Boston\" om de tijdzone " #~ "van Boston New York te noemen)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "Welk soort feedback er moet worden gegeven bij een alarm." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Welk soort feedback er moet worden gegeven bij een alarm. Momenteel " #~ "worden twee modi ondersteund: 'pulseren', 'geen'." #~ msgid "The alarm's default volume level." #~ msgstr "Het standaard volumeniveau van het alarm." #~ msgid "The volume at which alarms will be played." #~ msgstr "Het volume waarop alarmen moeten worden afgespeeld." #~ msgid "The alarm's duration." #~ msgstr "De alarmduur." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Hoe lang het geluid van het alarm moet worden herhaald als de spontane " #~ "actie niet wordt verworpen door de gebruiker." #~ msgid "The snooze duration." #~ msgstr "De uitstelduur." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "" #~ "Hoe lang er moet worden gewacht nadat de gebruiker heeft gedrukt op de " #~ "knop Uitstellen." #~ msgid "Error getting time" #~ msgstr "Fout bij lezen van tijd" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d%d%d VM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d%d%d NM" #~ msgid "Open Calendar" #~ msgstr "Kalender openen" ayatana-indicator-datetime-25.4.0/po/nn.po0000644000000000000000000000374314773244555015272 0ustar # Norwegian Nynorsk translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: nn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ny.po0000644000000000000000000000363514773244555015305 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ny\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/oc.po0000644000000000000000000000707114773244555015256 0ustar # Occitan translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2025-02-02 05:33+0000\n" "Last-Translator: Quentin PAGÈS \n" "Language-Team: Occitan \n" "Language: oc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.10-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A %e %B de %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Ajustar un eveniment…" #: src/menu.cpp:448 msgid "Clock" msgstr "Relòtge" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Paramètres de data e d'ora…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Data e ora" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Paramètres d’ora e de data, accès rapid al calendièr" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Data e ora" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (a alarmas)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a %H:%M" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarma %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Eveniment %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "D’acòrdi" #: src/snap.cpp:169 msgid "Snooze" msgstr "Repetir" #~ msgid "The calendar's default sound file." #~ msgstr "Fichièr son per defaut del calendièr." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Se un calendièr o un recòrd d’eveniment especifica pas son pròpri fichièr " #~ "son, aqueste fichièr serà utilizat a la plaça." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%H:%M" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Uèi" #~ msgid "Tomorrow" #~ msgstr "Deman" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Deman %H:%M" #~ msgid "%a %l:%M %p" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %H:%M" #~ msgid "Tomorrow %H:%M" #~ msgstr "Deman %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" ayatana-indicator-datetime-25.4.0/po/os.po0000644000000000000000000000365314773244555015300 0ustar # Ossetian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: os\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/pa.po0000644000000000000000000000365214773244555015256 0ustar # Punjabi translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: pa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/pl.po0000644000000000000000000002753614773244555015300 0ustar # Polish translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2023-07-31 16:06+0000\n" "Last-Translator: Eryk Michalak \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 5.0-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Dodaj wydarzenie…" #: src/menu.cpp:448 msgid "Clock" msgstr "Zegar" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Ustawienia czasu i daty…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Data i godzina" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Ustawienia godziny i daty, szybki dostęp do kalendarza" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Data i godzina" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (ma alarmy)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Wydarzenie %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Drzemka" #~ msgid "The calendar's default sound file." #~ msgstr "Domyślny plik dźwiękowy powiadomienia kalendarza." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Jeśli powiadomienie kalendarza lub przypomnienia nie określa własnego " #~ "pliku dźwiękowego, plik ten będzie używany jako dźwięk zastępczy." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%G:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %b %e %Y" #~ msgid "%a %b %e" #~ msgstr "%a %b %e" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%b %e %Y" #~ msgid "%b %e" #~ msgstr "%b %e" #~ msgid "%Y" #~ msgstr "%R" #~ msgid "Today" #~ msgstr "Dzisiaj" #~ msgid "Tomorrow" #~ msgstr "Jutro" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Jutro %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Jutro %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Pokaż zegar w panelu" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Określa, czy wskaźnik zegarowy pojawia się w panelu, czy nie." #~ msgid "What the time format should be" #~ msgstr "Jaki powinien być format czasu" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Steruje formatem czasu wyświetlanym na wskaźniku. Dla prawie wszystkich " #~ "użytkowników powinno to być domyślne dla ich ustawień narodowych. Jeśli " #~ "uważasz, że ustawienie jest nieprawidłowe w Twoim regionie, dołącz do " #~ "zespołu tłumaczy lub porozmawiaj z nim w sprawie swojego języka. Jeśli " #~ "chcesz tylko czegoś innego, możesz to zmienić na 12 lub 24. Możesz też " #~ "użyć niestandardowego ciągu formatu i ustawić niestandardowe ustawienie " #~ "formatu czasu." #~ msgid "The format string passed to strftime" #~ msgstr "Ciąg formatu przekazany do strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Format czasu i/lub daty, który jest widoczny w panelu podczas używania " #~ "wskaźnika. Dla większości użytkowników będzie to zestaw wstępnie " #~ "zdefiniowanych wartości określonych przez narzędzie konfiguracyjne, ale " #~ "zaawansowani użytkownicy mogą go zmienić na dowolną wartość, którą " #~ "strftime może zaakceptować. Sprawdź stronę man na strftime, aby uzyskać " #~ "więcej informacji." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Pokaż liczbę sekund na wskaźniku" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Sprawia, że wskaźnik datetime pokazuje liczbę sekund na wskaźniku. Należy " #~ "pamiętać, że spowoduje to dodatkowe rozładowanie baterii, ponieważ czas " #~ "będzie aktualizowany 60 razy częściej, więc nie jest to zalecane. Ponadto " #~ "to ustawienie zostanie zignorowane, jeśli wartość formatu czasu zostanie " #~ "ustawiona jako niestandardowa." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Pokaż dzień tygodnia na wskaźniku" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Umieszcza dzień tygodnia w panelu wraz z godziną i/lub datą w zależności " #~ "od ustawień. To ustawienie zostanie zignorowane, jeśli wartość formatu " #~ "czasu zostanie ustawiona jako niestandardowa." #~ msgid "Show the month and date in the indicator" #~ msgstr "Pokaż miesiąc i datę na wskaźniku" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Umieszcza miesiąc i datę w panelu wraz z czasem i/lub dniem tygodnia w " #~ "zależności od ustawień. To ustawienie zostanie zignorowane, jeśli wartość " #~ "formatu czasu zostanie ustawiona jako niestandardowa." #~ msgid "Show the year in the indicator" #~ msgstr "Pokaż rok w wskaźniku" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Umieszcza rok w panelu wraz z miesiącem i datą. To ustawienie zostanie " #~ "zignorowane, jeśli wartość formatu czasu jest ustawiona na wartość " #~ "niestandardową lub jeśli opcja show-date ma wartość false." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Pokaż kalendarz miesięczny na wskaźniku" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Umieszcza kalendarz miesięczny w menu wskaźnika-datetime." #~ msgid "Show week numbers in calendar" #~ msgstr "Pokaż numery tygodni w kalendarzu" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Wyświetla numery tygodni w kalendarzu miesięcznym w menu wskaźnika-" #~ "datetime." #~ msgid "Show events in the indicator" #~ msgstr "Pokaż wydarzenia na wskaźniku" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Wyświetla zdarzenia z Evolution w menu wskaźnika-datetime." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Pokaż automatycznie wykrywaną lokalizację na wskaźniku" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Pokazuje twoją aktualną lokalizację (określoną z geoclue i /etc/timezone) " #~ "w menu wskaźnika-datetime." #~ msgid "Show locations in the indicator" #~ msgstr "Pokaż lokalizacje na wskaźniku" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "Pokazuje własne zdefiniowane lokalizacje w menu wskaźnika-datetime." #~ msgid "A List of locations" #~ msgstr "Lista lokalizacji" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Dodaje listę lokalizacji skonfigurowanych przez użytkownika do " #~ "wyświetlania w menu wskaźnik daty." #~ msgid "The name of the current timezone" #~ msgstr "Nazwa aktualnej strefy czasowej" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Niektóre strefy czasowe mogą być znane przez wiele różnych miast lub " #~ "nazw. To ustawienie opisuje, w jaki sposób bieżąca strefa woli być " #~ "nazwana. Format to \"TIMEZONE NAME\" (np. \"America/New_York Boston\", " #~ "aby nazwać strefę New_York w Bostonie)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "" #~ "Jaki rodzaj sprzężenia zwrotnego, jeśli w ogóle, uruchamia się z alarmem." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Jaki rodzaj sprzężenia zwrotnego, jeśli w ogóle, uruchamia się z alarmem. " #~ "Obecnie obsługiwane są dwa tryby: 'impuls', 'brak'." #~ msgid "The alarm's default volume level." #~ msgstr "Domyślny poziom głośności alarmu." #~ msgid "The volume at which alarms will be played." #~ msgstr "Głośność, z jaką będą odtwarzane alarmy." #~ msgid "The alarm's duration." #~ msgstr "Czas trwania alarmu." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Jak długo dźwięk alarmu będzie zapętlony, jeśli decyzja przyciągania nie " #~ "zostanie odrzucona przez użytkownika." #~ msgid "The snooze duration." #~ msgstr "Czas drzemki." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "Jak długo czekać, kiedy użytkownik kliknie przycisk odkładania." #~ msgid "Error getting time" #~ msgstr "Wystąpił błąd pobierania godziny" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d PM" #~ msgid "Open Calendar" #~ msgstr "Otwórz kalendarz" ayatana-indicator-datetime-25.4.0/po/POTFILES.in0000644000000000000000000000140414773244555016064 0ustar data/org.ayatana.indicator.datetime.AlarmProperties.xml data/org.ayatana.indicator.datetime.gschema.xml.in src/actions.cpp src/actions-live.cpp src/alarm-queue-simple.cpp src/appointment.cpp src/awake.cpp src/clock.cpp src/clock-live.cpp src/date-time.cpp src/engine-eds.cpp src/exporter.cpp src/formatter.cpp src/formatter-desktop.cpp src/haptic.cpp src/locations.cpp src/locations-settings.cpp src/main.cpp src/menu.cpp src/notifications.cpp src/planner-aggregate.cpp src/planner.cpp src/planner-month.cpp src/planner-range.cpp src/planner-snooze.cpp src/planner-upcoming.cpp src/settings-live.cpp src/snap.cpp src/sound.cpp src/timezone-geoclue.cpp src/timezones-live.cpp src/timezone-timedated.cpp src/wakeup-timer-mainloop.cpp src/wakeup-timer-powerd.cpp src/utils.c ayatana-indicator-datetime-25.4.0/po/ps.po0000644000000000000000000000365114773244555015277 0ustar # Pashto translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ps\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/pt_BR.po0000644000000000000000000002146014773244555015661 0ustar # Portuguese translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2024-04-11 08:01+0000\n" "Last-Translator: Wellington Terumi Uemura \n" "Language-Team: Portuguese (Brazil) \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.5-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Adicionar Evento…" #: src/menu.cpp:448 msgid "Clock" msgstr "Relógio" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Configuração de data e hora…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Dia e hora" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Configurações de hora e data, acesso rápido ao calendário" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Data e Hora" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (há alarme)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarme %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Evento %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Soneca" #~ msgid "The calendar's default sound file." #~ msgstr "Arquivo de som padrão do calendário." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Se um evento de calendário ou lembrete não especificar seu próprio " #~ "arquivo de som, este arquivo será usado como o som padrão." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Hoje" #~ msgid "Tomorrow" #~ msgstr "Amanhã" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a, %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Amanhã %H:%M" #~ msgid "%a %l:%M %p" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a, %d %b %I:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Amanhã %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a, %d %b %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Mostrar o relógio no painel" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Controlar se o indicador do relógio aparece no painel ou não." #~ msgid "What the time format should be" #~ msgstr "Qual o formato de hora deve ser" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Controla o formato de hora exibido no indicador. Para quase todos os " #~ "usuários, esse deve ser o padrão para sua localidade. Se você acha que a " #~ "configuração está errada para sua localidade, participe ou converse com a " #~ "equipe de tradução em seu idioma. Se você quer apenas algo diferente, " #~ "você pode ajustar isso para 12 ou 24 horas. Ou você pode usar uma string " #~ "de formato personalizado e definir a configuração de formato de hora " #~ "personalizada." #~ msgid "The format string passed to strftime" #~ msgstr "A string de formato passada para o strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "O formato da hora e/ou data que é visível no painel ao usar o indicador. " #~ "Para a maioria dos usuários, este será um conjunto de valores " #~ "predefinidos, conforme determinado pelo utilitário de configuração, mas " #~ "os usuários avançados podem alterá-lo para qualquer coisa que o strftime " #~ "possa aceitar. Olhe para a man page em strftime para mais informações." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Mostrar o número de segundos no indicador" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Faz o indicador datetime mostrar o número de segundos no indicador. É " #~ "importante observar que isso causará um consumo de bateria adicional, " #~ "pois o tempo será atualizado 60 vezes mais frequentemente, por isso não é " #~ "recomendado. Além disso, essa configuração será ignorada se o valor do " #~ "formato de hora estiver definido como personalizado." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Mostrar o dia da semana no indicador" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Coloca o dia da semana no painel juntamente com a hora e/ou data, " #~ "dependendo das configurações. Essa configuração será ignorada se o valor " #~ "do formato de hora estiver definido como personalizado." #~ msgid "Show the month and date in the indicator" #~ msgstr "Mostrar o mês e a data no indicador" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Coloca o mês e a data no painel junto com a hora e/ou dia da semana, " #~ "dependendo das configurações. Essa configuração será ignorada se o valor " #~ "do formato de hora estiver definido como personalizado." #~ msgid "Show the year in the indicator" #~ msgstr "Mostrar o ano no indicador" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Coloca o ano no painel junto com o mês e a data. Essa configuração será " #~ "ignorada se o valor do formato de hora for definido como personalizado ou " #~ "se data de exibição estiver definida como falsa." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Mostrar o calendário mensal no indicador" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Coloca o calendário mensal no menu indicador-datetime." #~ msgid "Show week numbers in calendar" #~ msgstr "Mostrar números da semana no calendário" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Mostra os números da semana no calendário mensal no menu do indicador-" #~ "datetime." #~ msgid "Error getting time" #~ msgstr "Erro ao obter hora" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d PM" #~ msgid "Open Calendar" #~ msgstr "Abrir o calendário" ayatana-indicator-datetime-25.4.0/po/pt.po0000644000000000000000000001451414773244555015300 0ustar # Portuguese translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2025-03-20 10:13+0000\n" "Last-Translator: Bruno Fragoso \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 5.11-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e. %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Adicionar evento…" #: src/menu.cpp:448 msgid "Clock" msgstr "Relógio" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Configurações de data e hora…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Data e Hora" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Configurações de hora e data, acesso rápido ao calendário" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Hora e Data" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (tem alarmes)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarme %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Evento %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Soneca" #~ msgid "The calendar's default sound file." #~ msgstr "O ficheiro de som predefinido do calendário." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Se um evento de calendário ou lembrete não especificar o seu próprio " #~ "ficheiro de som, este ficheiro será usado como o som de retorno." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a, %d.%m.%Y" #~ msgid "%a %b %e" #~ msgstr "%a, %d.%m." #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%d. %b %Y" #~ msgid "%b %e" #~ msgstr "%e. %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Hoje" #~ msgid "Tomorrow" #~ msgstr "Amanhã" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a, %d. %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Amanhã % l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a, %b. %d %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Amanhã %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a, %b. %d %H:%M" #~ msgid "What the time format should be" #~ msgstr "Qual deve ser o formato da hora" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Controla o formato da hora mostrado no indicador. Para quase todos os " #~ "utilizadores, isto deve ser o padrão para a sua localização. Se acha que " #~ "a configuração está errada para sua localização, participe ou converse " #~ "com a equipa de tradução do seu idioma. Se quer apenas algo diferente, " #~ "pode ajustar isto para 12 ou 24 horas. Ou pode usar uma expressão de " #~ "formato personalizado e definir a configuração de formato de hora " #~ "personalizada." #~ msgid "The format string passed to strftime" #~ msgstr "Uma expressão de formato passada para o strftime" #~ msgid "The name of the current timezone" #~ msgstr "O nome do fuso horário atual" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Alguns fusos horários podem ser conhecidos por muitas cidades ou nomes " #~ "diferentes. Esta configuração descreve como a zona atual prefere ser " #~ "nomeada. O formato é \"TIMEZONE NAME\" (por exemplo, \"America/New_York " #~ "Boston\" para nomear a zona de New_York Boston)." #~ msgid "The alarm's default volume level." #~ msgstr "O nível de volume predefinido do alarme." #~ msgid "The volume at which alarms will be played." #~ msgstr "O volume no qual os alarmes serão reproduzidos." #~ msgid "The alarm's duration." #~ msgstr "A duração do alarme." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Quanto tempo o som do alarme será transmitido em ciclo se a sua decisão " #~ "de disparo não for rejeitada pelo utilizador." #~ msgid "The snooze duration." #~ msgstr "A duração da soneca." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "Quanto tempo de espera quando o usuário atinge o botão Snooze." #~ msgid "Error getting time" #~ msgstr "Erro na obtenção das horas" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d PM" #~ msgid "Open Calendar" #~ msgstr "Abrir Calendário" ayatana-indicator-datetime-25.4.0/po/ro.po0000644000000000000000000001177014773244555015276 0ustar # Romanian translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2024-09-29 00:16+0000\n" "Last-Translator: Remus-Gabriel Chelu \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" "X-Generator: Weblate 5.8-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Adăugați un eveniment…" #: src/menu.cpp:448 msgid "Clock" msgstr "Ceas" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Configurări oră și dată…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Data și ora" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Configurări de oră și dată, acces rapid la calendar" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Ora și data" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (are alarmă)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarmă %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Eveniment %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Ok" #: src/snap.cpp:169 msgid "Snooze" msgstr "Amânare" #~ msgid "Show the clock in the panel" #~ msgstr "Arată ceasul în panoul" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Controlează dacă indicatorul de ceas apare în panou sau nu." #~ msgid "What the time format should be" #~ msgstr "Ce format de timp ar trebui să fie" #~ msgid "The format string passed to strftime" #~ msgstr "Șirul de format a trecut la strftime" #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Afișați numărul de secunde din indicator" #~ msgid "Show the day of the week in the indicator" #~ msgstr "Afișați ziua săptămânii în indicator" #~ msgid "Show the month and date in the indicator" #~ msgstr "Afișați luna și data în indicator" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Pune luna și data în panou împreună cu ora și / sau ziua săptămânii, în " #~ "funcție de setări. Această setare va fi ignorată în cazul în care " #~ "valoarea formatul orei este setată personalizat." #~ msgid "Show the year in the indicator" #~ msgstr "Afișați anul în indicator" #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Afișați calendarul lunar în indicator" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Pune calendarul lunar în meniul indicator." #~ msgid "Show week numbers in calendar" #~ msgstr "Afișați numerele săptămânii din calendar" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "Afișează numerele săptămânii din calendarul lunar în meniul dată." #~ msgid "Show events in the indicator" #~ msgstr "Afișați evenimentele în indicator" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Afișează locația dvs. curentă (determinată de geoclue și / etc / " #~ "timezone) în meniul indicator-datetime." #~ msgid "Show locations in the indicator" #~ msgstr "Afișați locațiile în indicator" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "" #~ "Afișează locații personalizate definite în meniul indicator-datetime." #~ msgid "A List of locations" #~ msgstr "O listă de locații" #~ msgid "Error getting time" #~ msgstr "Eroare la obținerea orei" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d PM" #~ msgid "Open Calendar" #~ msgstr "Deschide calendarul" ayatana-indicator-datetime-25.4.0/po/ru.po0000644000000000000000000001413514773244555015302 0ustar # Russian translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2022-09-15 22:17+0000\n" "Last-Translator: Sergii Horichenko \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.14.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Добавить событие…" #: src/menu.cpp:448 msgid "Clock" msgstr "Часы" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Настройки даты и времени…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Дата и время" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Настройки времени и даты, быстрый доступ к календарю" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Время и дата" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (есть будильник)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Будильник %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Событие %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "О.К." #: src/snap.cpp:169 msgid "Snooze" msgstr "Повторять" #~ msgid "The calendar's default sound file." #~ msgstr "Звуковой файл календаря по умолчанию." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Если в календаре или событии напоминания не указан собственный звуковой " #~ "файл, этот файл будет использоваться в качестве запасного звука." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%H:%M" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Сегодня" #~ msgid "Tomorrow" #~ msgstr "Завтра" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Завтра %H:%M" #~ msgid "%a %l:%M %p" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %b. %d %H:%M" #~ msgid "Tomorrow %H:%M" #~ msgstr "Завтра в %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %b %d %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Показывать часы в панели" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Управляет отображением индикатора часов на панели." #~ msgid "What the time format should be" #~ msgstr "Какой формат времени должен быть" #~ msgid "The format string passed to strftime" #~ msgstr "Строка формата, переданная в strftime" #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Показывать секунды в индикаторе" #~ msgid "Show the day of the week in the indicator" #~ msgstr "Показывать день недели в индикаторе" #~ msgid "Show the month and date in the indicator" #~ msgstr "Показывать месяц и дату в индикаторе" #~ msgid "Show the year in the indicator" #~ msgstr "Показывать год в индикаторе" #~ msgid "The name of the current timezone" #~ msgstr "Название текущего часового пояса" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Некоторые часовые пояса могут называться по разному в зависимости от " #~ "города или каким-либо другим названием. Данная настройка назначает " #~ "предпочтительное название часового пояса. Формат \"TIMEZONE " #~ "NAME\" (например \"America/New_York Boston\" изменит название часового " #~ "пояса на New_York zone Boston)." #~ msgid "Error getting time" #~ msgstr "Ошибка получения времени" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d PM" #~ msgid "Open Calendar" #~ msgstr "Открыть календарь" ayatana-indicator-datetime-25.4.0/po/sa.po0000644000000000000000000000365314773244555015262 0ustar # Sanskrit translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/sc.po0000644000000000000000000000630314773244555015257 0ustar # Sardinian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2020-10-27 14:36+0000\n" "Last-Translator: Adrià Martín \n" "Language-Team: Sardinian \n" "Language: sc\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.3.2-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Agiunghe un'eventu…" #: src/menu.cpp:448 msgid "Clock" msgstr "Relògiu" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Cunfiguratzione data e ora…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Data e ora" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Ora e data" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "AB" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "The calendar's default sound file." #~ msgstr "S'archìviu de sonu predefinidu de su calendàriu." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Oe" #~ msgid "Tomorrow" #~ msgstr "Cras" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Cras %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Cras %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" ayatana-indicator-datetime-25.4.0/po/sdh.po0000644000000000000000000000363614773244555015436 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sdh\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/sd.po0000644000000000000000000000365114773244555015263 0ustar # Sindhi translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sd\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/se.po0000644000000000000000000000366014773244555015264 0ustar # Northern Sami translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: se\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/shn.po0000644000000000000000000000365014773244555015444 0ustar # Shan translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: shn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/si.po0000644000000000000000000000365214773244555015271 0ustar # Sinhala translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: si\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/sk.po0000644000000000000000000000570614773244555015275 0ustar # Slovak translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2020-05-31 23:41+0000\n" "Last-Translator: Juraj Liso \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Weblate 4.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 #, fuzzy msgid "Time and Date" msgstr "Nastaviť čas a dátum..." #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "Show the clock in the panel" #~ msgstr "Zobraziť hodiny na paneli" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Určuje, či sa na paneli zobrazujú hodiny." #~ msgid "What the time format should be" #~ msgstr "Aký by mal byť formát času" #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Zobraziť počet sekúnd v indikátore" #~ msgid "Show the month and date in the indicator" #~ msgstr "Zobrazovať mesiac a dátum v indikátore" #~ msgid "Show the year in the indicator" #~ msgstr "Zobrazovať rok v indikátore" #~ msgid "Error getting time" #~ msgstr "Čas zistenia chyby" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d PM" #~ msgid "Open Calendar" #~ msgstr "Otvoriť kalendár" ayatana-indicator-datetime-25.4.0/po/sl.po0000644000000000000000000000442714773244555015275 0ustar # Slovenian translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2010-03-03 10:06-0500\n" "Last-Translator: Canonical OEM\n" "Language-Team: Slovenian\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || " "n%100==4 ? 2 : 3);\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 #, fuzzy msgid "Time and Date" msgstr "Nastavi čas in datum ..." #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "Error getting time" #~ msgstr "Napaka pri pridobivanju podatka o času" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d PM" #~ msgid "Open Calendar" #~ msgstr "Odpri koledar" ayatana-indicator-datetime-25.4.0/po/sq.po0000644000000000000000000000702014773244555015272 0ustar # Albanian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2019-10-30 16:03+0000\n" "Last-Translator: Danjela Hoxha \n" "Language-Team: Albanian \n" "Language: sq\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.10-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Shto Event…" #: src/menu.cpp:448 msgid "Clock" msgstr "Ora" #: src/menu.cpp:500 #, fuzzy msgid "Time and Date Settings…" msgstr "Parametrat e Kohës dhe Datës…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Data dhe ora" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 #, fuzzy msgid "Time and Date" msgstr "Data & Ora" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (ka alarme)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Dakord" #: src/snap.cpp:169 msgid "Snooze" msgstr "Dremit" #~ msgid "The calendar's default sound file." #~ msgstr "Skedari parazgjedhur i zërit i kalendarit." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Nëse një ngjarje kalendarike ose kujtese nuk specifikon skedarin e vet të " #~ "tingullit, ky skedar do të përdoret si tingull pasues." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %b %e %Y" #~ msgid "%a %b %e" #~ msgstr "%a %b %e" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%b %e %Y" #~ msgid "%b %e" #~ msgstr "%b %e" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Sot" #~ msgid "Tomorrow" #~ msgstr "Nesër" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Nesër %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Nesër %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" ayatana-indicator-datetime-25.4.0/po/sr.po0000644000000000000000000000444214773244555015300 0ustar # Serbian translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2010-03-03 10:06-0500\n" "Last-Translator: Canonical OEM\n" "Language-Team: Serbian\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 #, fuzzy msgid "Time and Date" msgstr "Podesi vreme i datum" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "Error getting time" #~ msgstr "Greška u prikazu vremena" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d%d%d pre podne" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d%d%d popodne" #~ msgid "Open Calendar" #~ msgstr "Otvori kalendar" ayatana-indicator-datetime-25.4.0/po/sv.po0000644000000000000000000002702714773244555015310 0ustar # Swedish translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2024-04-11 08:01+0000\n" "Last-Translator: bittin1ddc447d824349b2 \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.5-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Lägg till händelse…" #: src/menu.cpp:448 msgid "Clock" msgstr "Klocka" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Tid- & datuminställningar…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Datum och tid" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Tid- & datuminställningar, snabb kalenderåtkomst" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Tid och datum" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (har alarm)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %H:%M" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Alarm %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Evenemang %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Somna in" #~ msgid "The calendar's default sound file." #~ msgstr "Standardljudfilen för kalendern." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Om en kalender eller påminnelse inte anger sin egen ljudfil kommer denna " #~ "fil att användas som ljudet att falla tillbaka på." #~ msgid "%l:%M:%S %p" #~ msgstr "%H:%M:%S" #~ msgid "%l:%M %p" #~ msgstr "%H:%M" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Idag" #~ msgid "Tomorrow" #~ msgstr "Imorgon" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Imorgon  %H:%M" #~ msgid "%a %l:%M %p" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %H:%M" #~ msgid "Tomorrow %H:%M" #~ msgstr "Imorgon  %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Visa klockan i panelen" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Styr huruvida klockindikatorn visas i panelen eller ej." #~ msgid "What the time format should be" #~ msgstr "Vilket tidsformat som ska användas" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Styr tidsformatet som visas i indikatorn. För nästan alla användare bör " #~ "detta vara standardvärdet för deras lokal. Om du tycker att inställningen " #~ "är fel för din lokal gå med i eller prata med översättningsgruppen för " #~ "ditt språk. Om du bara vill ha något annat kan du justera detta till att " #~ "vara antingen 12- eller 24-timmarstid. Eller så kan du använda en " #~ "anpassad formatsträng och ställa in den anpassade " #~ "tidsformatsinställningen." #~ msgid "The format string passed to strftime" #~ msgstr "Formatsträngen som fungerar med strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Formatet för tiden och/eller datumet som visas i panelen när indikatorn " #~ "används. För de flesta användare kommer detta att vara en uppsättning " #~ "fördefinierade värden bestämda av konfigurationsverktyget, men avancerade " #~ "användare kan vilja ändra det till något som strftime accepterar. Titta " #~ "på manualsidan för strftime för vidare information." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Visa antalet sekunder i indikatorn" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Får datumtidsindikatorn att visa antalet sekunder i indikatorn. Det är " #~ "viktigt att notera att detta kommer att förorsaka ytterligare användning " #~ "av batteri då tiden kommer att uppdateras 60 gånger så ofta, så det " #~ "rekommenderas inte. Denna inställning kommer också att ignoreras om " #~ "tidformatsvärdet är anpassat." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Visa dagen i veckan i indikatorn" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Placerar dagen i veckan på panelen tillsammans med tid och/eller datum " #~ "beroende på inställningar. Denna inställning kommer att ignoreras om " #~ "tidformatsvärdet är anpassat." #~ msgid "Show the month and date in the indicator" #~ msgstr "Visa månad och dag i indikatorn" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Placerar månaden och dagen i panelen tillsammans med tid och/eller datum " #~ "i veckan beroende på inställningar. Denna inställning kommer att " #~ "ignoreras om tidformatsvärdet är anpassat." #~ msgid "Show the year in the indicator" #~ msgstr "Visa året i indikatorn" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Placerar året i panelen tillsammans med månaden och dagen. Denna " #~ "inställning kommer att ignoreras om antingen tidformatsvärdet är anpassat " #~ "eller om visa-datum är inställt på falskt." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Visa den månatliga kalendern i indikatorn" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Placerar den månatliga kalendern i indikatorns datumtidsmeny." #~ msgid "Show week numbers in calendar" #~ msgstr "Visa veckonummer i kalender" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Visar veckonumret i den månatliga kalendern i indikatorns datumtidsmeny." #~ msgid "Show events in the indicator" #~ msgstr "Visa händelser i indikatorn" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Visa händelser från Evolution i indikatorns datumtidsmeny." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Visa den autodetekterade platsen i indikatorn" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Visar din aktuella position (bestämd från geoclue och /etc/timezone) i " #~ "indikatorns datumtidsmeny." #~ msgid "Show locations in the indicator" #~ msgstr "Visa platser i indikatorn" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "Visar anpassade platser i indikatorns datumtidsmeny." #~ msgid "A List of locations" #~ msgstr "En lista över platser" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Lägger till listan över platser som användaren har konfigurerat att visa " #~ "i indikatorns datumtidsmeny." #~ msgid "The name of the current timezone" #~ msgstr "Namnet på den aktuella tidszonen" #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Vissa tidszoner är kända som namnet på många olika städer. Denna " #~ "inställning beskriver hur den aktuella zonen önskas namnges. Formatet är " #~ "\"TIDSZON NAMN\" (t.ex. \"America/New_York Boston\" för att namnge " #~ "New_York-zonen Boston)." #~ msgid "What kind of haptic feedback, if any, to trigger with an alarm." #~ msgstr "" #~ "Vilken typ av haptisk återkoppling, om någon, som ska utlösas med ett " #~ "alarm." #~ msgid "" #~ "What kind of haptic feedback, if any, to trigger with an alarm. Two modes " #~ "are currently supported: 'pulse', 'none'." #~ msgstr "" #~ "Vilken typ av haptisk återkoppling, om någon, som ska utlösas med ett " #~ "alarm. Två lägen stöds för närvarande: ”pulse”, ”none”." #~ msgid "The alarm's default volume level." #~ msgstr "Standardljudvolym för alarmet." #~ msgid "The volume at which alarms will be played." #~ msgstr "Volymen som alarmet kommer att spelas upp med." #~ msgid "The alarm's duration." #~ msgstr "Alarmets varaktighet." #~ msgid "" #~ "How long the alarm's sound will be looped if its snap decision is not " #~ "dismissed by the user." #~ msgstr "" #~ "Hur länge alarmets ljud kommer att repeteras om dess snabbeslut inte " #~ "avfärdas av användaren." #~ msgid "The snooze duration." #~ msgstr "Varaktighet för insomningsfunktionen." #~ msgid "How long to wait when the user hits the Snooze button." #~ msgstr "Tid att vänta när användaren trycker på insomningsknappen." #~ msgid "Error getting time" #~ msgstr "Ett fel uppstod då tid hämtades" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d FM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d EM" #~ msgid "Open Calendar" #~ msgstr "Öppna kalender" ayatana-indicator-datetime-25.4.0/po/sw.po0000644000000000000000000000365214773244555015307 0ustar # Swahili translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: sw\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/szl.po0000644000000000000000000000366014773244555015465 0ustar # Language szl translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: szl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ta_LK.po0000644000000000000000000000364014773244555015645 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ta_LK\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ta.po0000644000000000000000000001235214773244555015257 0ustar # Tamil translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2024-11-09 09:00+0000\n" "Last-Translator: தமிழ்நேரம் \n" "Language-Team: Tamil \n" "Language: ta\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.8.2\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %b %y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "நிகழ்வைச் சேர்க்கவும்…" #: src/menu.cpp:448 msgid "Clock" msgstr "கடிகை" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "நேரம் மற்றும் தேதி அமைப்புகள்…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "தேதி மற்றும் நேரம்" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "நேரம் மற்றும் தேதி அமைப்புகள், விரைவான காலண்டர் அணுகல்" #: src/menu.cpp:613 msgid "Time and Date" msgstr "நேரம் மற்றும் தேதி" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (அலாரங்கள் உள்ளன)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l: %m %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %h: %m" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "அலாரம் %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "நிகழ்வுகள்" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "சரி" #: src/snap.cpp:169 msgid "Snooze" msgstr "உறக்கநிலை" #~ msgid "Show the clock in the panel" #~ msgstr "குழுவில் கடிகாரத்தைக் காட்டு" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "கடிகார காட்டி பேனலில் உள்ளதா இல்லையா என்பதைக் கட்டுப்படுத்துகிறது." #~ msgid "What the time format should be" #~ msgstr "நேரம் வடிவம் இருக்க வேண்டும்" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "சுட்டிக்காட்டி காட்டப்படும் நேர வடிவத்தை கட்டுப்படுத்துகிறது. கிட்டத்தட்ட அனைத்து " #~ "பயனர்களுக்கும் இது அவர்களின் மொழிக்கான இயல்புநிலையாக இருக்க வேண்டும். உங்கள் மொழிக்கான " #~ "அமைப்பு தவறாக உள்ளதாக நினைத்தால் தயவுசெய்து உங்கள் மொழிக்கான மொழிபெயர்ப்பு குழுவில் " #~ "சேர் அல்லது உரையாடுங்கள். நீங்கள் வித்தியாசமாக ஏதாவது விரும்பினால், இதை 12 அல்லது 24 " #~ "முறைகளாக மாற்றலாம். அல்லது, தனிப்பயன் வடிவமைப்பு சரத்தை பயன்படுத்தலாம் மற்றும் " #~ "தனிப்பயன் நேர வடிவமைப்பு அமைப்பை அமைக்கலாம்." #~ msgid "The format string passed to strftime" #~ msgstr "வடிவமைப்பு சரம் strftime சென்றது" #~ msgid "Show the number of seconds in the indicator" #~ msgstr "" #~ "43/5000\n" #~ "காட்டி எண்ணிக்கை விநாடிகள் காட்ட" ayatana-indicator-datetime-25.4.0/po/te.po0000644000000000000000000001470114773244555015263 0ustar # Telugu translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2019-08-26 04:24+0000\n" "Last-Translator: leela <53352@protonmail.com>\n" "Language-Team: Telugu \n" "Language: te\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 3.9-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "Show the clock in the panel" #~ msgstr "గడియారం వాక్యం పట్టికలో చూపించడం" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "గడియారం పట్టికలో చూపించాలా వద్దా అని అదుపు చేయడం." #~ msgid "What the time format should be" #~ msgstr "సమయ ఆకృతి ఏ విధంగా ఉండాలి?" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "సూచికలో ప్రదర్శించబడే సమయ ఆకృతిని నియంత్రిస్తుంది. దాదాపు అన్ని వినియోగదారులకు ఇది వారి లొకేల్‌కు " #~ "డిఫాల్ట్‌గా ఉండాలి. మీ లొకేల్‌కు సెట్టింగ్ తప్పు అని మీరు అనుకుంటే, దయచేసి మీ భాష కోసం అనువాద బృందంలో " #~ "చేరండి లేదా మాట్లాడండి. మీరు వేరేదాన్ని కోరుకుంటే, మీరు దీన్ని 12 లేదా 24 సమయం గా సర్దుబాటు " #~ "చేయవచ్చు. లేదా, మీరు కస్టమ్ ఫార్మాట్ స్ట్రింగ్‌ను ఉపయోగించవచ్చు మరియు కస్టమ్-టైమ్-ఫార్మాట్ సెట్టింగ్‌ను సెట్ " #~ "చేయవచ్చు." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "క్షణాల లెక్క సూచికలో చూపించంచండి" #~ msgid "Show the day of the week in the indicator" #~ msgstr "సూచికలో వారం చూపించడం" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "సెట్టింగులను బట్టి సమయం మరియు / లేదా తేదీతో పాటు వారంలోని రోజును విషయ పట్టికలో ఉంచుతుంది. సమయ-" #~ "ఆకృతి విలువ అనుకూలానికి సెట్ట్ చేయబడితే ఈ సెట్టింగ్ విస్మరించబడుతుంది." #~ msgid "Show the month and date in the indicator" #~ msgstr "నెల మరియు తేది సూచిక లో చూపించడం" #~ msgid "Show the year in the indicator" #~ msgstr "సూచిక లో సంవత్సరం చూపించడం" #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "నెల పంచాంగం సూచికలో చూపించడం" #, fuzzy #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "సూచికల- తేది సమయం యొక్క జాబితాలో పెట్టడం" #~ msgid "Show week numbers in calendar" #~ msgstr "వార-అంకెలు పంచాంగంలో చూపించడం" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "సూచిక-డేట్‌టైమ్ మెనులో నెలవారీ క్యాలెండర్‌లో వార సంఖ్యలను చూపుతుంది." #~ msgid "Show events in the indicator" #~ msgstr "సూచికలో సంఘటనలను చూపించు" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "సూచిక-తేదీసమయ జలాబితాలో పరిణామం నుండి సంఘటనలను చూపుతుంది." ayatana-indicator-datetime-25.4.0/po/tg.po0000644000000000000000000000365014773244555015266 0ustar # Tajik translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: tg\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/th.po0000644000000000000000000000437114773244555015270 0ustar # Thai translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2010-03-03 10:06-0500\n" "Last-Translator: Canonical OEM\n" "Language-Team: Thai\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 #, fuzzy msgid "Time and Date" msgstr "ตั้งเวลาและวันที่..." #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" #~ msgid "Error getting time" #~ msgstr "ข้อผิดพลาดการขอข้อมูลเวลา" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d AM" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d PM" #~ msgid "Open Calendar" #~ msgstr "เปิดปฏิทิน" ayatana-indicator-datetime-25.4.0/po/ti.po0000644000000000000000000000365314773244555015273 0ustar # Tigrinya translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ti\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/tr.po0000644000000000000000000001344614773244555015305 0ustar # Turkish translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2022-09-25 13:23+0000\n" "Last-Translator: Oğuz Ersen \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.14.1\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Etkinlik Ekle…" #: src/menu.cpp:448 msgid "Clock" msgstr "Saat" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Saat ve Tarih Ayarları…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Tarih ve Saat" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Saat ve tarih ayarları, hızlı takvim erişimi" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Saat ve Tarih" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (alarmları var)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "%s alarmı" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "%s etkinliği" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "Tamam" #: src/snap.cpp:169 msgid "Snooze" msgstr "Ertele" #~ msgid "The calendar's default sound file." #~ msgstr "Takvimin öntanımlı ses dosyası." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Bir takvim veya hatırlatma etkinliği kendi ses dosyasını belirtmezse, bu " #~ "dosya yedek ses olarak kullanılacaktır." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%e %b %Y %a" #~ msgid "%a %b %e" #~ msgstr "%e %b %a" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Bugün" #~ msgid "Tomorrow" #~ msgstr "Yarın" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%d %b %a" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Yarın %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%l:%M %b %d %a" #~ msgid "Tomorrow %H:%M" #~ msgstr "Yarın %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%d %b %a %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Panelde saati göster" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Saat gösterge panelinde görünür olup olmadığını denetler." #~ msgid "What the time format should be" #~ msgstr "Saat biçimi ne olmalıdır" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Göstergede görüntülenen saat biçimini denetler. Neredeyse tüm " #~ "kullanıcılar için bu, onların yerel ayarları için varsayılan olmalıdır. " #~ "Yerel ayarlarınızın yanlış olduğunu düşünüyorsanız, lütfen dilinize " #~ "çeviri yapan ekibe katılın veya çeviri ekibiyle görüşün. Farklı bir şey " #~ "istiyorsanız, bunu 12 veya 24 saat olacak şekilde ayarlayabilirsiniz. " #~ "Veya, özel bir biçim dizesi kullanabilir ve özel zaman biçimi ayarını " #~ "uygulayabilirsiniz." #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Göstergeyi kullanırken panelde görünen saat ve/veya tarihin biçimi. Çoğu " #~ "kullanıcı için, yapılandırma yardımcı programı tarafından belirlenen " #~ "önceden tanımlanmış değerler kümesidir, ancak ileri düzey kullanıcılar " #~ "bunu strftime'ın kabul edebileceği bir şey ile değiştirebilirler. Daha " #~ "fazla bilgi için strftime için kullanılan man sayfasına bakınız." #~ msgid "Error getting time" #~ msgstr "Saati alma hatâsı" #~ msgid "%d%d:%d%d AM" #~ msgstr "Öğleden Önce %d%d:%d%d" #~ msgid "%d%d:%d%d PM" #~ msgstr "Öğleden Sonra %d%d:%d%d" #~ msgid "Open Calendar" #~ msgstr "Takvimi Aç" ayatana-indicator-datetime-25.4.0/po/tt.po0000644000000000000000000000363514773244555015306 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: tt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/ug.po0000644000000000000000000000745614773244555015277 0ustar # Uighur translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2020-05-09 07:12+0000\n" "Last-Translator: Abdusalam <1810010207@s.upc.edu.cn>\n" "Language-Team: Uyghur \n" "Language: ug\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "پائالىيەت قوشۇش…" #: src/menu.cpp:448 msgid "Clock" msgstr "سائەت" #: src/menu.cpp:500 #, fuzzy msgid "Time and Date Settings…" msgstr "ۋاقىت ۋە چېسلا تەڭشىكى…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "چېسلا ۋە ۋاقىت" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 #, fuzzy msgid "Time and Date" msgstr "ۋاقىت ۋە چېسلا" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (ئاگاھلاندۇرۇش سىگنالى بار)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "ئاگاھلاندۇرۇش %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "ماقۇل" #: src/snap.cpp:169 msgid "Snooze" msgstr "قايتا جىرىڭلاتما" #~ msgid "The calendar's default sound file." #~ msgstr "كالېندارنىڭ سۈكۈتتىكى ئاۋاز ھۆججىتى." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "ئەگەر بىر كالېندار ياكى ئەسكەرتىش ھادىسىسى ئۆزىنىڭ ئاۋاز ھۆججىتىنى " #~ "بەلگىلىمىسە ، بۇ ھۆججەت خاتالىق ئاۋازى سۈپىتىدە ئىشلىتىلىدۇ." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a %b %e %Y" #~ msgid "%a %b %e" #~ msgstr "%a %b %e" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%b %e %Y" #~ msgid "%b %e" #~ msgstr "%b %e" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "بۈگۈن" #~ msgid "Tomorrow" #~ msgstr "ئەتە" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "ئەتە %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "ئەتە %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" ayatana-indicator-datetime-25.4.0/po/uk.po0000644000000000000000000003156314773244555015277 0ustar # Ukrainian translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2022-09-15 22:17+0000\n" "Last-Translator: Sergii Horichenko \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.14.1-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%A, %e %B %Y" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "Додати подію…" #: src/menu.cpp:448 msgid "Clock" msgstr "Годинник" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "Налаштування часу і дати…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "Дата і час" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "Налаштування часу та дати, швидкий доступ до календаря" #: src/menu.cpp:613 msgid "Time and Date" msgstr "Час і дата" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (будильник)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "Будильник %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "Подія %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "OK" #: src/snap.cpp:169 msgid "Snooze" msgstr "Відкласти" #~ msgid "The calendar's default sound file." #~ msgstr "Типовий звуковий файл для календаря." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "Якщо подія календаря або нагадування не вказує на власний звуковий файл, " #~ "в якості звуку буде використовуватися цей файл." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%H:%M" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%a, %e %b %Y" #~ msgid "%a %b %e" #~ msgstr "%a, %e %b" #, c-format #~ msgid "%a" #~ msgstr "%a" #~ msgid "%b %e %Y" #~ msgstr "%e %b %Y" #~ msgid "%b %e" #~ msgstr "%e %b" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "Сьогодні" #~ msgid "Tomorrow" #~ msgstr "Завтра" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%a %d %b" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "Завтра %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a, %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "Завтра %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%,a %d %b %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "Показати годинник на панелі" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "Контролює, чи відображається на панелі індикатор годинника чи ні." #~ msgid "What the time format should be" #~ msgstr "Який формат часу повинен бути" #~ msgid "" #~ "Controls the time format that is displayed in the indicator. For almost " #~ "all users this should be the default for their locale. If you think the " #~ "setting is wrong for your locale please join or talk to the translation " #~ "team for your language. If you just want something different you can " #~ "adjust this to be either 12 or 24 time. Or, you can use a custom format " #~ "string and set the custom-time-format setting." #~ msgstr "" #~ "Контролює формат часу, який відображається в індикаторі. Для майже всіх " #~ "користувачів це має бути за замовчуванням до їх локалізації. Якщо ви " #~ "вважаєте, що неправильне налаштування вашого мовного коду, будь ласка, " #~ "приєднайтеся до вашої мови або поговоріть з командою перекладу. Якщо ви " #~ "просто хочете чогось іншого, ви можете налаштувати час як 12 або 24. Або " #~ "ви можете використовувати спеціальну строку форматування та встановити " #~ "custom-time-format setting." #~ msgid "The format string passed to strftime" #~ msgstr "Рядок формату переданий в strftime" #~ msgid "" #~ "The format of the time and/or date that is visible on the panel when " #~ "using the indicator. For most users this will be a set of predefined " #~ "values as determined by the configuration utility, but advanced users can " #~ "change it to anything strftime can accept. Look at the man page on " #~ "strftime for more information." #~ msgstr "" #~ "Формат часу та/або дати, видимий на панелі під час використання " #~ "індикатора. Для більшості користувачів це буде набором заздалегідь " #~ "визначених значень, як це визначається утилітою конфігурації, але " #~ "досвідчені користувачі можуть змінювати його в будь-який момент, який " #~ "може прийняти strftime. Подивіться на сторінку man на strftime для " #~ "отримання додаткової інформації." #~ msgid "Show the number of seconds in the indicator" #~ msgstr "Показати кількість секунд у індикаторі" #~ msgid "" #~ "Makes the datetime indicator show the number of seconds in the indicator. " #~ "It's important to note that this will cause additional battery drain as " #~ "the time will update 60 times as often, so it is not recommended. Also, " #~ "this setting will be ignored if the time-format value is set to custom." #~ msgstr "" #~ "Робить так, що індикатор дати і часу показує кількість секунд. Важливо " #~ "відзначити, що це призведе до додаткової розрядки акумулятора, так як час " #~ "буде оновлюватися 60 разів частіше, і тому не рекомендуються. Також цей " #~ "параметр буде проігноровано, якщо значення часового формату встановлено " #~ "як користувацьке." #~ msgid "Show the day of the week in the indicator" #~ msgstr "Показати день тижня в індикаторі" #~ msgid "" #~ "Puts the day of the week on the panel along with the time and/or date " #~ "depending on settings. This setting will be ignored if the time-format " #~ "value is set to custom." #~ msgstr "" #~ "Встановлює день тижня на панелі, а також час та/або дату в залежності від " #~ "налаштувань. Цей параметр буде проігноровано, якщо значення часового " #~ "формату встановлено як користувацьке." #~ msgid "Show the month and date in the indicator" #~ msgstr "Показати місяць і дату в індикаторі" #~ msgid "" #~ "Puts the month and the date in the panel along with the time and/or day " #~ "of the week depending on settings. This setting will be ignored if the " #~ "time-format value is set to custom." #~ msgstr "" #~ "Встановлює місяць і дату в панелі, а також час та/або день тижня залежно " #~ "від налаштувань. Цей параметр буде проігноровано, якщо значення часового " #~ "формату встановлено як користувацьке." #~ msgid "Show the year in the indicator" #~ msgstr "Показати рік в індикаторі" #~ msgid "" #~ "Puts the year in the panel along with the month and the date. This " #~ "setting will be ignored if either the time-format value is set to custom " #~ "or if show-date is set to false." #~ msgstr "" #~ "Встановлює рік у панелі разом із місяцем та датою. Цей параметр буде " #~ "проігноровано, якщо значення часового формату встановлено як " #~ "користувацьке, або якщо параметр show-date встановлений на false." #~ msgid "Show the monthly calendar in the indicator" #~ msgstr "Показати щомісячний календар у індикаторі" #~ msgid "Puts the monthly calendar in indicator-datetime's menu." #~ msgstr "Вставляє місячний календар в меню індикатора дати і часу." #~ msgid "Show week numbers in calendar" #~ msgstr "Показувати номери тижнів у календарі" #~ msgid "" #~ "Shows the week numbers in the monthly calendar in indicator-datetime's " #~ "menu." #~ msgstr "" #~ "Показує номери тижнів в місячному календарі в меню індикатора дати і часу." #~ msgid "Show events in the indicator" #~ msgstr "Показувати події в індикаторі" #~ msgid "Shows events from Evolution in indicator-datetime's menu." #~ msgstr "Показує події від Evolution в меню індикатора дати і часу." #~ msgid "Show the auto-detected location in the indicator" #~ msgstr "Показувати автоматично виявлене місцеположення в індикаторі" #~ msgid "" #~ "Shows your current location (determined from geoclue and /etc/timezone) " #~ "in indicator-datetime's menu." #~ msgstr "" #~ "Показує ваше поточне місцезнаходження (визначається з geoclue і /etc/" #~ "timezone) в меню індикатора дати і часу." #~ msgid "Show locations in the indicator" #~ msgstr "Показати місцезнаходження в індикаторі" #~ msgid "Shows custom defined locations in indicator-datetime's menu." #~ msgstr "" #~ "Показує визначені користувачем місцезнаходження в меню індикатора дати і " #~ "часу." #~ msgid "A List of locations" #~ msgstr "Список місць розташування" #~ msgid "" #~ "Adds the list of locations the user has configured to display in the " #~ "indicator-datetime menu." #~ msgstr "" #~ "Додає список розташувань, які користувач налаштував для відображення в " #~ "меню індикатора дати і часу." #~ msgid "The name of the current timezone" #~ msgstr "Назва поточного часового поясу" #, fuzzy #~ msgid "" #~ "Some timezones can be known by many different cities or names. This " #~ "setting describes how the current zone prefers to be named. Format is " #~ "\"TIMEZONE NAME\" (e.g. \"America/New_York Boston\" to name the New_York " #~ "zone Boston)." #~ msgstr "" #~ "Деякі часові пояси можуть бути відомі багатьма містами або " #~ "найменуваннями. Цей параметр описує, як поточна сфера вважає за краще " #~ "назвати. Формат - 'TIMEZONE NAME' (наприклад, 'America / New_York " #~ "Boston', щоб назвати зону New_York Boston)." ayatana-indicator-datetime-25.4.0/po/ur.po0000644000000000000000000000364714773244555015310 0ustar # Urdu translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ur\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/uz.po0000644000000000000000000000365014773244555015312 0ustar # Uzbek translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: uz\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/vec.po0000644000000000000000000000363614773244555015435 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: vec\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/vi.po0000644000000000000000000000372514773244555015275 0ustar # Vietnamese translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/wae.po0000644000000000000000000000366014773244555015431 0ustar # Language wae translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: wae\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/wo.po0000644000000000000000000000363514773244555015304 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: wo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/zh_CN.po0000644000000000000000000001002514773244555015647 0ustar # Chinese translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2024-04-01 22:37+0000\n" "Last-Translator: 复予 \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.5-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%Y年 %m月 %e日 %A" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "添加事件…" #: src/menu.cpp:448 msgid "Clock" msgstr "时钟" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "时间和日期设置…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "日期和时间" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "时间与日期设置,快速访问日历" #: src/menu.cpp:613 msgid "Time and Date" msgstr "时间和日期" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s (已设置闹钟)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "%a, %l:%M %p" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "%a, %H:%M" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "闹钟 %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "事件 %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "好的" #: src/snap.cpp:169 msgid "Snooze" msgstr "稍后再响" #~ msgid "The calendar's default sound file." #~ msgstr "此日历的默认音效文件." #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "如果日历或提醒事项没有被指定使用其他音效文件, 那么此文件将会被调用(作为后" #~ "备音效文件)." #~ msgid "%l:%M:%S %p" #~ msgstr "%l:%M:%S %p" #~ msgid "%l:%M %p" #~ msgstr "%l:%M %p" #~ msgid "%H:%M:%S" #~ msgstr "%H:%M:%S" #~ msgid "%H:%M" #~ msgstr "%H:%M" #~ msgid "%a %b %e %Y" #~ msgstr "%Y年%m月%d日 周%a" #~ msgid "%a %b %e" #~ msgstr "%m月%d日 周%a\"" #, c-format #~ msgid "%a" #~ msgstr "周%a" #~ msgid "%b %e %Y" #~ msgstr "%Y年%m月%d日" #~ msgid "%b %e" #~ msgstr "%m月%d日" #~ msgid "%Y" #~ msgstr "%Y" #~ msgid "Today" #~ msgstr "今天" #~ msgid "Tomorrow" #~ msgstr "明天" #, c-format #~ msgid "%A" #~ msgstr "%A" #~ msgid "%a %d %b" #~ msgstr "%b月 %d日 周%a" #~ msgid "Tomorrow %l:%M %p" #~ msgstr "明天 %l:%M %p" #~ msgid "%a %l:%M %p" #~ msgstr "%a %l:%M %p" #~ msgid "%a %d %b %l:%M %p" #~ msgstr "%a %d %b %l:%M %p" #~ msgid "Tomorrow %H:%M" #~ msgstr "明天 %H:%M" #~ msgid "%a %H:%M" #~ msgstr "%a %H:%M" #~ msgid "%a %d %b %H:%M" #~ msgstr "%a %d %b %H:%M" #~ msgid "Show the clock in the panel" #~ msgstr "在面板中显示时钟" #~ msgid "Controls whether the clock indicator appears in the panel or not." #~ msgstr "控制时钟指示器是否出现在面板中。" #~ msgid "Error getting time" #~ msgstr "获取时间出错" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d 上午" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d 下午" #~ msgid "Open Calendar" #~ msgstr "打开日历" ayatana-indicator-datetime-25.4.0/po/zh_HK.po0000644000000000000000000000365514773244555015664 0ustar # Chinese translations for PACKAGE package. # Copyright (C) 2017 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2017. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2017-10-12 07:36+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: zh_HK\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/zh_LATN@pinyin.po0000644000000000000000000000417514773244555017445 0ustar # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2025-03-05 08:15+0000\n" "Last-Translator: Droit <3118138007@qq.com>\n" "Language-Team: Chinese (Simplified) \n" "Language: zh_LATN@pinyin\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 5.10.3-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "" #: src/menu.cpp:448 msgid "Clock" msgstr "" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "" #: src/menu.cpp:555 msgid "Date and Time" msgstr "日期和时间" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "" #: src/menu.cpp:613 msgid "Time and Date" msgstr "" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "好的" #: src/snap.cpp:169 msgid "Snooze" msgstr "" ayatana-indicator-datetime-25.4.0/po/zh_TW.po0000644000000000000000000000557614773244555015720 0ustar # Chinese translations for PACKAGE package. # Copyright (C) 2010 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Canonical OEM, 2010. # msgid "" msgstr "" "Project-Id-Version: indicator-datetime\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-10-10 23:55+0200\n" "PO-Revision-Date: 2024-10-31 03:08+0000\n" "Last-Translator: hugoalh \n" "Language-Team: Chinese (Traditional Han script) \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 5.8.2-dev\n" #. Translators, please edit/rearrange these strftime(3) tokens to suit your locale! #. Format string for the day on the first menuitem in the datetime indicator. #. This format string gives the full weekday, date, month, and year. #. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" #. en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" #: src/menu.cpp:337 msgid "%A, %e %B %Y" msgstr "%Y 年 %m 月 %e 日 %A" #. add the 'Add Event…' menuitem #: src/menu.cpp:438 msgid "Add Event…" msgstr "增加事件…" #: src/menu.cpp:448 msgid "Clock" msgstr "時鐘" #: src/menu.cpp:500 msgid "Time and Date Settings…" msgstr "時間和日期設定…" #: src/menu.cpp:555 msgid "Date and Time" msgstr "日期和時間" #: src/menu.cpp:564 msgid "Time & date settings, quick calendar access" msgstr "時間和日期設定,快速日曆存取" #: src/menu.cpp:613 msgid "Time and Date" msgstr "時間和日期" #: src/menu.cpp:618 #, c-format msgid "%s (has alarms)" msgstr "%s(有鬧鐘)" #. * strftime(3) format for abbreviated weekday, #. hours, minutes in a 12h locale; e.g. Wed, 2:00 PM #: src/snap.cpp:147 msgid "%a, %l:%M %p" msgstr "" #. * A strftime(3) format for abbreviated weekday, #. hours, minutes in a 24h locale; e.g. Wed, 14:00 #: src/snap.cpp:151 msgid "%a, %H:%M" msgstr "" #: src/snap.cpp:157 #, c-format msgid "Alarm %s" msgstr "鬧鐘 %s" #: src/snap.cpp:159 #, c-format msgid "Event %s" msgstr "事件 %s" #: src/snap.cpp:168 src/snap.cpp:172 msgid "OK" msgstr "好的" #: src/snap.cpp:169 msgid "Snooze" msgstr "延後" #~ msgid "The calendar's default sound file." #~ msgstr "日曆預設音效檔案。" #~ msgid "" #~ "If a calendar or reminder event doesn't specify its own sound file, this " #~ "file will be used as the fallback sound." #~ msgstr "" #~ "如果日曆和提醒事件沒有設定自己的音效檔案,這個檔案就會用作後備音效。" #~ msgid "Error getting time" #~ msgstr "獲得時間發生錯誤" #~ msgid "%d%d:%d%d AM" #~ msgstr "%d%d:%d%d 上午" #~ msgid "%d%d:%d%d PM" #~ msgstr "%d%d:%d%d 下午" #~ msgid "Open Calendar" #~ msgstr "開啟行事曆" ayatana-indicator-datetime-25.4.0/README0000777000000000000000000000000014773244555016026 2README.mdustar ayatana-indicator-datetime-25.4.0/README.md0000644000000000000000000001546214773244555015161 0ustar # Ayatana System Indicator — DateTime [![Build Status](https://api.travis-ci.com/AyatanaIndicators/ayatana-indicator-datetime.svg)](https://travis-ci.com/github/AyatanaIndicators/ayatana-indicator-datetime) ## About Ayatana Indicators The Ayatana Indicators project is the continuation of Application Indicators and System Indicators, two technologies developed by Canonical Ltd. for the Unity7 desktop. Application Indicators are a GTK implementation of the StatusNotifierItem Specification (SNI) that was originally submitted to freedesktop.org by KDE. System Indicators are an extensions to the Application Indicators idea. System Indicators allow for far more widgets to be displayed in the indicator's menu. The Ayatana Indicators project is the new upstream for application indicators, system indicators and associated projects with a focus on making Ayatana Indicators a desktop agnostic technology. On GNU/Linux, Ayatana Indicators are currently available for desktop envinronments like MATE (used by default in [Ubuntu MATE](https://ubuntu-mate.com)), XFCE (used by default in [Xubuntu](https://bluesabre.org/2021/02/25/xubuntu-21-04-progress-update/), LXDE, and the Budgie Desktop). The Lomiri Operating Environment (UI of the Ubuntu Touch OS, formerly known as Unity8) uses Ayatana Indicators for rendering its notification area and the [UBports](https://ubports.com) project is a core contributor to the Ayatana Indicators project. For further info, please visit: https://ayatana-indicators.org When using the -datetime Ayatana Indicator, make sure that the -datetime Ubuntu Indicator (package name: indicator-datetime) is not installed. ## The Datetime Ayatana System Indicator ### Actions * **desktop.open-settings-app**
**phone.open-settings-app** - Description: open the settings application. - State: None - Parameter: None * **desktop.open-alarm-app**
**phone.open-alarm-app** - Description: open the application for creating new alarms. - State: None - Parameter: None * **desktop.open-calendar-app**
**phone.open-calendar-app** - State: None - Parameter: int64, a time_t hinting which day/time to show in the planner, or 0 for the current day * **desktop.open-appointment**
**phone.open-appointment** - Description: opens an appointment editor to the specified appointment. - State: None - Parameter: string, an opaque uid to specify which appointment to use. This uid comes from the menuitems' target values. * **set-location** - Description: Set the current location. This will try to set the current - timezone to the new location's timezone. - State: None - Parameter: a timezone id string followed by a space and location name. - Example: **America/Chicago Oklahoma City** * **calendar** - Description: set which month/day should be given focus in the indicator's calendar. The planner will look for appointments from this day to the end of the same month. Client code implementing the calendar view should call this when the user clicks on a new day, month, or year. - State: a dictionary containing these key value/pairs: - **appointment-days**: an array of day-of-month ints. Used by the calendar menuitem to mark appointment days. - **calendar-day**: int64, a time_t. Used by the calendar menuitem to know which year/month should be visible and which day should have the cursor. - **show-week-numbers**: if true, show week numbers in the calendar. - Parameter: int64, a time_t specifying which year/month should be visible and which day should have the cursor. ### Custom Menuitems * Calendar - x-ayatana-type s "org.ayatana.indicator.calendar" * Alarm - label s short summary of the appointment - x-ayatana-type s "org.ayatana.indicator.alarm" - x-ayatana-time x the date of the appointment - x-ayatana-time-format s strftime format string * Appointment - label s short summary of the appointment - x-ayatana-type s "org.ayatana.indicator.appointment" - x-ayatana-color s color of the appt's type, to give a visual cue - x-ayatana-time x the date of the appointment - x-ayatana-time-format s strftime format string * Location - label s the location's name, eg "Oklahoma City" - x-ayatana-type s "org.ayatana.indicator.location" - x-ayatana-timezone s timezone that the location is in - x-ayatana-time-format s strftime format string ### Code #### Model The app's model is represented by the "State" class, and "Menu" objects are the corresponding views. "State" is a simple container for various properties, and menus connect to those properties' changed() signals to know when the view needs to be refreshed. As one can see in main.c, the app's very simple flow is to instantiate a state and its properties, build menus that correspond to the state, and export the menus on DBus. Because State is a simple aggregate of its components (such as a "Clock" or "Planner" object to get the current time and upcoming appointments, respectively), one can plug in live components for production and mock components for unit tests. The entire backend can be mix-and-matched by adding the desired test-or-production components. Start with:
include/datetime/state.h
include/datetime/clock.h
include/datetime/locations.h
include/datetime/planner.h
include/datetime/settings.h
include/datetime/timezones.h
Implementations:
include/datetime/settings-live.h
include/datetime/locations-settings.h
include/datetime/planner-eds.h
include/datetime/timezones-live.h
#### View Menu is a mostly-opaque class to wrap GMenu code. Its subclasses contain the per-profile logic of which sections/menuitems to show and which to hide. Menus are instantiated via the MenuFactory, which takes a state and profile. Actions is a mostly-opaque class to wrap our GActionGroup. Its subclasses contain the code that actually executed when an action is triggered (ie, LiveActions for production and MockActions for testing). Exporter exports the Actions and Menus onto the DBus, and also emits a signal if/when the busname is lost so ayatana-indicator-datetime-service knows when to exit. include/datetime/menu.h
include/datetime/actions.h
include/datetime/exporter.h
## License and Copyright See COPYING and AUTHORS file in this project. ## Building and Testing For instructions on building and running built-in tests, see the INSTALL.md file. ayatana-indicator-datetime-25.4.0/src/actions.cpp0000644000000000000000000002123014773244555016623 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include // split_settings_location() #include #include #include extern "C" { #include } namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ namespace { DateTime datetime_from_timet_variant(GVariant* v) { int64_t t = 0; if (v != nullptr) if (g_variant_type_equal(G_VARIANT_TYPE_INT64,g_variant_get_type(v))) t = g_variant_get_int64(v); if (t != 0) return DateTime::Local(t); else return DateTime::NowLocal(); } bool lookup_appointment_by_uid(const std::shared_ptr& state, const gchar* uid, Appointment& setme) { bool bRet = false; std::for_each(state->calendar_upcoming->appointments().get().begin(), state->calendar_upcoming->appointments().get().end(), [uid, &setme, &bRet](const Appointment& appt) { if (appt.uid == uid) { setme = appt; bRet = true; } }); return bRet; } void on_appointment_activated (GSimpleAction*, GVariant *vdata, gpointer gself) { auto self = static_cast(gself); Appointment appt; const gchar* uid = nullptr; gint64 time = 0; g_variant_get(vdata, "(&sx)", &uid, &time); if (lookup_appointment_by_uid(self->state(), uid, appt)) self->open_appointment(appt, DateTime::Local(time)); } void on_alarm_activated (GSimpleAction*, GVariant*, gpointer gself) { static_cast(gself)->open_alarm_app(); } void on_calendar_activated (GSimpleAction*, GVariant* vt, gpointer gself) { const auto dt = datetime_from_timet_variant(vt); static_cast(gself)->open_calendar_app(dt); } void on_settings_activated (GSimpleAction*, GVariant*, gpointer gself) { static_cast(gself)->open_settings_app(); } void on_set_location(GSimpleAction * /*action*/, GVariant * param, gpointer gself) { char * zone; char * name; split_settings_location(g_variant_get_string(param, nullptr), &zone, &name); static_cast(gself)->set_location(zone, name); g_free(name); g_free(zone); } void on_calendar_active_changed(GSimpleAction * /*action*/, GVariant * state, gpointer gself) { // reset the date when the menu is shown if (g_variant_get_boolean(state)) { auto self = static_cast(gself); self->set_calendar_date(self->state()->clock->localtime(), true); } } void on_calendar_date_activated(GSimpleAction * /*action*/, GVariant * state, gpointer gself) { const time_t t = g_variant_get_int64(state); g_return_if_fail(t != 0); auto dt = DateTime::Local(t).start_of_day(); bool bLomiri = ayatana_common_utils_is_lomiri (); static_cast(gself)->set_calendar_date(dt, bLomiri); } GVariant* create_default_header_state() { GVariantBuilder b; g_variant_builder_init(&b, G_VARIANT_TYPE_VARDICT); g_variant_builder_add(&b, "{sv}", "accessible-desc", g_variant_new_string("accessible-desc")); g_variant_builder_add(&b, "{sv}", "label", g_variant_new_string("label")); g_variant_builder_add(&b, "{sv}", "title", g_variant_new_string("title")); g_variant_builder_add(&b, "{sv}", "visible", g_variant_new_boolean(true)); return g_variant_builder_end(&b); } GVariant* create_calendar_state(const std::shared_ptr& state) { gboolean days[32] = { 0 }; for (const auto& appt : state->calendar_month->appointments().get()) if (!appt.is_alarm() || state->settings->show_alarms.get()) { days[appt.begin.day_of_month()] = true; } GVariantBuilder day_builder; g_variant_builder_init(&day_builder, G_VARIANT_TYPE("ai")); for (guint i=0; icalendar_month->month().get().to_unix()); g_variant_builder_add(&dict_builder, "{sv}", key, v); key = "show-week-numbers"; v = g_variant_new_boolean(state->settings->show_week_numbers.get()); g_variant_builder_add(&dict_builder, "{sv}", key, v); return g_variant_builder_end(&dict_builder); } } // unnamed namespace /*** **** ***/ Actions::Actions(const std::shared_ptr& state): m_state(state), m_actions(g_simple_action_group_new()) { GActionEntry entries[] = { { "desktop.open-appointment", on_appointment_activated, "(sx)", nullptr }, { "desktop.open-alarm-app", on_alarm_activated }, { "desktop.open-calendar-app", on_calendar_activated, "x", nullptr }, { "desktop.open-settings-app", on_settings_activated }, { "phone.open-appointment", on_appointment_activated, "(sx)", nullptr }, { "phone.open-alarm-app", on_alarm_activated }, { "phone.open-calendar-app", on_calendar_activated, "x", nullptr }, { "phone.open-settings-app", on_settings_activated }, { "calendar-active", nullptr, nullptr, "false", on_calendar_active_changed }, { "set-location", on_set_location, "s" } }; g_action_map_add_action_entries(G_ACTION_MAP(m_actions), entries, G_N_ELEMENTS(entries), this); // add the header actions auto gam = G_ACTION_MAP(m_actions); auto v = create_default_header_state(); auto a = g_simple_action_new_stateful("desktop-header", nullptr, v); g_action_map_add_action(gam, G_ACTION(a)); g_object_unref(a); a = g_simple_action_new_stateful("desktop_greeter-header", nullptr, v); g_action_map_add_action(gam, G_ACTION(a)); g_object_unref(a); a = g_simple_action_new_stateful("phone-header", nullptr, v); g_action_map_add_action(gam, G_ACTION(a)); g_object_unref(a); a = g_simple_action_new_stateful("phone_greeter-header", nullptr, v); g_action_map_add_action(gam, G_ACTION(a)); g_object_unref(a); // add the calendar action v = create_calendar_state(state); a = g_simple_action_new_stateful("calendar", G_VARIANT_TYPE_INT64, v); g_action_map_add_action(gam, G_ACTION(a)); g_signal_connect(a, "activate", G_CALLBACK(on_calendar_date_activated), this); g_object_unref(a); /// /// Keep our GActionGroup's action's states in sync with m_state /// m_state->calendar_month->month().changed().connect([this](const DateTime&){ update_calendar_state(); }); m_state->calendar_month->appointments().changed().connect([this](const std::vector&){ update_calendar_state(); }); m_state->settings->show_week_numbers.changed().connect([this](bool){ update_calendar_state(); }); // FIXME: rebuild the calendar state when show-week-number changes } Actions::~Actions() { g_clear_object(&m_actions); } void Actions::update_calendar_state() { g_action_group_change_action_state(action_group(), "calendar", create_calendar_state(m_state)); } void Actions::set_calendar_date(const DateTime& date, bool bUpdateCalendar) { if (bUpdateCalendar) { m_state->calendar_month->month().set(date); } m_state->calendar_upcoming->date().set(date); } GActionGroup* Actions::action_group() { return G_ACTION_GROUP(m_actions); } const std::shared_ptr Actions::state() const { return m_state; } } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/actions-live.cpp0000644000000000000000000001507514773244555017572 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include extern "C" { #include } namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ LiveActions::LiveActions(const std::shared_ptr& state_in): Actions(state_in) { } /*** **** ***/ std::string LiveActions::open_alarm_app() { std::string sReturn = ""; if (ayatana_common_utils_is_lomiri()) { sReturn = "alarm://"; ayatana_common_utils_open_url(sReturn.c_str()); } else { sReturn = "evolution -c calendar"; ayatana_common_utils_execute_command(sReturn.c_str()); } return sReturn; } std::string LiveActions::open_calendar_app(const DateTime& dt) { std::string sReturn = ""; if (ayatana_common_utils_is_lomiri()) { const auto utc = dt.to_timezone("UTC"); sReturn = utc.format("calendar://startdate=%Y-%m-%dT%H:%M:%S+00:00"); ayatana_common_utils_open_url(sReturn.c_str()); } else { const auto utc = dt.start_of_day().to_timezone("UTC"); sReturn = utc.format("evolution \"calendar:///?startdate=%Y%m%dT%H%M%SZ\""); ayatana_common_utils_execute_command(sReturn.c_str()); } return sReturn; } std::string LiveActions::open_settings_app() { std::string sReturn = ""; if (ayatana_common_utils_is_lomiri()) { sReturn = "settings:///system/time-date"; ayatana_common_utils_open_url(sReturn.c_str()); } else if (ayatana_common_utils_is_unity()) { sReturn = "unity-control-center datetime"; ayatana_common_utils_execute_command(sReturn.c_str()); } else if (ayatana_common_utils_is_mate()) { sReturn = "mate-time-admin"; ayatana_common_utils_execute_command(sReturn.c_str()); } else { sReturn = "gnome-control-center datetime"; ayatana_common_utils_execute_command(sReturn.c_str()); } return sReturn; } bool LiveActions::desktop_has_calendar_app() const { static bool inited = false; static bool have_calendar = false; if (G_UNLIKELY(!inited)) { inited = true; #if 0 auto all = g_app_info_get_all_for_type ("text/calendar"); for(auto l=all; !have_calendar && l!=nullptr; l=l->next) { auto app_info = static_cast(l->data); if (!g_strcmp0("evolution.desktop", g_app_info_get_id(app_info))) have_calendar = true; } g_list_free_full(all, (GDestroyNotify)g_object_unref); #else /* Work around http://pad.lv/1296233 for Trusty... let's revert this when the GIO bug is fixed. */ auto executable = g_find_program_in_path("evolution"); have_calendar = executable != nullptr; g_free(executable); #endif } return have_calendar; } std::string LiveActions::open_appointment(const Appointment& appt, const DateTime& date) { std::string sReturn = ""; switch (appt.type) { case Appointment::ALARM: sReturn = open_alarm_app(); break; case Appointment::EVENT: default: sReturn = open_calendar_app(date); break; } return sReturn; } /*** **** ***/ namespace { struct setlocation_data { std::string tzid; std::string name; std::shared_ptr settings; }; static void on_datetime1_set_timezone_response(GObject * object, GAsyncResult * res, gpointer gdata) { GError* err = nullptr; auto response = g_dbus_proxy_call_finish(G_DBUS_PROXY(object), res, &err); auto data = static_cast(gdata); if (err != nullptr) { if (!g_error_matches(err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("Could not set new timezone: %s", err->message); g_error_free(err); } else { data->settings->timezone_name.set(data->tzid + " " + data->name); g_variant_unref(response); } delete data; } static void on_datetime1_proxy_ready (GObject * object G_GNUC_UNUSED, GAsyncResult * res, gpointer gdata) { auto data = static_cast(gdata); GError * err = nullptr; auto proxy = g_dbus_proxy_new_for_bus_finish(res, &err); if (err != nullptr) { if (!g_error_matches(err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("Could not grab DBus proxy for timedated: %s", err->message); g_error_free(err); delete data; } else { g_dbus_proxy_call(proxy, Bus::Timedate1::Methods::SET_TIMEZONE, g_variant_new ("(sb)", data->tzid.c_str(), TRUE), G_DBUS_CALL_FLAGS_NONE, -1, nullptr, on_datetime1_set_timezone_response, data); g_object_unref (proxy); } } } // unnamed namespace void LiveActions::set_location(const std::string& tzid, const std::string& name) { g_return_if_fail(!tzid.empty()); g_return_if_fail(!name.empty()); auto data = new struct setlocation_data; data->tzid = tzid; data->name = name; data->settings = state()->settings; g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, nullptr, Bus::Timedate1::BUSNAME, Bus::Timedate1::ADDR, Bus::Timedate1::IFACE, nullptr, on_datetime1_proxy_ready, data); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/alarm-queue-simple.cpp0000644000000000000000000001246014773244555020675 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include #include #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class SimpleAlarmQueue::Impl { public: Impl(const std::shared_ptr& clock, const std::shared_ptr& planner, const std::shared_ptr& timer): m_clock{clock}, m_planner{planner}, m_timer{timer}, m_datetime{clock->localtime()} { m_planner->appointments().changed().connect([this](const std::vector&){ g_debug("AlarmQueue %p calling requeue() due to appointments changed", this); requeue(); }); m_clock->minute_changed.connect([this]{ const auto now = m_clock->localtime(); constexpr auto skew_threshold_usec = int64_t{90} * G_USEC_PER_SEC; const bool clock_jumped = std::abs(now - m_datetime) > skew_threshold_usec; m_datetime = now; if (clock_jumped) { g_debug("AlarmQueue %p calling requeue() due to clock skew", this); requeue(); } }); m_timer->timeout().connect([this](){ g_debug("AlarmQueue %p calling requeue() due to timeout", this); requeue(); }); requeue(); } ~Impl() { } core::Signal& alarm_reached() { return m_alarm_reached; } private: void requeue() { const auto appointments = m_planner->appointments().get(); const Alarm* alarm; // kick any current alarms for (const auto& appointment : appointments) { if ((alarm = appointment_get_current_alarm(appointment))) { m_triggered.insert(std::make_pair(appointment.uid, alarm->time)); m_alarm_reached(appointment, *alarm); } } // idle until the next alarm if ((alarm = find_next_alarm(appointments))) { g_debug ("setting timer to wake up for next appointment '%s' at %s", alarm->text.c_str(), alarm->time.format("%F %T").c_str()); m_timer->set_wakeup_time(alarm->time); } } bool already_triggered (const Appointment& appt, const Alarm& alarm) const { const std::pair key{appt.uid, alarm.time}; return m_triggered.count(key) != 0; } // return the next Alarm (if any) that will kick now or in the future const Alarm* find_next_alarm(const std::vector& appointments) const { const Alarm* best {}; const auto now = m_clock->localtime(); const auto beginning_of_minute = now.start_of_minute(); g_debug ("planner has %zu appointments in it", (size_t)appointments.size()); for(const auto& appointment : appointments) { for(const auto& alarm : appointment.alarms) { if (already_triggered(appointment, alarm)) continue; if (alarm.time < beginning_of_minute) // has this one already passed? continue; if (best && (best->time < alarm.time)) // do we already have a better match? continue; best = &alarm; } } return best; } // return the Appointment's current Alarm (if any) const Alarm* appointment_get_current_alarm(const Appointment& appointment) const { const auto now = m_clock->localtime(); for (const auto& alarm : appointment.alarms) if (!already_triggered(appointment, alarm) && DateTime::is_same_minute(now, alarm.time)) return &alarm; return nullptr; } std::set> m_triggered; const std::shared_ptr m_clock; const std::shared_ptr m_planner; const std::shared_ptr m_timer; core::Signal m_alarm_reached; DateTime m_datetime; }; /*** **** Public API ***/ SimpleAlarmQueue::SimpleAlarmQueue(const std::shared_ptr& clock, const std::shared_ptr& planner, const std::shared_ptr& timer): impl{new Impl{clock, planner, timer}} { } SimpleAlarmQueue::~SimpleAlarmQueue() { } core::Signal& SimpleAlarmQueue::alarm_reached() { return impl->alarm_reached(); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/appointment.cpp0000644000000000000000000000271214773244555017525 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include namespace ayatana { namespace indicator { namespace datetime { /**** ***** ****/ bool Alarm::operator==(const Alarm& that) const { return (text==that.text) && (audio_url==that.audio_url) && (this->time==that.time); } bool Alarm::has_sound() const { return !audio_url.empty(); } bool Alarm::has_text() const { return !text.empty(); } bool Appointment::operator==(const Appointment& that) const { return (type==that.type) && (uid==that.uid) && (color==that.color) && (summary==that.summary) && (begin==that.begin) && (end==that.end) && (alarms==that.alarms); } /**** ***** ****/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/awake.cpp0000644000000000000000000001050314773244555016254 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include #include #include #include #include namespace ayatana { namespace indicator { namespace notifications { /*** **** ***/ class Awake::Impl { public: Impl(GDBusConnection* bus, const std::string& app_name): m_app_name(app_name), m_cancellable(g_cancellable_new()), m_system_bus{G_DBUS_CONNECTION(g_object_ref(bus))} { // ask repowerd to keep the system awake static constexpr int32_t POWERD_SYS_STATE_ACTIVE = 1; g_dbus_connection_call (m_system_bus, BUS_POWERD_NAME, BUS_POWERD_PATH, BUS_POWERD_INTERFACE, "requestSysState", g_variant_new("(si)", m_app_name.c_str(), POWERD_SYS_STATE_ACTIVE), G_VARIANT_TYPE("(s)"), G_DBUS_CALL_FLAGS_NONE, -1, m_cancellable, on_force_awake_response, this); } ~Impl() { g_cancellable_cancel (m_cancellable); g_object_unref (m_cancellable); unforce_awake (); g_clear_object (&m_system_bus); } private: static void on_force_awake_response (GObject * connection, GAsyncResult * res, gpointer gself) { GError * error; GVariant * args; error = nullptr; args = g_dbus_connection_call_finish (G_DBUS_CONNECTION(connection), res, &error); if (error != nullptr) { if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && !g_error_matches (error, G_DBUS_ERROR, G_DBUS_ERROR_SERVICE_UNKNOWN)) { g_warning ("Unable to inhibit sleep: %s", error->message); } g_error_free (error); } else { auto self = static_cast(gself); g_clear_pointer (&self->m_awake_cookie, g_free); g_variant_get (args, "(s)", &self->m_awake_cookie); g_variant_unref (args); } } void unforce_awake () { g_return_if_fail (G_IS_DBUS_CONNECTION(m_system_bus)); if (m_awake_cookie != nullptr) { g_dbus_connection_call (m_system_bus, BUS_POWERD_NAME, BUS_POWERD_PATH, BUS_POWERD_INTERFACE, "clearSysState", g_variant_new("(s)", m_awake_cookie), nullptr, G_DBUS_CALL_FLAGS_NONE, -1, m_cancellable, nullptr, nullptr); g_clear_pointer (&m_awake_cookie, g_free); } } const std::string m_app_name; GCancellable * m_cancellable = nullptr; GDBusConnection * m_system_bus = nullptr; char * m_awake_cookie = nullptr; }; /*** **** ***/ Awake::Awake(GDBusConnection* system_bus, const std::string& app_name): impl{new Impl{system_bus, app_name}} { } Awake::~Awake() { } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/clock.cpp0000644000000000000000000002001014773244555016251 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include #include #include #include #include #include #include #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class Clock::Impl { public: Impl(Clock& owner): m_owner(owner), m_cancellable(g_cancellable_new()) { g_bus_get(G_BUS_TYPE_SYSTEM, m_cancellable, on_bus_ready, this); } ~Impl() { g_cancellable_cancel(m_cancellable); g_object_unref(m_cancellable); for(const auto& tag : m_watched_names) g_bus_unwatch_name(tag); } private: static void on_bus_ready(GObject * /*source_object*/, GAsyncResult * res, gpointer gself) { GError * error = NULL; GDBusConnection * bus; if ((bus = g_bus_get_finish(res, &error))) { auto self = static_cast(gself); auto tag = g_bus_watch_name_on_connection(bus, "org.freedesktop.login1", G_BUS_NAME_WATCHER_FLAGS_NONE, on_login1_appeared, on_login1_vanished, gself, nullptr); self->m_watched_names.insert(tag); tag = g_bus_watch_name_on_connection(bus, BUS_POWERD_NAME, G_BUS_NAME_WATCHER_FLAGS_NONE, on_powerd_appeared, on_powerd_vanished, gself, nullptr); self->m_watched_names.insert(tag); g_object_unref(bus); } else if (error != nullptr) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("%s Couldn't get system bus: %s", G_STRLOC, error->message); g_error_free(error); } } void remember_subscription(const std::string & name, GDBusConnection * bus, guint tag) { g_object_ref(bus); auto deleter = [tag](GDBusConnection* bus){ g_dbus_connection_signal_unsubscribe(bus, tag); g_object_unref(G_OBJECT(bus)); }; m_subscriptions[name].push_back(std::shared_ptr(bus, deleter)); } /** *** DBus Chatter: org.freedesktop.login1 *** *** Fire Clock::minute_changed() signal on login1's PrepareForSleep signal **/ static void on_login1_appeared(GDBusConnection * bus, const gchar * name, const gchar * name_owner, gpointer gself) { auto tag = g_dbus_connection_signal_subscribe(bus, name_owner, "org.freedesktop.login1.Manager", // interface "PrepareForSleep", // signal name "/org/freedesktop/login1", // object path nullptr, // arg0 G_DBUS_SIGNAL_FLAGS_NONE, on_prepare_for_sleep, gself, nullptr); static_cast(gself)->remember_subscription(name, bus, tag); } static void on_login1_vanished(GDBusConnection * /*system_bus*/, const gchar * name, gpointer gself) { static_cast(gself)->m_subscriptions[name].clear(); } static void on_prepare_for_sleep(GDBusConnection* /*connection*/, const gchar* /*sender_name*/, const gchar* /*object_path*/, const gchar* /*interface_name*/, const gchar* /*signal_name*/, GVariant* /*parameters*/, gpointer gself) { g_debug("firing clock.minute_changed() due to PrepareForSleep"); static_cast(gself)->m_owner.minute_changed(); } /** *** DBus Chatter: com.lomiri.Repowerd *** *** Fire Clock::minute_changed() signal when powerd says the system's *** has awoken from sleep -- the old timestamp is likely out-of-date **/ static void on_powerd_appeared(GDBusConnection * bus, const gchar * name, const gchar * name_owner, gpointer gself) { auto tag = g_dbus_connection_signal_subscribe(bus, name_owner, BUS_POWERD_INTERFACE, "SysPowerStateChange", BUS_POWERD_PATH, nullptr, // arg0 G_DBUS_SIGNAL_FLAGS_NONE, on_sys_power_state_change, gself, // user_data nullptr); // user_data closure static_cast(gself)->remember_subscription(name, bus, tag); } static void on_powerd_vanished(GDBusConnection * /*bus*/, const gchar * name, gpointer gself) { static_cast(gself)->m_subscriptions[name].clear(); } static void on_sys_power_state_change(GDBusConnection* /*connection*/, const gchar* /*sender_name*/, const gchar* /*object_path*/, const gchar* /*interface_name*/, const gchar* /*signal_name*/, GVariant* /*parameters*/, gpointer gself) { g_debug("firing clock.minute_changed() due to state change"); static_cast(gself)->m_owner.minute_changed(); } /*** **** ***/ Clock& m_owner; GCancellable * m_cancellable = nullptr; std::set m_watched_names; std::map>> m_subscriptions; }; /*** **** ***/ Clock::Clock(): m_impl(new Impl{*this}) { } Clock::~Clock() { } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/clock-live.cpp0000644000000000000000000001366514773244555017230 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include // g_unix_fd_add() #include #include // close() #ifndef TFD_TIMER_CANCEL_ON_SET #define TFD_TIMER_CANCEL_ON_SET (1 << 1) #endif namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class LiveClock::Impl { public: Impl(LiveClock& owner, const std::shared_ptr& timezone_): m_owner(owner), m_timezone(timezone_) { if (m_timezone) { auto setter = [this](const std::string& z){setTimezone(z);}; m_timezone->timezone.changed().connect(setter); setter(m_timezone->timezone.get()); } reset_timer(); refresh(); } ~Impl() { unset_timer(); g_clear_pointer(&m_gtimezone, g_time_zone_unref); } DateTime localtime() const { g_assert(m_gtimezone != nullptr); auto gdt = g_date_time_new_now(m_gtimezone); DateTime ret(m_gtimezone, gdt); g_date_time_unref(gdt); return ret; } private: void unset_timer() { if (m_timerfd_tag != 0) { g_source_remove(m_timerfd_tag); m_timerfd_tag = 0; } if (m_timerfd != -1) { close(m_timerfd); m_timerfd = -1; } } void reset_timer() { // clear out any previous timer unset_timer(); // create a new timer m_timerfd = timerfd_create(CLOCK_REALTIME, 0); if (m_timerfd == -1) g_error("unable to create realtime timer: %s", g_strerror(errno)); // set args to fire at the beginning of the next minute... struct itimerspec timerval; int flags = TFD_TIMER_ABSTIME; auto now = g_date_time_new_now(m_gtimezone); auto next = g_date_time_add_minutes(now, 1); auto start_of_next = g_date_time_add_seconds(next, -g_date_time_get_seconds(next)); timerval.it_value.tv_sec = g_date_time_to_unix(start_of_next); timerval.it_value.tv_nsec = 0; g_date_time_unref(start_of_next); g_date_time_unref(next); g_date_time_unref(now); // ...and also to fire at the beginning of every subsequent minute... timerval.it_interval.tv_sec = 60; timerval.it_interval.tv_nsec = 0; // ...and also to fire if someone changes the time // manually (eg toggling from manual<->ntp) flags |= TFD_TIMER_CANCEL_ON_SET; if (timerfd_settime(m_timerfd, flags, &timerval, NULL) == -1) g_error("timerfd_settime failed: %s", g_strerror(errno)); // listen for the changes/timers m_timerfd_tag = g_unix_fd_add(m_timerfd, (GIOCondition)(G_IO_IN|G_IO_HUP|G_IO_ERR), on_timerfd_cond, this); } static gboolean on_timerfd_cond (gint fd, GIOCondition cond, gpointer gself) { auto self = static_cast(gself); int n_bytes = 0; uint64_t n_interrupts = 0; if (cond & G_IO_IN) n_bytes = read(fd, &n_interrupts, sizeof(uint64_t)); if ((n_interrupts==0) || (n_bytes!=sizeof(uint64_t))) { auto now = g_date_time_new_now(self->m_gtimezone); auto now_str = g_date_time_format(now, "%F %T"); g_debug("%s triggered at %s.%06d by GIOCondition %d, read %zd bytes, found %zu interrupts", G_STRFUNC, now_str, g_date_time_get_microsecond(now), (int)cond, (ssize_t)n_bytes, (size_t)n_interrupts); g_free(now_str); g_date_time_unref(now); // reset the timer in case someone changed the system clock self->reset_timer(); } self->refresh(); return G_SOURCE_CONTINUE; } /*** **** ***/ void setTimezone(const std::string& str) { g_clear_pointer(&m_gtimezone, g_time_zone_unref); #if GLIB_CHECK_VERSION(2, 68, 0) m_gtimezone = g_time_zone_new_identifier(str.c_str()); if (m_gtimezone == NULL) { m_gtimezone = g_time_zone_new_utc(); } #else m_gtimezone = g_time_zone_new(str.c_str()); #endif m_owner.minute_changed(); } /*** **** ***/ void refresh() { const auto now = localtime(); // maybe emit change signals if (!DateTime::is_same_minute(m_prev_datetime, now)) m_owner.minute_changed(); if (!DateTime::is_same_day(m_prev_datetime, now)) m_owner.date_changed(); m_prev_datetime = now; } protected: LiveClock& m_owner; GTimeZone* m_gtimezone = nullptr; std::shared_ptr m_timezone; DateTime m_prev_datetime; int m_timerfd = -1; guint m_timerfd_tag = 0; }; LiveClock::LiveClock(const std::shared_ptr& timezone_): p(new Impl(*this, timezone_)) { } LiveClock::~LiveClock() =default; DateTime LiveClock::localtime() const { return p->localtime(); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/CMakeLists.txt0000644000000000000000000000565114773244555017230 0ustar set (SERVICE_LIB "indicatordatetimeservice") if (ENABLE_LOMIRI_FEATURES) set (INDICATOR_VARIANT_NAME "lomiri-indicator-datetime") else () set (INDICATOR_VARIANT_NAME "${CMAKE_PROJECT_NAME}") endif () add_definitions (-DG_LOG_DOMAIN="${INDICATOR_VARIANT_NAME}") set (SERVICE_EXEC "${INDICATOR_VARIANT_NAME}-service") # handwritten sources set (SERVICE_C_SOURCES utils.c) set (SERVICE_CXX_SOURCES actions.cpp actions-live.cpp alarm-queue-simple.cpp awake.cpp appointment.cpp clock.cpp clock-live.cpp date-time.cpp exporter.cpp formatter.cpp formatter-desktop.cpp haptic.cpp locations.cpp locations-settings.cpp menu.cpp myself.cpp notifications.cpp planner.cpp planner-aggregate.cpp planner-snooze.cpp planner-month.cpp planner-range.cpp planner-upcoming.cpp settings-live.cpp snap.cpp sound.cpp timezone-geoclue.cpp timezones-live.cpp timezone-timedated.cpp utils.c wakeup-timer-mainloop.cpp wakeup-timer-powerd.cpp) if (ENABLE_LOMIRI_FEATURES) list (APPEND SERVICE_CXX_SOURCES engine-mkcal.cpp) else () list (APPEND SERVICE_CXX_SOURCES engine-eds.cpp) endif() # generated sources include (GdbusCodegen) set(SERVICE_GENERATED_SOURCES) add_gdbus_codegen(SERVICE_GENERATED_SOURCES dbus-alarm-properties org.ayatana.indicator ${CMAKE_SOURCE_DIR}/data/org.ayatana.indicator.datetime.AlarmProperties.xml) if (ENABLE_LOMIRI_FEATURES) add_gdbus_codegen(SERVICE_GENERATED_SOURCES dbus-accounts-sound com.lomiri.touch /usr/share/accountsservice/interfaces/com.lomiri.touch.AccountsService.Sound.xml) endif() # add the bin dir to our include path so our code can find the generated header files include_directories (${CMAKE_CURRENT_BINARY_DIR}) set_source_files_properties (engine-eds.cpp PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -Wno-enum-constexpr-conversion") add_library (${SERVICE_LIB} STATIC ${SERVICE_C_SOURCES} ${SERVICE_CXX_SOURCES} ${SERVICE_GENERATED_SOURCES}) pkg_check_modules (LIBNOTIFY libnotify REQUIRED) if (LIBNOTIFY_VERSION VERSION_GREATER_EQUAL "0.8.4") target_compile_definitions (${SERVICE_LIB} PUBLIC LIBNOTIFY_HAS_SET_APP_ICON) endif() include_directories (${CMAKE_SOURCE_DIR}) link_directories (${SERVICE_DEPS_LIBRARY_DIRS}) if (ENABLE_LOMIRI_FEATURES) set_source_files_properties (engine-mkcal.cpp PROPERTIES COMPILE_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations") target_link_libraries (${SERVICE_LIB} KF5::CalendarCore) target_compile_definitions (${SERVICE_LIB} PRIVATE -DQT_DEBUG -DQT_MESSAGELOGCONTEXT) endif () add_executable (${SERVICE_EXEC} main.cpp) target_link_libraries (${SERVICE_EXEC} ${SERVICE_LIB} ${SERVICE_DEPS_LIBRARIES}) install (TARGETS ${SERVICE_EXEC} RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_LIBEXECDIR}/${INDICATOR_VARIANT_NAME}") ayatana-indicator-datetime-25.4.0/src/date-time.cpp0000644000000000000000000001616714773244555017051 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ DateTime::DateTime() { } DateTime::DateTime(GTimeZone* gtz, GDateTime* gdt) { g_return_if_fail(gtz!=nullptr); g_return_if_fail(gdt!=nullptr); reset(gtz, gdt); } DateTime::DateTime(GTimeZone* gtz, int year, int month, int day, int hour, int minute, double seconds) { g_return_if_fail(gtz!=nullptr); auto gdt = g_date_time_new(gtz, year, month, day, hour, minute, seconds); reset(gtz, gdt); g_date_time_unref(gdt); } DateTime& DateTime::operator=(const DateTime& that) { m_tz = that.m_tz; m_dt = that.m_dt; return *this; } DateTime& DateTime::operator+=(const std::chrono::minutes& minutes) { return (*this = add_full(0, 0, 0, 0, minutes.count(), 0)); } DateTime& DateTime::operator+=(const std::chrono::seconds& seconds) { return (*this = add_full(0, 0, 0, 0, 0, seconds.count())); } DateTime::DateTime(GTimeZone* gtz, time_t t) { auto utc = g_date_time_new_from_unix_utc(t); auto gdt = g_date_time_to_timezone (utc, gtz); reset(gtz, gdt); g_date_time_unref(gdt); g_date_time_unref(utc); } DateTime DateTime::NowLocal() { auto gtz = g_time_zone_new_local(); auto gdt = g_date_time_new_now(gtz); DateTime dt(gtz, gdt); g_time_zone_unref(gtz); g_date_time_unref(gdt); return dt; } DateTime DateTime::Local(time_t t) { auto gtz = g_time_zone_new_local(); auto gdt = g_date_time_new_from_unix_local(t); DateTime dt(gtz, gdt); g_time_zone_unref(gtz); g_date_time_unref(gdt); return dt; } DateTime DateTime::Local(int year, int month, int day, int hour, int minute, double seconds) { auto gtz = g_time_zone_new_local(); DateTime dt(gtz, year, month, day, hour, minute, seconds); g_time_zone_unref(gtz); return dt; } DateTime DateTime::to_timezone(const std::string& zone) const { #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone.c_str()); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone.c_str()); #endif auto gdt = g_date_time_to_timezone(get(), gtz); DateTime dt(gtz, gdt); g_time_zone_unref(gtz); g_date_time_unref(gdt); return dt; } DateTime DateTime::end_of_day() const { g_assert(is_set()); return add_days(1).start_of_day().add_full(0,0,0,0,0,-1); } DateTime DateTime::end_of_month() const { g_assert(is_set()); return add_full(0,1,0,0,0,0).start_of_month().add_full(0,0,0,0,0,-1); } DateTime DateTime::start_of_month() const { g_assert(is_set()); int year=0, month=0, day=0; ymd(year, month, day); return DateTime(m_tz.get(), year, month, 1, 0, 0, 0); } DateTime DateTime::start_of_day() const { g_assert(is_set()); int year=0, month=0, day=0; ymd(year, month, day); return DateTime(m_tz.get(), year, month, day, 0, 0, 0); } DateTime DateTime::start_of_minute() const { g_assert(is_set()); int year=0, month=0, day=0; ymd(year, month, day); return DateTime(m_tz.get(), year, month, day, hour(), minute(), 0); } DateTime DateTime::add_full(int year, int month, int day, int hour, int minute, double seconds) const { auto gdt = g_date_time_add_full(get(), year, month, day, hour, minute, seconds); DateTime dt(m_tz.get(), gdt); g_date_time_unref(gdt); return dt; } DateTime DateTime::add_days(int days) const { return add_full(0, 0, days, 0, 0, 0); } GDateTime* DateTime::get() const { g_assert(m_dt); return m_dt.get(); } std::string DateTime::format(const std::string& fmt) const { std::string ret; gchar* str = g_date_time_format(get(), fmt.c_str()); if (str) { ret = str; g_free(str); } return ret; } void DateTime::ymd(int& year, int& month, int& day) const { g_date_time_get_ymd(get(), &year, &month, &day); } int DateTime::day_of_month() const { return g_date_time_get_day_of_month(get()); } int DateTime::hour() const { return g_date_time_get_hour(get()); } int DateTime::minute() const { return g_date_time_get_minute(get()); } double DateTime::seconds() const { return g_date_time_get_seconds(get()); } int64_t DateTime::to_unix() const { return g_date_time_to_unix(get()); } void DateTime::reset(GTimeZone* gtz, GDateTime* gdt) { g_return_if_fail (gdt!=nullptr); g_return_if_fail (gtz!=nullptr); auto tz_deleter = [](GTimeZone* tz){g_time_zone_unref(tz);}; m_tz = std::shared_ptr(g_time_zone_ref(gtz), tz_deleter); auto dt_deleter = [](GDateTime* dt){g_date_time_unref(dt);}; m_dt = std::shared_ptr(g_date_time_ref(gdt), dt_deleter); } bool DateTime::operator<(const DateTime& that) const { return g_date_time_compare(get(), that.get()) < 0; } bool DateTime::operator>(const DateTime& that) const { return g_date_time_compare(get(), that.get()) > 0; } bool DateTime::operator<=(const DateTime& that) const { return g_date_time_compare(get(), that.get()) <= 0; } bool DateTime::operator>=(const DateTime& that) const { return g_date_time_compare(get(), that.get()) >= 0; } bool DateTime::operator!=(const DateTime& that) const { // return true if this isn't set, or if it's not equal return (!m_dt) || !(*this == that); } bool DateTime::operator==(const DateTime& that) const { auto dt = get(); auto tdt = that.get(); if (!dt && !tdt) return true; if (!dt || !tdt) return false; return g_date_time_compare(get(), that.get()) == 0; } int64_t DateTime::operator- (const DateTime& that) const { return g_date_time_difference(get(), that.get()); } bool DateTime::is_same_day(const DateTime& a, const DateTime& b) { // it's meaningless to compare uninitialized dates if (!a.m_dt || !b.m_dt) return false; int ay, am, ad; int by, bm, bd; g_date_time_get_ymd(a.get(), &ay, &am, &ad); g_date_time_get_ymd(b.get(), &by, &bm, &bd); return (ay==by) && (am==bm) && (ad==bd); } bool DateTime::is_same_minute(const DateTime& a, const DateTime& b) { if (!is_same_day(a,b)) return false; const auto adt = a.get(); const auto bdt = b.get(); return (g_date_time_get_hour(adt) == g_date_time_get_hour(bdt)) && (g_date_time_get_minute(adt) == g_date_time_get_minute(bdt)); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/engine-eds.cpp0000644000000000000000000013335514773244555017215 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021-2024 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #ifndef ALARM_DEFAULT_SOUND #define ALARM_DEFAULT_SOUND "dummy" #endif #include #include #include #include #include #include #include // std::sort() #include #include // time() #include // strstr(), strlen() #include #include namespace ayatana { namespace indicator { namespace datetime { static constexpr char const * TAG_ALARM {"x-lomiri-alarm"}; static constexpr char const * TAG_DISABLED {"x-lomiri-disabled"}; /**** ***** ****/ class EdsEngine::Impl { public: explicit Impl(const std::shared_ptr &myself) : m_myself(myself) { auto cancellable_deleter = [](GCancellable * c) { g_cancellable_cancel(c); g_clear_object(&c); }; m_cancellable = std::shared_ptr(g_cancellable_new(), cancellable_deleter); e_source_registry_new(m_cancellable.get(), on_source_registry_ready, this); m_myself->emails().changed().connect([this](const std::set &) { set_dirty_soon(); }); } ~Impl() { m_cancellable.reset(); while(!m_sources.empty()) remove_source(*m_sources.begin()); if (m_rebuild_tag) g_source_remove(m_rebuild_tag); if (m_source_registry) g_signal_handlers_disconnect_by_data(m_source_registry, this); g_clear_object(&m_source_registry); } core::Signal<>& changed() { return m_changed; } void get_appointments(const DateTime& begin, const DateTime& end, const Timezone& timezone, std::function&)> func) { const auto b_str = begin.format("%F %T"); const auto e_str = end.format("%F %T"); g_debug("getting all appointments from [%s ... %s]", b_str.c_str(), e_str.c_str()); /** *** init the default timezone **/ ICalTimezone * default_timezone = nullptr; const auto tz = timezone.timezone.get().c_str(); auto gtz = timezone_from_name(tz, nullptr, nullptr, &default_timezone); if (gtz == nullptr) { gtz = g_time_zone_new_local(); } g_debug("default_timezone is %s", default_timezone ? i_cal_timezone_get_display_name(default_timezone) : "null"); /** *** walk through the sources to build the appointment list **/ auto main_task = std::make_shared(this, func, default_timezone, gtz, begin, end); for (auto& kv : m_clients) { auto& client = kv.second; if (default_timezone != nullptr) e_cal_client_set_default_timezone(client, default_timezone); g_debug("calling e_cal_client_generate_instances for %p", (void*)client); auto& source = kv.first; auto extension = e_source_get_extension(source, E_SOURCE_EXTENSION_CALENDAR); // check source is selected if (!e_source_selectable_get_selected(E_SOURCE_SELECTABLE(extension))) { g_debug("Source is not selected, ignore it: %s", e_source_get_display_name(source)); continue; } const auto color = e_source_selectable_get_color(E_SOURCE_SELECTABLE(extension)); e_cal_client_generate_instances( client, begin.to_unix(), end.to_unix(), m_cancellable.get(), on_event_generated, new ClientSubtask(main_task, client, m_cancellable, color), on_event_generated_list_ready); } } void disable_alarm(const Appointment& appointment) { if (appointment.is_alarm()) { for (auto& kv : m_clients) // find the matching icalcomponent { e_cal_client_get_object(kv.second, appointment.uid.c_str(), nullptr, m_cancellable.get(), on_object_ready_for_disable, this); } } } private: void set_dirty_now() { m_changed(); } static gboolean set_dirty_now_static (gpointer gself) { auto self = static_cast(gself); self->m_rebuild_tag = 0; self->m_rebuild_deadline = 0; self->set_dirty_now(); return G_SOURCE_REMOVE; } void set_dirty_soon() { static constexpr int MIN_BATCH_SEC = 1; static constexpr int MAX_BATCH_SEC = 60; static_assert(MIN_BATCH_SEC <= MAX_BATCH_SEC, "bad boundaries"); const auto now = time(nullptr); if (m_rebuild_deadline == 0) // first pass { m_rebuild_deadline = now + MAX_BATCH_SEC; m_rebuild_tag = g_timeout_add_seconds(MIN_BATCH_SEC, set_dirty_now_static, this); } else if (now < m_rebuild_deadline) { g_source_remove (m_rebuild_tag); m_rebuild_tag = g_timeout_add_seconds(MIN_BATCH_SEC, set_dirty_now_static, this); } } static void on_source_registry_ready(GObject* /*source*/, GAsyncResult* res, gpointer gself) { GError * error = nullptr; auto r = e_source_registry_new_finish(res, &error); if (error != nullptr) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("ayatana-indicator-datetime cannot show EDS appointments: %s", error->message); g_error_free(error); } else { g_signal_connect(r, "source-added", G_CALLBACK(on_source_added), gself); g_signal_connect(r, "source-removed", G_CALLBACK(on_source_removed), gself); g_signal_connect(r, "source-changed", G_CALLBACK(on_source_changed), gself); g_signal_connect(r, "source-disabled", G_CALLBACK(on_source_disabled), gself); g_signal_connect(r, "source-enabled", G_CALLBACK(on_source_enabled), gself); auto self = static_cast(gself); self->m_source_registry = r; self->add_sources_by_extension(E_SOURCE_EXTENSION_CALENDAR); self->add_sources_by_extension(E_SOURCE_EXTENSION_TASK_LIST); } } void add_sources_by_extension(const char* extension) { auto& r = m_source_registry; auto sources = e_source_registry_list_sources(r, extension); for (auto l=sources; l!=nullptr; l=l->next) on_source_added(r, E_SOURCE(l->data), this); g_list_free_full(sources, g_object_unref); } static void on_source_added(ESourceRegistry* registry, ESource* source, gpointer gself) { auto self = static_cast(gself); self->m_sources.insert(E_SOURCE(g_object_ref(source))); if (e_source_get_enabled(source)) on_source_enabled(registry, source, gself); } static void on_source_enabled(ESourceRegistry* /*registry*/, ESource* source, gpointer gself) { auto self = static_cast(gself); ECalClientSourceType source_type; bool client_wanted = false; if (e_source_has_extension(source, E_SOURCE_EXTENSION_CALENDAR)) { source_type = E_CAL_CLIENT_SOURCE_TYPE_EVENTS; client_wanted = true; } else if (e_source_has_extension(source, E_SOURCE_EXTENSION_TASK_LIST)) { source_type = E_CAL_CLIENT_SOURCE_TYPE_TASKS; client_wanted = true; } const auto source_uid = e_source_get_uid(source); if (client_wanted) { g_debug("%s connecting a client to source %s", G_STRFUNC, source_uid); e_cal_client_connect(source, source_type, #if EDS_CHECK_VERSION(3,13,90) -1, #endif self->m_cancellable.get(), on_client_connected, gself); } else { g_debug("%s not using source %s -- no tasks/calendar", G_STRFUNC, source_uid); } } static void on_client_connected(GObject* /*source*/, GAsyncResult * res, gpointer gself) { GError * error = nullptr; EClient * client = e_cal_client_connect_finish(res, &error); if (error) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("ayatana-indicator-datetime cannot connect to EDS source: %s", error->message); g_error_free(error); } else { // add the client to our collection auto self = static_cast(gself); g_debug("got a client for %s", e_cal_client_get_local_attachment_store(E_CAL_CLIENT(client))); auto source = e_client_get_source(client); auto ecc = E_CAL_CLIENT(client); self->m_clients[source] = ecc; self->ensure_client_alarms_have_triggers(ecc); // now create a view for it so that we can listen for changes e_cal_client_get_view (ecc, "#t", // match all self->m_cancellable.get(), on_client_view_ready, self); g_debug("client connected; calling set_dirty_soon()"); self->set_dirty_soon(); } } static void on_client_view_ready (GObject* client, GAsyncResult* res, gpointer gself) { GError* error = nullptr; ECalClientView* view = nullptr; if (e_cal_client_get_view_finish (E_CAL_CLIENT(client), res, &view, &error)) { // add the view to our collection e_cal_client_view_set_flags(view, E_CAL_CLIENT_VIEW_FLAGS_NONE, nullptr); e_cal_client_view_start(view, &error); g_debug("got a view for %s", e_cal_client_get_local_attachment_store(E_CAL_CLIENT(client))); auto self = static_cast(gself); self->m_views[e_client_get_source(E_CLIENT(client))] = view; g_signal_connect(view, "objects-added", G_CALLBACK(on_view_objects_added), self); g_signal_connect(view, "objects-modified", G_CALLBACK(on_view_objects_modified), self); g_signal_connect(view, "objects-removed", G_CALLBACK(on_view_objects_removed), self); g_debug("view connected; calling set_dirty_soon()"); self->set_dirty_soon(); } else if(error != nullptr) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("ayatana-indicator-datetime cannot get View to EDS client: %s", error->message); g_error_free(error); } } static void on_view_objects_added(ECalClientView* /*view*/, gpointer /*objects*/, gpointer gself) { g_debug("%s", G_STRFUNC); static_cast(gself)->set_dirty_soon(); } static void on_view_objects_modified(ECalClientView* /*view*/, gpointer /*objects*/, gpointer gself) { g_debug("%s", G_STRFUNC); static_cast(gself)->set_dirty_soon(); } static void on_view_objects_removed(ECalClientView* /*view*/, gpointer /*objects*/, gpointer gself) { g_debug("%s", G_STRFUNC); static_cast(gself)->set_dirty_soon(); } static void on_source_disabled(ESourceRegistry* /*registry*/, ESource* source, gpointer gself) { static_cast(gself)->disable_source(source); } void disable_source(ESource* source) { // if an ECalClientView is associated with this source, remove it auto vit = m_views.find(source); if (vit != m_views.end()) { auto& view = vit->second; e_cal_client_view_stop(view, nullptr); const auto n_disconnected = g_signal_handlers_disconnect_by_data(view, this); g_warn_if_fail(n_disconnected == 3); g_object_unref(view); m_views.erase(vit); set_dirty_soon(); } // if an ECalClient is associated with this source, remove it auto cit = m_clients.find(source); if (cit != m_clients.end()) { auto& client = cit->second; g_object_unref(client); m_clients.erase(cit); set_dirty_soon(); } } static void on_source_removed(ESourceRegistry* /*registry*/, ESource* source, gpointer gself) { static_cast(gself)->remove_source(source); } void remove_source(ESource* source) { disable_source(source); auto sit = m_sources.find(source); if (sit != m_sources.end()) { g_object_unref(*sit); m_sources.erase(sit); set_dirty_soon(); } } static void on_source_changed(ESourceRegistry* /*registry*/, ESource* /*source*/, gpointer gself) { g_debug("source changed; calling set_dirty_soon()"); static_cast(gself)->set_dirty_soon(); } void ensure_client_alarms_have_triggers(ECalClient* client) { auto sexp = g_strdup_printf("has-categories? '%s'", TAG_ALARM); e_cal_client_get_object_list_as_comps( client, sexp, m_cancellable.get(), ensure_client_alarms_have_triggers_async_cb, this); g_clear_pointer(&sexp, g_free); } static void ensure_client_alarms_have_triggers_async_cb( GObject * oclient, GAsyncResult * res, gpointer gself) { ECalClient * client = E_CAL_CLIENT(oclient); GError * error = nullptr; GSList * components = nullptr; if (e_cal_client_get_object_list_as_comps_finish(client, res, &components, &error)) { auto self = static_cast(gself); self->ensure_ayatana_alarms_have_triggers(client, components); e_client_util_free_object_slist (components); } else if (error != nullptr) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("can't get clock-app alarm list: %s", error->message); g_error_free(error); } } static ECalComponentAlarm * ensure_alarm_has_trigger(ECalComponentAlarm *alarm) { ECalComponentAlarm * ret = nullptr; auto trigger = e_cal_component_alarm_get_trigger(alarm); if (trigger == nullptr || (e_cal_component_alarm_trigger_get_kind (trigger) == E_CAL_COMPONENT_ALARM_TRIGGER_NONE)) { auto copy = e_cal_component_alarm_copy (alarm); auto null_duration = i_cal_duration_new_null_duration(); trigger = e_cal_component_alarm_trigger_new_relative(E_CAL_COMPONENT_ALARM_TRIGGER_RELATIVE_START, null_duration); e_cal_component_alarm_trigger_set_duration(trigger, null_duration); e_cal_component_alarm_set_trigger(copy, trigger); ret = copy; e_cal_component_alarm_trigger_free(trigger); g_clear_object(&null_duration); } return ret; } void ensure_ayatana_alarms_have_triggers(ECalClient * client, GSList * components) { GSList * modify_slist = nullptr; // for each component.. for (auto l=components; l!=nullptr; l=l->next) { bool bChanged = false; // for each alarm... auto component = E_CAL_COMPONENT(l->data); auto auids = e_cal_component_get_alarm_uids(component); for(auto lAlarms=auids; lAlarms!=nullptr; lAlarms=lAlarms->next) { auto auid = static_cast(lAlarms->data); auto alarm = e_cal_component_get_alarm(component, auid); if (alarm == nullptr) continue; auto new_alarm = ensure_alarm_has_trigger (alarm); if (new_alarm != nullptr) { e_cal_component_remove_alarm (component, auid); e_cal_component_add_alarm (component, new_alarm); bChanged = true; g_clear_pointer (&new_alarm, e_cal_component_alarm_free); } } g_slist_free_full (auids, g_free); if (bChanged) { auto icc = e_cal_component_get_icalcomponent(component); // icc owned by ecc modify_slist = g_slist_prepend(modify_slist, icc); } } if (modify_slist != nullptr) { e_cal_client_modify_objects(client, modify_slist, E_CAL_OBJ_MOD_ALL, E_CAL_OPERATION_FLAG_NONE, m_cancellable.get(), ensure_ayatana_alarms_have_triggers_async_cb, this); g_clear_pointer(&modify_slist, g_slist_free); } } // log a warning if e_cal_client_modify_objects() failed static void ensure_ayatana_alarms_have_triggers_async_cb( GObject * oclient, GAsyncResult * res, gpointer /*gself*/) { GError * error = nullptr; e_cal_client_modify_objects_finish (E_CAL_CLIENT(oclient), res, &error); if (error != nullptr) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("couldn't add alarm triggers: %s", error->message); g_error_free(error); } } /*** **** ***/ typedef std::function&)> appointment_func; struct Task { Impl* p; appointment_func func; ICalTimezone* default_timezone; // pointer owned by libical GTimeZone* gtz; std::vector appointments; const DateTime begin; const DateTime end; Task(Impl* p_in, appointment_func func_in, ICalTimezone* tz_in, GTimeZone* gtz_in, const DateTime& begin_in, const DateTime& end_in): p{p_in}, func{func_in}, default_timezone{tz_in}, gtz{gtz_in}, begin{begin_in}, end{end_in} {} ~Task() { g_clear_pointer(>z, g_time_zone_unref); // give the caller the sorted finished product auto& a = appointments; std::sort(a.begin(), a.end(), [](const Appointment& a, const Appointment& b){return a.begin < b.begin;}); func(a); }; }; struct ClientSubtask { std::shared_ptr task; ECalClient* client; std::shared_ptr cancellable; std::string color; GList *components; GList *instance_components; std::set parent_components; ClientSubtask(const std::shared_ptr& task_in, ECalClient* client_in, const std::shared_ptr& cancellable_in, const char* color_in): task(task_in), client(client_in), cancellable(cancellable_in), components(nullptr), instance_components(nullptr) { if (color_in) color = color_in; } }; static std::string get_alarm_text(ECalComponentAlarm * alarm) { std::string ret; auto action = e_cal_component_alarm_get_action(alarm); if (action == E_CAL_COMPONENT_ALARM_DISPLAY) { auto text = e_cal_component_alarm_get_description(alarm); if (text != nullptr) { auto value = e_cal_component_text_get_value(text); if (value != nullptr) { ret = value; } } } return ret; } static std::string get_alarm_sound_url(ECalComponentAlarm * alarm, const std::string & default_sound) { std::string ret; auto action = e_cal_component_alarm_get_action(alarm); if (action == E_CAL_COMPONENT_ALARM_AUDIO) { auto attachments = e_cal_component_alarm_get_attachments(alarm); for (; attachments != nullptr; attachments = attachments->next) { ICalAttach *attach = I_CAL_ATTACH (attachments->data); if (attach != nullptr && i_cal_attach_get_is_url (attach)) { const char* url = i_cal_attach_get_url(attach); if (url != nullptr) { ret = url; break; } } } if (ret.empty()) ret = default_sound; } return ret; } static gboolean on_event_generated(ICalComponent *comp, ICalTime *start, ICalTime *end, gpointer gsubtask, GCancellable *cancellable, GError **error) { auto subtask = static_cast(gsubtask); const auto uid = i_cal_component_get_uid (comp); auto ecomp = e_cal_component_new_from_icalcomponent (i_cal_component_clone (comp)); auto auids = e_cal_component_get_alarm_uids(ecomp); for(auto l=auids; l!=nullptr; l=l->next) { auto auid = static_cast(l->data); auto alarm = e_cal_component_get_alarm(ecomp, auid); if (alarm == nullptr) continue; auto new_alarm = ensure_alarm_has_trigger (alarm); if (new_alarm != nullptr) { e_cal_component_remove_alarm (ecomp, auid); e_cal_component_add_alarm (ecomp, new_alarm); g_clear_pointer (&new_alarm, e_cal_component_alarm_free); } } if (e_cal_component_is_instance(ecomp) && (uid != nullptr)) { subtask->parent_components.insert(std::string(uid)); subtask->instance_components = g_list_append(subtask->instance_components, ecomp); } else { subtask->components = g_list_append(subtask->components, ecomp); } return TRUE; } static void merge_detached_instances(ClientSubtask *subtask, GSList *instances) { for (GSList *i=instances; i!=nullptr; i=i->next) { auto instance = static_cast(i->data); auto instance_id = e_cal_component_get_id(instance); for (GList *c=subtask->instance_components ; c!= nullptr; c=c->next) { auto component = static_cast(c->data); auto component_id = e_cal_component_get_id(component); bool found = false; if (e_cal_component_id_equal(instance_id, component_id)) { // replaces virtual instance with the real one g_object_unref(component); c->data = g_object_ref(instance); found = true; } e_cal_component_id_free(component_id); if (found) break; } e_cal_component_id_free(instance_id); } } static void fetch_detached_instances(GObject *, GAsyncResult *res, gpointer gsubtask) { auto subtask = static_cast(gsubtask); if (res) { GError *error = nullptr; GSList *comps = nullptr; e_cal_client_get_objects_for_uid_finish(subtask->client, res, &comps, &error); if (error) { g_warning("Fail to retrieve detached instances: %s", error->message); g_error_free(error); } else { merge_detached_instances(subtask, comps); e_client_util_free_object_slist(comps); } } if (subtask->parent_components.empty()) { on_event_fetch_list_done(gsubtask); return; } // continue fetch detached instances auto i_begin = subtask->parent_components.begin(); std::string id = *i_begin; subtask->parent_components.erase(i_begin); e_cal_client_get_objects_for_uid(subtask->client, id.c_str(), subtask->cancellable.get(), (GAsyncReadyCallback) fetch_detached_instances, gsubtask); } static void on_event_generated_list_ready(gpointer gsubtask) { fetch_detached_instances(nullptr, nullptr, gsubtask); } static gint sort_events_by_start_date(ECalComponent *eventA, ECalComponent *eventB) { auto start_date_a = e_cal_component_get_dtstart(eventA); auto start_date_b = e_cal_component_get_dtstart(eventB); auto icaltime_a = e_cal_component_datetime_get_value(start_date_a); auto icaltime_b = e_cal_component_datetime_get_value(start_date_b); auto time_a = i_cal_time_as_timet(icaltime_a); auto time_b = i_cal_time_as_timet(icaltime_b); if (time_a == time_b) return 0; if (time_a < time_b) return -1; return 1; } static bool is_alarm_interesting(ECalComponentAlarm *alarm) { if (alarm) { auto action = e_cal_component_alarm_get_action(alarm); if ((action == E_CAL_COMPONENT_ALARM_AUDIO) || (action == E_CAL_COMPONENT_ALARM_DISPLAY)) { return true; } } return false; } // we only care about AUDIO or DISPLAY alarms, other kind of alarm will not generate a notification static bool event_has_valid_alarms(ECalComponent *event) { if (!e_cal_component_has_alarms(event)) return false; // check alarms bool valid = false; auto uids = e_cal_component_get_alarm_uids(event); for (auto l=uids; l!=nullptr; l=uids->next) { auto auid = static_cast(l->data); auto alarm = e_cal_component_get_alarm(event, auid); valid = is_alarm_interesting(alarm); if (valid) { break; } } g_slist_free_full(uids, g_free); return valid; } static void on_event_fetch_list_done(gpointer gsubtask) { auto subtask = static_cast(gsubtask); // generate alarms constexpr std::array omit = { (ECalComponentAlarmAction)-1 }; // list of action types to omit, terminated with -1 GSList * comp_alarms = nullptr; // we do not need translate tz for instance events, // they are aredy in the correct time e_cal_util_generate_alarms_for_list( subtask->instance_components, subtask->task->begin.to_unix(), subtask->task->end.to_unix(), const_cast(omit.data()), &comp_alarms, e_cal_client_tzlookup_cb, subtask->client, nullptr); // convert timezone for non-instance events e_cal_util_generate_alarms_for_list( subtask->components, subtask->task->begin.to_unix(), subtask->task->end.to_unix(), const_cast(omit.data()), &comp_alarms, e_cal_client_tzlookup_cb, subtask->client, subtask->task->default_timezone); // walk the alarms & add them for (auto l=comp_alarms; l!=nullptr; l=l->next) add_alarms_to_subtask(static_cast(l->data), subtask, subtask->task->gtz); subtask->components = g_list_concat(subtask->components, subtask->instance_components); subtask->components = g_list_sort(subtask->components, (GCompareFunc) sort_events_by_start_date); // add events without alarm for (auto l=subtask->components; l!=nullptr; l=l->next) { auto component = static_cast(l->data); if (!event_has_valid_alarms(component)) add_event_to_subtask(component, subtask, subtask->task->gtz); } g_list_free_full(subtask->components, g_object_unref); g_slist_free_full(comp_alarms, e_cal_component_alarms_free); delete subtask; } static GTimeZone * timezone_from_name (const char * tzid, ECalClient * client, GCancellable * cancellable, ICalTimezone **itimezone) { if (tzid == nullptr) return nullptr; auto itz = i_cal_timezone_get_builtin_timezone_from_tzid(tzid); // usually works if (itz == nullptr) // fallback itz = i_cal_timezone_get_builtin_timezone(tzid); if (client && (itz == nullptr)) // ok we have a strange tzid... ask EDS to look it up in VTIMEZONES e_cal_client_get_timezone_sync(client, tzid, &itz, cancellable, nullptr); const char* identifier {}; if (itimezone) *itimezone = itz; if (itz != nullptr) { identifier = i_cal_timezone_get_display_name(itz); if (identifier == nullptr) identifier = i_cal_timezone_get_location(itz); } // handle the TZID /freeassociation.sourceforge.net/Tzfile/[Location] case if (identifier != nullptr) { const char* pch; const char* key = "/freeassociation.sourceforge.net/"; if ((pch = strstr(identifier, key))) { identifier = pch + strlen(key); key = "Tzfile/"; // some don't have this, so check for it separately if ((pch = strstr(identifier, key))) identifier = pch + strlen(key); } } if (identifier == nullptr) g_warning("Unrecognized TZID: '%s'", tzid); else { #if GLIB_CHECK_VERSION(2, 68, 0) auto pZone = g_time_zone_new_identifier(identifier); if (pZone == NULL) { pZone = g_time_zone_new_utc(); } #else auto pZone = g_time_zone_new(identifier); #endif return pZone; } return nullptr; } static DateTime datetime_from_component_date_time(ECalClient * client, std::shared_ptr & cancellable, const ECalComponentDateTime * in, GTimeZone * default_timezone) { DateTime out; if (in == nullptr) return out; auto value = e_cal_component_datetime_get_value(in); if (value == nullptr) return out; auto tz = i_cal_time_get_timezone (value); GTimeZone * gtz = timezone_from_name(i_cal_timezone_get_tzid (tz), client, cancellable.get(), nullptr); if (gtz == nullptr) gtz = g_time_zone_ref(default_timezone); out = DateTime(gtz, i_cal_time_get_year(value), i_cal_time_get_month(value), i_cal_time_get_day(value), i_cal_time_get_hour(value), i_cal_time_get_minute(value), i_cal_time_get_second(value)); g_time_zone_unref(gtz); return out; } bool is_component_interesting(ECalComponent * component) { // we only want calendar events and vtodos const auto vtype = e_cal_component_get_vtype(component); if ((vtype != E_CAL_COMPONENT_EVENT) && (vtype != E_CAL_COMPONENT_TODO)) return false; // we're not interested in completed or cancelled components auto status = e_cal_component_get_status(component); if ((status == I_CAL_STATUS_COMPLETED) || (status == I_CAL_STATUS_CANCELLED)) return false; // we don't want disabled alarms bool disabled = false; GSList * categ_list = e_cal_component_get_categories_list (component); for (GSList * l=categ_list; l!=nullptr; l=l->next) { auto tag = static_cast(l->data); if (!g_strcmp0(tag, TAG_DISABLED)) disabled = true; } g_slist_free (categ_list); if (!disabled) { // we don't want not attending alarms // check if the user is part of attendee list if we found it check the status auto attendeeList = e_cal_component_get_attendees(component); for (GSList *attendeeIter=attendeeList; attendeeIter != nullptr; attendeeIter = attendeeIter->next) { ECalComponentAttendee *attendee = static_cast(attendeeIter->data); auto value = e_cal_component_attendee_get_value(attendee); if (value != nullptr) { if (strncmp(value, "mailto:", 7) == 0) { if (m_myself->isMyEmail(value+7)) { disabled = (e_cal_component_attendee_get_partstat(attendee) == I_CAL_PARTSTAT_DECLINED); break; } } } } if (attendeeList != nullptr) g_slist_free(attendeeList); } if (disabled) return false; return true; } static Appointment get_appointment(ECalClient * client, std::shared_ptr & cancellable, ECalComponent * component, GTimeZone * gtz) { Appointment baseline; // get appointment.uid const auto uid = e_cal_component_get_uid(component); if (uid != nullptr) baseline.uid = uid; // get source uid ESource *source = nullptr; g_object_get(G_OBJECT(client), "source", &source, nullptr); if (source != nullptr) { baseline.source_uid = e_source_get_uid(source); g_object_unref(source); } // get appointment.summary auto text = e_cal_component_get_summary(component); auto value = e_cal_component_text_get_value(text); if (value != nullptr) baseline.summary = value; // get appointment.begin auto eccdt_tmp = e_cal_component_get_dtstart(component); baseline.begin = datetime_from_component_date_time(client, cancellable, eccdt_tmp, gtz); e_cal_component_datetime_free(eccdt_tmp); // get appointment.end eccdt_tmp = e_cal_component_get_dtend(component); if (eccdt_tmp != nullptr) { auto dt_value = e_cal_component_datetime_get_value(eccdt_tmp); baseline.end = dt_value != nullptr ? datetime_from_component_date_time(client, cancellable, eccdt_tmp, gtz) : baseline.begin; } else { baseline.end = baseline.begin; } g_clear_pointer (&eccdt_tmp, e_cal_component_datetime_free); // get appointment.type baseline.type = Appointment::EVENT; auto icc = e_cal_component_get_icalcomponent(component); // icc owned by component auto categ_list = e_cal_component_get_categories_list (component); for (GSList * l=categ_list; l!=nullptr; l=l->next) { auto tag = static_cast(l->data); if (!g_strcmp0(tag, TAG_ALARM)) baseline.type = Appointment::ALARM; } g_slist_free_full(categ_list, g_free); // Get the colour - we might need this override in the future /*if (icc) { ECalComponentPropertyBag *pBag = e_cal_component_property_bag_new_from_component (icc, NULL, NULL); if (pBag) { guint nProperties = e_cal_component_property_bag_get_count (pBag); for (guint nProperty = 0; nProperty < nProperties; nProperty++) { ICalProperty *pProperty = e_cal_component_property_bag_get (pBag, nProperty); gchar *sName = i_cal_property_get_property_name (pProperty); gboolean bColour = !g_strcmp0 (sName, "COLOR"); if (bColour) { baseline.color = i_cal_property_get_value_as_string (pProperty); break; } } e_cal_component_property_bag_free (pBag); } }*/ g_debug("%s got appointment from %s to %s: %s", G_STRLOC, baseline.begin.format("%F %T %z").c_str(), baseline.end.format("%F %T %z").c_str(), i_cal_component_as_ical_string(icc) /* string owned by ical */); return baseline; } static void add_alarms_to_subtask(ECalComponentAlarms * comp_alarms, ClientSubtask * subtask, GTimeZone * gtz) { auto component = e_cal_component_alarms_get_component(comp_alarms); if (!subtask->task->p->is_component_interesting(component)) return; Appointment baseline = get_appointment(subtask->client, subtask->cancellable, component, gtz); baseline.color = subtask->color; /** *** Now loop through comp_alarms to get information that we need *** to build the instance appointments and their alarms. *** *** Outer map key is the instance component's start + end time. *** We build Appointment.begin and .end from that. *** *** inner map key is the alarm trigger, we build Alarm.time from that. *** *** inner map value is the Alarm. *** *** We map the alarms based on their trigger time so that we *** can fold together multiple valarms that trigger for the *** same componeng at the same time. This is commonplace; *** e.g. one valarm will have a display action and another *** will specify a sound to be played. */ std::map,std::map> alarms; for (auto l=e_cal_component_alarms_get_instances(comp_alarms); l!=nullptr; l=l->next) { auto ai = static_cast(l->data); auto a = e_cal_component_get_alarm(component, e_cal_component_alarm_instance_get_uid(ai)); if (!is_alarm_interesting(a)) { continue; } auto instance_time = std::make_pair(DateTime{gtz, e_cal_component_alarm_instance_get_occur_start(ai)}, DateTime{gtz, e_cal_component_alarm_instance_get_occur_end(ai)}); auto trigger_time = DateTime{gtz, e_cal_component_alarm_instance_get_time(ai)}; auto& alarm = alarms[instance_time][trigger_time]; if (alarm.text.empty()) alarm.text = get_alarm_text(a); if (alarm.audio_url.empty()) { alarm.audio_url = get_alarm_sound_url(a, (baseline.is_alarm() ? "file://" ALARM_DEFAULT_SOUND : "file://" CALENDAR_DEFAULT_SOUND)); } if (!alarm.time.is_set()) alarm.time = trigger_time; e_cal_component_alarm_free(a); } for (auto& i : alarms) { Appointment appointment = baseline; appointment.begin = i.first.first; appointment.end = i.first.second; appointment.alarms.reserve(i.second.size()); for (auto& j : i.second) { if (j.second.has_text() || j.second.has_sound()) appointment.alarms.push_back(j.second); } subtask->task->appointments.push_back(appointment); } } static void add_event_to_subtask(ECalComponent * component, ClientSubtask * subtask, GTimeZone * gtz) { // add it. simple, eh? if (subtask->task->p->is_component_interesting(component)) { Appointment appointment = get_appointment(subtask->client, subtask->cancellable, component, gtz); appointment.color = subtask->color; subtask->task->appointments.push_back(appointment); } } /*** **** ***/ static void on_object_ready_for_disable(GObject * client, GAsyncResult * result, gpointer gself) { ICalComponent * icc = nullptr; if (e_cal_client_get_object_finish (E_CAL_CLIENT(client), result, &icc, nullptr)) { auto rrule_property = i_cal_component_get_first_property (icc, I_CAL_RRULE_PROPERTY); // transfer none auto rdate_property = i_cal_component_get_first_property (icc, I_CAL_RDATE_PROPERTY); // transfer none const bool is_nonrepeating = (rrule_property == nullptr) && (rdate_property == nullptr); if (is_nonrepeating) { g_debug("'%s' appears to be a one-time alarm... adding 'disabled' tag.", i_cal_component_as_ical_string(icc)); auto ecc = e_cal_component_new_from_icalcomponent (icc); // takes ownership of icc icc = nullptr; if (ecc != nullptr) { // add TAG_DISABLED to the list of categories auto old_categories = e_cal_component_get_categories_list(ecc); auto new_categories = g_slist_copy(old_categories); new_categories = g_slist_append(new_categories, const_cast(TAG_DISABLED)); e_cal_component_set_categories_list(ecc, new_categories); g_slist_free(new_categories); g_slist_free_full (old_categories, g_free); e_cal_client_modify_object(E_CAL_CLIENT(client), e_cal_component_get_icalcomponent(ecc), E_CAL_OBJ_MOD_THIS, E_CAL_OPERATION_FLAG_NONE, static_cast(gself)->m_cancellable.get(), on_disable_done, nullptr); g_clear_object(&ecc); } } g_clear_pointer(&icc, i_cal_component_free); } } static void on_disable_done (GObject* gclient, GAsyncResult *res, gpointer) { GError * error = nullptr; if (!e_cal_client_modify_object_finish (E_CAL_CLIENT(gclient), res, &error)) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("ayatana-indicator-datetime cannot mark one-time alarm as disabled: %s", error->message); g_error_free(error); } } /*** **** ***/ core::Signal<> m_changed; std::set m_sources; std::map m_clients; std::map m_views; std::shared_ptr m_cancellable; ESourceRegistry* m_source_registry {}; guint m_rebuild_tag {}; time_t m_rebuild_deadline {}; std::shared_ptr m_myself; }; /*** **** ***/ EdsEngine::EdsEngine(const std::shared_ptr &myself): p(new Impl(myself)) { } EdsEngine::~EdsEngine() =default; core::Signal<>& EdsEngine::changed() { return p->changed(); } void EdsEngine::get_appointments(const DateTime& begin, const DateTime& end, const Timezone& tz, std::function&)> func) { p->get_appointments(begin, end, tz, func); } void EdsEngine::disable_alarm(const Appointment& appointment) { p->disable_alarm(appointment); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/engine-mkcal.cpp0000644000000000000000000007273614773244555017536 0ustar /* * Copyright 2024-2025 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Robert Tari */ #include #include #include #include #include namespace ayatana { namespace indicator { namespace datetime { class EdsEngine::Impl { public: explicit Impl (const std::shared_ptr &myself) : pMyself (myself) { this->pMyself->emails ().changed ().connect ([this] (const std::set &) { setDirtySoon (); }); // mKCal::ExtendedStorageObserver does not work const gchar* sHome = g_get_home_dir (); gchar *sDatabase = g_strdup_printf ("%s/.local/share/system/privileged/Calendar/mkcal/db.changed", sHome); GFile *pFile = g_file_new_for_path (sDatabase); g_free (sDatabase); GError *pError = NULL; this->pMonitor = g_file_monitor_file (pFile, G_FILE_MONITOR_NONE, NULL, &pError); g_object_unref (pFile); if (!this->pMonitor) { g_warning ("Panic: Error creating file monitor: %s", pError->message); g_error_free (pError); } else { g_signal_connect (this->pMonitor, "changed", G_CALLBACK (onDatabaseChanged), this); } } ~Impl () { if (this->pMonitor) { g_object_unref (this->pMonitor); } } core::Signal<>& changed () { return this->pChanged; } void addAlarm (KCalendarCore::Alarm::Ptr pAlarm, std::map, std::map> *pAlarms, QDateTime *pTriggerTime, QTimeZone *pTimeZone, KCalendarCore::Incidence::Ptr pIncidence, bool bAlarm) { /* Loop through lAlarms to get information that we need to build the instance appointments and their alarms. Outer map key is the instance component's start + end time. We build Appointment.begin and .end from that. Inner map key is the alarm trigger, we build Alarm.time from that. Inner map value is the Alarm. We map the alarms based on their trigger time so that we can fold together multiple valarms that trigger for the same component at the same time. This is commonplace; e.g. one valarm will have a display action and another will specify a sound to be played. */ DateTime cBeginTime = datetimeFromQDateTime (pTriggerTime, pTimeZone); QDateTime cQEndTime = {}; const bool bTime = pAlarm->hasTime (); if (!bTime) { cQEndTime = *pTriggerTime; } else { cQEndTime = pAlarm->endTime (); } DateTime cEndTime = datetimeFromQDateTime (&cQEndTime, pTimeZone); auto dInstanceTime = std::make_pair (cBeginTime, cEndTime); DateTime cTriggerTime = datetimeFromQDateTime (pTriggerTime, pTimeZone); auto &cAlarm = (*pAlarms)[dInstanceTime][cTriggerTime]; bool bTextEmpty = cAlarm.text.empty (); if (bTextEmpty) { const KCalendarCore::Alarm::Type eType = pAlarm->type (); if (eType == KCalendarCore::Alarm::Type::Display) { const QString sText = pAlarm->text (); bool bEmpty = sText.isEmpty (); if (!bEmpty) { cAlarm.text = sText.toStdString (); } } } bool bAudioEmpty = cAlarm.audio_url.empty (); if (bAudioEmpty) { QString sUri = {}; const KCalendarCore::Alarm::Type eType = pAlarm->type (); if (eType == KCalendarCore::Alarm::Type::Audio) { const QString sFile = pAlarm->audioFile (); bool bEmpty = sFile.isEmpty (); if (bEmpty) { cAlarm.audio_url = bAlarm ? "file://" ALARM_DEFAULT_SOUND : "file://" CALENDAR_DEFAULT_SOUND; } else { cAlarm.audio_url = sFile.toStdString (); } } } bool bTimeSet = cAlarm.time.is_set (); if (!bTimeSet) { cAlarm.time = cTriggerTime; } } void getAppointments (const QDateTime *pDateTimeBegin, const QDateTime *pDateTimeEnd, QTimeZone *pTimezone, std::function&)> pOnAppointments) { qDebug () << "Getting all appointments from " << *pDateTimeBegin << " to " << *pDateTimeEnd; const QDate cDateBegin = pDateTimeBegin->date (); const QDate cDateEnd = pDateTimeEnd->date (); // Load the incidences QTimeZone cSystemTimeZone = QTimeZone::systemTimeZone (); mKCal::ExtendedCalendar *pCalendar = new mKCal::ExtendedCalendar (cSystemTimeZone); mKCal::ExtendedCalendar::Ptr pCalendarPtr = mKCal::ExtendedCalendar::Ptr (pCalendar); mKCal::ExtendedStorage::Ptr pStoragePtr = mKCal::ExtendedCalendar::defaultStorage (pCalendarPtr); pStoragePtr->open (); pStoragePtr->load (cDateBegin, cDateEnd); // Get the notebooks mKCal::Notebook::List lNotebooks = pStoragePtr->notebooks (); std::map dNotebooks; for (mKCal::Notebook::Ptr pNotebook : lNotebooks) { QString sUid = pNotebook->uid (); dNotebooks[sUid] = pNotebook; } std::vector lAppointments; KCalendarCore::Incidence::List lIncidences = pCalendarPtr->incidences (); std::sort (lIncidences.begin (), lIncidences.end (), [](const KCalendarCore::Incidence::Ptr &pIncidence1, const KCalendarCore::Incidence::Ptr &pIncidence2) { return (pIncidence1->dtStart () < pIncidence2->dtStart ()); }); // Walk through the incidences to build the appointment list for (KCalendarCore::Incidence::Ptr pIncidence : lIncidences) { QString sCalendar = pCalendarPtr->notebook (pIncidence); bool bAlarm = dNotebooks[sCalendar]->name () == "Alarms"; const QString sUid = pIncidence->uid (); bool bEmpty = sUid.isEmpty (); if (bEmpty == false) { bool bIncidenceInteresting = isIncidenceInteresting (pIncidence); if (bIncidenceInteresting) { const QString sColor = dNotebooks[sCalendar]->color (); std::string sColorStd = sColor.toStdString (); Appointment cAppointment = getAppointment (pIncidence, pTimezone, bAlarm, sColorStd); Appointment *pAppointment = nullptr; if (!bAlarm) { // Walk the recurrences and add them const KCalendarCore::Recurrence *pRecurrence = pIncidence->recurrence (); const bool bRecurs = pRecurrence->recurs (); if (bRecurs) { QDateTime cRecurrenceStart = pRecurrence->getNextDateTime (*pDateTimeBegin); bool bRecurrenceValid = cRecurrenceStart.isValid (); while (bRecurrenceValid && cRecurrenceStart <= *pDateTimeEnd) { Appointment cRecurringAppointment = cAppointment; cRecurringAppointment.begin = datetimeFromQDateTime (&cRecurrenceStart, pTimezone); /*const int64_t nAppointmentEnd = cRecurringAppointment.end.to_unix (); QDateTime cRecurrenceEnd = QDateTime::fromSecsSinceEpoch (nAppointmentEnd); const qint64 nRecurrenceStart = cRecurrenceStart.toSecsSinceEpoch (); QDateTime cIncidenceStart = pIncidence->dtStart (); const qint64 nIncidenceStart = cIncidenceStart.toSecsSinceEpoch (); cRecurrenceEnd = cRecurrenceEnd.addSecs (nRecurrenceStart - nIncidenceStart);*/ const QDateTime cRecurrenceEnd = pIncidence->endDateForStart (cRecurrenceStart); cRecurringAppointment.end = datetimeFromQDateTime (&cRecurrenceEnd, pTimezone); lAppointments.push_back (cRecurringAppointment); qDebug () << "Recurrence from " << cRecurringAppointment.begin.format ("%F %T %z").c_str () << " to " << cRecurringAppointment.end.format ("%F %T %z").c_str () << ":" << cRecurringAppointment.summary.c_str (); cRecurrenceStart = pRecurrence->getNextDateTime (cRecurrenceStart); bRecurrenceValid = cRecurrenceStart.isValid (); } } else { lAppointments.push_back (cAppointment); qDebug () << "Event from " << cAppointment.begin.format ("%F %T %z").c_str () << " to " << cAppointment.end.format ("%F %T %z").c_str () << ":" << cAppointment.summary.c_str (); } pAppointment = &lAppointments.back (); } // Generate alarms KCalendarCore::Alarm::List lAlarms = pIncidence->alarms (); std::map, std::map> dAlarms; // Walk the alarms and add them for (KCalendarCore::Alarm::Ptr pAlarm : lAlarms) { // we only care about AUDIO or DISPLAY alarms, other kind of alarm will not generate a notification bool bAlarmInteresting = isAlarmInteresting (pAlarm); if (bAlarmInteresting) { const int nRepeat = pAlarm->repeatCount (); const KCalendarCore::Duration cSnoozeTime = pAlarm->snoozeTime (); const KCalendarCore::Duration cStartOffset = pAlarm->startOffset (); const int nStartOffset = cStartOffset.asSeconds (); if (nRepeat && cSnoozeTime) { const int nSnoozeTime = cSnoozeTime.asSeconds (); for (int nIter = 0; nIter < nRepeat + 1; nIter++) { QDateTime cStartDateTime = pIncidence->dtStart (); QDateTime cTriggerTime = cStartDateTime.addSecs (nStartOffset + (nIter * nSnoozeTime)); const Qt::TimeSpec cTimeSpec = cTriggerTime.timeSpec (); if (cTimeSpec != Qt::LocalTime) { cTriggerTime = cTriggerTime.toTimeZone (*pTimezone); } this->addAlarm (pAlarm, &dAlarms, &cTriggerTime, pTimezone, pIncidence, bAlarm); } } else { QDateTime cTriggerTime = (*pDateTimeBegin).addSecs (nStartOffset); cTriggerTime = pAlarm->nextRepetition (cTriggerTime); bool bValid = cTriggerTime.isValid (); while (bValid && cTriggerTime <= *pDateTimeEnd) { const Qt::TimeSpec cTimeSpec = cTriggerTime.timeSpec (); if (cTimeSpec != Qt::LocalTime) { cTriggerTime = cTriggerTime.toTimeZone (*pTimezone); } this->addAlarm (pAlarm, &dAlarms, &cTriggerTime, pTimezone, pIncidence, bAlarm); cTriggerTime = pAlarm->nextRepetition (cTriggerTime); bValid = cTriggerTime.isValid (); } } } } for (auto &cAlarm : dAlarms) { if (bAlarm) { pAppointment = new Appointment (cAppointment); pAppointment->begin = cAlarm.first.first; pAppointment->end = cAlarm.first.second; } int nAlarms = cAlarm.second.size (); pAppointment->alarms.reserve (nAlarms); for (auto &cAlarmSecond : cAlarm.second) { bool bText = cAlarmSecond.second.has_text (); bool bSound = cAlarmSecond.second.has_sound (); if (bText || bSound) { pAppointment->alarms.push_back (cAlarmSecond.second); qDebug () << "Alarm at " << cAlarmSecond.second.time.format ("%F %T %z").c_str (); } } if (bAlarm) { lAppointments.push_back (*pAppointment); qDebug () << "Alarm from " << (*pAppointment).begin.format ("%F %T %z").c_str () << " to " << (*pAppointment).end.format ("%F %T %z").c_str () << ":" << (*pAppointment).summary.c_str (); delete pAppointment; } } } } else { qWarning () << "Panic: incidence has no UID" << pIncidence; } } // Give the caller the sorted finished product auto &pAppointments = lAppointments; std::sort (pAppointments.begin (), pAppointments.end (), [](const Appointment &pAppointment1, const Appointment &pAppointment2){return pAppointment1.begin < pAppointment2.begin;}); pOnAppointments (pAppointments); qDebug () << "Returning appointments: " << lAppointments.size (); pStoragePtr.clear (); } private: static void onDatabaseChanged (GFileMonitor *pMonitor, GFile *pFile, GFile *OtherFile, GFileMonitorEvent eEvent, gpointer pData) { auto pSelf = static_cast (pData); if (eEvent == G_FILE_MONITOR_EVENT_CHANGED) { pSelf->setDirtySoon (); } } void setDirtyNow () { this->pChanged (); } static gboolean setDirtyNowStatic (gpointer pSelfPtr) { auto pSelf = static_cast (pSelfPtr); pSelf->nRebuildTag = 0; pSelf->nRebuildDeadline = 0; pSelf->setDirtyNow (); return G_SOURCE_REMOVE; } void setDirtySoon () { static constexpr int MIN_BATCH_SEC = 1; static constexpr int MAX_BATCH_SEC = 60; static_assert (MIN_BATCH_SEC <= MAX_BATCH_SEC, "bad boundaries"); const auto nNow = time (nullptr); // First pass if (this->nRebuildDeadline == 0) { this->nRebuildDeadline = nNow + MAX_BATCH_SEC; this->nRebuildTag = g_timeout_add_seconds (MIN_BATCH_SEC, setDirtyNowStatic, this); } else if (nNow < this->nRebuildDeadline) { g_source_remove (this->nRebuildTag); this->nRebuildTag = g_timeout_add_seconds (MIN_BATCH_SEC, setDirtyNowStatic, this); } } static bool isAlarmInteresting (KCalendarCore::Alarm::Ptr pAlarm) { const KCalendarCore::Alarm::Type eType = pAlarm->type (); if ((eType == KCalendarCore::Alarm::Type::Audio) || (eType == KCalendarCore::Alarm::Type::Display)) { // We don't want disabled alarms const bool bEnabled = pAlarm->enabled (); return bEnabled; } return false; } static DateTime datetimeFromQDateTime (const QDateTime *pDateTime, QTimeZone *pTimeZone) { DateTime cDateTimeOut = {}; bool bValid = pDateTime->isValid (); if (!bValid) { return cDateTimeOut; } const QByteArray sId = pTimeZone->id (); const char *sIdData = sId.constData (); GTimeZone *pGTimeZone = g_time_zone_new_identifier (sIdData); const QDate cDate = pDateTime->date (); const QTime cTime = pDateTime->time (); const int nYear = cDate.year (); const int nMonth = cDate.month (); const int nDay = cDate.day (); const int nHour = cTime.hour (); const int nMinute = cTime.minute (); const int nSecond = cTime.second (); cDateTimeOut = DateTime (pGTimeZone, nYear, nMonth, nDay, nHour, nMinute, nSecond); g_time_zone_unref (pGTimeZone); return cDateTimeOut; } bool isIncidenceInteresting (KCalendarCore::Incidence::Ptr pIncidence) { // We only want calendar events and todos const KCalendarCore::IncidenceBase::IncidenceType eType = pIncidence->type (); if ((eType != KCalendarCore::IncidenceBase::IncidenceType::TypeEvent) && (eType != KCalendarCore::IncidenceBase::IncidenceType::TypeTodo)) { return false; } // We're not interested in completed or cancelled incidences const KCalendarCore::Incidence::Status eIncidenceStatus = pIncidence->status (); if ((eIncidenceStatus == KCalendarCore::Incidence::Status::StatusCompleted) || (eIncidenceStatus == KCalendarCore::Incidence::Status::StatusCanceled)) { return false; } // We don't want not attending alarms const KCalendarCore::Attendee::List lAttendees = pIncidence->attendees (); for (KCalendarCore::Attendee cAttendee : lAttendees) { const QString sEmail = cAttendee.email (); const std::string sEmailStd = sEmail.toStdString (); bool bMyEmail = this->pMyself->isMyEmail (sEmailStd); // Check if the user is part of the attendee list if (bMyEmail) { // Check the status const KCalendarCore::Attendee::PartStat eAttendeeStatus = cAttendee.status (); bool bDeclined = (eAttendeeStatus == KCalendarCore::Attendee::PartStat::Declined); return !bDeclined; } } return true; } static Appointment getAppointment (KCalendarCore::Incidence::Ptr pIncidence, QTimeZone *pTimeZone, bool bAlarm, std::string sColor) { Appointment cAppointment; // Get Appointment.uid const QString sUid = pIncidence->uid (); cAppointment.uid = sUid.toStdString (); // Get Appointment.summary const QString sSummary = pIncidence->summary (); cAppointment.summary = sSummary.toStdString (); // Get Appointment.begin QDateTime cBegin = pIncidence->dtStart (); const Qt::TimeSpec cTimeSpecBegin = cBegin.timeSpec (); if (cTimeSpecBegin != Qt::LocalTime) { cBegin = cBegin.toTimeZone (*pTimeZone); } cAppointment.begin = datetimeFromQDateTime (&cBegin, pTimeZone); // Get Appointment.end QDateTime cEnd = {}; const KCalendarCore::IncidenceBase::IncidenceType eType = pIncidence->type (); if (eType == KCalendarCore::IncidenceBase::IncidenceType::TypeEvent) { KCalendarCore::Event::Ptr pEvent = qSharedPointerCast (pIncidence); cEnd = pEvent->dtEnd (); const Qt::TimeSpec cTimeSpecEnd = cEnd.timeSpec (); if (cTimeSpecEnd != Qt::LocalTime) { cEnd = cEnd.toTimeZone (*pTimeZone); } // Check for all day event bool bHasEndDate = pEvent->hasEndDate (); bool bAllDay = pIncidence->allDay (); if (!bHasEndDate && bAllDay) { cEnd = cBegin.addDays (1); } } const bool bValid = cEnd.isValid (); if (bValid) { cAppointment.end = datetimeFromQDateTime (&cEnd, pTimeZone); } else { cAppointment.end = cAppointment.begin; } // Get Appointment.type if (bAlarm) { cAppointment.type = Appointment::ALARM; } else { cAppointment.type = Appointment::EVENT; } // Get Appointment.color cAppointment.color = sColor; return cAppointment; } core::Signal<> pChanged; guint nRebuildTag {}; time_t nRebuildDeadline {}; std::shared_ptr pMyself; GFileMonitor *pMonitor; }; EdsEngine::EdsEngine (const std::shared_ptr &myself): p (new Impl (myself)) { } EdsEngine::~EdsEngine () = default; core::Signal<>& EdsEngine::changed () { return this->p->changed (); } void EdsEngine::get_appointments (const DateTime &pDateTimeBegin, const DateTime &pDateTimeEnd, const Timezone &pTimezone, std::function&)> pFunc) { qint64 nDateTimeBegin = pDateTimeBegin.to_unix (); QDateTime cDateTimeBegin = QDateTime::fromSecsSinceEpoch (nDateTimeBegin, Qt::UTC); qint64 nDateTimeEnd = pDateTimeEnd.to_unix (); QDateTime cDateTimeEnd = QDateTime::fromSecsSinceEpoch (nDateTimeEnd, Qt::UTC); QTimeZone cTimeZone = QTimeZone (); std::string sTimeZone = pTimezone.timezone.get (); const char *sTimeZoneData = sTimeZone.c_str (); QTimeZone cTimezone = QTimeZone (sTimeZoneData); this->p->getAppointments (&cDateTimeBegin, &cDateTimeEnd, &cTimezone, pFunc); } void EdsEngine::disable_alarm (const Appointment &pAppointment) { bool bAlarm = pAppointment.is_alarm (); if (bAlarm) { QTimeZone cSystemTimeZone = QTimeZone::systemTimeZone (); mKCal::ExtendedCalendar *pCalendar = new mKCal::ExtendedCalendar (cSystemTimeZone); mKCal::ExtendedCalendar::Ptr pCalendarPtr = mKCal::ExtendedCalendar::Ptr (pCalendar); mKCal::ExtendedStorage::Ptr pStoragePtr = mKCal::ExtendedCalendar::defaultStorage (pCalendarPtr); pStoragePtr->open (); const char *sUid = pAppointment.uid.c_str (); pStoragePtr->load (sUid); KCalendarCore::Incidence::List lIncidences = pCalendarPtr->incidences (); bool bChanged = false; for (KCalendarCore::Incidence::Ptr pIncidence : lIncidences) { KCalendarCore::Alarm::List lAlarms = pIncidence->alarms (); for (KCalendarCore::Alarm::Ptr pAlarm : lAlarms) { const bool bEnabled = pAlarm->enabled (); if (bEnabled) { pAlarm->setEnabled (false); bChanged = true; } } } if (bChanged) { pStoragePtr->save (); } pStoragePtr.clear (); } } } } } ayatana-indicator-datetime-25.4.0/src/exporter.cpp0000644000000000000000000001727314773244555017047 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include "dbus-alarm-properties.h" #include #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class Exporter::Impl { public: explicit Impl(const std::shared_ptr& settings): m_settings(settings), m_alarm_props(datetime_alarm_properties_skeleton_new()) { alarm_properties_init(); } ~Impl() { if (m_bus != nullptr) { for(auto& id : m_exported_menu_ids) g_dbus_connection_unexport_menu_model(m_bus, id); if (m_exported_actions_id) g_dbus_connection_unexport_action_group(m_bus, m_exported_actions_id); } g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(m_alarm_props)); g_clear_object(&m_alarm_props); if (m_own_id) g_bus_unown_name(m_own_id); g_clear_object(&m_bus); } core::Signal<> name_lost; void publish(const std::shared_ptr& actions, const std::vector>& menus) { m_actions = actions; m_menus = menus; m_own_id = g_bus_own_name(G_BUS_TYPE_SESSION, BUS_DATETIME_NAME, G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT, on_bus_acquired, nullptr, on_name_lost, this, nullptr); } private: /*** **** ***/ static void on_gobject_notify_string(GObject* o, GParamSpec* pspec, gpointer p) { gchar* val = nullptr; g_object_get (o, pspec->name, &val, nullptr); static_cast*>(p)->set(val); g_free(val); } void bind_string_property(gpointer o, const char* propname, core::Property& p) { // initialize the GObject property from the Settings g_object_set(o, propname, p.get().c_str(), nullptr); // when the GObject changes, update the Settings const std::string notify_propname = std::string("notify::") + propname; g_signal_connect(o, notify_propname.c_str(), G_CALLBACK(on_gobject_notify_string), &p); // when the Settings changes, update the GObject p.changed().connect([o, propname](const std::string& val){ g_object_set(o, propname, val.c_str(), nullptr); }); } static void on_gobject_notify_uint(GObject* o, GParamSpec* pspec, gpointer p) { uint val = 0; g_object_get (o, pspec->name, &val, nullptr); static_cast*>(p)->set(val); } void bind_uint_property(gpointer o, const char* propname, core::Property& p) { // initialize the GObject property from the Settings g_object_set(o, propname, p.get(), nullptr); // when the GObject changes, update the Settings const std::string notify_propname = std::string("notify::") + propname; g_signal_connect(o, notify_propname.c_str(), G_CALLBACK(on_gobject_notify_uint), &p); // when the Settings changes, update the GObject p.changed().connect([o, propname](unsigned int val){ g_object_set(o, propname, val, nullptr); }); } void alarm_properties_init() { bind_uint_property(m_alarm_props, "duration", m_settings->alarm_duration); bind_uint_property(m_alarm_props, "default-volume", m_settings->alarm_volume); bind_string_property(m_alarm_props, "default-sound", m_settings->alarm_sound); bind_string_property(m_alarm_props, "haptic-feedback", m_settings->alarm_haptic); bind_uint_property(m_alarm_props, "snooze-duration", m_settings->snooze_duration); } /*** **** ***/ static void on_bus_acquired(GDBusConnection* connection, const gchar* name, gpointer gthis) { g_debug("bus acquired: %s", name); static_cast(gthis)->on_bus_acquired(connection, name); } void on_bus_acquired(GDBusConnection* bus, const gchar* /*name*/) { m_bus = static_cast(g_object_ref(bus)); // export the alarm properties GError * error = nullptr; g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(m_alarm_props), m_bus, BUS_DATETIME_PATH"/AlarmProperties", &error); // export the actions const auto id = g_dbus_connection_export_action_group(m_bus, BUS_DATETIME_PATH, m_actions->action_group(), &error); if (id) { m_exported_actions_id = id; } else { g_warning("cannot export action group: %s", error->message); g_clear_error(&error); } // export the menus for(auto& menu : m_menus) { const auto path = std::string(BUS_DATETIME_PATH) + "/" + menu->name(); const auto nId = g_dbus_connection_export_menu_model(m_bus, path.c_str(), menu->menu_model(), &error); if (nId) { m_exported_menu_ids.insert(nId); } else { if (error != nullptr) g_warning("cannot export %s menu: %s", menu->name().c_str(), error->message); g_clear_error(&error); } } } /*** **** ***/ static void on_name_lost(GDBusConnection*, const gchar* name, gpointer gthis) { g_debug("name lost: %s", name); static_cast(gthis)->name_lost(); } /*** **** ***/ std::shared_ptr m_settings; std::set m_exported_menu_ids; guint m_own_id = 0; guint m_exported_actions_id = 0; GDBusConnection* m_bus = nullptr; std::shared_ptr m_actions; std::vector> m_menus; DatetimeAlarmProperties* m_alarm_props = nullptr; }; /*** **** ***/ Exporter::Exporter(const std::shared_ptr& settings): p(new Impl(settings)) { } Exporter::~Exporter() { } core::Signal<>& Exporter::name_lost() { return p->name_lost; } void Exporter::publish(const std::shared_ptr& actions, const std::vector>& menus) { p->publish(actions, menus); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/formatter.cpp0000644000000000000000000001656314773244555017203 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include #include #include // T_() #include #include #include // setlocale() #include // nl_langinfo() #include // strstr() namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ namespace { void clear_timer(guint& tag) { if (tag) { g_source_remove(tag); tag = 0; } } gint calculate_milliseconds_until_next_second(const DateTime& now) { gint interval_usec; guint interval_msec; interval_usec = G_USEC_PER_SEC - g_date_time_get_microsecond(now.get()); interval_msec = (interval_usec + 999) / 1000; return interval_msec; } /* * We periodically rebuild the sections that have time format strings * that are dependent on the current time: * * 1. appointment menuitems' time format strings depend on the * current time; for example, they don't show the day of week * if the appointment is today. * * 2. location menuitems' time format strings depend on the * current time; for example, they don't show the day of the week * if the local date and location date are the same. * * 3. the "local date" menuitem in the calendar section is, * obviously, dependent on the local time. * * In short, we want to update whenever the number of days between two zone * might have changed. We do that by updating when either zone's day changes. * * Since not all UTC offsets are evenly divisible by hours * (examples: Newfoundland UTC-03:30, Nepal UTC+05:45), refreshing on the hour * is not enough. We need to refresh at HH:00, HH:15, HH:30, and HH:45. */ guint calculate_seconds_until_next_fifteen_minutes(GDateTime * now) { char * str; gint minute; guint seconds; GTimeSpan diff; GDateTime * next; GDateTime * start_of_next; minute = g_date_time_get_minute(now); minute = 15 - (minute % 15); next = g_date_time_add_minutes(now, minute); start_of_next = g_date_time_new_local(g_date_time_get_year(next), g_date_time_get_month(next), g_date_time_get_day_of_month(next), g_date_time_get_hour(next), g_date_time_get_minute(next), 0.1); str = g_date_time_format(start_of_next, "%F %T"); g_debug("%s %s the next timestamp rebuild will be at %s", G_STRLOC, G_STRFUNC, str); g_free(str); diff = g_date_time_difference(start_of_next, now); seconds = (diff + (G_TIME_SPAN_SECOND-1)) / G_TIME_SPAN_SECOND; g_date_time_unref(start_of_next); g_date_time_unref(next); return seconds; } } // unnamed namespace class Formatter::Impl { public: Impl(Formatter* owner, const std::shared_ptr& clock): m_owner(owner), m_clock(clock) { m_owner->header_format.changed().connect([this](const std::string& /*fmt*/){update_header();}); m_clock->minute_changed.connect([this](){update_header();}); update_header(); restartRelativeTimer(); } ~Impl() { clear_timer(m_header_seconds_timer); clear_timer(m_relative_timer); } private: static bool format_shows_seconds(const std::string& fmt) { return (fmt.find("%s") != std::string::npos) || (fmt.find("%S") != std::string::npos) || (fmt.find("%T") != std::string::npos) || (fmt.find("%X") != std::string::npos) || (fmt.find("%c") != std::string::npos); } void update_header() { // update the header property const auto fmt = m_owner->header_format.get(); const auto str = m_clock->localtime().format(fmt); m_owner->header.set(str); // if the header needs to show seconds, set a timer. if (format_shows_seconds(fmt)) start_header_timer(); else clear_timer(m_header_seconds_timer); } // we've got a header format that shows seconds, // so we need to update it every second void start_header_timer() { clear_timer(m_header_seconds_timer); const auto now = m_clock->localtime(); auto interval_msec = calculate_milliseconds_until_next_second(now); interval_msec += 50; // add a small margin to ensure the callback // fires /after/ next is reached m_header_seconds_timer = g_timeout_add_full(G_PRIORITY_HIGH, interval_msec, on_header_timer, this, nullptr); } static gboolean on_header_timer(gpointer gself) { static_cast(gself)->update_header(); return G_SOURCE_REMOVE; } private: void restartRelativeTimer() { clear_timer(m_relative_timer); const auto now = m_clock->localtime(); const auto seconds = calculate_seconds_until_next_fifteen_minutes(now.get()); m_relative_timer = g_timeout_add_seconds(seconds, onRelativeTimer, this); } static gboolean onRelativeTimer(gpointer gself) { auto self = static_cast(gself); self->m_owner->relative_format_changed(); self->restartRelativeTimer(); return G_SOURCE_REMOVE; } private: Formatter* const m_owner; guint m_header_seconds_timer = 0; guint m_relative_timer = 0; public: std::shared_ptr m_clock; }; /*** **** ***/ Formatter::Formatter(const std::shared_ptr& clock): p(new Formatter::Impl(this, clock)) { } Formatter::~Formatter() { } const char* Formatter::default_header_time_format(bool twelvehour, bool show_seconds) { const char* fmt; if (twelvehour && show_seconds) /* TRANSLATORS: a strftime(3) format for 12hr time w/seconds */ fmt = T_("%l:%M:%S %p"); else if (twelvehour) /* TRANSLATORS: a strftime(3) format for 12hr time */ fmt = T_("%l:%M %p"); else if (show_seconds) /* TRANSLATORS: a strftime(3) format for 24hr time w/seconds */ fmt = T_("%H:%M:%S"); else /* TRANSLATORS: a strftime(3) format for 24hr time */ fmt = T_("%H:%M"); return fmt; } /*** **** ***/ std::string Formatter::relative_format(GDateTime* then_begin, GDateTime* then_end) const { auto cstr = generate_full_format_string_at_time (p->m_clock->localtime().get(), then_begin, then_end); const std::string ret = cstr; g_free (cstr); return ret; } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/formatter-desktop.cpp0000644000000000000000000001444414773244555020646 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include #include // T_() namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ namespace { std::string joinDateAndTimeFormatStrings(const char* date_string, const char* time_string) { std::string str; if (date_string && time_string) { str = date_string; str += "\u2003"; str += time_string; } else if (date_string) { str = date_string; } else // time_string { str = time_string; } return str; } } // unnamed namespace /*** **** ***/ DesktopFormatter::DesktopFormatter(const std::shared_ptr& clock_in, const std::shared_ptr& settings_in): Formatter(clock_in), m_settings(settings_in) { m_settings->show_day.changed().connect([this](bool){rebuildHeaderFormat();}); m_settings->show_date.changed().connect([this](bool){rebuildHeaderFormat();}); m_settings->show_year.changed().connect([this](bool){rebuildHeaderFormat();}); m_settings->show_seconds.changed().connect([this](bool){rebuildHeaderFormat();}); m_settings->time_format_mode.changed().connect([this](TimeFormatMode){rebuildHeaderFormat();}); m_settings->custom_time_format.changed().connect([this](const std::string&){rebuildHeaderFormat();}); rebuildHeaderFormat(); } void DesktopFormatter::rebuildHeaderFormat() { header_format.set(getHeaderLabelFormatString()); } std::string DesktopFormatter::getHeaderLabelFormatString() const { std::string fmt; const auto mode = m_settings->time_format_mode.get(); if (mode == TIME_FORMAT_MODE_CUSTOM) { fmt = m_settings->custom_time_format.get(); } else { const auto show_day = m_settings->show_day.get(); const auto show_date = m_settings->show_date.get(); const auto show_year = show_date && m_settings->show_year.get(); const auto date_fmt = getDateFormat(show_day, show_date, show_year); const auto time_fmt = getFullTimeFormatString(); fmt = joinDateAndTimeFormatStrings(date_fmt, time_fmt); } return fmt; } const gchar* DesktopFormatter::getFullTimeFormatString() const { const auto show_seconds = m_settings->show_seconds.get(); bool twelvehour; switch (m_settings->time_format_mode.get()) { case TIME_FORMAT_MODE_LOCALE_DEFAULT: twelvehour = is_locale_12h(); break; case TIME_FORMAT_MODE_24_HOUR: twelvehour = false; break; default: twelvehour = true; break; } return default_header_time_format(twelvehour, show_seconds); } const gchar* DesktopFormatter::getDateFormat(bool show_day, bool show_date, bool show_year) const { const char * fmt; if (show_day && show_date && show_year) /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) This format string shows the abbreviated weekday, day, abbreviated month, and year. en_US example: "%a %b %e %Y" --> "Sat Oct 31 2020" en_GB example: "%a %e %b %Y" --> "Sat 31 Oct 2020" zh_CN example(?): "%Y年%m月%d日 周%a" --> "2020年10月31日 周六" */ fmt = T_("%a %b %e %Y"); else if (show_day && show_date) /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) This format string shows the abbreviated weekday, day, and abbreviated month. en_US example: "%a %b %e" --> "Sat Oct 31" en_GB example: "%a %e %b" --> "Sat 31 Oct" zh_CN example(?): "%m月%d日 周%a" --> "03月27日 周六" */ fmt = T_("%a %b %e"); else if (show_day) /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) This format string shows the abbreviated weekday. zh_CN example(?): "周%a" --> "周六" */ fmt = T_("%a"); else if (show_date && show_year) /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) This format string shows the day, abbreviated month, and year. en_US example: "%b %e %Y" --> "Oct 31 2020" en_GB example: "%e %b %Y" --> "31 Oct 2020" zh_CN example(?): "%Y年%m月%d日" --> "2020年10月31日" */ fmt = T_("%b %e %Y"); else if (show_date) /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! That will fix bug #1001595 for your locale and make the date/time in the upper-right corner of your screen look beautiful :) This format string shows the abbreviated month and day. en_US example: "%b %e" --> "Mar 27" en_GB example: "%e %b" --> "27 Mar" zh_CN example(?): "%m月%d日" --> "03月27日" */ fmt = T_("%b %e"); else if (show_year) /* This strftime(3) format string shows the year. */ fmt = T_("%Y"); else fmt = nullptr; return fmt; } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/haptic.cpp0000644000000000000000000000671514773244555016446 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021-2022 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include namespace ayatana { namespace indicator { namespace notifications { /*** **** ***/ class Haptic::Impl { public: explicit Impl(bool repeat): m_cancellable(g_cancellable_new()), m_repeat(repeat) { g_bus_get (G_BUS_TYPE_SYSTEM, m_cancellable, on_bus_ready, this); } ~Impl() { if (m_tag) g_source_remove(m_tag); g_cancellable_cancel (m_cancellable); g_object_unref (m_cancellable); g_clear_object (&m_bus); } private: static void on_bus_ready (GObject*, GAsyncResult* res, gpointer gself) { GError * error; GDBusConnection * bus; error = nullptr; bus = g_bus_get_finish (res, &error); if (error != nullptr) { if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning ("Unable to get bus: %s", error->message); g_error_free (error); } else if (bus != nullptr) { auto self = static_cast(gself); self->m_bus = G_DBUS_CONNECTION (g_object_ref (bus)); self->start_vibrating(); g_object_unref (bus); } } void start_vibrating() { g_return_if_fail (m_tag == 0); if (m_repeat) { // Set up a loop to keep repeating the pattern: one second on, one second off. m_tag = g_timeout_add(2000, call_vibrate_static, this); } call_vibrate(); } static gboolean call_vibrate_static (gpointer gself) { static_cast(gself)->call_vibrate(); return G_SOURCE_CONTINUE; } void call_vibrate() { auto duration = g_variant_new ("(i)", 1000); g_dbus_connection_call (m_bus, BUS_HAPTIC_NAME, BUS_HAPTIC_PATH, BUS_HAPTIC_INTERFACE, "vibrate", duration, nullptr, G_DBUS_CALL_FLAGS_NONE, -1, m_cancellable, nullptr, nullptr); } GCancellable * m_cancellable = nullptr; GDBusConnection * m_bus = nullptr; guint m_tag = 0; bool m_repeat = false; }; /*** **** ***/ Haptic::Haptic(bool repeat): impl(new Impl (repeat)) { } Haptic::~Haptic() { } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/locations.cpp0000644000000000000000000000337214773244555017165 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include namespace ayatana { namespace indicator { namespace datetime { const std::string& Location::zone() const { return m_zone; } const std::string& Location::name() const { return m_name; } bool Location::operator== (const Location& that) const { return (m_name == that.m_name) && (m_zone == that.m_zone) && (m_offset == that.m_offset); } Location::Location(const std::string& zone_, const std::string& name_): m_zone(zone_), m_name(name_) { #if GLIB_CHECK_VERSION(2, 68, 0) auto gzone = g_time_zone_new_identifier(zone().c_str()); if (gzone == NULL) { gzone = g_time_zone_new_utc(); } #else auto gzone = g_time_zone_new (zone().c_str()); #endif auto gtime = g_date_time_new_now (gzone); m_offset = g_date_time_get_utc_offset (gtime); g_date_time_unref (gtime); g_time_zone_unref (gzone); } } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/locations-settings.cpp0000644000000000000000000000563314773244555021025 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include // std::find() namespace ayatana { namespace indicator { namespace datetime { SettingsLocations::SettingsLocations(const std::shared_ptr& settings, const std::shared_ptr& timezones): m_settings(settings), m_timezones(timezones) { m_settings->locations.changed().connect([this](const std::vector&){reload();}); m_settings->show_locations.changed().connect([this](bool){reload();}); m_timezones->timezone.changed().connect([this](const std::string&){reload();}); m_timezones->timezones.changed().connect([this](const std::set&){reload();}); reload(); } void SettingsLocations::reload() { std::vector v; const std::string timezone_name = m_settings->timezone_name.get(); // add the primary timezone first auto zone = m_timezones->timezone.get(); if (!zone.empty()) { gchar * name = get_beautified_timezone_name(zone.c_str(), timezone_name.c_str()); Location l(zone, name); v.push_back(l); g_free(name); } // add the other detected timezones for(const auto& sZone : m_timezones->timezones.get()) { gchar * name = get_beautified_timezone_name(sZone.c_str(), timezone_name.c_str()); Location l(sZone, name); if (std::find(v.begin(), v.end(), l) == v.end()) v.push_back(l); g_free(name); } // maybe add the user-specified locations if (m_settings->show_locations.get()) { for(const auto& locstr : m_settings->locations.get()) { gchar* sZone; gchar* name; split_settings_location(locstr.c_str(), &sZone, &name); Location loc(sZone, name); if (std::find(v.begin(), v.end(), loc) == v.end()) v.push_back(loc); g_free(name); g_free(sZone); } } locations.set(v); } } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/main.cpp0000644000000000000000000001677714773244555016133 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * Authors: * Charles Kerr * Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // bindtextdomain() #include #include #include // exit() namespace ain = ayatana::indicator::notifications; using namespace ayatana::indicator::datetime; namespace { std::shared_ptr create_engine() { std::shared_ptr engine; // we don't show appointments in the greeter, // so no need to connect to EDS there... if (!g_strcmp0("lightdm", g_get_user_name())) engine.reset(new MockEngine); else engine.reset(new EdsEngine(std::shared_ptr(new Myself))); return engine; } std::shared_ptr create_state(const std::shared_ptr& engine, const std::shared_ptr& timezone_) { // create the live objects auto live_settings = std::make_shared(); auto live_timezones = std::make_shared(live_settings, timezone_); auto live_clock = std::make_shared(timezone_); // create a full-month planner currently pointing to the current month const auto now = live_clock->localtime(); auto range_planner = std::make_shared(engine, timezone_); auto calendar_month = std::make_shared(range_planner, now); // create an upcoming-events planner currently pointing to the current date range_planner = std::make_shared(engine, timezone_); auto calendar_upcoming = std::make_shared(range_planner, now); // create the state auto state = std::make_shared(); state->settings = live_settings; state->clock = live_clock; state->locations = std::make_shared(live_settings, live_timezones); state->calendar_month = calendar_month; state->calendar_upcoming = calendar_upcoming; return state; } std::shared_ptr create_simple_alarm_queue(const std::shared_ptr& clock, const std::shared_ptr& snooze_planner, const std::shared_ptr& engine, const std::shared_ptr& tz) { // create an upcoming-events planner that =always= tracks the clock's date auto range_planner = std::make_shared(engine, tz); auto upcoming_planner = std::make_shared(range_planner, clock->localtime()); clock->date_changed.connect([clock,upcoming_planner](){ const auto now = clock->localtime(); g_debug("refretching appointments due to date change: %s", now.format("%F %T").c_str()); upcoming_planner->date().set(now); }); // create an aggregate planner that folds together the above // upcoming-events planner and locally-generated snooze events std::shared_ptr planner = std::make_shared(); planner->add(upcoming_planner); planner->add(snooze_planner); auto wakeup_timer = std::make_shared(clock); return std::make_shared(clock, planner, wakeup_timer); } } int main(int /*argc*/, char** /*argv*/) { // These can be removed when https://bugzilla.gnome.org/show_bug.cgi?id=674885 is fixed g_type_ensure(G_TYPE_DBUS_CONNECTION); // http://pad.lv/1239710 g_type_ensure(G_TYPE_DBUS_PROXY); // http://pad.lv/1425297 // boilerplate i18n setlocale(LC_ALL, ""); bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); textdomain(GETTEXT_PACKAGE); // get the system bus GError* error {}; auto system_bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, &error); if (error != nullptr) { g_critical("Unable to get system bus: %s", error->message); g_clear_error(&error); return 0; } auto engine = create_engine(); auto timezone_ = std::make_shared(system_bus); auto state = create_state(engine, timezone_); auto actions = std::make_shared(state); MenuFactory factory(actions, state); // set up the snap decisions auto snooze_planner = std::make_shared(state->settings, state->clock); auto notification_engine = std::make_shared("ayatana-indicator-datetime-service"); auto sound_builder = std::make_shared(); std::unique_ptr snap (new Snap(notification_engine, sound_builder, state->settings, system_bus)); auto alarm_queue = create_simple_alarm_queue(state->clock, snooze_planner, engine, timezone_); auto on_response = [snooze_planner, actions](const Appointment& appointment, const Alarm& alarm, const Snap::Response& response) { switch(response) { case Snap::Response::Snooze: snooze_planner->add(appointment, alarm); break; case Snap::Response::ShowApp: actions->open_appointment(appointment, appointment.begin); break; case Snap::Response::None: break; } }; auto on_alarm_reached = [&engine, &snap, &on_response](const Appointment& appointment, const Alarm& alarm) { (*snap)(appointment, alarm, on_response); engine->disable_alarm(appointment); }; alarm_queue->alarm_reached().connect(on_alarm_reached); // create the menus std::vector> menus; for(int i=0, n=Menu::NUM_PROFILES; isettings); exporter.name_lost().connect([loop](){ g_message("%s exiting; failed/lost bus ownership", GETTEXT_PACKAGE); g_main_loop_quit(loop); }); exporter.publish(actions, menus); g_main_loop_run(loop); g_main_loop_unref(loop); g_clear_object(&system_bus); return 0; } ayatana-indicator-datetime-25.4.0/src/menu.cpp0000644000000000000000000006035714773244555016144 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include #include #include #include extern "C" { #include } namespace ayatana { namespace indicator { namespace datetime { /**** ***** ****/ Menu::Menu (Profile profile_in, const std::string& name_in): m_profile(profile_in), m_name(name_in) { } const std::string& Menu::name() const { return m_name; } Menu::Profile Menu::profile() const { return m_profile; } GMenuModel* Menu::menu_model() { return G_MENU_MODEL(m_menu); } /** * To avoid a giant menu on the PC, and to avoid pushing lower menu items * off-screen on the phone, the menu should show the * next five calendar events, if any. * * The list might include multiple occurrences of the same event (bug 1515821). */ std::vector Menu::get_display_appointments(const std::vector& appointments_in, const DateTime& now, unsigned int max_items, const bool include_alarms) { std::vector appointments; std::copy_if(appointments_in.begin(), appointments_in.end(), std::back_inserter(appointments), [now, include_alarms](const Appointment& a){return a.end >= now && (!a.is_alarm() || include_alarms);}); if (appointments.size() > max_items) { const auto next_minute = now.add_full(0,0,0,0,1,-now.seconds()); const auto start_of_day = now.start_of_day(); const auto end_of_day = now.end_of_day(); /* * If there are more than five, the events shown should be, in order of priority: * 1. any events that start or end (bug 1329048) after the current minute today; * 2. any full-day events that span all of today (bug 1302004); * 3. any events that start or end tomorrow; * 4. any events that start or end the day after tomorrow; and so on. */ auto compare = [next_minute, start_of_day, end_of_day]( const Appointment& a, const Appointment& b) { const bool a_later_today = (a.begin >= next_minute) || (a.end <= end_of_day); const bool b_later_today = (b.begin >= next_minute) || (b.end <= end_of_day); if (a_later_today != b_later_today) return a_later_today; const bool a_full_day_today = (a.begin <= start_of_day) && (end_of_day <= a.end); const bool b_full_day_today = (b.begin <= start_of_day) && (end_of_day <= b.end); if (a_full_day_today != b_full_day_today) return a_full_day_today; if (a.begin != b.begin) return a.begin < b.begin; if (b.end != b.end) return a.end < b.end; return false; }; std::sort(appointments.begin(), appointments.end(), compare); appointments.resize(max_items); } /* * However, the display order should be the reverse: full-day events * first (since they start first), part-day events afterward in * chronological order. If multiple events have exactly the same start+end * time, they should be sorted alphabetically. */ auto compare = [](const Appointment& a, const Appointment& b) { if (a.begin != b.begin) return a.begin < b.begin; if (a.end != b.end) return a.end < b.end; return a.summary < b.summary; }; std::sort(appointments.begin(), appointments.end(), compare); return appointments; } /**** ***** ****/ #define ALARM_ICON_NAME "alarm-clock" #define CALENDAR_ICON_NAME "calendar" class MenuImpl: public Menu { protected: MenuImpl(const Menu::Profile profile_in, const std::string& name_in, std::shared_ptr& state, std::shared_ptr& actions, std::shared_ptr formatter): Menu(profile_in, name_in), m_state(state), m_actions(actions), m_formatter(formatter) { if (m_pSettings == NULL && profile_in != Phone && profile_in != PhoneGreeter) { m_pSettings = g_settings_new("org.ayatana.common"); g_signal_connect(m_pSettings, "changed::max-menu-text-length", G_CALLBACK(on_string_length_changed), this); } // initialize the menu create_gmenu(); for (int i=0; iheader.changed().connect([this](const std::string&){ update_header(); }); m_formatter->header_format.changed().connect([this](const std::string&){ update_section(Locations); // need to update x-ayatana-time-format }); m_formatter->relative_format_changed.connect([this](){ update_section(Appointments); // uses formatter.relative_format() update_section(Locations); // uses formatter.relative_format() }); m_state->settings->show_calendar.changed().connect([this](bool){ update_section(Calendar); }); m_state->settings->show_events.changed().connect([this](bool){ update_section(Appointments); // showing events got toggled }); m_state->settings->show_alarms.changed().connect([this](bool){ update_section(Appointments); // showing alarms got toggled }); m_state->calendar_upcoming->date().changed().connect([this](const DateTime&){ update_upcoming(); // our m_upcoming is planner->upcoming() filtered by time }); m_state->calendar_upcoming->appointments().changed().connect([this](const std::vector&){ update_upcoming(); // our m_upcoming is planner->upcoming() filtered by time }); m_state->clock->date_changed.connect([this](){ update_section(Calendar); // need to update the Date menuitem update_section(Locations); // locations' relative time may have changed }); m_state->clock->minute_changed.connect([this](){ update_upcoming(); // our m_upcoming is planner->upcoming() filtered by time }); m_state->locations->locations.changed().connect([this](const std::vector&) { update_section(Locations); // "locations" is the list of Locations we show }); } virtual ~MenuImpl() { g_clear_object(&m_menu); g_clear_pointer(&m_serialized_alarm_icon, g_variant_unref); g_clear_pointer(&m_serialized_calendar_icon, g_variant_unref); g_clear_object(&m_pSettings); } virtual GVariant* create_header_state() =0; static void on_string_length_changed(GSettings *pSettings, gchar *sKey, gpointer pSelf) { static_cast(pSelf)->update_section(Appointments); } void update_header() { auto action_group = m_actions->action_group(); auto action_name = name() + "-header"; auto state = create_header_state(); g_action_group_change_action_state(action_group, action_name.c_str(), state); } void update_upcoming() { // The usual case is to show events germane to the current time. // However when the user clicks onto a different calendar date, // we pick events starting from the beginning of that clicked day. const auto now = m_state->clock->localtime(); const auto calendar_day = m_state->calendar_month->month().get(); const auto begin = DateTime::is_same_day(now, calendar_day) ? now.start_of_minute() : calendar_day.start_of_day(); auto upcoming = get_display_appointments( m_state->calendar_upcoming->appointments().get(), begin, 5, m_state->settings->show_alarms.get() ); if (m_upcoming != upcoming) { m_upcoming.swap(upcoming); update_header(); // show an 'alarm' icon if there are upcoming alarms update_section(Appointments); // "upcoming" is the list of Appointments we show } } std::shared_ptr m_state; std::shared_ptr m_actions; std::shared_ptr m_formatter; GMenu* m_submenu = nullptr; GVariant* get_serialized_alarm_icon() { if (G_UNLIKELY(m_serialized_alarm_icon == nullptr)) { auto i = g_themed_icon_new_with_default_fallbacks(ALARM_ICON_NAME); m_serialized_alarm_icon = g_icon_serialize(i); g_object_unref(i); } return m_serialized_alarm_icon; } GVariant* get_serialized_calendar_icon() { if (G_UNLIKELY(m_serialized_calendar_icon == nullptr)) { auto i = g_themed_icon_new_with_default_fallbacks(CALENDAR_ICON_NAME); m_serialized_calendar_icon = g_icon_serialize(i); g_object_unref(i); } return m_serialized_calendar_icon; } std::vector m_upcoming; private: void create_gmenu() { g_assert(m_submenu == nullptr); m_submenu = g_menu_new(); // build placeholders for the sections for(int i=0; isettings->show_calendar.get() && ((profile == Desktop) || (profile == DesktopGreeter) || (profile == Phone)); auto menu = g_menu_new(); const char * action_name; if (profile == Phone) action_name = "indicator.phone.open-calendar-app"; else if (profile == Desktop) action_name = "indicator.desktop.open-calendar-app"; else action_name = nullptr; /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! Format string for the day on the first menuitem in the datetime indicator. This format string gives the full weekday, date, month, and year. en_US example: "%A, %B %e %Y" --> Saturday, October 31 2020" en_GB example: "%A, %e %B %Y" --> Saturday, 31 October 2020" */ auto label = m_state->clock->localtime().format(_("%A, %e %B %Y")); auto item = g_menu_item_new (label.c_str(), nullptr); auto v = get_serialized_calendar_icon(); g_menu_item_set_attribute_value (item, G_MENU_ATTRIBUTE_ICON, v); if (action_name != nullptr) { v = g_variant_new_int64(0); g_menu_item_set_action_and_target_value (item, action_name, v); } g_menu_append_item(menu, item); g_object_unref(item); // add calendar if (show_calendar) { item = g_menu_item_new ("[calendar]", nullptr); v = g_variant_new_int64(0); g_menu_item_set_action_and_target_value (item, "indicator.calendar", v); g_menu_item_set_attribute (item, "x-ayatana-type", "s", "org.ayatana.indicator.calendar"); if (action_name != nullptr) g_menu_item_set_attribute (item, "activation-action", "s", action_name); g_menu_append_item (menu, item); g_object_unref (item); } return G_MENU_MODEL(menu); } void add_appointments(GMenu* menu, Profile profile) { const int MAX_APPTS = 5; std::set added; const char * action_name; if (profile == Phone) action_name = "indicator.phone.open-appointment"; else if ((profile == Desktop) && m_actions->desktop_has_calendar_app()) action_name = "indicator.desktop.open-appointment"; else action_name = nullptr; for (const auto& appt : m_upcoming) { // don't show duplicates if (added.count(appt.uid)) continue; // don't show too many if (g_menu_model_get_n_items (G_MENU_MODEL(menu)) >= MAX_APPTS) break; added.insert(appt.uid); GDateTime* begin = appt.begin(); GDateTime* end = appt.end(); auto fmt = m_formatter->relative_format(begin, end); auto unix_time = g_date_time_to_unix(begin); ayatana_common_utils_ellipsize((char*)appt.summary.c_str()); auto menu_item = g_menu_item_new (appt.summary.c_str(), nullptr); g_menu_item_set_attribute (menu_item, "x-ayatana-time", "x", unix_time); g_menu_item_set_attribute (menu_item, "x-ayatana-time-format", "s", fmt.c_str()); if (appt.is_alarm()) { g_menu_item_set_attribute (menu_item, "x-ayatana-type", "s", "org.ayatana.indicator.alarm"); g_menu_item_set_attribute_value(menu_item, G_MENU_ATTRIBUTE_ICON, get_serialized_alarm_icon()); } else { g_menu_item_set_attribute (menu_item, "x-ayatana-type", "s", "org.ayatana.indicator.appointment"); } if (!appt.color.empty()) g_menu_item_set_attribute (menu_item, "x-ayatana-color", "s", appt.color.c_str()); if (action_name != nullptr) { g_menu_item_set_action_and_target_value (menu_item, action_name, g_variant_new ("(sx)", appt.uid.c_str(), unix_time)); } g_menu_append_item (menu, menu_item); g_object_unref (menu_item); } } GMenuModel* create_appointments_section(Profile profile) { auto menu = g_menu_new(); if (m_state->settings->show_events.get()) { if (profile==Desktop) { add_appointments (menu, profile); if (m_actions->desktop_has_calendar_app()) { // add the 'Add Event…' menuitem auto menu_item = g_menu_item_new(_("Add Event…"), nullptr); const gchar* action_name = "indicator.desktop.open-calendar-app"; auto v = g_variant_new_int64(0); g_menu_item_set_action_and_target_value(menu_item, action_name, v); g_menu_append_item(menu, menu_item); g_object_unref(menu_item); } } else if (profile==Phone) { auto menu_item = g_menu_item_new (_("Clock"), "indicator.phone.open-alarm-app"); g_menu_item_set_attribute_value (menu_item, G_MENU_ATTRIBUTE_ICON, get_serialized_alarm_icon()); g_menu_append_item (menu, menu_item); g_object_unref (menu_item); add_appointments (menu, profile); } } return G_MENU_MODEL(menu); } GMenuModel* create_locations_section(Profile profile) { GMenu* menu = g_menu_new(); const auto now = m_state->clock->localtime(); if (profile == Desktop || profile == Phone) { for(const auto& location : m_state->locations->locations.get()) { const auto& zone = location.zone(); const auto& name = location.name(); const auto zone_now = now.to_timezone(zone); const auto fmt = m_formatter->relative_format(zone_now.get()); auto detailed_action = g_strdup_printf("indicator.set-location::%s %s", zone.c_str(), name.c_str()); auto i = g_menu_item_new (name.c_str(), detailed_action); g_menu_item_set_attribute(i, "x-ayatana-type", "s", "org.ayatana.indicator.location"); g_menu_item_set_attribute(i, "x-ayatana-timezone", "s", zone.c_str()); g_menu_item_set_attribute(i, "x-ayatana-time-format", "s", fmt.c_str()); g_menu_append_item (menu, i); g_object_unref(i); g_free(detailed_action); } } return G_MENU_MODEL(menu); } GMenuModel* create_settings_section(Profile profile) { auto menu = g_menu_new(); const char * action_name; if (profile == Desktop) action_name = "indicator.desktop.open-settings-app"; else if (profile == Phone) action_name = "indicator.phone.open-settings-app"; else action_name = nullptr; if (action_name != nullptr) g_menu_append (menu, _("Time and Date Settings…"), action_name); return G_MENU_MODEL (menu); } void update_section(Section section) { GMenuModel * model; const auto p = profile(); switch (section) { case Calendar: model = create_calendar_section(p); break; case Appointments: model = create_appointments_section(p); break; case Locations: model = create_locations_section(p); break; case Settings: model = create_settings_section(p); break; default: model = nullptr; g_warn_if_reached(); } if (model) { g_menu_remove(m_submenu, section); g_menu_insert_section(m_submenu, section, nullptr, model); g_object_unref(model); } } //private: GVariant * m_serialized_alarm_icon = nullptr; GVariant * m_serialized_calendar_icon = nullptr; GSettings *m_pSettings = NULL; }; // class MenuImpl /*** **** ***/ class DesktopBaseMenu: public MenuImpl { protected: DesktopBaseMenu(Menu::Profile profile_, const std::string& name_, std::shared_ptr& state_, std::shared_ptr& actions_): MenuImpl(profile_, name_, state_, actions_, std::shared_ptr(new DesktopFormatter(state_->clock, state_->settings))) { update_header(); } GVariant* create_header_state() override { const auto title = _("Date and Time"); auto label = g_variant_new_string(m_formatter->header.get().c_str()); GVariantBuilder b; g_variant_builder_init(&b, G_VARIANT_TYPE_VARDICT); g_variant_builder_add(&b, "{sv}", "accessible-desc", label); g_variant_builder_add(&b, "{sv}", "label", label); g_variant_builder_add(&b, "{sv}", "title", g_variant_new_string(title)); g_variant_builder_add(&b, "{sv}", "visible", g_variant_new_boolean(TRUE)); g_variant_builder_add(&b, "{sv}", "tooltip", g_variant_new_string (_("Time & date settings, quick calendar access"))); return g_variant_builder_end(&b); } }; class DesktopMenu: public DesktopBaseMenu { public: DesktopMenu(std::shared_ptr& state_, std::shared_ptr& actions_): DesktopBaseMenu(Desktop,"desktop", state_, actions_) {} }; class DesktopGreeterMenu: public DesktopBaseMenu { public: DesktopGreeterMenu(std::shared_ptr& state_, std::shared_ptr& actions_): DesktopBaseMenu(DesktopGreeter,"desktop_greeter", state_, actions_) {} }; class PhoneBaseMenu: public MenuImpl { protected: PhoneBaseMenu(Menu::Profile profile_, const std::string& name_, std::shared_ptr& state_, std::shared_ptr& actions_): MenuImpl(profile_, name_, state_, actions_, std::shared_ptr(new PhoneFormatter(state_->clock))) { update_header(); } GVariant* create_header_state() override { // are there alarms? bool has_alarms = false; bool has_non_alarm_events = false; for(const auto& appointment : m_upcoming) { has_alarms = appointment.is_alarm(); if (has_alarms) { break; } else { has_non_alarm_events = true; } } GVariantBuilder b; g_variant_builder_init(&b, G_VARIANT_TYPE_VARDICT); g_variant_builder_add(&b, "{sv}", "title", g_variant_new_string (_("Time and Date"))); g_variant_builder_add(&b, "{sv}", "visible", g_variant_new_boolean (TRUE)); if (has_alarms || has_non_alarm_events) { auto label = m_formatter->header.get(); auto a11y = g_strdup_printf(_("%s (has events)"), label.c_str()); g_variant_builder_add(&b, "{sv}", "label", g_variant_new_string(label.c_str())); g_variant_builder_add(&b, "{sv}", "accessible-desc", g_variant_new_take_string(a11y)); if (has_alarms && m_state->settings->show_alarms.get()) { g_variant_builder_add(&b, "{sv}", "icon", get_serialized_alarm_icon()); } else { g_variant_builder_add(&b, "{sv}", "icon", get_serialized_calendar_icon()); } } else { auto v = g_variant_new_string(m_formatter->header.get().c_str()); g_variant_builder_add(&b, "{sv}", "label", v); g_variant_builder_add(&b, "{sv}", "accessible-desc", v); } return g_variant_builder_end (&b); } }; class PhoneMenu: public PhoneBaseMenu { public: PhoneMenu(std::shared_ptr& state_, std::shared_ptr& actions_): PhoneBaseMenu(Phone, "phone", state_, actions_) {} }; class PhoneGreeterMenu: public PhoneBaseMenu { public: PhoneGreeterMenu(std::shared_ptr& state_, std::shared_ptr& actions_): PhoneBaseMenu(PhoneGreeter, "phone_greeter", state_, actions_) {} }; /**** ***** ****/ MenuFactory::MenuFactory(const std::shared_ptr& actions_, const std::shared_ptr& state_): m_actions(actions_), m_state(state_) { } std::shared_ptr MenuFactory::buildMenu(Menu::Profile profile) { std::shared_ptr menu; switch (profile) { case Menu::Desktop: menu.reset(new DesktopMenu(m_state, m_actions)); break; case Menu::DesktopGreeter: menu.reset(new DesktopGreeterMenu(m_state, m_actions)); break; case Menu::Phone: menu.reset(new PhoneMenu(m_state, m_actions)); break; case Menu::PhoneGreeter: menu.reset(new PhoneGreeterMenu(m_state, m_actions)); break; default: g_warn_if_reached(); break; } return menu; } /**** ***** ****/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/myself.cpp0000644000000000000000000000431214773244555016464 0ustar /* * Copyright 2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho */ #include "datetime/myself.h" #if GLIB_CHECK_VERSION(2, 66, 0) #include #else #include #endif #include #include namespace ayatana { namespace indicator { namespace datetime { Myself::Myself() : m_accounts_manager(ag_manager_new(), g_object_unref) { reloadEmails(); g_object_connect(m_accounts_manager.get(), "signal::account-created", on_accounts_changed, this, "signal::account-deleted", on_accounts_changed, this, "signal::account-updated", on_accounts_changed, this, nullptr); } bool Myself::isMyEmail(const std::string &email) { return m_emails.get().count(email) > 0; } void Myself::on_accounts_changed(AgManager *, guint, Myself *self) { self->reloadEmails(); } void Myself::reloadEmails() { std::set emails; auto manager = m_accounts_manager.get(); auto ids = ag_manager_list(manager); for (auto l=ids; l!=nullptr; l=l->next) { auto acc = ag_manager_get_account(manager, GPOINTER_TO_UINT(l->data)); if (acc) { auto account_name = ag_account_get_display_name(acc); if (account_name != nullptr) emails.insert(account_name); g_object_unref(acc); } } ag_manager_list_free(ids); m_emails.set(emails); } } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/notifications.cpp0000644000000000000000000003762014773244555020046 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021-2025 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #ifdef LOMIRI_FEATURES_ENABLED #include #endif #include #include #include #include #include #include #include namespace ayatana { namespace indicator { namespace notifications { static G_DEFINE_QUARK(NotificationKey, notification_key) static G_DEFINE_QUARK(NotificationAction, notification_action) /*** **** ***/ class Builder::Impl { public: std::string m_title; std::string m_body; std::string m_icon_name; std::chrono::seconds m_duration; gint64 m_start_time {}; std::set m_string_hints; std::vector> m_actions; std::function m_closed_callback; std::function m_timeout_callback; bool m_show_notification_bubble; bool m_post_to_messaging_menu; }; Builder::Builder(): impl(new Impl()) { } Builder::~Builder() { } void Builder::set_title (const std::string& title) { impl->m_title = title; } void Builder::set_body (const std::string& body) { impl->m_body = body; } void Builder::set_icon_name (const std::string& icon_name) { impl->m_icon_name = icon_name; } void Builder::set_timeout (const std::chrono::seconds& duration) { impl->m_duration = duration; } void Builder::add_hint (const std::string& name) { impl->m_string_hints.insert (name); } void Builder::add_action (const std::string& action, const std::string& label) { impl->m_actions.push_back(std::pair(action,label)); } void Builder::set_closed_callback (std::function cb) { impl->m_closed_callback.swap (cb); } void Builder::set_timeout_callback (std::function cb) { impl->m_timeout_callback.swap (cb); } void Builder::set_start_time (uint64_t time) { impl->m_start_time = time; } void Builder::set_show_notification_bubble (bool show) { impl->m_show_notification_bubble = show; } void Builder::set_post_to_messaging_menu (bool post) { impl->m_post_to_messaging_menu = post; } /*** **** ***/ class Engine::Impl { struct notification_data { std::shared_ptr nn; Builder::Impl data; }; struct messaging_menu_data { std::string msg_id; std::function callback; Engine::Impl *self; }; public: explicit Impl(const std::string& app_name): m_app_name(app_name) { if (!notify_init(app_name.c_str())) g_critical("Unable to initialize libnotify!"); // messaging menu auto app_id = calendar_app_id(); if (!app_id.empty()) { m_messaging_app.reset(messaging_menu_app_new(app_id.c_str()), g_object_unref); messaging_menu_app_register(m_messaging_app.get()); } } ~Impl() { close_all (); remove_all (); notify_uninit (); if (m_messaging_app) messaging_menu_app_unregister (m_messaging_app.get()); } const std::string& app_name() const { return m_app_name; } bool supports_actions() const { return server_caps().count("actions") != 0; } #ifdef LOMIRI_FEATURES_ENABLED bool requires_hint_lomiri_timeout() const { return server_caps().count(HINT_LOMIRI_TIMEOUT) != 0; } #endif void close_all () { // call close() on all our keys std::set keys; for (const auto& it : m_notifications) keys.insert (it.first); for (const int key : keys) close (key); } void close (int key) { auto it = m_notifications.find(key); if (it != m_notifications.end()) { // tell the server to close the notification GError * error = nullptr; if (!notify_notification_close (it->second.nn.get(), &error)) { g_warning ("Unable to close notification %d: %s", key, error->message); g_error_free (error); } // call the user callback and remove it from our bookkeeping remove_closed_notification (key); } } int show (const Builder& builder) { int ret = -1; const auto& info = *builder.impl; std::shared_ptr nn ( notify_notification_new(info.m_title.c_str(), info.m_body.c_str(), info.m_icon_name.c_str()), [this](NotifyNotification * n) { g_signal_handlers_disconnect_by_data(n, this); g_object_unref (G_OBJECT(n)); } ); #ifdef LIBNOTIFY_HAS_SET_APP_ICON NotifyNotification *pNotification = nn.get (); const char *sIcon = info.m_icon_name.c_str (); notify_notification_set_app_icon (pNotification, sIcon); #endif if (info.m_duration.count() != 0) { const auto& d= info.m_duration; auto ms = std::chrono::duration_cast(d); notify_notification_set_timeout (nn.get (), ms.count ()); #ifdef LOMIRI_FEATURES_ENABLED if (requires_hint_lomiri_timeout()) { // Lomiri has its own logic regarding timeout. notify_notification_set_hint (nn.get(), HINT_LOMIRI_TIMEOUT, g_variant_new_int32(ms.count())); } #endif } for (const auto& hint : info.m_string_hints) { notify_notification_set_hint (nn.get(), hint.c_str(), g_variant_new_string("true")); } for (const auto& action : info.m_actions) { notify_notification_add_action (nn.get(), action.first.c_str(), action.second.c_str(), on_notification_clicked, nullptr, nullptr); } static int next_key = 1; const int key = next_key++; g_object_set_qdata (G_OBJECT(nn.get()), notification_key_quark(), GINT_TO_POINTER(key)); m_notifications[key] = { nn, info }; g_signal_connect (nn.get(), "closed", G_CALLBACK(on_notification_closed), this); if (!info.m_show_notification_bubble) { post(info); return ret; } GError * error = nullptr; if (notify_notification_show(nn.get(), &error)) { ret = key; } else { g_critical ("Unable to show notification for '%s': %s", info.m_title.c_str(), error->message); g_error_free (error); m_notifications.erase(key); } return ret; } std::string post(const Builder::Impl& data) { if (!data.m_post_to_messaging_menu) { return ""; } if (!m_messaging_app) { return std::string(); } uuid_t message_uuid; uuid_generate(message_uuid); char uuid_buf[37]; uuid_unparse(message_uuid, uuid_buf); const std::string message_id(uuid_buf); // use full icon path name, "calendar-app" does not work with themed icons auto icon_file = g_file_new_for_path(calendar_app_icon().c_str()); // messaging_menu_message_new: will take control of icon object GIcon *icon = g_file_icon_new(icon_file); g_object_unref(icon_file); // check if source exists if (!messaging_menu_app_has_source(m_messaging_app.get(), m_app_name.c_str())) messaging_menu_app_append_source(m_messaging_app.get(), m_app_name.c_str(), nullptr, "Calendar"); auto msg = messaging_menu_message_new(message_id.c_str(), icon, data.m_title.c_str(), nullptr, data.m_body.c_str(), data.m_start_time * G_USEC_PER_SEC); // secs -> microsecs if (msg) { std::shared_ptr msg_data(new messaging_menu_data{message_id, data.m_timeout_callback, this}); m_messaging_messages[message_id] = msg_data; g_signal_connect(G_OBJECT(msg), "activate", G_CALLBACK(on_message_activated), msg_data.get()); messaging_menu_app_append_message(m_messaging_app.get(), msg, m_app_name.c_str(), false); // we use that to keep track of messaging, in case of message get cleared from menu g_object_set_data_full(G_OBJECT(msg), "destroy-notify", msg_data.get(), on_message_destroyed); // keep the message control with message_menu g_object_unref(msg); return message_id; } else { g_warning("Fail to create messaging menu message"); } return ""; } void remove (const std::string &key) { auto it = m_messaging_messages.find(key); if (it != m_messaging_messages.end()) { // tell the server to remove message messaging_menu_app_remove_message_by_id(m_messaging_app.get(), it->second->msg_id.c_str()); // message will be remove by on_message_destroyed cb. } } void remove_all () { // call remove() on all our keys while (!m_messaging_messages.empty()) remove(m_messaging_messages.begin()->first); } private: const std::set& server_caps() const { if (G_UNLIKELY(m_lazy_caps.empty())) { auto caps_gl = notify_get_server_caps(); std::string caps_str; for(auto l=caps_gl; l!=nullptr; l=l->next) { m_lazy_caps.insert((const char*)l->data); caps_str += (const char*) l->data;; if (l->next != nullptr) caps_str += ", "; } g_debug("%s notify_get_server() returned [%s]", G_STRFUNC, caps_str.c_str()); g_list_free_full(caps_gl, g_free); } return m_lazy_caps; } static void on_notification_clicked (NotifyNotification * nn, char * action, gpointer) { g_object_set_qdata_full (G_OBJECT(nn), notification_action_quark(), g_strdup(action), g_free); } static void on_notification_closed (NotifyNotification * nn, gpointer gself) { const GQuark q = notification_key_quark(); const gpointer gkey = g_object_get_qdata(G_OBJECT(nn), q); static_cast(gself)->remove_closed_notification(GPOINTER_TO_INT(gkey)); } static void on_message_activated (MessagingMenuMessage *, const char *, GVariant *, gpointer data) { auto msg_data = static_cast(data); auto it = msg_data->self->m_messaging_messages.find(msg_data->msg_id); g_return_if_fail (it != msg_data->self->m_messaging_messages.end()); const auto& ndata = it->second; if (ndata->callback) ndata->callback(); } static void on_message_destroyed(gpointer data) { auto msg_data = static_cast(data); auto it = msg_data->self->m_messaging_messages.find(msg_data->msg_id); if (it != msg_data->self->m_messaging_messages.end()) msg_data->self->m_messaging_messages.erase(it); } void remove_closed_notification (int key) { auto it = m_notifications.find(key); g_return_if_fail (it != m_notifications.end()); const auto& ndata = it->second; auto nn = ndata.nn.get(); if (ndata.data.m_closed_callback) { std::string action; const GQuark q = notification_action_quark(); const gpointer p = g_object_get_qdata(G_OBJECT(nn), q); if (p != nullptr) action = static_cast(p); ndata.data.m_closed_callback (action); // empty action means that the notification got timeout // post a message on messaging menu if (action.empty()) post(ndata.data); } m_notifications.erase(it); } static std::string calendar_app_id() { #ifdef LOMIRI_FEATURES_ENABLED auto urls = g_strsplit("calendar://", ",", 0); auto appids = lomiri_url_dispatch_url_appid(const_cast(urls)); g_strfreev(urls); std::string result; if (appids != nullptr) { // Due the use of old API by messaging_menu we need append a extra ".desktop" to the app_id. result = std::string(appids[0]) + ".desktop"; g_strfreev(appids); } return result; #else return std::string(); #endif } static std::string calendar_app_icon() { auto app_desktop = g_desktop_app_info_new(calendar_app_id().c_str()); if (app_desktop != nullptr) { auto icon_name = g_desktop_app_info_get_string(app_desktop, "Icon"); g_object_unref(app_desktop); if (icon_name) { std::string result(icon_name); g_free(icon_name); return result; } } g_warning("Fail to get calendar icon"); return std::string(); } /*** **** ***/ // messaging menu std::shared_ptr m_messaging_app; std::map > m_messaging_messages; const std::string m_app_name; // key-to-data std::map m_notifications; // server capabilities. // as the name indicates, don't use this directly: use server_caps() instead mutable std::set m_lazy_caps; #ifdef LOMIRI_FEATURES_ENABLED static constexpr char const * HINT_LOMIRI_TIMEOUT {"x-lomiri-snap-decisions-timeout"}; #endif }; /*** **** ***/ Engine::Engine(const std::string& app_name): impl(new Impl(app_name)) { } Engine::~Engine() { } bool Engine::supports_actions() const { return impl->supports_actions(); } int Engine::show(const Builder& builder) { return impl->show(builder); } void Engine::close_all() { impl->close_all(); } void Engine::close(int key) { impl->close(key); } const std::string& Engine::app_name() const { return impl->app_name(); } /*** **** ***/ } // namespace notifications } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/planner-aggregate.cpp0000644000000000000000000000467114773244555020560 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class AggregatePlanner::Impl { public: explicit Impl(AggregatePlanner* owner): m_owner(owner) { } ~Impl() =default; core::Property>& appointments() { return m_appointments; } void add(const std::shared_ptr& planner) { m_planners.push_back(planner); auto on_changed = [this](const std::vector&){rebuild();}; auto connection = planner->appointments().changed().connect(on_changed); m_connections.push_back(connection); } private: void rebuild() { // use a sorted aggregate vector of all our planners std::vector all; for (const auto& planner : m_planners) { const auto& walk = planner->appointments().get(); all.insert(std::end(all), std::begin(walk), std::end(walk)); } m_owner->sort(all); m_appointments.set(all); } const AggregatePlanner* m_owner = nullptr; core::Property> m_appointments; std::vector> m_planners; std::vector m_connections; }; /*** **** ***/ AggregatePlanner::AggregatePlanner(): impl(new Impl{this}) { } AggregatePlanner::~AggregatePlanner() { } core::Property>& AggregatePlanner::appointments() { return impl->appointments(); } void AggregatePlanner::add(const std::shared_ptr& planner) { return impl->add(planner); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/planner.cpp0000644000000000000000000000225214773244555016625 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ Planner::Planner() { } Planner::~Planner() { } void Planner::sort(std::vector& appts) { std::sort(std::begin(appts), std::end(appts), [](const Appointment& a, const Appointment& b){return a.begin < b.begin;}); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/planner-month.cpp0000644000000000000000000000326014773244555017750 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ MonthPlanner::MonthPlanner(const std::shared_ptr& range_planner, const DateTime& month_in): m_range_planner(range_planner) { month().changed().connect([this](const DateTime& m){ auto month_begin = m.start_of_month(); auto month_end = m.end_of_month(); g_debug("PlannerMonth %p setting calendar month range: [%s..%s]", this, month_begin.format("%F %T").c_str(), month_end.format("%F %T").c_str()); m_range_planner->range().set(std::pair(month_begin,month_end)); }); month().set(month_in); } core::Property& MonthPlanner::month() { return m_month; } core::Property>& MonthPlanner::appointments() { return m_range_planner->appointments(); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/planner-range.cpp0000644000000000000000000000555214773244555017725 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ SimpleRangePlanner::SimpleRangePlanner(const std::shared_ptr& engine, const std::shared_ptr& timezone): m_engine(engine), m_timezone(timezone), m_range(std::pair(DateTime::NowLocal(), DateTime::NowLocal())) { engine->changed().connect([this](){ g_debug("RangePlanner %p rebuilding soon because Engine %p emitted 'changed' signal", this, m_engine.get()); rebuild_soon(); }); m_timezone->timezone.changed().connect([this](const std::string& s){ g_debug("RangePlanner %p rebuilding soon because the timezone changed to '%s'", this, s.c_str()); rebuild_soon(); }); range().changed().connect([this](const std::pair&){ g_debug("rebuilding because the date range changed"); rebuild_soon(); }); } SimpleRangePlanner::~SimpleRangePlanner() { if (m_rebuild_tag) g_source_remove(m_rebuild_tag); } /*** **** ***/ void SimpleRangePlanner::rebuild_now() { const auto& r = range().get(); auto on_appointments_fetched = [this](const std::vector& a){ g_debug("RangePlanner %p got %zu appointments", this, a.size()); appointments().set(a); }; m_engine->get_appointments(r.first, r.second, *m_timezone.get(), on_appointments_fetched); } void SimpleRangePlanner::rebuild_soon() { static const int ARBITRARY_BATCH_MSEC = 200; if (m_rebuild_tag == 0) m_rebuild_tag = g_timeout_add(ARBITRARY_BATCH_MSEC, rebuild_now_static, this); } gboolean SimpleRangePlanner::rebuild_now_static(gpointer gself) { auto self = static_cast(gself); self->m_rebuild_tag = 0; self->rebuild_now(); return G_SOURCE_REMOVE; } /*** **** ***/ core::Property>& SimpleRangePlanner::appointments() { return m_appointments; } core::Property>& SimpleRangePlanner::range() { return m_range; } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/planner-snooze.cpp0000644000000000000000000000600714773244555020142 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2024 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class SnoozePlanner::Impl { public: Impl(SnoozePlanner* owner, const std::shared_ptr& settings, const std::shared_ptr& clock): m_owner(owner), m_settings(settings), m_clock(clock) { } ~Impl() { } core::Property>& appointments() { return m_appointments; } void add(const Appointment& appt_in, const Alarm& alarm) { // make a copy of the appointment with only this alarm Appointment appt = appt_in; appt.alarms.clear(); appt.alarms.push_back(alarm); // reschedule the alarm to go off N minutes from now // also take into count every whole minute since the alarm went off const auto offset_to_now = std::chrono::duration_cast(std::chrono::microseconds(DateTime::NowLocal() - appt.begin)); const auto offset = offset_to_now + std::chrono::minutes(m_settings->snooze_duration.get()); appt.begin += offset; appt.end += offset; appt.alarms[0].time += offset; // give it a new ID gchar* uid = g_uuid_string_random (); appt.uid = uid; g_free(uid); // add it to our appointment list auto tmp = appointments().get(); tmp.push_back(appt); m_owner->sort(tmp); m_appointments.set(tmp); } private: const SnoozePlanner* const m_owner; const std::shared_ptr m_settings; const std::shared_ptr m_clock; core::Property> m_appointments; }; /*** **** ***/ SnoozePlanner::SnoozePlanner(const std::shared_ptr& settings, const std::shared_ptr& clock): impl(new Impl{this, settings, clock}) { } SnoozePlanner::~SnoozePlanner() { } void SnoozePlanner::add(const Appointment& appointment, const Alarm& alarm) { impl->add(appointment, alarm); } core::Property>& SnoozePlanner::appointments() { return impl->appointments(); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/planner-upcoming.cpp0000644000000000000000000000327214773244555020447 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ UpcomingPlanner::UpcomingPlanner(const std::shared_ptr& range_planner, const DateTime& date_in): m_range_planner(range_planner) { date().changed().connect([this](const DateTime& dt){ // set the range to the upcoming month const auto b = dt.start_of_day(); const auto e = b.add_full(0, 1, 0, 0, 0, 0); g_debug("%p setting date range to [%s..%s]", this, b.format("%F %T").c_str(), e.format("%F %T").c_str()); m_range_planner->range().set(std::pair(b,e)); }); date().set(date_in); } core::Property& UpcomingPlanner::date() { return m_date; } core::Property>& UpcomingPlanner::appointments() { return m_range_planner->appointments(); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/settings-live.cpp0000644000000000000000000003427014773244555017770 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ LiveSettings::~LiveSettings() { g_clear_object(&m_settings_general_notification); g_clear_object(&m_settings_cal_notification); g_clear_object(&m_settings); } LiveSettings::LiveSettings(): m_settings(g_settings_new(SETTINGS_INTERFACE)) { g_signal_connect (m_settings, "changed", G_CALLBACK(on_changed_ccid), this); // init the Properties from the GSettings backend update_custom_time_format(); update_locations(); update_show_calendar(); update_show_date(); update_show_day(); update_show_detected_locations(); update_show_events(); update_show_alarms(); update_show_locations(); update_show_seconds(); update_show_week_numbers(); update_show_year(); update_time_format_mode(); update_timezone_name(); update_calendar_sound(); update_alarm_sound(); update_alarm_volume(); update_alarm_duration(); update_alarm_haptic(); update_snooze_duration(); GSettingsSchemaSource *pSource = g_settings_schema_source_get_default(); GSettingsSchema *pSchema = g_settings_schema_source_lookup(pSource, SETTINGS_NOTIFY_SCHEMA_ID, TRUE); if (pSchema != NULL) { m_settings_cal_notification = g_settings_new_with_path(SETTINGS_NOTIFY_SCHEMA_ID, SETTINGS_NOTIFY_CALENDAR_PATH); m_settings_general_notification = g_settings_new(SETTINGS_NOTIFY_APPS_SCHEMA_ID); g_signal_connect (m_settings_cal_notification, "changed", G_CALLBACK(on_changed_cal_notification), this); g_signal_connect (m_settings_general_notification, "changed", G_CALLBACK(on_changed_general_notification), this); update_cal_notification_enabled(); update_cal_notification_sounds(); update_cal_notification_vibrations(); update_cal_notification_bubbles(); update_cal_notification_list(); update_vibrate_silent_mode(); } else { m_settings_cal_notification = NULL; m_settings_general_notification = NULL; } // now listen for clients to change the properties s.t. we can sync update GSettings custom_time_format.changed().connect([this](const std::string& value){ g_settings_set_string(m_settings, SETTINGS_CUSTOM_TIME_FORMAT_S, value.c_str()); }); locations.changed().connect([this](const std::vector& value){ const int n = value.size(); gchar** strv = g_new0(gchar*, n+1); for(int i=0; i(value[i].c_str()); g_settings_set_strv(m_settings, SETTINGS_LOCATIONS_S, strv); g_free(strv); }); show_calendar.changed().connect([this](bool value){ g_settings_set_boolean(m_settings, SETTINGS_SHOW_CALENDAR_S, value); }); show_date.changed().connect([this](bool value){ g_settings_set_boolean(m_settings, SETTINGS_SHOW_DATE_S, value); }); show_day.changed().connect([this](bool value){ g_settings_set_boolean(m_settings, SETTINGS_SHOW_DAY_S, value); }); show_detected_location.changed().connect([this](bool value){ g_settings_set_boolean(m_settings, SETTINGS_SHOW_DETECTED_S, value); }); show_events.changed().connect([this](bool value){ g_settings_set_boolean(m_settings, SETTINGS_SHOW_EVENTS_S, value); }); show_alarms.changed().connect([this](bool value){ g_settings_set_boolean(m_settings, SETTINGS_SHOW_ALARMS_S, value); }); show_locations.changed().connect([this](bool value){ g_settings_set_boolean(m_settings, SETTINGS_SHOW_LOCATIONS_S, value); }); show_seconds.changed().connect([this](bool value){ g_settings_set_boolean(m_settings, SETTINGS_SHOW_SECONDS_S, value); }); show_week_numbers.changed().connect([this](bool value){ g_settings_set_boolean(m_settings, SETTINGS_SHOW_WEEK_NUMBERS_S, value); }); show_year.changed().connect([this](bool value){ g_settings_set_boolean(m_settings, SETTINGS_SHOW_YEAR_S, value); }); time_format_mode.changed().connect([this](TimeFormatMode value){ g_settings_set_enum(m_settings, SETTINGS_TIME_FORMAT_S, gint(value)); }); timezone_name.changed().connect([this](const std::string& value){ g_settings_set_string(m_settings, SETTINGS_TIMEZONE_NAME_S, value.c_str()); }); calendar_sound.changed().connect([this](const std::string& value){ g_settings_set_string(m_settings, SETTINGS_CALENDAR_SOUND_S, value.c_str()); }); alarm_sound.changed().connect([this](const std::string& value){ g_settings_set_string(m_settings, SETTINGS_ALARM_SOUND_S, value.c_str()); }); alarm_volume.changed().connect([this](unsigned int value){ g_settings_set_uint(m_settings, SETTINGS_ALARM_VOLUME_S, value); }); alarm_duration.changed().connect([this](unsigned int value){ g_settings_set_uint(m_settings, SETTINGS_ALARM_DURATION_S, value); }); alarm_haptic.changed().connect([this](const std::string& value){ g_settings_set_string(m_settings, SETTINGS_ALARM_HAPTIC_S, value.c_str()); }); snooze_duration.changed().connect([this](unsigned int value){ g_settings_set_uint(m_settings, SETTINGS_SNOOZE_DURATION_S, value); }); cal_notification_enabled.changed().connect([this](bool value){ g_settings_set_boolean(m_settings_cal_notification, SETTINGS_NOTIFY_ENABLED_KEY, value); }); cal_notification_sounds.changed().connect([this](bool value){ g_settings_set_boolean(m_settings_cal_notification, SETTINGS_NOTIFY_SOUNDS_KEY, value); }); cal_notification_vibrations.changed().connect([this](bool value){ g_settings_set_boolean(m_settings_cal_notification, SETTINGS_NOTIFY_VIBRATIONS_KEY, value); }); cal_notification_bubbles.changed().connect([this](bool value){ g_settings_set_boolean(m_settings_cal_notification, SETTINGS_NOTIFY_BUBBLES_KEY, value); }); cal_notification_list.changed().connect([this](bool value){ g_settings_set_boolean(m_settings_cal_notification, SETTINGS_NOTIFY_LIST_KEY, value); }); vibrate_silent_mode.changed().connect([this](bool value){ g_settings_set_boolean(m_settings_general_notification, SETTINGS_VIBRATE_SILENT_KEY, value); }); } /*** **** ***/ void LiveSettings::update_custom_time_format() { auto val = g_settings_get_string(m_settings, SETTINGS_CUSTOM_TIME_FORMAT_S); custom_time_format.set(val); g_free(val); } void LiveSettings::update_locations() { auto strv = g_settings_get_strv(m_settings, SETTINGS_LOCATIONS_S); std::vector l; for(int i=0; strv && strv[i]; i++) l.push_back(strv[i]); g_strfreev(strv); locations.set(l); } void LiveSettings::update_show_calendar() { const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_CALENDAR_S); show_calendar.set(val); } void LiveSettings::update_show_date() { show_date.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_DATE_S)); } void LiveSettings::update_show_day() { show_day.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_DAY_S)); } void LiveSettings::update_show_detected_locations() { const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_DETECTED_S); show_detected_location.set(val); } void LiveSettings::update_show_events() { const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_EVENTS_S); show_events.set(val); } void LiveSettings::update_show_alarms() { const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_ALARMS_S); show_alarms.set(val); } void LiveSettings::update_show_locations() { const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_LOCATIONS_S); show_locations.set(val); } void LiveSettings::update_show_seconds() { show_seconds.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_SECONDS_S)); } void LiveSettings::update_show_week_numbers() { const auto val = g_settings_get_boolean(m_settings, SETTINGS_SHOW_WEEK_NUMBERS_S); show_week_numbers.set(val); } void LiveSettings::update_show_year() { show_year.set(g_settings_get_boolean(m_settings, SETTINGS_SHOW_YEAR_S)); } void LiveSettings::update_time_format_mode() { time_format_mode.set((TimeFormatMode)g_settings_get_enum(m_settings, SETTINGS_TIME_FORMAT_S)); } void LiveSettings::update_timezone_name() { auto val = g_settings_get_string(m_settings, SETTINGS_TIMEZONE_NAME_S); timezone_name.set(val); g_free(val); } void LiveSettings::update_calendar_sound() { auto val = g_settings_get_string(m_settings, SETTINGS_CALENDAR_SOUND_S); calendar_sound.set(val); g_free(val); } void LiveSettings::update_alarm_sound() { auto val = g_settings_get_string(m_settings, SETTINGS_ALARM_SOUND_S); alarm_sound.set(val); g_free(val); } void LiveSettings::update_alarm_volume() { alarm_volume.set(g_settings_get_uint(m_settings, SETTINGS_ALARM_VOLUME_S)); } void LiveSettings::update_alarm_duration() { alarm_duration.set(g_settings_get_uint(m_settings, SETTINGS_ALARM_DURATION_S)); } void LiveSettings::update_alarm_haptic() { auto val = g_settings_get_string(m_settings, SETTINGS_ALARM_HAPTIC_S); alarm_haptic.set(val); g_free(val); } void LiveSettings::update_snooze_duration() { snooze_duration.set(g_settings_get_uint(m_settings, SETTINGS_SNOOZE_DURATION_S)); } void LiveSettings::update_cal_notification_enabled() { cal_notification_enabled.set(g_settings_get_boolean(m_settings_cal_notification, SETTINGS_NOTIFY_ENABLED_KEY)); } void LiveSettings::update_cal_notification_sounds() { cal_notification_sounds.set(g_settings_get_boolean(m_settings_cal_notification, SETTINGS_NOTIFY_SOUNDS_KEY)); } void LiveSettings::update_cal_notification_vibrations() { cal_notification_vibrations.set(g_settings_get_boolean(m_settings_cal_notification, SETTINGS_NOTIFY_VIBRATIONS_KEY)); } void LiveSettings::update_cal_notification_bubbles() { cal_notification_bubbles.set(g_settings_get_boolean(m_settings_cal_notification, SETTINGS_NOTIFY_BUBBLES_KEY)); } void LiveSettings::update_cal_notification_list() { cal_notification_list.set(g_settings_get_boolean(m_settings_cal_notification, SETTINGS_NOTIFY_LIST_KEY)); } void LiveSettings::update_vibrate_silent_mode() { vibrate_silent_mode.set(g_settings_get_boolean(m_settings_general_notification, SETTINGS_VIBRATE_SILENT_KEY)); } /*** **** ***/ void LiveSettings::on_changed_cal_notification(GSettings* /*settings*/, gchar* key, gpointer gself) { static_cast(gself)->update_key_cal_notification(key); } void LiveSettings::update_key_cal_notification(const std::string& key) { if (key == SETTINGS_NOTIFY_ENABLED_KEY) update_cal_notification_enabled(); else if (key == SETTINGS_NOTIFY_SOUNDS_KEY) update_cal_notification_sounds(); else if (key == SETTINGS_NOTIFY_VIBRATIONS_KEY) update_cal_notification_vibrations(); else if (key == SETTINGS_NOTIFY_BUBBLES_KEY) update_cal_notification_bubbles(); else if (key == SETTINGS_NOTIFY_LIST_KEY) update_cal_notification_list(); } /*** **** ***/ void LiveSettings::on_changed_general_notification(GSettings* /*settings*/, gchar* key, gpointer gself) { static_cast(gself)->update_key_general_notification(key); } void LiveSettings::update_key_general_notification(const std::string& key) { if (key == SETTINGS_VIBRATE_SILENT_KEY) update_vibrate_silent_mode(); } /*** **** ***/ void LiveSettings::on_changed_ccid(GSettings* /*settings*/, gchar* key, gpointer gself) { static_cast(gself)->update_key_ccid(key); } void LiveSettings::update_key_ccid(const std::string& key) { if (key == SETTINGS_LOCATIONS_S) update_locations(); else if (key == SETTINGS_TIME_FORMAT_S) update_time_format_mode(); else if (key == SETTINGS_SHOW_SECONDS_S) update_show_seconds(); else if (key == SETTINGS_SHOW_DAY_S) update_show_day(); else if (key == SETTINGS_SHOW_DATE_S) update_show_date(); else if (key == SETTINGS_SHOW_YEAR_S) update_show_year(); else if (key == SETTINGS_CUSTOM_TIME_FORMAT_S) update_custom_time_format(); else if (key == SETTINGS_SHOW_CALENDAR_S) update_show_calendar(); else if (key == SETTINGS_SHOW_WEEK_NUMBERS_S) update_show_week_numbers(); else if (key == SETTINGS_SHOW_EVENTS_S) update_show_events(); else if (key == SETTINGS_SHOW_ALARMS_S) update_show_alarms(); else if (key == SETTINGS_SHOW_LOCATIONS_S) update_show_locations(); else if (key == SETTINGS_SHOW_DETECTED_S) update_show_detected_locations(); else if (key == SETTINGS_TIMEZONE_NAME_S) update_timezone_name(); else if (key == SETTINGS_CALENDAR_SOUND_S) update_calendar_sound(); else if (key == SETTINGS_ALARM_SOUND_S) update_alarm_sound(); else if (key == SETTINGS_ALARM_VOLUME_S) update_alarm_volume(); else if (key == SETTINGS_ALARM_DURATION_S) update_alarm_duration(); else if (key == SETTINGS_ALARM_HAPTIC_S) update_alarm_haptic(); else if (key == SETTINGS_SNOOZE_DURATION_S) update_snooze_duration(); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/snap.cpp0000644000000000000000000002762114773244555016136 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #ifdef LOMIRI_FEATURES_ENABLED #include "dbus-accounts-sound.h" #endif #include #include // is_locale_12h() #include #include #include #include #include #include #include #include #include // getuid() #include // getuid() namespace ain = ayatana::indicator::notifications; namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class Snap::Impl { public: Impl(const std::shared_ptr& engine, const std::shared_ptr& sound_builder, const std::shared_ptr& settings, GDBusConnection* system_bus): m_engine(engine), m_sound_builder(sound_builder), m_settings(settings), m_cancellable(g_cancellable_new()), m_system_bus{G_DBUS_CONNECTION(g_object_ref(system_bus))} { #ifdef LOMIRI_FEATURES_ENABLED auto object_path = g_strdup_printf("/org/freedesktop/Accounts/User%lu", (gulong)getuid()); accounts_service_sound_proxy_new(m_system_bus, G_DBUS_PROXY_FLAGS_GET_INVALIDATED_PROPERTIES, "org.freedesktop.Accounts", object_path, m_cancellable, on_sound_proxy_ready, this); g_free(object_path); #endif } ~Impl() { g_cancellable_cancel(m_cancellable); g_clear_object(&m_cancellable); #ifdef LOMIRI_FEATURES_ENABLED g_clear_object(&m_accounts_service_sound_proxy); #endif g_clear_object(&m_system_bus); for (const auto& key : m_notifications) m_engine->close (key); } void operator()(const Appointment& appointment, const Alarm& alarm, response_func on_response) { // If calendar notifications are disabled, don't show them if (!appointment.is_alarm() && !calendar_notifications_are_enabled()) { g_debug("Skipping disabled calendar event '%s' notification", appointment.summary.c_str()); return; } /* Alarms and calendar events are treated differently. Alarms should require manual intervention to dismiss. Calendar events are less urgent and shouldn't require manual intervention and shouldn't loop the sound. */ const bool interactive = appointment.is_alarm() && m_engine->supports_actions(); // force the system to stay awake std::shared_ptr awake; if (appointment.is_alarm() || calendar_bubbles_enabled() || calendar_list_enabled()) { awake = std::make_shared(m_system_bus, m_engine->app_name()); } // calendar events are muted in silent mode; alarm clocks never are std::shared_ptr sound; if (appointment.is_alarm() || (calendar_sounds_enabled() && !silent_mode())) { // create the sound. const auto role = appointment.is_alarm() ? "alarm" : "alert"; const auto uri = get_alarm_uri(appointment, alarm, m_settings); const auto volume = m_settings->alarm_volume.get(); const bool loop = interactive; sound = m_sound_builder->create(role, uri, volume, loop); } // create the haptic feedback... std::shared_ptr haptic; if (should_vibrate() && (appointment.is_alarm() || calendar_vibrations_enabled())) { // when in silent mode should only vibrate if user defined so if (!silent_mode() || vibrate_in_silent_mode_enabled()) { const auto haptic_mode = m_settings->alarm_haptic.get(); if (haptic_mode == "pulse") haptic = std::make_shared(appointment.is_alarm()); } } // show a notification... const auto minutes = std::chrono::minutes(m_settings->alarm_duration.get()); ain::Builder b; b.set_body (appointment.summary); b.set_icon_name (appointment.is_alarm() ? "alarm-clock" : "calendar-app"); b.add_hint (ain::Builder::HINT_NONSHAPED_ICON); b.set_start_time (appointment.begin.to_unix()); const char * timefmt; if (is_locale_12h()) { /** strftime(3) format for abbreviated weekday, hours, minutes in a 12h locale; e.g. Wed, 2:00 PM */ timefmt = _("%a, %l:%M %p"); } else { /** A strftime(3) format for abbreviated weekday, hours, minutes in a 24h locale; e.g. Wed, 14:00 */ timefmt = _("%a, %H:%M"); } const auto timestr = appointment.begin.format(timefmt); const char * titlefmt; if (appointment.is_alarm()) { titlefmt = _("Alarm %s"); } else { titlefmt = _("Event %s"); } auto title = g_strdup_printf(titlefmt, timestr.c_str()); b.set_title (title); g_free (title); b.set_timeout (std::chrono::duration_cast(minutes)); if (interactive) { b.add_hint (ain::Builder::HINT_SNAP); b.add_hint (ain::Builder::HINT_AFFIRMATIVE_HINT); b.add_action (ACTION_NONE, _("OK")); b.add_action (ACTION_SNOOZE, _("Snooze")); } else { b.add_hint (ain::Builder::HINT_INTERACTIVE); b.add_action (ACTION_SHOW_APP, _("OK")); } // add 'sound', 'haptic', and 'awake' objects to the capture so // they stay alive until the closed callback is called; i.e., // for the lifespan of the notficiation b.set_closed_callback([appointment, alarm, on_response, sound, awake, haptic] (const std::string& action){ Snap::Response response; if ((action == ACTION_SNOOZE) || (appointment.is_alarm() && action.empty())) response = Snap::Response::Snooze; else if (action == ACTION_SHOW_APP) response = Snap::Response::ShowApp; else response = Snap::Response::None; on_response(appointment, alarm, response); }); //TODO: we need to extend it to support alarms appointments if (!appointment.is_alarm()) { b.set_timeout_callback([appointment, alarm, on_response](){ on_response(appointment, alarm, Snap::Response::ShowApp); }); } b.set_show_notification_bubble(appointment.is_alarm() || calendar_bubbles_enabled()); b.set_post_to_messaging_menu(appointment.is_alarm() || calendar_list_enabled()); const auto key = m_engine->show(b); if (key) m_notifications.insert (key); } private: bool calendar_notifications_are_enabled() const { return m_settings->cal_notification_enabled.get(); } bool calendar_sounds_enabled() const { return m_settings->cal_notification_sounds.get(); } bool calendar_vibrations_enabled() const { return m_settings->cal_notification_vibrations.get(); } bool calendar_bubbles_enabled() const { return m_settings->cal_notification_bubbles.get(); } bool calendar_list_enabled() const { return m_settings->cal_notification_list.get(); } bool vibrate_in_silent_mode_enabled() const { return m_settings->vibrate_silent_mode.get(); } #ifdef LOMIRI_FEATURES_ENABLED static void on_sound_proxy_ready(GObject* /*source_object*/, GAsyncResult* res, gpointer gself) { GError * error; error = nullptr; auto proxy = accounts_service_sound_proxy_new_finish (res, &error); if (error != nullptr) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("%s Couldn't find accounts service sound proxy: %s", G_STRLOC, error->message); g_clear_error(&error); } else { static_cast(gself)->m_accounts_service_sound_proxy = proxy; } } #endif bool silent_mode() const { #ifdef LOMIRI_FEATURES_ENABLED return (m_accounts_service_sound_proxy != nullptr) && (accounts_service_sound_get_silent_mode(m_accounts_service_sound_proxy)); #else return false; #endif } bool should_vibrate() const { #ifdef LOMIRI_FEATURES_ENABLED return (m_accounts_service_sound_proxy != nullptr) && (accounts_service_sound_get_other_vibrate(m_accounts_service_sound_proxy)); #else return true; #endif } std::string get_alarm_uri(const Appointment& appointment, const Alarm& alarm, const std::shared_ptr& settings) const { const auto is_alarm = appointment.is_alarm(); const std::string candidates[] = { alarm.audio_url, is_alarm ? settings->alarm_sound.get() : settings->calendar_sound.get(), is_alarm ? ALARM_DEFAULT_SOUND : CALENDAR_DEFAULT_SOUND }; std::string uri; for(const auto& candidate : candidates) { if (gst_uri_is_valid (candidate.c_str())) { uri = candidate; break; } else if (g_file_test(candidate.c_str(), G_FILE_TEST_EXISTS)) { gchar* tmp = gst_filename_to_uri(candidate.c_str(), nullptr); if (tmp != nullptr) { uri = tmp; g_free (tmp); break; } } } return uri; } const std::shared_ptr m_engine; const std::shared_ptr m_sound_builder; const std::shared_ptr m_settings; std::set m_notifications; GCancellable * m_cancellable {nullptr}; #ifdef LOMIRI_FEATURES_ENABLED AccountsServiceSound * m_accounts_service_sound_proxy {nullptr}; #endif GDBusConnection * m_system_bus {nullptr}; static constexpr char const * ACTION_NONE {"none"}; static constexpr char const * ACTION_SNOOZE {"snooze"}; static constexpr char const * ACTION_SHOW_APP {"show-app"}; }; /*** **** ***/ Snap::Snap(const std::shared_ptr& engine, const std::shared_ptr& sound_builder, const std::shared_ptr& settings, GDBusConnection* system_bus): impl(new Impl(engine, sound_builder, settings, system_bus)) { } Snap::~Snap() { } void Snap::operator()(const Appointment& appointment, const Alarm& alarm, response_func on_response) { (*impl)(appointment, alarm, on_response); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/sound.cpp0000644000000000000000000001154414773244555016322 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include #include #include // std::call_once() namespace ayatana { namespace indicator { namespace notifications { /*** **** ***/ /** * Plays a sound, possibly looping. */ class Sound::Impl { public: Impl(const std::string& role, const std::string& uri, unsigned int volume, bool loop): m_role(role), m_uri(uri), m_volume(volume), m_loop(loop) { // init GST once static std::once_flag once; std::call_once(once, [](){ GError* error = nullptr; if (!gst_init_check (nullptr, nullptr, &error)) { g_critical("Unable to play alarm sound: %s", error->message); g_error_free(error); } }); m_play = gst_element_factory_make("playbin", "play"); auto bus = gst_pipeline_get_bus(GST_PIPELINE(m_play)); m_watch_source = gst_bus_add_watch(bus, bus_callback, this); gst_object_unref(bus); g_debug("Playing '%s'", m_uri.c_str()); g_object_set(G_OBJECT (m_play), "uri", m_uri.c_str(), "volume", get_volume(), nullptr); gst_element_set_state (m_play, GST_STATE_PLAYING); } ~Impl() { g_source_remove(m_watch_source); if (m_play != nullptr) { gst_element_set_state (m_play, GST_STATE_NULL); g_clear_pointer (&m_play, gst_object_unref); } } private: // convert settings range [1..100] to gst playbin's range is [0...1.0] gdouble get_volume() const { constexpr int in_range_lo = 1; constexpr int in_range_hi = 100; const double in = CLAMP(m_volume, in_range_lo, in_range_hi); const double pct = (in - in_range_lo) / (in_range_hi - in_range_lo); constexpr double out_range_lo = 0.0; constexpr double out_range_hi = 1.0; return out_range_lo + (pct * (out_range_hi - out_range_lo)); } static gboolean bus_callback(GstBus*, GstMessage* msg, gpointer gself) { auto self = static_cast(gself); const auto message_type = GST_MESSAGE_TYPE(msg); if ((message_type == GST_MESSAGE_EOS) && (self->m_loop)) { gst_element_seek(self->m_play, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_NONE, (gint64)GST_CLOCK_TIME_NONE); } else if (message_type == GST_MESSAGE_STREAM_START) { /* Set the media role if audio sink is pulsesink */ GstElement *audio_sink = nullptr; g_object_get(self->m_play, "audio-sink", &audio_sink, nullptr); if (audio_sink) { GstPluginFeature *feature = nullptr; feature = GST_PLUGIN_FEATURE_CAST(GST_ELEMENT_GET_CLASS(audio_sink)->elementfactory); if (feature && g_strcmp0(gst_plugin_feature_get_name(feature), "pulsesink") == 0) { auto role_str = g_strdup_printf("props,media.role=%s", self->m_role.c_str()); GstStructure *props = gst_structure_from_string(role_str, nullptr); g_object_set(audio_sink, "stream-properties", props, nullptr); gst_structure_free(props); g_free(role_str); } gst_object_unref(audio_sink); } } return G_SOURCE_CONTINUE; // keep listening } /*** **** ***/ const std::string m_role; const std::string m_uri; const unsigned int m_volume; const bool m_loop; guint m_watch_source = 0; GstElement* m_play = nullptr; }; Sound::Sound(const std::string& role, const std::string& uri, unsigned int volume, bool loop): impl (new Impl(role, uri, volume, loop)) { } Sound::~Sound() { } /*** **** ***/ } // namespace notifications } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/timezone-geoclue.cpp0000644000000000000000000002244114773244555020443 0ustar /* * Copyright 2013 Canonical Ltd. * * Authors: * Charles Kerr * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include #include #include #include #include #define GEOCLUE_BUS_NAME "org.freedesktop.Geoclue.Master" namespace ayatana { namespace indicator { namespace datetime { class GeoclueTimezone::Impl { public: Impl(GeoclueTimezone& owner): m_owner(owner), m_cancellable(g_cancellable_new()) { g_bus_get(G_BUS_TYPE_SESSION, m_cancellable, on_bus_got, this); } ~Impl() { g_cancellable_cancel(m_cancellable); g_object_unref(m_cancellable); g_object_unref(m_bus); } private: void remember_subscription(GDBusConnection * bus, guint tag) { g_object_ref(bus); auto deleter = [tag](GDBusConnection* bus){ g_dbus_connection_signal_unsubscribe(bus, tag); g_object_unref(G_OBJECT(bus)); }; m_subscriptions.push_back(std::shared_ptr(bus, deleter)); } static void on_bus_got(GObject * /*source*/, GAsyncResult * res, gpointer gself) { GError * error; GDBusConnection * connection; error = nullptr; connection = g_bus_get_finish(res, &error); if (error) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("Couldn't get bus: %s", error->message); g_error_free(error); } else { auto self = static_cast(gself); self->m_bus = connection; g_dbus_connection_call(self->m_bus, GEOCLUE_BUS_NAME, "/org/freedesktop/Geoclue/Master", "org.freedesktop.Geoclue.Master", "Create", nullptr, // parameters G_VARIANT_TYPE("(o)"), G_DBUS_CALL_FLAGS_NONE, -1, self->m_cancellable, on_client_created, self); } } static void on_client_created(GObject* source, GAsyncResult* res, gpointer gself) { GVariant * result; if ((result = call_finish(G_STRFUNC, source, res))) { auto self = static_cast(gself); GVariant * child = g_variant_get_child_value(result, 0); self->m_client_object_path = g_variant_get_string(child, nullptr); g_variant_unref(child); g_variant_unref(result); auto tag = g_dbus_connection_signal_subscribe(self->m_bus, GEOCLUE_BUS_NAME, "org.freedesktop.Geoclue.Address", // interface "AddressChanged", // signal name self->m_client_object_path.c_str(), // object path nullptr, // arg0 G_DBUS_SIGNAL_FLAGS_NONE, on_address_changed, self, nullptr); self->remember_subscription(self->m_bus, tag); g_dbus_connection_call(self->m_bus, GEOCLUE_BUS_NAME, self->m_client_object_path.c_str(), "org.freedesktop.Geoclue.MasterClient", "SetRequirements", g_variant_new("(iibi)", 2, 0, FALSE, 1023), nullptr, G_DBUS_CALL_FLAGS_NONE, -1, self->m_cancellable, on_requirements_set, self); } } static void on_address_changed(GDBusConnection* /*connection*/, const gchar* /*sender_name*/, const gchar* /*object_path*/, const gchar* /*interface_name*/, const gchar* /*signal_name*/, GVariant* parameters, gpointer gself) { static_cast(gself)->set_timezone_from_address_variant(parameters); } static void on_requirements_set(GObject* source, GAsyncResult* res, gpointer gself) { GVariant * result; if ((result = call_finish(G_STRFUNC, source, res))) { auto self = static_cast(gself); g_dbus_connection_call(self->m_bus, GEOCLUE_BUS_NAME, self->m_client_object_path.c_str(), "org.freedesktop.Geoclue.MasterClient", "AddressStart", nullptr, nullptr, G_DBUS_CALL_FLAGS_NONE, -1, self->m_cancellable, on_address_started, self); g_variant_unref(result); } } static void on_address_started(GObject* source, GAsyncResult* res, gpointer gself) { GVariant * result; if ((result = call_finish(G_STRFUNC, source, res))) { auto self = static_cast(gself); g_dbus_connection_call(self->m_bus, GEOCLUE_BUS_NAME, self->m_client_object_path.c_str(), "org.freedesktop.Geoclue.Address", "GetAddress", nullptr, G_VARIANT_TYPE("(ia{ss}(idd))"), G_DBUS_CALL_FLAGS_NONE, -1, self->m_cancellable, on_address_got, self); g_variant_unref(result); } } static void on_address_got(GObject* source, GAsyncResult* res, gpointer gself) { GVariant * result; if ((result = call_finish(G_STRFUNC, source, res))) { static_cast(gself)->set_timezone_from_address_variant(result); g_variant_unref(result); } } /*** **** ***/ void set_timezone_from_address_variant(GVariant * variant) { g_return_if_fail(g_variant_is_of_type(variant, G_VARIANT_TYPE("(ia{ss}(idd))"))); const gchar * timezone_string = nullptr; GVariant * dict = g_variant_get_child_value(variant, 1); if (dict) { if (g_variant_lookup(dict, "timezone", "&s", &timezone_string)) { g_debug("from geoclue, setting timezone to '%s'", timezone_string); m_owner.timezone.set(timezone_string); } g_variant_unref(dict); } } static GVariant* call_finish(const char * funcname, GObject * source, GAsyncResult * res) { GError * error; GVariant * result; error = nullptr; result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source), res, &error); if (error) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("%s failed: %s", funcname, error->message); g_error_free(error); g_clear_pointer(&result, g_variant_unref); } return result; } /*** **** ***/ GeoclueTimezone & m_owner; GDBusConnection * m_bus = nullptr; GCancellable * m_cancellable = nullptr; std::string m_client_object_path; std::vector> m_subscriptions; }; /**** ***** ****/ GeoclueTimezone::GeoclueTimezone(): impl(new Impl{*this}) { } GeoclueTimezone::~GeoclueTimezone() { } /**** ***** ****/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/timezones-live.cpp0000644000000000000000000000405414773244555020142 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include #include namespace ayatana { namespace indicator { namespace datetime { LiveTimezones::LiveTimezones( const std::shared_ptr& settings, const std::shared_ptr& primary_timezone ): m_primary_timezone(primary_timezone), m_settings(settings) { m_primary_timezone->timezone.changed().connect([this](const std::string&){update_timezones();}); m_settings->show_detected_location.changed().connect([this](bool){update_geolocation();}); update_geolocation(); update_timezones(); } void LiveTimezones::update_geolocation() { // clear the previous pointer, if any m_geo.reset(); // if location detection is enabled, turn on GeoClue if(m_settings->show_detected_location.get()) { auto geo = new GeoclueTimezone(); geo->timezone.changed().connect([this](const std::string&){update_timezones();}); m_geo.reset(geo); } } void LiveTimezones::update_timezones() { const auto a = m_primary_timezone->timezone.get(); const auto b = m_geo ? m_geo->timezone.get() : ""; timezone.set(a.empty() ? b : a); std::set zones; if (!a.empty()) zones.insert(a); if (!b.empty()) zones.insert(b); timezones.set(zones); } } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/timezone-timedated.cpp0000644000000000000000000001442314773244555020761 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include #include #include #include #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class TimedatedTimezone::Impl { public: Impl(TimedatedTimezone& owner, GDBusConnection* connection): m_owner{owner}, m_connection{G_DBUS_CONNECTION(g_object_ref(G_OBJECT(connection)))}, m_cancellable{g_cancellable_new()} { // set the fallback value m_owner.timezone.set("Etc/Utc"); // watch for timedate1 on the bus m_watcher_id = g_bus_watch_name_on_connection( m_connection, Bus::Timedate1::BUSNAME, G_BUS_NAME_WATCHER_FLAGS_AUTO_START, on_timedate1_appeared, on_timedate1_vanished, this, nullptr); // listen for changed properties m_signal_subscription_id = g_dbus_connection_signal_subscribe( m_connection, Bus::Timedate1::IFACE, Bus::Properties::IFACE, Bus::Properties::Signals::PROPERTIES_CHANGED, Bus::Timedate1::ADDR, nullptr, G_DBUS_SIGNAL_FLAGS_NONE, on_properties_changed, this, nullptr); } ~Impl() { g_cancellable_cancel(m_cancellable); g_clear_object(&m_cancellable); g_bus_unwatch_name(m_watcher_id); g_dbus_connection_signal_unsubscribe(m_connection, m_signal_subscription_id); g_clear_object(&m_connection); } private: static void on_timedate1_appeared(GDBusConnection * /*connection*/, const gchar * name, const gchar * /*name_owner*/, gpointer gself) { g_debug("%s appeared on bus", name); static_cast(gself)->ask_for_timezone(); } static void on_timedate1_vanished(GDBusConnection * /*connection*/, const gchar * name, gpointer /*gself*/) { g_debug("%s not present on bus", name); } static void on_properties_changed(GDBusConnection * /*connection*/, const gchar * /*sender_name*/, const gchar * /*object_path*/, const gchar * /*interface_name*/, const gchar * /*signal_name*/, GVariant * parameters, gpointer gself) { auto self = static_cast(gself); GVariant* changed_properties {}; gchar** invalidated_properties {}; g_variant_get(parameters, "(s@a{sv}^as)", NULL, &changed_properties, &invalidated_properties); const char* tz {}; if (g_variant_lookup(changed_properties, Bus::Timedate1::Properties::TIMEZONE, "&s", &tz, NULL)) { if (tz != nullptr) self->set_timezone(tz); else g_warning("%s no timezone found", G_STRLOC); } else if (g_strv_contains(invalidated_properties, Bus::Timedate1::Properties::TIMEZONE)) { self->ask_for_timezone(); } g_variant_unref(changed_properties); g_strfreev(invalidated_properties); } void ask_for_timezone() { g_dbus_connection_call( m_connection, Bus::Timedate1::BUSNAME, Bus::Timedate1::ADDR, Bus::Properties::IFACE, Bus::Properties::Methods::GET, g_variant_new("(ss)", Bus::Timedate1::IFACE, Bus::Timedate1::Properties::TIMEZONE), G_VARIANT_TYPE("(v)"), G_DBUS_CALL_FLAGS_NONE, -1, m_cancellable, on_get_timezone_ready, this); } static void on_get_timezone_ready(GObject * connection, GAsyncResult * res, gpointer gself) { GError* error {}; GVariant* v = g_dbus_connection_call_finish(G_DBUS_CONNECTION(connection), res, &error); if (error != nullptr) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("%s Couldn't get timezone: %s", G_STRLOC, error->message); } else if (v != nullptr) { GVariant* tzv {}; g_variant_get(v, "(v)", &tzv); const char* tz = g_variant_get_string(tzv, nullptr); if (tz != nullptr) static_cast(gself)->set_timezone(tz); else g_warning("%s no timezone found", G_STRLOC); g_clear_pointer(&tzv, g_variant_unref); g_clear_pointer(&v, g_variant_unref); } } void set_timezone(const std::string& tz) { g_return_if_fail(!tz.empty()); g_debug("set timezone: '%s'", tz.c_str()); m_owner.timezone.set(tz); } /*** **** ***/ TimedatedTimezone& m_owner; GDBusConnection* m_connection {}; GCancellable* m_cancellable {}; unsigned long m_signal_subscription_id {}; unsigned int m_watcher_id {}; }; /*** **** ***/ TimedatedTimezone::TimedatedTimezone(GDBusConnection* connection): impl{new Impl{*this, connection}} { } TimedatedTimezone::~TimedatedTimezone() { } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/utils.c0000644000000000000000000003477214773244555016002 0ustar /* * Copyright 2010, 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Michael Terry * Charles Kerr */ #include #include #include #include #include #include #include /* Check the system locale setting to see if the format is 24-hour time or 12-hour time */ gboolean is_locale_12h(void) { int i; static const char *formats_24h[] = {"%H", "%R", "%T", "%OH", "%k", NULL}; const char* t_fmt = nl_langinfo(T_FMT); for (i=0; formats_24h[i]!=NULL; i++) if (strstr(t_fmt, formats_24h[i]) != NULL) return FALSE; return TRUE; } void split_settings_location(const gchar* location, gchar** zone, gchar** name) { gchar* location_dup = g_strdup(location); if(location_dup != NULL) g_strstrip(location_dup); gchar* first = NULL; if(location_dup && (first = strchr(location_dup, ' '))) *first = '\0'; if(zone) *zone = location_dup; if(name != NULL) { gchar* after = first ? g_strstrip(first + 1) : NULL; if(after && *after) { *name = g_strdup(after); } else if (location_dup) // make the name from zone { gchar * chr = strrchr(location_dup, '/'); after = g_strdup(chr ? chr + 1 : location_dup); // replace underscores with spaces for(chr=after; chr && *chr; chr++) if(*chr == '_') *chr = ' '; *name = after; } else { *name = NULL; } } } /** * Our Locations come from two places: (1) direct user input and (2) ones * guessed by the system, such as from geoclue or timedate1. * * Since the latter only have a timezone (eg, "America/Chicago") and the * former have a descriptive name provided by the end user (eg, * "America/Chicago Oklahoma City"), this function tries to make a * more human-readable name by using the user-provided name if the guessed * timezone matches the last one the user manually clicked on. * * In the example above, this allows the menuitem for the system-guessed * timezone ("America/Chicago") to read "Oklahoma City" after the user clicks * on the "Oklahoma City" menuitem. */ gchar* get_beautified_timezone_name(const char* timezone_, const char* saved_location) { gchar* zone; gchar* name; split_settings_location(timezone_, &zone, &name); gchar* saved_zone; gchar* saved_name; split_settings_location(saved_location, &saved_zone, &saved_name); gchar* rv; if (g_strcmp0(zone, saved_zone) == 0) { rv = saved_name; saved_name = NULL; } else { rv = name; name = NULL; } g_free(zone); g_free(name); g_free(saved_zone); g_free(saved_name); return rv; } gchar* get_timezone_name(const gchar* timezone_, GSettings* settings) { gchar* saved_location = g_settings_get_string(settings, SETTINGS_TIMEZONE_NAME_S); gchar* rv = get_beautified_timezone_name(timezone_, saved_location); g_free(saved_location); return rv; } /*** **** ***/ typedef enum { DATE_PROXIMITY_TODAY, DATE_PROXIMITY_TOMORROW, DATE_PROXIMITY_WEEK, DATE_PROXIMITY_FAR } date_proximity_t; static date_proximity_t getDateProximity(GDateTime* now, GDateTime* time) { date_proximity_t prox = DATE_PROXIMITY_FAR; gint now_year, now_month, now_day; gint time_year, time_month, time_day; // did it already happen? if (g_date_time_difference(time, now) < -G_USEC_PER_SEC) return DATE_PROXIMITY_FAR; // does it happen today? g_date_time_get_ymd(now, &now_year, &now_month, &now_day); g_date_time_get_ymd(time, &time_year, &time_month, &time_day); if ((now_year == time_year) && (now_month == time_month) && (now_day == time_day)) prox = DATE_PROXIMITY_TODAY; // does it happen tomorrow? if (prox == DATE_PROXIMITY_FAR) { GDateTime* tomorrow = g_date_time_add_days(now, 1); gint tom_year, tom_month, tom_day; g_date_time_get_ymd(tomorrow, &tom_year, &tom_month, &tom_day); if ((tom_year == time_year) && (tom_month == time_month) && (tom_day == time_day)) prox = DATE_PROXIMITY_TOMORROW; g_date_time_unref(tomorrow); } // does it happen this week? if (prox == DATE_PROXIMITY_FAR) { GDateTime* week = g_date_time_add_days(now, 6); GDateTime* week_bound = g_date_time_new_local(g_date_time_get_year(week), g_date_time_get_month(week), g_date_time_get_day_of_month(week), 23, 59, 59.9); if (g_date_time_compare(time, week_bound) <= 0) prox = DATE_PROXIMITY_WEEK; g_date_time_unref(week_bound); g_date_time_unref(week); } return prox; } const char* T_(const char *msg) { /* General strategy here is to make sure LANGUAGE is empty (since that trumps all LC_* vars) and then to temporarily swap LC_TIME and LC_MESSAGES. Then have gettext translate msg. We strdup the strings because the setlocale & *env functions do not guarantee anything about the storage used for the string, and thus the string may not be portably safe after multiple calls. Note that while you might think g_dcgettext would do the trick here, that actually looks in /usr/share/locale/XX/LC_TIME, not the LC_MESSAGES directory, so we won't find any translation there. */ gchar* message_locale = g_strdup(setlocale(LC_MESSAGES, NULL)); const char* time_locale = setlocale(LC_TIME, NULL); gchar* language = g_strdup(g_getenv("LANGUAGE")); if (language) g_unsetenv("LANGUAGE"); setlocale(LC_MESSAGES, time_locale); /* Get the LC_TIME version */ const char* rv = _(msg); /* Put everything back the way it was */ setlocale(LC_MESSAGES, message_locale); if (language) g_setenv("LANGUAGE", language, TRUE); g_free(message_locale); g_free(language); return rv; } /** * _ a time today should be shown as just the time (e.g. “3:55 PM”) * _ a full-day event today should be shown as “Today” * _ a time any other day this week should be shown as the short version of the * day and time (e.g. “Wed 3:55 PM”) * _ a full-day event tomorrow should be shown as “Tomorrow” * _ a full-day event another day this week should be shown as the * weekday (e.g. “Friday”) * _ a time after this week should be shown as the short version of the day, * date, and time (e.g. “Wed 21 Apr 3:55 PM”) * _ a full-day event after this week should be shown as the short version of * the day and date (e.g. “Wed 21 Apr”). * _ in addition, when presenting the times of upcoming events, the time should * be followed by the timezone if it is different from the one the computer * is currently set to. For example, “Wed 3:55 PM UTC−5”. */ char* generate_full_format_string_at_time (GDateTime* now, GDateTime* then, GDateTime* then_end) { GString* ret = g_string_new (NULL); if (then != NULL) { const gboolean full_day = then_end && (g_date_time_difference(then_end, then) >= G_TIME_SPAN_DAY); const date_proximity_t prox = getDateProximity(now, then); if (full_day) { switch (prox) { case DATE_PROXIMITY_TODAY: g_string_assign (ret, T_("Today")); break; case DATE_PROXIMITY_TOMORROW: g_string_assign (ret, T_("Tomorrow")); break; case DATE_PROXIMITY_WEEK: /* This is a strftime(3) format string indicating the unabbreviated weekday. */ g_string_assign (ret, T_("%A")); break; case DATE_PROXIMITY_FAR: /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! This format string is used for showing full-day events that are over a week away. en_US example: "%a %b %d" --> "Sat Oct 31" en_GB example: "%a %d %b" --> "Sat 31 Oct" zh_CN example(?): "%m月%d日 周%a" --> "10月31日 周六" */ g_string_assign (ret, T_("%a %d %b")); break; } } else if (is_locale_12h()) { switch (prox) { case DATE_PROXIMITY_TODAY: /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! This format string is used for showing, on a 12-hour clock, events/appointments that happen today. en_US example: "%l:%M %p" --> "1:00 PM" */ g_string_assign (ret, T_("%l:%M %p")); break; case DATE_PROXIMITY_TOMORROW: /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! This format string is used for showing, on a 12-hour clock, events/appointments that happen tomorrow. (Note: the space between the day and the time is an em space (unicode character 2003), which is slightly wider than a normal space.) en_US example: "Tomorrow %l:%M %p" --> "Tomorrow 1:00 PM" */ g_string_assign (ret, T_("Tomorrow %l:%M %p")); break; case DATE_PROXIMITY_WEEK: /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! This format string is used for showing, on a 12-hour clock, events/appointments that happen this week. (Note: the space between the day and the time is an em space (unicode character 2003), which is slightly wider than a normal space.) en_US example: "Tomorrow %l:%M %p" --> "Fri 1:00 PM" */ g_string_assign (ret, T_("%a %l:%M %p")); break; case DATE_PROXIMITY_FAR: /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! This format string is used for showing, on a 12-hour clock, events/appointments that happen over a week from now. (Note: the space between the day and the time is an em space (unicode character 2003), which is slightly wider than a normal space.) en_US example: "%a %b %d %l:%M %p" --> "Fri Oct 31 1:00 PM" en_GB example: "%a %d %b %l:%M %p" --> "Fri 31 Oct 1:00 PM" */ g_string_assign (ret, T_("%a %d %b %l:%M %p")); break; } } else { switch (prox) { case DATE_PROXIMITY_TODAY: /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! This format string is used for showing, on a 24-hour clock, events/appointments that happen today. en_US example: "%H:%M" --> "13:00" */ g_string_assign (ret, T_("%H:%M")); break; case DATE_PROXIMITY_TOMORROW: /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! This format string is used for showing, on a 24-hour clock, events/appointments that happen tomorrow. (Note: the space between the day and the time is an em space (unicode character 2003), which is slightly wider than a normal space.) en_US example: "Tomorrow %l:%M %p" --> "Tomorrow 13:00" */ g_string_assign (ret, T_("Tomorrow %H:%M")); break; case DATE_PROXIMITY_WEEK: /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! This format string is used for showing, on a 24-hour clock, events/appointments that happen this week. (Note: the space between the day and the time is an em space (unicode character 2003), which is slightly wider than a normal space.) en_US example: "%a %H:%M" --> "Fri 13:00" */ g_string_assign (ret, T_("%a %H:%M")); break; case DATE_PROXIMITY_FAR: /* Translators, please edit/rearrange these strftime(3) tokens to suit your locale! This format string is used for showing, on a 24-hour clock, events/appointments that happen over a week from now. (Note: the space between the day and the time is an em space (unicode character 2003), which is slightly wider than a normal space.) en_US example: "%a %b %d %H:%M" --> "Fri Oct 31 13:00" en_GB example: "%a %d %b %H:%M" --> "Fri 31 Oct 13:00" */ g_string_assign (ret, T_("%a %d %b %H:%M")); break; } } /* if it's an appointment in a different timezone (and doesn't run for a full day) then the time should be followed by its timezone. */ if ((then_end != NULL) && (!full_day) && ((g_date_time_get_utc_offset(now) != g_date_time_get_utc_offset(then)))) { g_string_append_printf (ret, " %s", g_date_time_get_timezone_abbreviation(then)); } } return g_string_free (ret, FALSE); } ayatana-indicator-datetime-25.4.0/src/wakeup-timer-mainloop.cpp0000644000000000000000000000605214773244555021416 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include // abs() namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class MainloopWakeupTimer::Impl { public: explicit Impl(const std::shared_ptr& clock): m_clock(clock) { } ~Impl() { cancel_timer(); } void set_wakeup_time(const DateTime& d) { m_wakeup_time = d; rebuild_timer(); } core::Signal<>& timeout() { return m_timeout; } private: void rebuild_timer() { cancel_timer(); g_return_if_fail(m_wakeup_time.is_set()); const auto now = m_clock->localtime(); const auto difference_usec = g_date_time_difference(m_wakeup_time.get(), now.get()); const guint interval_msec = std::abs(difference_usec) / 1000u; g_debug("%s setting wakeup timer to kick at %s, which is in %zu seconds", G_STRFUNC, m_wakeup_time.format("%F %T").c_str(), size_t{interval_msec/1000}); m_timeout_tag = g_timeout_add_full(G_PRIORITY_HIGH, interval_msec, on_timeout, this, nullptr); } static gboolean on_timeout(gpointer gself) { g_debug("%s %s", G_STRLOC, G_STRFUNC); static_cast(gself)->on_timeout(); return G_SOURCE_REMOVE; } void on_timeout() { cancel_timer(); m_timeout(); } void cancel_timer() { if (m_timeout_tag != 0) { g_source_remove(m_timeout_tag); m_timeout_tag = 0; } } core::Signal<> m_timeout; const std::shared_ptr& m_clock; guint m_timeout_tag = 0; DateTime m_wakeup_time; }; /*** **** ***/ MainloopWakeupTimer::MainloopWakeupTimer(const std::shared_ptr& clock): p(new Impl(clock)) { } MainloopWakeupTimer::~MainloopWakeupTimer() { } void MainloopWakeupTimer::set_wakeup_time(const DateTime& d) { p->set_wakeup_time(d); } core::Signal<>& MainloopWakeupTimer::timeout() { return p->timeout(); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/src/wakeup-timer-powerd.cpp0000644000000000000000000002315314773244555021101 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021-2022 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include // BUS_POWERD_NAME #include #include // std::shared_ptr namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class PowerdWakeupTimer::Impl { public: explicit Impl(const std::shared_ptr& clock): m_cancellable(g_cancellable_new()) { g_bus_get(G_BUS_TYPE_SYSTEM, m_cancellable, on_bus_ready, this); } ~Impl() { clear_current_cookie(); g_cancellable_cancel(m_cancellable); g_clear_object(&m_cancellable); if (m_sub_id) g_dbus_connection_signal_unsubscribe(m_bus.get(), m_sub_id); if (m_watch_tag) g_bus_unwatch_name(m_watch_tag); } void set_wakeup_time(const DateTime& d) { m_wakeup_time = d; update_cookie(); } core::Signal<>& timeout() { return m_timeout; } private: void emit_timeout() { return m_timeout(); } static void on_bus_ready(GObject * /*unused*/, GAsyncResult * res, gpointer gself) { GError * error; GDBusConnection * bus; error = nullptr; bus = g_bus_get_finish(res, &error); if (bus == nullptr) { if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("%s Couldn't get system bus: %s", G_STRLOC, error->message); } else { static_cast(gself)->init_bus(bus); } g_clear_object(&bus); g_clear_error(&error); } void init_bus(GDBusConnection* connection) { m_bus.reset(G_DBUS_CONNECTION(g_object_ref(G_OBJECT(connection))), [](GDBusConnection *c){g_object_unref(G_OBJECT(c));}); m_sub_id = g_dbus_connection_signal_subscribe(m_bus.get(), BUS_POWERD_NAME, BUS_POWERD_INTERFACE, "Wakeup", BUS_POWERD_PATH, nullptr, G_DBUS_SIGNAL_FLAGS_NONE, on_wakeup_signal, this, // userdata nullptr); // userdata free m_watch_tag = g_bus_watch_name_on_connection(m_bus.get(), BUS_POWERD_NAME, G_BUS_NAME_WATCHER_FLAGS_NONE, on_name_appeared_static, nullptr, // name-vanished, this, // userdata nullptr); // userdata free } static void on_wakeup_signal(GDBusConnection * /*connection*/, const gchar * sender_name, const gchar * /*object_path*/, const gchar * /*interface_name*/, const gchar * /*signal_name*/, GVariant * /*parameters*/, gpointer gself) { g_debug("%s %s broadcast a hw wakeup signal", G_STRLOC, sender_name); static_cast(gself)->emit_timeout(); } static void on_name_appeared_static(GDBusConnection * /*connection*/, const gchar * name, const gchar * name_owner, gpointer gself) { g_debug("%s %s owns %s now; let's ask for a new cookie", G_STRLOC, name, name_owner); static_cast(gself)->update_cookie(); } /*** **** requestWakeup ***/ void update_cookie() { if (!m_bus) return; // if we've already got a cookie, clear it clear_current_cookie(); g_warn_if_fail(m_cookie.empty()); // get a new cookie, if necessary if (m_wakeup_time.is_set()) { g_debug("%s calling %s::requestWakeup(%s)", G_STRLOC, BUS_POWERD_NAME, m_wakeup_time.format("%F %T").c_str()); auto args = g_variant_new("(st)", GETTEXT_PACKAGE, uint64_t(m_wakeup_time.to_unix())); g_dbus_connection_call(m_bus.get(), BUS_POWERD_NAME, BUS_POWERD_PATH, BUS_POWERD_INTERFACE, "requestWakeup", // method_name args, G_VARIANT_TYPE("(s)"), // reply_type G_DBUS_CALL_FLAGS_NONE, -1, // use default timeout m_cancellable, on_request_wakeup_done, this); } } static void on_request_wakeup_done(GObject * o, GAsyncResult * res, gpointer gself) { GError * error; GVariant * ret; error = nullptr; ret = g_dbus_connection_call_finish(G_DBUS_CONNECTION(o), res, &error); if (ret == nullptr) { /* powerd isn't on the desktop, but we don't need hardware wakeups there anyway... so no need to warn on SERVICE_UNKNOWN */ if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED) && !g_error_matches(error, G_DBUS_ERROR, G_DBUS_ERROR_SERVICE_UNKNOWN)) { g_warning("%s Could not set hardware wakeup: %s", G_STRLOC, error->message); } } else { const char* s = nullptr; g_variant_get(ret, "(&s)", &s); g_debug("%s %s::requestWakeup() sent cookie %s", G_STRLOC, BUS_POWERD_NAME, s); auto& cookie = static_cast(gself)->m_cookie; if (s != nullptr) cookie = s; else cookie.clear(); } // cleanup g_clear_pointer(&ret, g_variant_unref); g_clear_error(&error); } /*** **** clearWakeup ***/ void clear_current_cookie() { if (!m_cookie.empty()) { g_debug("%s calling %s::clearWakeup(%s)", G_STRLOC, BUS_POWERD_NAME, m_cookie.c_str()); g_dbus_connection_call(m_bus.get(), BUS_POWERD_NAME, BUS_POWERD_PATH, BUS_POWERD_INTERFACE, "clearWakeup", // method_name g_variant_new("(s)", m_cookie.c_str()), nullptr, // no response type G_DBUS_CALL_FLAGS_NONE, -1, // use default timeout nullptr, // cancellable on_clear_wakeup_done, nullptr); m_cookie.clear(); } } // this is only here to log errors static void on_clear_wakeup_done(GObject * o, GAsyncResult * res, gpointer /*unused*/) { GError * error; GVariant * ret; error = nullptr; ret = g_dbus_connection_call_finish(G_DBUS_CONNECTION(o), res, &error); if (!ret && !g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) g_warning("%s Couldn't clear hardware wakeup: %s", G_STRLOC, error->message); // cleanup g_clear_pointer(&ret, g_variant_unref); g_clear_error(&error); } /*** **** ***/ core::Signal<> m_timeout; DateTime m_wakeup_time; std::shared_ptr m_bus; GCancellable * m_cancellable = nullptr; std::string m_cookie; guint m_watch_tag = 0; guint m_sub_id = 0; }; /*** **** ***/ PowerdWakeupTimer::PowerdWakeupTimer(const std::shared_ptr& clock): p(new Impl(clock)) { } PowerdWakeupTimer::~PowerdWakeupTimer() { } void PowerdWakeupTimer::set_wakeup_time(const DateTime& d) { p->set_wakeup_time(d); } core::Signal<>& PowerdWakeupTimer::timeout() { return p->timeout(); } /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana ayatana-indicator-datetime-25.4.0/tests/accounts.db0000644000000000000000000004600014773244555017162 0ustar SQLite format 3@ -   cB+ user@ubuntu.comUbuntu3 uphablet@ubuntu.comUbuntu  Accounts Services&    <<<<<<<<<<<<<MMMMMMMMDY[llYlMMrM\MAM*MmO hhh`H`#" 4#`[cH[HNH>H(HHjXF5#`N=0 zzP%pUtableAccountsAccountsCREATE TABLE Accounts (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,provider TEXT,enabled INTEGER)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)!tableServicesServicesCREATE TABLE Services (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL UNIQUE,display TEXT NOT NULL,provider TEXT,type TEXT)/Cindexsqlite_autoindex_Services_1ServicesI#aindexidx_serviceServicesCREATE INDEX idx_service ON Services(name) mtableSettingsSettingsCREATE TABLE Settings (account INTEGER NOT NULL,service INTEGER,key TEXT NOT NULL,type TEXT NOT NULL,value BLOB)  O\m )!indexidx_signaturesSignatures CREATE UNIQUE INDEX idx_signatures ON Signatures (account, service, key)c#indexidx_settingSettingsCREATE UNIQUE INDEX idx_setting ON Settings (account, service, key)%/ triggertg_delete_accountAccountsCREATE TRIGGER tg_delete_account BEFORE DELETE ON Accounts FOR EACH ROW BEGIN DELETE FROM Settings WHERE account = OLD.id; END! !! tableSignaturesSignatures CREATE TABLE Signatures (account INTEGER NOT NULL,service INTEGER,key TEXT NOT NULL,signature TEXT NOT NULL,token TEXT NOT NULL)  ayatana-indicator-datetime-25.4.0/tests/actions-mock.h0000644000000000000000000000543114773244555017577 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_ACTIONS_MOCK_H #define INDICATOR_DATETIME_ACTIONS_MOCK_H #include #include namespace ayatana { namespace indicator { namespace datetime { class MockActions: public Actions { public: explicit MockActions(const std::shared_ptr& state_in): Actions(state_in) {} ~MockActions() =default; enum Action { OpenAlarmApp, OpenAppt, OpenCalendarApp, OpenSettingsApp, SetLocation }; const std::vector& history() const { return m_history; } const DateTime& date_time() const { return m_date_time; } const std::string& zone() const { return m_zone; } const std::string& name() const { return m_name; } const Appointment& appointment() const { return m_appt; } void clear() { m_history.clear(); m_zone.clear(); m_name.clear(); } bool desktop_has_calendar_app() const { return m_desktop_has_calendar_app; } std::string open_alarm_app() { m_history.push_back(OpenAlarmApp); return ""; } std::string open_appointment(const Appointment& appt, const DateTime& dt) { m_appt = appt; m_date_time = dt; m_history.push_back(OpenAppt); return ""; } std::string open_calendar_app(const DateTime& dt) { m_date_time = dt; m_history.push_back(OpenCalendarApp); return ""; } std::string open_settings_app() { m_history.push_back(OpenSettingsApp); return ""; } void set_location(const std::string& zone_, const std::string& name_) { m_history.push_back(SetLocation); m_zone = zone_; m_name = name_; } void set_desktop_has_calendar_app(bool b) { m_desktop_has_calendar_app = b; } private: bool m_desktop_has_calendar_app = true; Appointment m_appt; std::string m_zone; std::string m_name; DateTime m_date_time; std::vector m_history; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_ACTIONS_MOCK_H ayatana-indicator-datetime-25.4.0/tests/CMakeLists.txt0000644000000000000000000001525414773244555017603 0ustar find_package(GMock REQUIRED) # dbustest pkg_check_modules(DBUSTEST REQUIRED dbustest-1>=14.04.0) include_directories (SYSTEM ${DBUSTEST_INCLUDE_DIRS}) # build the necessary schemas set_directory_properties (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES gschemas.compiled) set_source_files_properties (gschemas.compiled GENERATED) # GSettings: # compile the ayatana-indicator-datetime schema into a gschemas.compiled file in this directory, # and help the tests to find that file by setting -DSCHEMA_DIR set (SCHEMA_DIR ${CMAKE_CURRENT_BINARY_DIR}) add_definitions(-DSCHEMA_DIR="${SCHEMA_DIR}") execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_schemas OUTPUT_VARIABLE COMPILE_SCHEMA_EXECUTABLE OUTPUT_STRIP_TRAILING_WHITESPACE) add_custom_command (OUTPUT gschemas.compiled DEPENDS ${CMAKE_BINARY_DIR}/data/org.ayatana.indicator.datetime.gschema.xml COMMAND cp -n ${CMAKE_BINARY_DIR}/data/*gschema.xml ${SCHEMA_DIR} || echo "Skip copying schema file, another thread is doing it already" COMMAND ${COMPILE_SCHEMA_EXECUTABLE} ${SCHEMA_DIR}) # look for headers in our src dir, and also in the directories where we autogenerate files... include_directories (${CMAKE_SOURCE_DIR}/src) include_directories (${CMAKE_BINARY_DIR}/src) include_directories (${CMAKE_CURRENT_BINARY_DIR}) include_directories (${DBUSTEST_INCLUDE_DIRS}) add_definitions (-DSANDBOX="${CMAKE_CURRENT_BINARY_DIR}") add_definitions (-DG_LOG_DOMAIN="ayatana-indicator-datetime") function(add_test_by_name name) set (TEST_NAME ${name}) set (COVERAGE_TEST_TARGETS ${COVERAGE_TEST_TARGETS} ${TEST_NAME} PARENT_SCOPE) add_executable (${TEST_NAME} ${TEST_NAME}.cpp gschemas.compiled) target_link_options(${TEST_NAME} PRIVATE -no-pie) add_test (${TEST_NAME} ${TEST_NAME}) target_link_libraries (${TEST_NAME} indicatordatetimeservice ${DBUSTEST_LIBRARIES} ${SERVICE_DEPS_LIBRARIES} ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES}) endfunction() add_test_by_name(test-datetime) add_test_by_name(test-sound) if (ENABLE_LOMIRI_FEATURES) add_test_by_name(test-notification) endif () add_test_by_name(test-notification-response) add_test_by_name(test-actions) add_test_by_name(test-alarm-queue) add_test(NAME dear-reader-the-next-test-takes-60-seconds COMMAND true) add_test_by_name(test-clock) add_test_by_name(test-exporter) add_test_by_name(test-formatter) add_test_by_name(test-live-actions) add_test_by_name(test-locations) add_test_by_name(test-menu-appointments) add_test_by_name(test-menus) add_test_by_name(test-planner) add_test_by_name(test-settings) add_test_by_name(test-timezone-timedated) add_test_by_name(test-utils) set (TEST_NAME manual-test-snap) set (COVERAGE_TEST_TARGETS ${COVERAGE_TEST_TARGETS} ${TEST_NAME}) add_executable (${TEST_NAME} ${TEST_NAME}.cpp) target_link_options(${TEST_NAME} PRIVATE -no-pie) target_link_libraries (${TEST_NAME} indicatordatetimeservice ${SERVICE_DEPS_LIBRARIES} ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES}) ## ## EDS Tests ## find_program(DBUS_RUNNER dbus-test-runner) if (ENABLE_LOMIRI_FEATURES) function(add_eds_ics_test_by_name name) set (TEST_NAME ${name}) set (COVERAGE_TEST_TARGETS ${COVERAGE_TEST_TARGETS} ${TEST_NAME} PARENT_SCOPE) add_executable(${TEST_NAME} ${TEST_NAME}.cpp gschemas.compiled) target_link_options(${TEST_NAME} PRIVATE -no-pie) target_link_libraries (${TEST_NAME} indicatordatetimeservice ${DBUSTEST_LIBRARIES} ${SERVICE_DEPS_LIBRARIES} ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES}) add_test (${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/run-mkcal-db-test.sh ${DBUS_RUNNER} # arg1: dbus-test-runner exec ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME} # arg2: test executable path ${TEST_NAME} # arg3: test name ${CMAKE_CURRENT_SOURCE_DIR}/${TEST_NAME}.db # arg4: the database file for this test ${CMAKE_CURRENT_SOURCE_DIR}/accounts.db) # arg5: online accounts database endfunction() else () function(add_eds_ics_test_by_name name) set (TEST_NAME ${name}) set (COVERAGE_TEST_TARGETS ${COVERAGE_TEST_TARGETS} ${TEST_NAME} PARENT_SCOPE) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${TEST_NAME}.ics.in" "${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME}.ics") add_executable(${TEST_NAME} ${TEST_NAME}.cpp gschemas.compiled) target_link_options(${TEST_NAME} PRIVATE -no-pie) target_link_libraries (${TEST_NAME} indicatordatetimeservice ${DBUSTEST_LIBRARIES} ${SERVICE_DEPS_LIBRARIES} ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES}) add_test (${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/run-eds-ics-test.sh ${DBUS_RUNNER} # arg1: dbus-test-runner exec ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME} # arg2: test executable path ${TEST_NAME} # arg3: test name ${CMAKE_CURRENT_SOURCE_DIR}/test-eds-ics-config-files # arg4: base directory for config file template ${CMAKE_CURRENT_BINARY_DIR}/${TEST_NAME}.ics # arg5: the ical file for this test ${CMAKE_CURRENT_SOURCE_DIR}/accounts.db) # arg6: online accounts database endfunction() endif () add_eds_ics_test_by_name(test-eds-ics-all-day-events) add_eds_ics_test_by_name(test-eds-ics-repeating-events) add_eds_ics_test_by_name(test-eds-ics-nonrepeating-events) add_eds_ics_test_by_name(test-eds-ics-repeating-valarms) add_eds_ics_test_by_name(test-eds-ics-missing-trigger) add_eds_ics_test_by_name(test-eds-ics-tzids) add_eds_ics_test_by_name(test-eds-ics-tzids-2) add_eds_ics_test_by_name(test-eds-ics-tzids-utc) add_eds_ics_test_by_name(test-eds-ics-non-attending-alarms) add_eds_ics_test_by_name(test-eds-ics-repeating-events-with-individual-change) add_eds_ics_test_by_name(test-eds-ics-alarm-custom-sound) function(add_dbusmock_test_by_name name) set (TEST_NAME ${name}) set (COVERAGE_TEST_TARGETS ${COVERAGE_TEST_TARGETS} ${TEST_NAME} PARENT_SCOPE) add_executable (${TEST_NAME} ${TEST_NAME}.cpp gschemas.compiled) target_link_options(${TEST_NAME} PRIVATE -no-pie) add_test (${TEST_NAME} ${TEST_NAME}) target_link_libraries (${TEST_NAME} indicatordatetimeservice ${SERVICE_DEPS_LIBRARIES} ${DBUSTEST_LIBRARIES} ${GTEST_LIBRARIES} ${GMOCK_LIBRARIES}) endfunction() add_dbusmock_test_by_name(test-timezone-geoclue) add_dbusmock_test_by_name(test-timezones) set( COVERAGE_TEST_TARGETS ${COVERAGE_TEST_TARGETS} PARENT_SCOPE ) ayatana-indicator-datetime-25.4.0/tests/geoclue-fixture.h0000644000000000000000000001303514773244555020316 0ustar /* * Copyright 2013 Canonical Ltd. * * Authors: * Charles Kerr * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef INDICATOR_DATETIME_TESTS_GEOCLUE_FIXTURE_H #define INDICATOR_DATETIME_TESTS_GEOCLUE_FIXTURE_H #include "glib-fixture.h" #include class GeoclueFixture : public GlibFixture { private: typedef GlibFixture super; GDBusConnection * bus = nullptr; protected: DbusTestService * service = nullptr; DbusTestDbusMock * mock = nullptr; DbusTestDbusMockObject * obj_geo = nullptr; DbusTestDbusMockObject * obj_geo_m = nullptr; DbusTestDbusMockObject * obj_geo_mc = nullptr; DbusTestDbusMockObject * obj_geo_addr = nullptr; const std::string timezone_1 = "America/Denver"; void SetUp () override { super::SetUp(); GError * error = nullptr; const auto master_path = "/org/freedesktop/Geoclue/Master"; const auto client_path = "/org/freedesktop/Geoclue/Master/client0"; GString * gstr = g_string_new (nullptr); service = dbus_test_service_new (nullptr); mock = dbus_test_dbus_mock_new ("org.freedesktop.Geoclue.Master"); auto interface = "org.freedesktop.Geoclue.Master"; obj_geo_m = dbus_test_dbus_mock_get_object (mock, master_path, interface, nullptr); g_string_printf (gstr, "ret = '%s'", client_path); dbus_test_dbus_mock_object_add_method (mock, obj_geo_m, "Create", nullptr, G_VARIANT_TYPE_OBJECT_PATH, gstr->str, &error); interface = "org.freedesktop.Geoclue.MasterClient"; obj_geo_mc = dbus_test_dbus_mock_get_object (mock, client_path, interface, nullptr); dbus_test_dbus_mock_object_add_method (mock, obj_geo_mc, "SetRequirements", G_VARIANT_TYPE("(iibi)"), nullptr, "", &error); dbus_test_dbus_mock_object_add_method (mock, obj_geo_mc, "AddressStart", nullptr, nullptr, "", &error); interface = "org.freedesktop.Geoclue"; obj_geo = dbus_test_dbus_mock_get_object (mock, client_path, interface, nullptr); dbus_test_dbus_mock_object_add_method (mock, obj_geo, "AddReference", nullptr, nullptr, "", &error); g_string_printf (gstr, "ret = (1385238033, {'timezone': '%s'}, (3, 0.0, 0.0))", timezone_1.c_str()); interface = "org.freedesktop.Geoclue.Address"; obj_geo_addr = dbus_test_dbus_mock_get_object (mock, client_path, interface, nullptr); dbus_test_dbus_mock_object_add_method (mock, obj_geo_addr, "GetAddress", nullptr, G_VARIANT_TYPE("(ia{ss}(idd))"), gstr->str, &error); dbus_test_service_add_task(service, DBUS_TEST_TASK(mock)); dbus_test_service_start_tasks(service); bus = g_bus_get_sync (G_BUS_TYPE_SESSION, nullptr, nullptr); g_dbus_connection_set_exit_on_close (bus, FALSE); g_object_add_weak_pointer (G_OBJECT(bus), (gpointer*)&bus); g_string_free (gstr, TRUE); } void TearDown () override { g_clear_object (&mock); g_clear_object (&service); g_object_unref (bus); unsigned int cleartry = 0; while (bus != nullptr && cleartry < 10) { wait_msec (100); cleartry++; } // I've looked and can't find where this extra ref is coming from. // is there an unbalanced ref to the bus in the test harness?! while (bus != nullptr) { g_object_unref (bus); wait_msec (1000); } super::TearDown (); } private: struct EmitAddressChangedData { DbusTestDbusMock * mock = nullptr; DbusTestDbusMockObject * obj_geo_addr = nullptr; std::string timezone; EmitAddressChangedData(DbusTestDbusMock* mock_, DbusTestDbusMockObject* obj_geo_addr_, const std::string& timezone_): mock(mock_), obj_geo_addr(obj_geo_addr_), timezone(timezone_) {} }; static gboolean emit_address_changed_idle (gpointer gdata) { auto data = static_cast(gdata); auto fmt = g_strdup_printf ("(1385238033, {'timezone': '%s'}, (3, 0.0, 0.0))", data->timezone.c_str()); GError * error = nullptr; dbus_test_dbus_mock_object_emit_signal(data->mock, data->obj_geo_addr, //"org.freedesktop.Geoclue.Address", "AddressChanged", G_VARIANT_TYPE("(ia{ss}(idd))"), g_variant_new_parsed (fmt), &error); if (error) { g_warning("%s: %s", G_STRFUNC, error->message); g_error_free (error); } g_free (fmt); delete data; return G_SOURCE_REMOVE; } public: void setGeoclueTimezoneOnIdle (const std::string& newZone) { g_timeout_add (50, emit_address_changed_idle, new EmitAddressChangedData(mock, obj_geo_addr, newZone.c_str())); } }; #endif /* INDICATOR_DATETIME_TESTS_GEOCLUE_FIXTURE_H */ ayatana-indicator-datetime-25.4.0/tests/glib-fixture.h0000644000000000000000000001700114773244555017605 0ustar /* * Copyright 2013-2016 Canonical Ltd. * * Authors: * Charles Kerr * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #pragma once #include #include // std::function #include #include // std::shared_ptr #include #include #include #include #include // setlocale() class GlibFixture : public ::testing::Test { public: virtual ~GlibFixture() =default; protected: virtual void SetUp() override { setlocale(LC_ALL, "C.UTF-8"); loop = g_main_loop_new(nullptr, false); // only use local, temporary settings g_assert(g_setenv("GSETTINGS_SCHEMA_DIR", SCHEMA_DIR, true)); g_assert(g_setenv("GSETTINGS_BACKEND", "memory", true)); g_debug("SCHEMA_DIR is %s", SCHEMA_DIR); // fail on unexpected messages from this domain g_log_set_fatal_mask(G_LOG_DOMAIN, G_LOG_LEVEL_WARNING); g_unsetenv("DISPLAY"); } virtual void TearDown() override { g_test_assert_expected_messages (); g_clear_pointer(&loop, g_main_loop_unref); } void expectLogMessage (const gchar *domain, GLogLevelFlags level, const gchar *pattern) { g_test_expect_message (domain, level, pattern); } private: static gboolean wait_for_signal__timeout(gpointer name) { g_error("%s: timed out waiting for signal '%s'", G_STRLOC, (char*)name); return G_SOURCE_REMOVE; } static gboolean wait_msec__timeout(gpointer loop) { g_main_loop_quit(static_cast(loop)); return G_SOURCE_CONTINUE; } protected: /* convenience func to loop while waiting for a GObject's signal */ void wait_for_signal(gpointer o, const gchar * signal, const int timeout_seconds=5) { // wait for the signal or for timeout, whichever comes first const auto handler_id = g_signal_connect_swapped(o, signal, G_CALLBACK(g_main_loop_quit), loop); const auto timeout_id = g_timeout_add_seconds(timeout_seconds, wait_for_signal__timeout, loop); g_main_loop_run(loop); g_source_remove(timeout_id); g_signal_handler_disconnect(o, handler_id); } /* convenience func to loop for N msec */ void wait_msec(int msec=50) { const auto id = g_timeout_add(msec, wait_msec__timeout, loop); g_main_loop_run(loop); g_source_remove(id); } bool wait_for(std::function test_function, guint timeout_msec=1000) { auto timer = std::shared_ptr(g_timer_new(), [](GTimer* t){g_timer_destroy(t);}); const auto timeout_sec = timeout_msec / 1000.0; for (;;) { if (test_function()) return true; //g_message("%f ... %f", g_timer_elapsed(timer.get(), nullptr), timeout_sec); if (g_timer_elapsed(timer.get(), nullptr) >= timeout_sec) return false; wait_msec(); } } bool wait_for_name_owned(GDBusConnection* connection, const gchar* name, guint timeout_msec=1000, GBusNameWatcherFlags flags=G_BUS_NAME_WATCHER_FLAGS_AUTO_START) { struct Data { GMainLoop* loop = nullptr; bool owned = false; }; Data data; auto on_name_appeared = [](GDBusConnection* /*connection*/, const gchar* /*name_*/, const gchar* name_owner, gpointer gdata) { if (name_owner == nullptr) return; auto tmp = static_cast(gdata); tmp->owned = true; g_main_loop_quit(tmp->loop); }; const auto timeout_id = g_timeout_add(timeout_msec, wait_msec__timeout, loop); data.loop = loop; const auto watch_id = g_bus_watch_name_on_connection(connection, name, flags, on_name_appeared, nullptr, /* name_vanished */ &data, nullptr); /* user_data_free_func */ g_main_loop_run(loop); g_bus_unwatch_name(watch_id); g_source_remove(timeout_id); return data.owned; } void EXPECT_NAME_OWNED_EVENTUALLY(GDBusConnection* connection, const gchar* name, guint timeout_msec=1000, GBusNameWatcherFlags flags=G_BUS_NAME_WATCHER_FLAGS_AUTO_START) { EXPECT_TRUE(wait_for_name_owned(connection, name, timeout_msec, flags)) << "name: " << name; } void EXPECT_NAME_NOT_OWNED_EVENTUALLY(GDBusConnection* connection, const gchar* name, guint timeout_msec=1000, GBusNameWatcherFlags flags=G_BUS_NAME_WATCHER_FLAGS_AUTO_START) { EXPECT_FALSE(wait_for_name_owned(connection, name, timeout_msec, flags)) << "name: " << name; } void ASSERT_NAME_OWNED_EVENTUALLY(GDBusConnection* connection, const gchar* name, guint timeout_msec=1000, GBusNameWatcherFlags flags=G_BUS_NAME_WATCHER_FLAGS_AUTO_START) { ASSERT_TRUE(wait_for_name_owned(connection, name, timeout_msec, flags)) << "name: " << name; } void ASSERT_NAME_NOT_OWNED_EVENTUALLY(GDBusConnection* connection, const gchar* name, guint timeout_msec=1000, GBusNameWatcherFlags flags=G_BUS_NAME_WATCHER_FLAGS_AUTO_START) { ASSERT_FALSE(wait_for_name_owned(connection, name, timeout_msec, flags)) << "name: " << name; } using source_func = std::function; guint idle_add(source_func&& func) { return g_idle_add_full( G_PRIORITY_DEFAULT_IDLE, [](gpointer gf){return (*static_cast(gf))();}, new std::function(func), [](gpointer gf){delete static_cast(gf);} ); } guint timeout_add(source_func&& func, std::chrono::milliseconds msec) { return g_timeout_add_full( G_PRIORITY_DEFAULT, msec.count(), [](gpointer gf){return (*static_cast(gf))();}, new std::function(func), [](gpointer gf){delete static_cast(gf);} ); } GMainLoop* loop {}; }; ayatana-indicator-datetime-25.4.0/tests/libdbusmock-fixture.h0000644000000000000000000001204114773244555021165 0ustar /* * Copyright 2014-2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #pragma once #include "glib-fixture.h" #include /*** **** ***/ class LibdbusmockFixture: public GlibFixture { private: typedef GlibFixture super; protected: GDBusConnection * system_bus {}; GDBusConnection * session_bus {}; DbusTestService * service {}; void SetUp() override { super::SetUp(); service = dbus_test_service_new(nullptr); } void startDbusMock() { // start 'em up. // make the system bus work off the mock bus too, since that's // where the upower and screen are on the system bus... dbus_test_service_start_tasks(service); g_setenv("DBUS_SYSTEM_BUS_ADDRESS", g_getenv("DBUS_SESSION_BUS_ADDRESS"), TRUE); session_bus = g_bus_get_sync(G_BUS_TYPE_SESSION, nullptr, nullptr); ASSERT_NE(nullptr, session_bus); g_dbus_connection_set_exit_on_close(session_bus, false); g_object_add_weak_pointer(G_OBJECT(session_bus), (gpointer *)&session_bus); system_bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, nullptr); ASSERT_NE(nullptr, system_bus); g_dbus_connection_set_exit_on_close(system_bus, FALSE); g_object_add_weak_pointer(G_OBJECT(system_bus), (gpointer *)&system_bus); } void TearDown() override { g_clear_object(&service); g_object_unref(session_bus); g_object_unref(system_bus); // wait a little while for the scaffolding to shut down, // but don't block on it forever... wait_for([this](){return system_bus==nullptr && session_bus==nullptr;}, 5000); super::TearDown(); } bool wait_for_method_call(DbusTestDbusMock* mock, DbusTestDbusMockObject* obj, const gchar* method, GVariant* params=nullptr, guint timeout_msec=100) { if (params != nullptr) g_variant_ref_sink(params); auto test_function = [mock, obj, method, params]() { GError* error {}; const auto called = dbus_test_dbus_mock_object_check_method_call(mock, obj, method, params, &error); if (error != nullptr) { g_critical("Error looking for method call '%s': %s", method, error->message); g_clear_error(&error); } return called; }; const auto ret = wait_for(test_function, timeout_msec); g_clear_pointer(¶ms, g_variant_unref); return ret; } void EXPECT_METHOD_CALLED_EVENTUALLY(DbusTestDbusMock* mock, DbusTestDbusMockObject* obj, const gchar* method, GVariant* params=nullptr, guint timeout_msec=1000) { EXPECT_TRUE(wait_for_method_call(mock, obj, method, params, timeout_msec)) << "method: " << method; } void EXPECT_METHOD_NOT_CALLED_EVENTUALLY(DbusTestDbusMock* mock, DbusTestDbusMockObject* obj, const gchar* method, GVariant* params=nullptr, guint timeout_msec=1000) { EXPECT_FALSE(wait_for_method_call(mock, obj, method, params, timeout_msec)) << "method: " << method; } void ASSERT_METHOD_CALLED_EVENTUALLY(DbusTestDbusMock* mock, DbusTestDbusMockObject* obj, const gchar* method, GVariant* params=nullptr, guint timeout_msec=1000) { ASSERT_TRUE(wait_for_method_call(mock, obj, method, params, timeout_msec)) << "method: " << method; } void ASSERT_METHOD_NOT_CALLED_EVENTUALLY(DbusTestDbusMock* mock, DbusTestDbusMockObject* obj, const gchar* method, GVariant* params=nullptr, guint timeout_msec=1000) { ASSERT_FALSE(wait_for_method_call(mock, obj, method, params, timeout_msec)) << "method: " << method; } }; ayatana-indicator-datetime-25.4.0/tests/manual0000644000000000000000000002025414773244555016237 0ustar Test-case ayatana-indicator-datetime/mate-items-check
Log in to a desktop user session
Go to the panel and click on the DateTime indicator
Ensure there are items in the menu
Test-case ayatana-indicator-datetime/arctica-greeter-items-check
Start a system and wait for the greeter or logout of the current user session
Go to the panel and click on the DateTime indicator
Ensure there are items in the menu
Test-case ayatana-indicator-datetime/lomiri-items-check
Login to a user session running Lomiri
Pull down the top panel until it sticks open
Navigate through the tabs until "Time and Date" is shown
Upcoming is at the top of the menu
The menu is populated with items
Test-case ayatana-indicator-datetime/timestamp-wakeup
Unplug the phone from any USB connection and put it to sleep
Reawaken the device.
The indicator should be showing the correct time.
Test-case ayatana-indicator-datetime/new-alarm-wakeup
Create and save an upcoming alarm in lomiri-clock-app
Unplug the phone from any USB connection and put it to sleep
Confirm that the alarm sounds on time even if the phone is asleep. (Note: if in doubt about sleep you can see in the syslog whether the device actually suspended or whether the suspend was aborted)
Confirm that the screen comes on when the alarm is triggered.
If the device supports haptic feedback, confirm the alarm vibrates.
Test-case ayatana-indicator-datetime/disabled-alarms
Create and save an upcoming alarm in lomiri-clock-app
Confirm that the alarm icon appears next to the current time in Lomiri's indicator display
Disable the alarm in lomiri-clock-app
When all alarms are disabled or removed, the alarm icon should disappear.
Re-enable the alarm in lomiri-clock-app
When the alarm is enabled, the alarm icon should reappear.
Test-case ayatana-indicator-datetime/disable-one-time-alarms-after-notification
Create and save an upcoming nonrepeating alarm in lomiri-clock-app
Confirm that the alarm icon appears next to the current time in Lomiri's indicator display
Wait until the alarm time is reached
Confirm that the alarm notification is shown
Confirm that the alarm's sound is played while the alarm notification is present
Confirm that the one-time alarm is disabled after the notification is shown. NOTE: due to a refresh bug in clock-app you may need to refresh its alarms page (by swapping back to the main page, then the alarm page again, this is tracked in #1362341) in order to see the alarm change from enabled to disabled.
Create and save an upcoming repeating alarm in lomiri-clock-app
Confirm that the alarm icon appears next to the current time in Lomiri's indicator display
Wait until the alarm time is reached
Confirm that the alarm notification is shown
Confirm that the alarm's sound is played while the alarm notification is present
Confirm that the repeating alarm is not disabled after the notification is shown. NOTE: due to a refresh bug in clock-app you may need to refresh its alarms page (by swapping back to the main page, then the alarm page again, this is tracked in #1362341) in order to see the alarm change from enabled to disabled.
Test-case ayatana-indicator-datetime/calendar-event-notification
In the calendar app, create and save a new upcoming calendar event that will occur in the next few minutes.
The datetime indicator's event list should update itself to show this new event.
Calendar events do not get the alarm icon, so no alarm icon should be shown in the header unless there is also an upcoming alarm set.
Wait for the event's time to be reached
The datetime indicator should pop up a non-interactive notification that plays a nonlooping sound.
The notification should disappear after a moment without requiring user intervention.
Test-case ayatana-indicator-datetime/alarm-timezone
In lomiri-system-settings, change your timezone to a zone you're not in
In lomiri-clock-app, create and save an upcoming alarm
The indicator's menu should show the alarm to click at the specified time
In lomiri-system-settings, change back to your correct timezone
The indicator's menu should still show the alarm to click at the specified time
Test-case ayatana-indicator-datetime/snooze
Create and save an upcoming alarm in lomiri-clock-app
When the alarm goes off, press the 'Snooze' button
The alarm should go away, then reappear N minutes later. By default the N is 5 minutes but will be configurable from lomiri-clock-app.
When the snoozed alarm reappears, press the 'OK' button
This time when the alarm is dismissed, it should not reappear.
Test-case ayatana-indicator-datetime/edited-alarm-wakeup
Edit an alarm that's already passed. (see previous test)
Unplug the phone from any USB connection and put it to sleep
Confirm that the alarm sounds on time even if the phone is asleep. (Note: if in doubt about sleep you can see in the syslog whether the device actually suspended or whether the suspend was aborted)
Confirm that the screen comes on when the alarm is triggered.
If the device supports haptic feedback, confirm the alarm vibrates.
Test-case ayatana-indicator-datetime/tell-snap-decision-to-dismiss
Set an alarm and wait for it to arrive.
Alarm should go off at the specified time
Press the 'Dismiss' button in the alarm's snap decision popup before the sound stops.
Popup should disappear
Sound should stop at the same time, rather than playing til the end of the file.
Test-case ayatana-indicator-datetime/change-alarm-sound
Open the clock app
Swipe up from the bottom
Click on the + symbol
Save an alarm for a few minutes time leave everything on default settings
Click on save
Click on the alarm
Change the sound of the alarm
Click on save
Let the alarm go off
The newly-selected sound should play, rather than the previous sound.
Test-case ayatana-indicator-datetime/silent-mode
Set an alarm and wait for it to arrive.
From the sound indicator, turn on silent mode.
Alarm should go off at the specified time and play its sound regardless of silent mode.
From the sound indicator, turn on silent mode.
Create a calendar event from the calendar app and wait for it to arrive.
The calendar event notification should be silent.
From the sound indicator, turn off silent mode.
Create a calendar event from the calendar app and wait for it to arrive.
The calendar event notification should play a sound.
Test-case ayatana-indicator-datetime/manual-time
In your system's Time and Date Settings, manually change the time to an arbitrary time.
The indicator's timestamp should change right after the time manual time is set.
If all actions produce the expected results listed, please submit a 'passed' result. If an action fails, or produces an unexpected result, please submit a 'failed' result and file a bug. Please be sure to include the bug number when you submit your result. ayatana-indicator-datetime-25.4.0/tests/manual-test-snap.cpp0000644000000000000000000000663714773244555020745 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * Authors: * Charles Kerr * Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include #include #include #include #include #include using namespace ayatana::indicator::datetime; namespace ain = ayatana::indicator::notifications; /*** **** ***/ namespace { gboolean quit_idle (gpointer gloop) { g_main_loop_quit(static_cast(gloop)); return G_SOURCE_REMOVE; }; int volume = 50; GOptionEntry entries[] = { { "volume", 'v', 0, G_OPTION_ARG_INT, &volume, "Volume level [1..100]", "volume" }, { nullptr } }; } int main(int argc, const char* argv[]) { GError* error = nullptr; GOptionContext* context = g_option_context_new(nullptr); g_option_context_add_main_entries(context, entries, nullptr); if (!g_option_context_parse(context, &argc, (gchar***)&argv, &error)) { g_print("option parsing failed: %s\n", error->message); exit(1); } g_option_context_free(context); volume = CLAMP(volume, 1, 100); Appointment a; a.color = "green"; a.summary = "Alarm"; a.uid = "D4B57D50247291478ED31DED17FF0A9838DED402"; a.type = Appointment::ALARM; a.begin = DateTime::Local(2014, 12, 25, 0, 0, 0); a.end = a.begin.end_of_day(); a.alarms.push_back(Alarm{"Alarm Text", "", a.begin}); auto loop = g_main_loop_new(nullptr, false); auto on_response = [loop](const Appointment& appt, const Alarm&, const Snap::Response& response){ const char* str {""}; switch(response) { case Snap::Response::ShowApp: str = "show-app"; break; case Snap::Response::Snooze: str = "snooze"; break; case Snap::Response::None: str = "no-action"; break; }; g_message("You clicked '%s' for appt url '%s'", str, appt.summary.c_str()); g_idle_add(quit_idle, loop); }; // only use local, temporary settings g_assert(g_setenv("GSETTINGS_SCHEMA_DIR", SCHEMA_DIR, true)); g_assert(g_setenv("GSETTINGS_BACKEND", "memory", true)); g_debug("SCHEMA_DIR is %s", SCHEMA_DIR); auto settings = std::make_shared(); settings->alarm_volume.set(volume); auto notification_engine = std::make_shared("ayatana-indicator-datetime-service"); auto sound_builder = std::make_shared(); auto system_bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, nullptr); Snap snap (notification_engine, sound_builder, settings, system_bus); snap(a, a.alarms.front(), on_response); g_main_loop_run(loop); g_main_loop_unref(loop); g_clear_object(&system_bus); return 0; } ayatana-indicator-datetime-25.4.0/tests/notification-fixture.h0000644000000000000000000003332114773244555021361 0ustar /* * Copyright 2014-2016 Canonical Ltd. * Copyright 2021-2023 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #pragma once #include "libdbusmock-fixture.h" #include #include #include #include #include #include #include #include // getuid() #include // getuid() /*** **** ***/ class NotificationFixture: public LibdbusmockFixture { private: typedef LibdbusmockFixture super; protected: static constexpr char const * NOTIFY_BUSNAME {"org.freedesktop.Notifications"}; static constexpr char const * NOTIFY_INTERFACE {"org.freedesktop.Notifications"}; static constexpr char const * NOTIFY_PATH {"/org/freedesktop/Notifications"}; static constexpr char const * HAPTIC_METHOD_VIBRATE {"vibrate"}; static constexpr int SCREEN_COOKIE {8675309}; static constexpr char const * SCREEN_METHOD_KEEP_DISPLAY_ON {"keepDisplayOn"}; static constexpr char const * SCREEN_METHOD_REMOVE_DISPLAY_ON_REQUEST {"removeDisplayOnRequest"}; static constexpr int POWERD_SYS_STATE_ACTIVE = 1; static constexpr char const * POWERD_COOKIE {"567-48-8307"}; static constexpr char const * POWERD_METHOD_REQUEST_SYS_STATE {"requestSysState"}; static constexpr char const * POWERD_METHOD_CLEAR_SYS_STATE {"clearSysState"}; static constexpr int FIRST_NOTIFY_ID {1000}; static constexpr int NOTIFICATION_CLOSED_EXPIRED {1}; static constexpr int NOTIFICATION_CLOSED_DISMISSED {2}; static constexpr int NOTIFICATION_CLOSED_API {3}; static constexpr int NOTIFICATION_CLOSED_UNDEFINED {4}; static constexpr char const * METHOD_CLOSE {"CloseNotification"}; static constexpr char const * METHOD_GET_CAPS {"GetCapabilities"}; static constexpr char const * METHOD_GET_INFO {"GetServerInformation"}; static constexpr char const * METHOD_NOTIFY {"Notify"}; static constexpr char const * SIGNAL_CLOSED {"NotificationClosed"}; #ifdef LOMIRI_FEATURES_ENABLED static constexpr char const * HINT_LOMIRI_TIMEOUT {"x-lomiri-snap-decisions-timeout"}; #endif static constexpr char const * AS_BUSNAME {"org.freedesktop.Accounts"}; static constexpr char const * AS_INTERFACE {"com.lomiri.touch.AccountsService.Sound"}; static constexpr char const * PROP_OTHER_VIBRATIONS {"OtherVibrate"}; static constexpr char const * PROP_SILENT_MODE {"SilentMode"}; ayatana::indicator::datetime::Appointment appt; ayatana::indicator::datetime::Appointment ualarm; DbusTestDbusMock * as_mock = nullptr; DbusTestDbusMock * notify_mock = nullptr; DbusTestDbusMock * powerd_mock = nullptr; DbusTestDbusMock * screen_mock = nullptr; DbusTestDbusMock * haptic_mock = nullptr; DbusTestDbusMockObject * as_obj = nullptr; DbusTestDbusMockObject * notify_obj = nullptr; DbusTestDbusMockObject * powerd_obj = nullptr; DbusTestDbusMockObject * screen_obj = nullptr; DbusTestDbusMockObject * haptic_obj = nullptr; void SetUp() override { GError * error = nullptr; char * str = nullptr; super::SetUp(); // init an Appointment appt.color = "green"; appt.summary = "Christmas"; appt.uid = "D4B57D50247291478ED31DED17FF0A9838DED402"; appt.type = ayatana::indicator::datetime::Appointment::EVENT; const auto christmas = ayatana::indicator::datetime::DateTime::Local(2015,12,25,0,0,0); appt.begin = christmas.start_of_day(); appt.end = christmas.end_of_day(); appt.alarms.push_back(ayatana::indicator::datetime::Alarm{"Ho Ho Ho!", CALENDAR_DEFAULT_SOUND, appt.begin}); // init an Alarm ualarm.color = "red"; ualarm.summary = "Wakeup"; ualarm.uid = "E4B57D50247291478ED31DED17FF0A9838DED403"; ualarm.type = ayatana::indicator::datetime::Appointment::ALARM; const auto tomorrow = ayatana::indicator::datetime::DateTime::NowLocal().add_days(1); ualarm.begin = tomorrow; ualarm.end = tomorrow; ualarm.alarms.push_back(ayatana::indicator::datetime::Alarm{"It's Tomorrow!", "", appt.begin}); /// /// Add the AccountsService mock /// as_mock = dbus_test_dbus_mock_new(AS_BUSNAME); auto as_path = g_strdup_printf("/org/freedesktop/Accounts/User%lu", (gulong)getuid()); as_obj = dbus_test_dbus_mock_get_object(as_mock, as_path, AS_INTERFACE, &error); g_free(as_path); g_assert_no_error(error); // PROP_SILENT_MODE dbus_test_dbus_mock_object_add_property(as_mock, as_obj, PROP_SILENT_MODE, G_VARIANT_TYPE_BOOLEAN, g_variant_new_boolean(false), &error); g_assert_no_error(error); // PROP_OTHER_VIBRATIONS dbus_test_dbus_mock_object_add_property(as_mock, as_obj, PROP_OTHER_VIBRATIONS, G_VARIANT_TYPE_BOOLEAN, g_variant_new_boolean(true), &error); g_assert_no_error(error); dbus_test_service_add_task(service, DBUS_TEST_TASK(as_mock)); /// /// Add the Notifications mock /// notify_mock = dbus_test_dbus_mock_new(NOTIFY_BUSNAME); notify_obj = dbus_test_dbus_mock_get_object(notify_mock, NOTIFY_PATH, NOTIFY_INTERFACE, &error); g_assert_no_error(error); // METHOD_GET_INFO str = g_strdup("ret = ('mock-notify', 'test vendor', '1.0', '1.1')"); dbus_test_dbus_mock_object_add_method(notify_mock, notify_obj, METHOD_GET_INFO, nullptr, G_VARIANT_TYPE("(ssss)"), str, &error); g_assert_no_error (error); g_free (str); // METHOD_NOTIFY str = g_strdup_printf("try:\n" " self.NextNotifyId\n" "except AttributeError:\n" " self.NextNotifyId = %d\n" "ret = self.NextNotifyId\n" "self.NextNotifyId += 1\n", FIRST_NOTIFY_ID); dbus_test_dbus_mock_object_add_method(notify_mock, notify_obj, METHOD_NOTIFY, G_VARIANT_TYPE("(susssasa{sv}i)"), G_VARIANT_TYPE_UINT32, str, &error); g_assert_no_error (error); g_free (str); // METHOD_CLOSE str = g_strdup_printf("self.EmitSignal('%s', '%s', 'uu', [ args[0], %d ])", NOTIFY_INTERFACE, SIGNAL_CLOSED, NOTIFICATION_CLOSED_API); dbus_test_dbus_mock_object_add_method(notify_mock, notify_obj, METHOD_CLOSE, G_VARIANT_TYPE("(u)"), nullptr, str, &error); g_assert_no_error (error); g_free (str); dbus_test_service_add_task(service, DBUS_TEST_TASK(notify_mock)); /// /// Add the powerd mock /// powerd_mock = dbus_test_dbus_mock_new(BUS_POWERD_NAME); powerd_obj = dbus_test_dbus_mock_get_object(powerd_mock, BUS_POWERD_PATH, BUS_POWERD_INTERFACE, &error); g_assert_no_error(error); str = g_strdup_printf ("ret = '%s'", POWERD_COOKIE); dbus_test_dbus_mock_object_add_method(powerd_mock, powerd_obj, POWERD_METHOD_REQUEST_SYS_STATE, G_VARIANT_TYPE("(si)"), G_VARIANT_TYPE("(s)"), str, &error); g_assert_no_error (error); g_free (str); dbus_test_dbus_mock_object_add_method(powerd_mock, powerd_obj, POWERD_METHOD_CLEAR_SYS_STATE, G_VARIANT_TYPE("(s)"), nullptr, "", &error); g_assert_no_error (error); dbus_test_service_add_task(service, DBUS_TEST_TASK(powerd_mock)); /// /// Add the Screen mock /// screen_mock = dbus_test_dbus_mock_new(BUS_SCREEN_NAME); screen_obj = dbus_test_dbus_mock_get_object(screen_mock, BUS_SCREEN_PATH, BUS_SCREEN_INTERFACE, &error); g_assert_no_error(error); str = g_strdup_printf ("ret = %d", SCREEN_COOKIE); dbus_test_dbus_mock_object_add_method(screen_mock, screen_obj, SCREEN_METHOD_KEEP_DISPLAY_ON, nullptr, G_VARIANT_TYPE("(i)"), str, &error); g_assert_no_error (error); g_free (str); dbus_test_dbus_mock_object_add_method(screen_mock, screen_obj, SCREEN_METHOD_REMOVE_DISPLAY_ON_REQUEST, G_VARIANT_TYPE("(i)"), nullptr, "", &error); g_assert_no_error (error); dbus_test_service_add_task(service, DBUS_TEST_TASK(screen_mock)); /// /// Add the haptic mock /// haptic_mock = dbus_test_dbus_mock_new(BUS_HAPTIC_NAME); haptic_obj = dbus_test_dbus_mock_get_object(haptic_mock, BUS_HAPTIC_PATH, BUS_HAPTIC_INTERFACE, &error); dbus_test_dbus_mock_object_add_method(haptic_mock, haptic_obj, HAPTIC_METHOD_VIBRATE, G_VARIANT_TYPE("i"), nullptr, "", &error); g_assert_no_error (error); dbus_test_service_add_task(service, DBUS_TEST_TASK(haptic_mock)); startDbusMock(); } void TearDown() override { g_clear_object(&haptic_mock); g_clear_object(&screen_mock); g_clear_object(&powerd_mock); g_clear_object(¬ify_mock); g_clear_object(&as_mock); super::TearDown(); } void mock_capabilities(bool mock_lomiri_caps = false) { // GetCapabilities returns an array containing 'actions', // so our notifications will be interactive. #ifndef LOMIRI_FEATURES_ENABLED g_assert_false(mock_lomiri_caps); #endif std::string python_code = std::string("ret = ['actions', 'body'") + #ifdef LOMIRI_FEATURES_ENABLED (mock_lomiri_caps ? std::string(", '") + HINT_LOMIRI_TIMEOUT + "'" : "") + #endif "]"; GError * error = nullptr; dbus_test_dbus_mock_object_add_method(notify_mock, notify_obj, METHOD_GET_CAPS, nullptr, G_VARIANT_TYPE_STRING_ARRAY, python_code.c_str(), &error); g_assert_no_error (error); } std::shared_ptr create_snap(const std::shared_ptr& ne, const std::shared_ptr& sb, const std::shared_ptr& settings) { auto snap = std::make_shared(ne, sb, settings, system_bus); wait_msec(100); // wait a moment for the Snap to finish its async dbus bootstrapping return snap; } }; ayatana-indicator-datetime-25.4.0/tests/planner-mock.h0000644000000000000000000000317014773244555017574 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_PLANNER_MOCK_H #define INDICATOR_DATETIME_PLANNER_MOCK_H #include namespace ayatana { namespace indicator { namespace datetime { /** * \brief #RangePlanner which does nothing on its own. * Its controller must set its appointments property. */ class MockRangePlanner: public RangePlanner { public: MockRangePlanner(): m_range(std::pair(DateTime::NowLocal(), DateTime::NowLocal())) { } ~MockRangePlanner() =default; core::Property>& appointments() { return m_appointments; } core::Property>& range() { return m_range; } private: core::Property> m_appointments; core::Property> m_range; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_PLANNER_MOCK_H ayatana-indicator-datetime-25.4.0/tests/run-eds-ics-test.sh0000755000000000000000000000472514773244555020511 0ustar #!/bin/sh SELF=$0 # this script TEST_RUNNER=$1 # full executable path of dbus-test-runner TEST_EXEC=$2 # full executable path of test app TEST_NAME=$3 # test name CONFIG_DIR=$4 # config files ICS_FILE=$5 # ical file holding test data ACCOUNTS_DB=$6 # online account database echo "this script: ${SELF}" echo "test-runner: ${TEST_RUNNER}" echo "test-exec: ${TEST_EXEC}" echo "test-name: ${TEST_NAME}" echo "config-dir: ${CONFIG_DIR}" echo "ics-file: ${ICS_FILE}" # set up the tmpdir export TEST_TMP_DIR=$(mktemp -p "${TMPDIR:-/tmp}" -d ${TEST_NAME}-XXXXXXXXXX) || exit 1 echo "running test '${TEST_NAME}' in ${TEST_TMP_DIR}" # set up the environment variables export QT_QPA_PLATFORM=minimal export HOME=${TEST_TMP_DIR} export XDG_RUNTIME_DIR=${TEST_TMP_DIR} export XDG_CACHE_HOME=${TEST_TMP_DIR}/.cache export XDG_CONFIG_HOME=${TEST_TMP_DIR}/.config export XDG_DATA_HOME=${TEST_TMP_DIR}/.local/share export XDG_DESKTOP_DIR=${TEST_TMP_DIR} export XDG_DOCUMENTS_DIR=${TEST_TMP_DIR} export XDG_DOWNLOAD_DIR=${TEST_TMP_DIR} export XDG_MUSIC_DIR=${TEST_TMP_DIR} export XDG_PICTURES_DIR=${TEST_TMP_DIR} export XDG_PUBLICSHARE_DIR=${TEST_TMP_DIR} export XDG_TEMPLATES_DIR=${TEST_TMP_DIR} export XDG_VIDEOS_DIR=${TEST_TMP_DIR} export QORGANIZER_EDS_DEBUG=On export GIO_USE_VFS=local # needed to ensure GVFS shuts down cleanly after the test is over export G_MESSAGES_DEBUG=all export G_DBUS_DEBUG=messages echo HOMEDIR=${HOME} rm -rf ${XDG_DATA_HOME} # if there are canned config files for this test, move them into place now if [ -d ${CONFIG_DIR} ]; then echo "copying files from ${CONFIG_DIR} to $HOME" cp --verbose --archive ${CONFIG_DIR}/. $HOME fi # if there's a specific ics file to test, copy it on top of the canned config files if [ -e "${ICS_FILE}" ]; then echo "copying ${ICS_FILE} into $HOME" mkdir -p ${XDG_DATA_HOME}/evolution/tasks/system/ cp --verbose --archive "${ICS_FILE}" ${XDG_DATA_HOME}/evolution/tasks/system/tasks.ics fi # prepare online accounts database if [ -e "${ACCOUNTS_DB}" ]; then echo "copying ${ACCOUNTS_DB} into $HOME" mkdir -p ${XDG_CONFIG_HOME}/libaccounts-glib/ cp --verbose --archive "${ACCOUNTS_DB}" ${XDG_CONFIG_HOME}/libaccounts-glib/accounts.db fi # run the test ${TEST_RUNNER} --keep-env --max-wait=90 --task "${TEST_EXEC}" --task-name ${TEST_NAME} --wait-until-complete rv=$? # if the test passed, blow away the tmpdir if [ $rv -eq 0 ]; then sleep 5 rm -rf $TEST_TMP_DIR fi # pass the test's return code to the caller. exit "$rv" ayatana-indicator-datetime-25.4.0/tests/run-mkcal-db-test.sh0000755000000000000000000000422114773244555020623 0ustar #!/bin/sh SELF=$0 # this script TEST_RUNNER=$1 # full executable path of dbus-test-runner TEST_EXEC=$2 # full executable path of test app TEST_NAME=$3 # test name DB_FILE=$4 # database file holding test data ACCOUNTS_DB=$5 # online account database echo "this script: ${SELF}" echo "test-runner: ${TEST_RUNNER}" echo "test-exec: ${TEST_EXEC}" echo "test-name: ${TEST_NAME}" echo "db-file: ${DB_FILE}" # set up the tmpdir export TEST_TMP_DIR=$(mktemp -p "${TMPDIR:-/tmp}" -d ${TEST_NAME}-XXXXXXXXXX) || exit 1 echo "running test '${TEST_NAME}' in ${TEST_TMP_DIR}" # set up the environment variables export QT_QPA_PLATFORM=minimal export HOME=${TEST_TMP_DIR} export XDG_RUNTIME_DIR=${TEST_TMP_DIR} export XDG_CACHE_HOME=${TEST_TMP_DIR}/.cache export XDG_CONFIG_HOME=${TEST_TMP_DIR}/.config export XDG_DATA_HOME=${TEST_TMP_DIR}/.local/share export XDG_DESKTOP_DIR=${TEST_TMP_DIR} export XDG_DOCUMENTS_DIR=${TEST_TMP_DIR} export XDG_DOWNLOAD_DIR=${TEST_TMP_DIR} export XDG_MUSIC_DIR=${TEST_TMP_DIR} export XDG_PICTURES_DIR=${TEST_TMP_DIR} export XDG_PUBLICSHARE_DIR=${TEST_TMP_DIR} export XDG_TEMPLATES_DIR=${TEST_TMP_DIR} export XDG_VIDEOS_DIR=${TEST_TMP_DIR} export GIO_USE_VFS=local # needed to ensure GVFS shuts down cleanly after the test is over export G_MESSAGES_DEBUG=all export G_DBUS_DEBUG=messages echo HOMEDIR=${HOME} rm -rf ${XDG_DATA_HOME} # if there's a specific db file to test, copy it if [ -e "${DB_FILE}" ]; then echo "copying ${DB_FILE} into $HOME" mkdir -p ${XDG_DATA_HOME}/system/privileged/Calendar/mkcal/ cp --verbose --archive "${DB_FILE}" ${XDG_DATA_HOME}/system/privileged/Calendar/mkcal/db fi # prepare online accounts database if [ -e "${ACCOUNTS_DB}" ]; then echo "copying ${ACCOUNTS_DB} into $HOME" mkdir -p ${XDG_CONFIG_HOME}/libaccounts-glib/ cp --verbose --archive "${ACCOUNTS_DB}" ${XDG_CONFIG_HOME}/libaccounts-glib/accounts.db fi # run the test ${TEST_RUNNER} --keep-env --max-wait=90 --task "${TEST_EXEC}" --task-name ${TEST_NAME} --wait-until-complete rv=$? # if the test passed, blow away the tmpdir if [ $rv -eq 0 ]; then sleep 5 rm -rf $TEST_TMP_DIR fi # pass the test's return code to the caller. exit "$rv" ayatana-indicator-datetime-25.4.0/tests/state-fixture.h0000644000000000000000000000360614773244555020016 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_TESTS_STATE_FIXTURE_H #define INDICATOR_DATETIME_TESTS_STATE_FIXTURE_H #include "test-dbus-fixture.h" #include "actions-mock.h" #include "state-mock.h" namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class StateFixture: public TestDBusFixture { private: typedef TestDBusFixture super; public: virtual ~StateFixture() =default; protected: std::shared_ptr m_mock_state; std::shared_ptr m_state; std::shared_ptr m_mock_actions; std::shared_ptr m_actions; virtual void SetUp() { super::SetUp(); m_mock_state.reset(new MockState); m_state = std::dynamic_pointer_cast(m_mock_state); m_mock_actions.reset(new MockActions(m_state)); m_actions = std::dynamic_pointer_cast(m_mock_actions); } virtual void TearDown() { m_actions.reset(); m_mock_actions.reset(); m_state.reset(); m_mock_state.reset(); super::TearDown(); } }; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana #endif /* INDICATOR_DATETIME_TESTS_STATE_FIXTURE_H */ ayatana-indicator-datetime-25.4.0/tests/state-mock.h0000644000000000000000000000340714773244555017260 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_STATE_MOCK_H #define INDICATOR_DATETIME_STATE_MOCK_H #include "planner-mock.h" #include #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ class MockState: public State { public: std::shared_ptr mock_clock; std::shared_ptr mock_range_planner; MockState() { const DateTime now = DateTime::NowLocal(); mock_clock.reset(new MockClock(now)); clock = std::dynamic_pointer_cast(mock_clock); settings.reset(new Settings); mock_range_planner.reset(new MockRangePlanner); auto range_planner = std::dynamic_pointer_cast(mock_range_planner); calendar_month.reset(new MonthPlanner(range_planner, now)); calendar_upcoming.reset(new UpcomingPlanner(range_planner, now)); locations.reset(new Locations); } }; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana #endif /* INDICATOR_DATETIME_STATE_MOCK_H */ ayatana-indicator-datetime-25.4.0/tests/test-actions.cpp0000644000000000000000000002640414773244555020163 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include "state-fixture.h" using namespace ayatana::indicator::datetime; class ActionsFixture: public StateFixture { typedef StateFixture super; std::vector build_some_appointments() { const auto now = m_state->clock->localtime(); const auto tomorrow = now.add_days(1); Appointment a1; // an alarm clock appointment a1.color = "red"; a1.summary = "http://www.example.com/"; a1.uid = "example"; a1.type = Appointment::ALARM; a1.begin = a1.end = tomorrow; Appointment a2; // a non-alarm appointment a2.color = "green"; a2.summary = "http://www.monkey.com/"; a2.uid = "monkey"; a2.type = Appointment::EVENT; a2.begin = a2.end = tomorrow; return std::vector({a1, a2}); } protected: void SetUp() override { super::SetUp(); } void TearDown() override { super::TearDown(); } void test_action_with_no_args(const char * action_name, MockActions::Action expected_action) { // preconditions EXPECT_TRUE(m_mock_actions->history().empty()); auto action_group = m_actions->action_group(); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); // run the test g_action_group_activate_action(action_group, action_name, nullptr); // test the results EXPECT_EQ(std::vector({expected_action}), m_mock_actions->history()); } void test_action_with_time_arg(const char * action_name, MockActions::Action expected_action) { // preconditions EXPECT_TRUE(m_mock_actions->history().empty()); auto action_group = m_actions->action_group(); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); // activate the action const auto now = DateTime::NowLocal(); auto v = g_variant_new_int64(now.to_unix()); g_action_group_activate_action(action_group, action_name, v); // test the results EXPECT_EQ(std::vector({expected_action}), m_mock_actions->history()); EXPECT_EQ(now.format("%F %T"), m_mock_actions->date_time().format("%F %T")); } void test_action_with_appt_arg(const char * action_name, MockActions::Action expected_action) { /// /// Test 1: activate an appointment that we know about /// // preconditions EXPECT_TRUE(m_mock_actions->history().empty()); auto action_group = m_actions->action_group(); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); // init some appointments to the state const auto appointments = build_some_appointments(); m_mock_state->mock_range_planner->appointments().set(appointments); // activate the action auto v = g_variant_new("(sx)", appointments[0].uid.c_str(), 0); g_action_group_activate_action(action_group, action_name, v); // test the results EXPECT_EQ(std::vector({expected_action}), m_mock_actions->history()); EXPECT_EQ(appointments[0], m_mock_actions->appointment()); /// /// Test 2: activate an appointment we *don't* know about /// // setup m_mock_actions->clear(); EXPECT_TRUE(m_mock_actions->history().empty()); // activate the action v = g_variant_new("(sx)", "this-uid-is-not-one-that-we-have", 0); g_action_group_activate_action(action_group, action_name, v); // test the results EXPECT_TRUE(m_mock_actions->history().empty()); } }; /*** **** ***/ TEST_F(ActionsFixture, ActionsExist) { EXPECT_TRUE(m_actions != nullptr); const char* names[] = { "desktop-header", "calendar", "set-location", "desktop.open-appointment", "desktop.open-alarm-app", "desktop.open-calendar-app", "desktop.open-settings-app", "phone.open-appointment", "phone.open-alarm-app", "phone.open-calendar-app", "phone.open-settings-app" }; for(const auto& name: names) { EXPECT_TRUE(g_action_group_has_action(m_actions->action_group(), name)); } } /*** **** ***/ TEST_F(ActionsFixture, DesktopOpenAlarmApp) { test_action_with_no_args("desktop.open-alarm-app", MockActions::OpenAlarmApp); } TEST_F(ActionsFixture, DesktopOpenAppointment) { test_action_with_appt_arg("desktop.open-appointment", MockActions::OpenAppt); } TEST_F(ActionsFixture, DesktopOpenCalendarApp) { test_action_with_time_arg("desktop.open-calendar-app", MockActions::OpenCalendarApp); } TEST_F(ActionsFixture, DesktopOpenSettingsApp) { test_action_with_no_args("desktop.open-settings-app", MockActions::OpenSettingsApp); } /*** **** ***/ TEST_F(ActionsFixture, PhoneOpenAlarmApp) { test_action_with_no_args("phone.open-alarm-app", MockActions::OpenAlarmApp); } TEST_F(ActionsFixture, PhoneOpenAppointment) { test_action_with_appt_arg("phone.open-appointment", MockActions::OpenAppt); } TEST_F(ActionsFixture, PhoneOpenCalendarApp) { test_action_with_time_arg("phone.open-calendar-app", MockActions::OpenCalendarApp); } TEST_F(ActionsFixture, PhoneOpenSettingsApp) { test_action_with_no_args("phone.open-settings-app", MockActions::OpenSettingsApp); } /*** **** ***/ TEST_F(ActionsFixture, SetLocation) { const auto action_name = "set-location"; auto action_group = m_actions->action_group(); EXPECT_TRUE(m_mock_actions->history().empty()); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); auto v = g_variant_new_string("America/Chicago Oklahoma City"); g_action_group_activate_action(action_group, action_name, v); const auto expected_action = MockActions::SetLocation; ASSERT_EQ(1, m_mock_actions->history().size()); EXPECT_EQ(expected_action, m_mock_actions->history()[0]); EXPECT_EQ("America/Chicago", m_mock_actions->zone()); EXPECT_EQ("Oklahoma City", m_mock_actions->name()); } TEST_F(ActionsFixture, DISABLED_SetCalendarDate) { // confirm that such an action exists const auto action_name = "calendar"; auto action_group = m_actions->action_group(); EXPECT_TRUE(m_mock_actions->history().empty()); EXPECT_TRUE(g_action_group_has_action(action_group, action_name)); // pick an arbitrary DateTime... auto now = DateTime::Local(2010, 1, 2, 3, 4, 5); // confirm that Planner.time gets changed to that date when we // activate the 'calendar' action with that date's time_t as the arg EXPECT_NE (now, m_state->calendar_month->month().get()); auto v = g_variant_new_int64(now.to_unix()); g_action_group_activate_action (action_group, action_name, v); EXPECT_TRUE(DateTime::is_same_day (now, m_state->calendar_month->month().get())); // DST change in US now = DateTime::Local(2015, 3, 8, 9, 0, 0); v = g_variant_new_int64(now.to_unix()); g_action_group_activate_action (action_group, action_name, v); EXPECT_TRUE(DateTime::is_same_day (now, m_state->calendar_month->month().get())); // DST change in Europe now = DateTime::Local(2015, 3, 29, 9, 0, 0); v = g_variant_new_int64(now.to_unix()); g_action_group_activate_action (action_group, action_name, v); EXPECT_TRUE(DateTime::is_same_day (now, m_state->calendar_month->month().get())); } TEST_F(ActionsFixture, DISABLED_ActivatingTheCalendarResetsItsDate) { // Confirm that the GActions exist auto action_group = m_actions->action_group(); EXPECT_TRUE(g_action_group_has_action(action_group, "calendar")); EXPECT_TRUE(g_action_group_has_action(action_group, "calendar-active")); /// /// Prerequisite for the test: move calendar-date away from today /// // move calendar-date a week into the future... const auto now = m_state->clock->localtime(); const auto next_week = now.add_days(7); const auto next_week_unix = next_week.to_unix(); g_action_group_activate_action (action_group, "calendar", g_variant_new_int64(next_week_unix)); // confirm the planner and calendar action state moved a week into the future // but that m_state->clock is unchanged auto expected = next_week.start_of_day(); const auto expected_unix = expected.to_unix(); EXPECT_EQ(expected_unix, m_state->calendar_month->month().get().to_unix()); EXPECT_EQ(now, m_state->clock->localtime()); auto calendar_state = g_action_group_get_action_state(action_group, "calendar"); EXPECT_TRUE(calendar_state != nullptr); EXPECT_TRUE(g_variant_is_of_type(calendar_state, G_VARIANT_TYPE_DICTIONARY)); auto v = g_variant_lookup_value(calendar_state, "calendar-day", G_VARIANT_TYPE_INT64); EXPECT_TRUE(v != nullptr); EXPECT_EQ(expected_unix, g_variant_get_int64(v)); g_clear_pointer(&v, g_variant_unref); g_clear_pointer(&calendar_state, g_variant_unref); /// /// Now the actual test. /// We set the state of 'calendar-active' to true, which should reset the calendar date. /// This is so the calendar always starts on today's date when the indicator's menu is pulled down. /// // change the state... g_action_group_change_action_state(action_group, "calendar-active", g_variant_new_boolean(true)); // confirm the planner and calendar action state were reset back to m_state->clock's time EXPECT_EQ(now.to_unix(), m_state->calendar_month->month().get().to_unix()); EXPECT_EQ(now, m_state->clock->localtime()); calendar_state = g_action_group_get_action_state(action_group, "calendar"); EXPECT_TRUE(calendar_state != nullptr); EXPECT_TRUE(g_variant_is_of_type(calendar_state, G_VARIANT_TYPE_DICTIONARY)); v = g_variant_lookup_value(calendar_state, "calendar-day", G_VARIANT_TYPE_INT64); EXPECT_TRUE(v != nullptr); EXPECT_EQ(now.to_unix(), g_variant_get_int64(v)); g_clear_pointer(&v, g_variant_unref); g_clear_pointer(&calendar_state, g_variant_unref); } ayatana-indicator-datetime-25.4.0/tests/test-alarm-queue.cpp0000644000000000000000000001242714773244555020741 0ustar /* * Copyright 2014 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include "state-fixture.h" using namespace ayatana::indicator::datetime; class AlarmQueueFixture: public StateFixture { private: typedef StateFixture super; protected: std::vector m_triggered; std::shared_ptr m_wakeup_timer; std::unique_ptr m_watcher; std::shared_ptr m_range_planner; std::shared_ptr m_upcoming; void SetUp() override { super::SetUp(); m_wakeup_timer.reset(new MainloopWakeupTimer(m_state->clock)); m_range_planner.reset(new MockRangePlanner); m_upcoming.reset(new UpcomingPlanner(m_range_planner, m_state->clock->localtime())); m_watcher.reset(new SimpleAlarmQueue(m_state->clock, m_upcoming, m_wakeup_timer)); m_watcher->alarm_reached().connect([this](const Appointment& appt, const Alarm& /*alarm*/){ m_triggered.push_back(appt.uid); }); EXPECT_TRUE(m_triggered.empty()); } void TearDown() override { m_triggered.clear(); m_watcher.reset(); m_upcoming.reset(); m_range_planner.reset(); super::TearDown(); } std::vector build_some_appointments() { const auto now = m_state->clock->localtime(); const auto tomorrow_begin = now.add_days(1).start_of_day(); const auto tomorrow_end = tomorrow_begin.end_of_day(); Appointment a1; // an alarm a1.color = "red"; a1.summary = "http://www.example.com/"; a1.uid = "example"; a1.type = Appointment::ALARM; a1.begin = tomorrow_begin; a1.end = tomorrow_end; a1.alarms.push_back(Alarm{"Alarm Text", "", a1.begin}); const auto ubermorgen_begin = now.add_days(2).start_of_day(); const auto ubermorgen_end = ubermorgen_begin.end_of_day(); Appointment a2; // something else a2.color = "green"; a2.summary = "http://www.monkey.com/"; a2.uid = "monkey"; a2.type = Appointment::EVENT; a2.begin = ubermorgen_begin; a2.end = ubermorgen_end; a2.alarms.push_back(Alarm{"Alarm Text", "", a2.begin}); return std::vector({a1, a2}); } }; /*** **** ***/ TEST_F(AlarmQueueFixture, AppointmentsChanged) { // Add some appointments to the planner. // One of these matches our state's localtime, so that should get triggered. std::vector a = build_some_appointments(); a[0].begin = a[0].alarms.front().time = m_state->clock->localtime(); m_range_planner->appointments().set(a); // Confirm that it got fired ASSERT_EQ(1, m_triggered.size()); EXPECT_EQ(a[0].uid, m_triggered[0]); } TEST_F(AlarmQueueFixture, TimeChanged) { // Add some appointments to the planner. // Neither of these match the state's localtime, so nothing should be triggered. std::vector a = build_some_appointments(); m_range_planner->appointments().set(a); EXPECT_TRUE(m_triggered.empty()); // Set the state's clock to a time that matches one of the appointments(). // That appointment should get triggered. g_message ("%s setting clock to %s", G_STRLOC, a[1].begin.format("%F %T").c_str()); m_mock_state->mock_clock->set_localtime(a[1].begin); ASSERT_EQ(1, m_triggered.size()); EXPECT_EQ(a[1].uid, m_triggered[0]); } TEST_F(AlarmQueueFixture, MoreThanOne) { const auto now = m_state->clock->localtime(); std::vector a = build_some_appointments(); a[0].alarms.front().time = now; a[1].alarms.front().time = now; m_range_planner->appointments().set(a); ASSERT_EQ(2, m_triggered.size()); EXPECT_EQ(a[0].uid, m_triggered[0]); EXPECT_EQ(a[1].uid, m_triggered[1]); } TEST_F(AlarmQueueFixture, NoDuplicates) { // Setup: add an appointment that gets triggered. const auto now = m_state->clock->localtime(); const std::vector appointments = build_some_appointments(); std::vector a; a.push_back(appointments[0]); a[0].alarms.front().time = now; m_range_planner->appointments().set(a); ASSERT_EQ(1, m_triggered.size()); EXPECT_EQ(a[0].uid, m_triggered[0]); // Now change the appointment vector by adding one to it. // Confirm that the AlarmQueue doesn't re-trigger a[0] a.push_back(appointments[1]); m_range_planner->appointments().set(a); ASSERT_EQ(1, m_triggered.size()); EXPECT_EQ(a[0].uid, m_triggered[0]); } ayatana-indicator-datetime-25.4.0/tests/test-clock.cpp0000644000000000000000000001664514773244555017624 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include "test-dbus-fixture.h" #include "timezone-mock.h" /*** **** ***/ using namespace ayatana::indicator::datetime; class ClockFixture: public TestDBusFixture { private: typedef TestDBusFixture super; }; TEST_F(ClockFixture, MinuteChangedSignalShouldTriggerOncePerMinute) { // start up a live clock auto timezone_ = std::make_shared(); timezone_->timezone.set("America/New_York"); LiveClock clock(timezone_); wait_msec(500); // wait for the bus to set up // count how many times clock.minute_changed() is emitted over the next minute const DateTime now = clock.localtime(); const auto gnow = now.get(); auto gthen = g_date_time_add_minutes(gnow, 1); int count = 0; clock.minute_changed.connect([&count](){count++;}); const auto msec = g_date_time_difference(gthen,gnow) / 1000; wait_msec(msec); EXPECT_EQ(1, count); g_date_time_unref(gthen); } /*** **** ***/ #define TIMEZONE_FILE (SANDBOX"/timezone") TEST_F(ClockFixture, HelloFixture) { auto timezone_ = std::make_shared(); timezone_->timezone.set("America/New_York"); LiveClock clock(timezone_); } TEST_F(ClockFixture, TimezoneChangeTriggersSkew) { auto timezone_ = std::make_shared(); timezone_->timezone.set("America/New_York"); LiveClock clock(timezone_); #if GLIB_CHECK_VERSION(2, 68, 0) auto tz_nyc = g_time_zone_new_identifier("America/New_York"); if (tz_nyc == NULL) { tz_nyc = g_time_zone_new_utc(); } #else auto tz_nyc = g_time_zone_new("America/New_York"); #endif auto now_nyc = g_date_time_new_now(tz_nyc); auto now = clock.localtime(); EXPECT_EQ(g_date_time_get_utc_offset(now_nyc), g_date_time_get_utc_offset(now.get())); EXPECT_LE(abs(g_date_time_difference(now_nyc,now.get())), G_USEC_PER_SEC); g_date_time_unref(now_nyc); g_time_zone_unref(tz_nyc); /// change the timezones! clock.minute_changed.connect([this](){ g_main_loop_quit(loop); }); g_idle_add([](gpointer gs){ static_cast(gs)->timezone.set("America/Los_Angeles"); return G_SOURCE_REMOVE; }, timezone_.get()); g_main_loop_run(loop); #if GLIB_CHECK_VERSION(2, 68, 0) auto tz_la = g_time_zone_new_identifier("America/Los_Angeles"); if (tz_la == NULL) { tz_la = g_time_zone_new_utc(); } #else auto tz_la = g_time_zone_new("America/Los_Angeles"); #endif auto now_la = g_date_time_new_now(tz_la); now = clock.localtime(); EXPECT_EQ(g_date_time_get_utc_offset(now_la), g_date_time_get_utc_offset(now.get())); EXPECT_LE(abs(g_date_time_difference(now_la,now.get())), G_USEC_PER_SEC); g_date_time_unref(now_la); g_time_zone_unref(tz_la); } /*** **** ***/ namespace { void on_login1_name_acquired(GDBusConnection * connection, const gchar * /*name*/, gpointer /*user_data*/) { g_dbus_connection_emit_signal(connection, nullptr, "/org/freedesktop/login1", // object path "org.freedesktop.login1.Manager", // interface "PrepareForSleep", // signal name g_variant_new("(b)", FALSE), nullptr); } } /** * Confirm that a "PrepareForSleep" event wil trigger a skew event */ TEST_F(ClockFixture, SleepTriggersSkew) { auto timezone_ = std::make_shared(); timezone_->timezone.set("America/New_York"); LiveClock clock(timezone_); wait_msec(250); // wait for the bus to set up bool skewed = false; clock.minute_changed.connect([&skewed, this](){ skewed = true; g_main_loop_quit(loop); return G_SOURCE_REMOVE; }); auto name_tag = g_bus_own_name(G_BUS_TYPE_SYSTEM, "org.freedesktop.login1", G_BUS_NAME_OWNER_FLAGS_NONE, nullptr /* bus acquired */, on_login1_name_acquired, nullptr /* name lost */, nullptr /* user_data */, nullptr /* user_data closure */); g_main_loop_run(loop); EXPECT_TRUE(skewed); g_bus_unown_name(name_tag); } namespace { void on_powerd_name_acquired(GDBusConnection * /*connection*/, const gchar * /*name*/, gpointer is_owned) { *static_cast(is_owned) = true; } } /** * Confirm that powerd's SysPowerStateChange triggers * a timestamp change */ TEST_F(ClockFixture, SysPowerStateChange) { // set up the mock clock bool minute_changed = false; auto clock = std::make_shared(DateTime::NowLocal()); clock->minute_changed.connect([&minute_changed]() { minute_changed = true; }); // control test -- minute_changed shouldn't get triggered // when the clock is silently changed gboolean is_owned = false; auto tag = g_bus_own_name_on_connection(system_bus, BUS_POWERD_NAME, G_BUS_NAME_OWNER_FLAGS_NONE, on_powerd_name_acquired, nullptr, &is_owned /* user_data */, nullptr /* user_data closure */); const DateTime not_now {DateTime::Local(1999, 12, 31, 23, 59, 59)}; clock->set_localtime_quietly(not_now); wait_msec(); ASSERT_TRUE(is_owned); ASSERT_FALSE(minute_changed); // now for the actual test, // confirm that SysPowerStateChange triggers a minute_changed() signal GError * error = nullptr; auto emitted = g_dbus_connection_emit_signal(system_bus, nullptr, BUS_POWERD_PATH, BUS_POWERD_INTERFACE, "SysPowerStateChange", g_variant_new("(i)", 1), &error); wait_msec(); EXPECT_TRUE(emitted); EXPECT_EQ(nullptr, error); EXPECT_TRUE(minute_changed); // cleanup g_bus_unown_name(tag); } ayatana-indicator-datetime-25.4.0/tests/test-datetime.cpp0000644000000000000000000000751714773244555020323 0ustar /* * Copyright 2015 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include "glib-fixture.h" using namespace ayatana::indicator::datetime; /*** **** ***/ class DateTimeFixture: public GlibFixture { public: DateTimeFixture() =default; virtual ~DateTimeFixture() =default; private: typedef GlibFixture super; protected: GRand * m_rand = nullptr; virtual void SetUp() override { super::SetUp(); m_rand = g_rand_new(); } virtual void TearDown() override { g_clear_pointer(&m_rand, g_rand_free); super::TearDown(); } DateTime random_day() { GTimeZone * universal = g_time_zone_new_utc(); DateTime point(universal, g_rand_int_range(m_rand, 1970, 3000), g_rand_int_range(m_rand, 1, 13), g_rand_int_range(m_rand, 1, 29), g_rand_int_range(m_rand, 0, 24), g_rand_int_range(m_rand, 0, 60), g_rand_double_range(m_rand, 0, 60.0)); g_time_zone_unref(universal); return point; } }; /*** **** ***/ TEST_F(DateTimeFixture, StartAndEnd) { const int n_iterations{10000}; for (int i{0}; i. * * Authors: * Charles Kerr * Robert Tari */ #ifndef INDICATOR_DATETIME_TESTS_DBUS_FIXTURE_H #define INDICATOR_DATETIME_TESTS_DBUS_FIXTURE_H #include "glib-fixture.h" /*** **** ***/ class TestDBusFixture: public GlibFixture { public: explicit TestDBusFixture() {}; virtual ~TestDBusFixture() =default; explicit TestDBusFixture(const std::vector& service_dirs_in): service_dirs(service_dirs_in) {} private: typedef GlibFixture super; static void on_bus_opened (GObject* /*object*/, GAsyncResult * res, gpointer gself) { auto self = static_cast(gself); GError * err = 0; self->system_bus = g_bus_get_finish (res, &err); g_assert_no_error (err); g_main_loop_quit (self->loop); } static void on_bus_closed (GObject* /*object*/, GAsyncResult * res, gpointer gself) { auto self = static_cast(gself); GError * err = 0; g_dbus_connection_close_finish (self->system_bus, res, &err); g_assert_no_error (err); g_main_loop_quit (self->loop); } protected: GTestDBus * test_dbus = NULL; GDBusConnection * system_bus = NULL; const std::vector service_dirs; virtual void SetUp() override { super::SetUp (); // pull up a test dbus test_dbus = g_test_dbus_new (G_TEST_DBUS_NONE); for (const auto& dir : service_dirs) g_test_dbus_add_service_dir (test_dbus, dir.c_str()); g_test_dbus_up (test_dbus); const char * address = g_test_dbus_get_bus_address (test_dbus); g_setenv ("DBUS_SYSTEM_BUS_ADDRESS", address, true); g_setenv ("DBUS_SESSION_BUS_ADDRESS", address, true); g_debug ("test_dbus's address is %s", address); // wait for the GDBusConnection before returning g_bus_get (G_BUS_TYPE_SYSTEM, nullptr, on_bus_opened, this); g_main_loop_run (loop); } virtual void TearDown() override { wait_msec(); // close the system bus g_dbus_connection_close(system_bus, nullptr, on_bus_closed, this); g_main_loop_run(loop); g_clear_object(&system_bus); // tear down the test dbus g_test_dbus_down(test_dbus); g_clear_object(&test_dbus); super::TearDown(); } }; #endif /* INDICATOR_DATETIME_TESTS_DBUS_FIXTURE_H */ ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-alarm-custom-sound.cpp0000644000000000000000000000601014773244555023571 0ustar /* * Copyright 2015 Canonical Ltd. * Copyright 2021 Robert Tari * Copyright 2023 UBports Foundation. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari * Ratchanan Srirattanamet */ #include #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" #include "wakeup-timer-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, AlarmCustomSound) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"America/Recife"}; auto tz = std::make_shared(zone_str); #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone_str); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone_str); #endif // make a planner that looks at the first half of 2023 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2023,1, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2023,6,30,23,59,59.5}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // the planner should match what we've got in the calendar.ics file const auto appts = planner->appointments().get(); EXPECT_EQ(1, appts.size()); EXPECT_EQ(1, appts[0].alarms.size()); EXPECT_EQ(appts[0].alarms[0].audio_url, "file:///usr/share/sounds/lomiri/ringtones/Entropy.ogg"); // cleanup g_time_zone_unref(gtz); } ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-alarm-custom-sound.db0000755000000000000000000033000014773244555023376 0ustar SQLite format 3@ $$.zq  MU    bb03f546-9614-4d2a-aee3-3444886b49fbDefault#0000FFg^Mg^M 'U bb03f546-9614-4d2a-aee3-3444886b49fb WW&/U)      U  bb03f546-9614-4d2a-aee3-3444886b49fbTodoAlarmx-lomiri-alarmddg^MgAGgAGaca60dd3-74e8-48d0-990d-8faa133ad222  ! Components    RRZ 5 w startTriggerRelationfile:///usr/share/sounds/lomiri/ringtones/Entropy.ogg) 5  startTriggerRelationAlarm'     'U bb03f546-9614-4d2a-aee3-3444886b49fb / U bb03f546-9614-4d2a-aee3-3444886b49fbd )U aca60dd3-74e8-48d0-990d-8faa133ad222 'U bb03f546-9614-4d2a-aee3-3444886b49fb       6{ / $s0o{FeindexIDXn+tableRecursiveRecursive CREATE TABLE Recursive(ComponentId INTEGER, RuleType INTEGER, Frequency INTEGER, Until INTEGER, UntilLocal INTEGER, untilTimeZone TEXT, Count INTEGER, Interval INTEGER, BySecond TEXT, ByMinute TEXT, ByHour TEXT, ByDay TEXT, ByDayPos Text, ByMonthDay TEXT, ByYearDay TEXT, ByWeekNum TEXT, ByMonth TEXT, BySetPos TEXT, WeekStart INTEGER)--AtableCustompropertiesCustompropertiesCREATE TABLE Customproperties(ComponentId INTEGER, Name TEXT, Value TEXT, Parameters TEXT)YtableRdatesRdatesCREATE TABLE Rdates(ComponentId INTEGER, Type INTEGER, Date INTEGER, DateLocal INTEGER, TimeZone TEXT)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)2!!/tableComponentsComponentsCREATE TABLE Components(ComponentId INTEGER PRIMARY KEY AUTOINCREMENT, Notebook TEXT, Type TEXT, Summary TEXT, Category TEXT, DateStart INTEGER, DateStartLocal INTEGER, StartTimeZone TEXT, HasDueDate INTEGER, DateEndDue INTEGER, DateEndDueLocal INTEGER, EndDueTimeZone TEXT, Duration INTEGER, Classification INTEGER, Location TEXT, Description TEXT, Status INTEGER, GeoLatitude REAL, GeoLongitude REAL, Priority INTEGER, Resources TEXT, DateCreated INTEGER, DateStamp INTEGER, DateLastModified INTEGER, Sequence INTEGER, Comments TEXT, Attachments TEXT, Contact TEXT, InvitationStatus INTEGER, RecurId INTEGER, RecurIdLocal INTEGER, RecurIdTimeZone TEXT, RelatedTo TEXT, URL TEXT, UID TEXT, Transparency INTEGER, LocalOnly INTEGER, Percent INTEGER, DateCompleted INTEGER, DateCompletedLocal INTEGER, CompletedTimeZone TEXT, DateDeleted INTEGER, extra1 STRING, extra2 STRING, extra3 INTEGER, thisAndFuture INTEGER)BStableCalendarsCalendarsCREATE TABLE Calendars(CalendarId TEXT PRIMARY KEY, Name TEXT, Description TEXT, Color INTEGER, Flags INTEGER, syncDate INTEGER, pluginName TEXT, account TEXT, attachmentSize INTEGER, modifiedDate INTEGER, sharedWith TEXT, syncProfile TEXT, createdDate INTEGER, extra1 STRING, extra2 STRING)1Eindexsqlite_autoindex_Calendars_1CalendarsHetableMetadataMetadataCREATE TABLE Metadata(transactionId INTEGER)   P > _ } 1 d hz91indexIDX_CALENDARPROPERTIESCalendarpropertiesCREATE INDEX IDX_CALENDARPROPERTIES on Calendarproperties(CalendarId)^+#}indexIDX_ATTACHMENTSAttachmentsCREATE INDEX IDX_ATTACHMENTS on Attachments(ComponentId)R%qindexIDX_ATTENDEEAttendeeCREATE INDEX IDX_ATTENDEE on Attendee(ComponentId)FeindexIDX_ALARMAlarmCREATE INDEX IDX_ALARM on Alarm(ComponentId)V'uindexIDX_RECURSIVERecursiveCREATE INDEX IDX_RECURSIVE on Recursive(ComponentId)s5-indexIDX_CUSTOMPROPERTIESCustompropertiesCREATE INDEX IDX_CUSTOMPROPERTIES on Customproperties(ComponentId)J!iindexIDX_RDATESRdatesCREATE INDEX IDX_RDATES on Rdates(ComponentId)h9!indexIDX_COMPONENT_NOTEBOOKComponentsCREATE INDEX IDX_COMPONENT_NOTEBOOK on Components(Notebook)v/!)indexIDX_COMPONENT_UIDComponentsCREATE UNIQUE INDEX IDX_COMPONENT_UID on Components(UID, RecurId, DateDeleted)'!SindexIDX_COMPONENTComponentsCREATE INDEX IDX_COMPONENT on Components(ComponentId, Notebook, DateStart, DateEndDue, DateDeleted)S%qindexIDX_CALENDARCalendarsCREATE INDEX IDX_CALENDAR on Calendars(CalendarId)C W1indexsqlite_autoindex_Calendarproperties_1CalendarpropertiesJ 11?tableCalendarpropertiesCalendarproperties CREATE TABLE Calendarproperties(CalendarId REFERENCES Calendars(CalendarId) ON DELETE CASCADE, Name TEXT NOT NULL, Value TEXT, UNIQUE (CalendarId, Name))# ## tableAttachmentsAttachments CREATE TABLE Attachments(ComponentId INTEGER, Data BLOB, Uri TEXT, MimeType TEXT, ShowInLine INTEGER, Label TEXT, Local INTEGER)G atableAttendeeAttendee CREATE TABLE Attendee(ComponentId INTEGER, Email TEXT, Name TEXT, IsOrganizer INTEGER, Role INTEGER, PartStat INTEGER, Rsvp INTEGER, DelegatedTo TEXT, DelegatedFrom TEXT)= YtableAlarmAlarm CREATE TABLE Alarm(ComponentId INTEGER, Action INTEGER, Repeat INTEGER, Duration INTEGER, Offset INTEGER, Relation TEXT, DateTrigger INTEGER, DateTriggerLocal INTEGER, triggerTimeZone TEXT, Description TEXT, Attachment TEXT, Summary TEXT, Address TEXT, CustomProperties TEXT, isEnabled INTEGER) ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-alarm-custom-sound.ics.in0000644000000000000000000000142614773244555024200 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2023-06-06T17:25:48.265942Z(42) BEGIN:VTODO UID:882a6a702f87a3afde203e5609d2626ba144a3c2 DTSTAMP:20230606T172548Z DTSTART:20230607T165701 PRIORITY:0 SUMMARY:Alarm CATEGORIES:x-lomiri-alarm SEQUENCE:1 LAST-MODIFIED:20230606T172548Z BEGIN:VALARM X-EVOLUTION-ALARM-UID:eceda45c7493b76e41cdb2369ce8160b75e53f98 ACTION:AUDIO TRIGGER;RELATED=START:PT0S REPEAT:0 DURATION:PT0S ATTACH:file:///usr/share/sounds/lomiri/ringtones/Entropy.ogg END:VALARM BEGIN:VALARM X-EVOLUTION-ALARM-UID:8eec04befc2876fb13a6726181fed33b9f7810c8 ACTION:DISPLAY DESCRIPTION:Alarm TRIGGER;RELATED=START:PT0S REPEAT:0 DURATION:PT0S END:VALARM END:VTODO END:VCALENDAR ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-all-day-events.cpp0000644000000000000000000000730214773244555022671 0ustar /* * Copyright 2015 Canonical Ltd. * Copyright 2021-2024 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" #include "wakeup-timer-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, MultipleAppointments) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"America/Chicago"}; auto tz = std::make_shared(zone_str); #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone_str); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone_str); #endif // make a planner that looks at the first half of 2015 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2015,1, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2015,6,30,23,59,59.5}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // what we expect to get... Appointment expected_appt; #ifndef LOMIRI_FEATURES_ENABLED expected_appt.uid = "20150521T111538Z-7449-1000-3572-0@ghidorah"; #else expected_appt.uid = "51340540-a924-468e-b3ee-0c0f222cd0f8"; #endif expected_appt.summary = "Memorial Day"; expected_appt.begin = DateTime{gtz,2015,5,25,0,0,0}; expected_appt.end = DateTime{gtz,2015,5,26,0,0,0}; // compare it to what we actually loaded... const auto appts = planner->appointments().get(); ASSERT_EQ(1, appts.size()); const auto& appt = appts[0]; EXPECT_EQ(expected_appt.begin, appt.begin); EXPECT_EQ(expected_appt.end, appt.end); EXPECT_EQ(expected_appt.uid, appt.uid); EXPECT_EQ(expected_appt.summary, appt.summary); EXPECT_EQ(0, appt.alarms.size()); EXPECT_PRED3([](auto sColourIn, auto sColourExpected1, auto sColourExpected2) { return sColourIn == sColourExpected1 || sColourIn == sColourExpected2; #ifndef LOMIRI_FEATURES_ENABLED }, appt.color, "#becedd", "#62a0ea"); #else }, appt.color, "#0000FF", ""); #endif // cleanup g_time_zone_unref(gtz); } ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-all-day-events.db0000644000000000000000000033000014773244555022466 0ustar SQLite format 3@ .v  MU    0a0ad4cc-0613-48a9-8b79-8307515b1c24Default#0000FFg^g^ 'U 0a0ad4cc-0613-48a9-8b79-8307515b1c24 ((U/U% %% 7   U  0a0ad4cc-0613-48a9-8b79-8307515b1c24EventMemorial DayUbfUbfFloatingDateUcUcFloatingDateToday is Memorial DayU]g^U]51340540-a924-468e-b3ee-0c0f222cd0f8  ! Components         'U 0a0ad4cc-0613-48a9-8b79-8307515b1c24 3 U 0a0ad4cc-0613-48a9-8b79-8307515b1c24UbfUc )U 51340540-a924-468e-b3ee-0c0f222cd0f8 'U 0a0ad4cc-0613-48a9-8b79-8307515b1c24      6{ / $s0o{FeindexIDXn+tableRecursiveRecursive CREATE TABLE Recursive(ComponentId INTEGER, RuleType INTEGER, Frequency INTEGER, Until INTEGER, UntilLocal INTEGER, untilTimeZone TEXT, Count INTEGER, Interval INTEGER, BySecond TEXT, ByMinute TEXT, ByHour TEXT, ByDay TEXT, ByDayPos Text, ByMonthDay TEXT, ByYearDay TEXT, ByWeekNum TEXT, ByMonth TEXT, BySetPos TEXT, WeekStart INTEGER)--AtableCustompropertiesCustompropertiesCREATE TABLE Customproperties(ComponentId INTEGER, Name TEXT, Value TEXT, Parameters TEXT)YtableRdatesRdatesCREATE TABLE Rdates(ComponentId INTEGER, Type INTEGER, Date INTEGER, DateLocal INTEGER, TimeZone TEXT)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)2!!/tableComponentsComponentsCREATE TABLE Components(ComponentId INTEGER PRIMARY KEY AUTOINCREMENT, Notebook TEXT, Type TEXT, Summary TEXT, Category TEXT, DateStart INTEGER, DateStartLocal INTEGER, StartTimeZone TEXT, HasDueDate INTEGER, DateEndDue INTEGER, DateEndDueLocal INTEGER, EndDueTimeZone TEXT, Duration INTEGER, Classification INTEGER, Location TEXT, Description TEXT, Status INTEGER, GeoLatitude REAL, GeoLongitude REAL, Priority INTEGER, Resources TEXT, DateCreated INTEGER, DateStamp INTEGER, DateLastModified INTEGER, Sequence INTEGER, Comments TEXT, Attachments TEXT, Contact TEXT, InvitationStatus INTEGER, RecurId INTEGER, RecurIdLocal INTEGER, RecurIdTimeZone TEXT, RelatedTo TEXT, URL TEXT, UID TEXT, Transparency INTEGER, LocalOnly INTEGER, Percent INTEGER, DateCompleted INTEGER, DateCompletedLocal INTEGER, CompletedTimeZone TEXT, DateDeleted INTEGER, extra1 STRING, extra2 STRING, extra3 INTEGER, thisAndFuture INTEGER)BStableCalendarsCalendarsCREATE TABLE Calendars(CalendarId TEXT PRIMARY KEY, Name TEXT, Description TEXT, Color INTEGER, Flags INTEGER, syncDate INTEGER, pluginName TEXT, account TEXT, attachmentSize INTEGER, modifiedDate INTEGER, sharedWith TEXT, syncProfile TEXT, createdDate INTEGER, extra1 STRING, extra2 STRING)1Eindexsqlite_autoindex_Calendars_1CalendarsHetableMetadataMetadataCREATE TABLE Metadata(transactionId INTEGER)   P > _ } 1 d hz91indexIDX_CALENDARPROPERTIESCalendarpropertiesCREATE INDEX IDX_CALENDARPROPERTIES on Calendarproperties(CalendarId)^+#}indexIDX_ATTACHMENTSAttachmentsCREATE INDEX IDX_ATTACHMENTS on Attachments(ComponentId)R%qindexIDX_ATTENDEEAttendeeCREATE INDEX IDX_ATTENDEE on Attendee(ComponentId)FeindexIDX_ALARMAlarmCREATE INDEX IDX_ALARM on Alarm(ComponentId)V'uindexIDX_RECURSIVERecursiveCREATE INDEX IDX_RECURSIVE on Recursive(ComponentId)s5-indexIDX_CUSTOMPROPERTIESCustompropertiesCREATE INDEX IDX_CUSTOMPROPERTIES on Customproperties(ComponentId)J!iindexIDX_RDATESRdatesCREATE INDEX IDX_RDATES on Rdates(ComponentId)h9!indexIDX_COMPONENT_NOTEBOOKComponentsCREATE INDEX IDX_COMPONENT_NOTEBOOK on Components(Notebook)v/!)indexIDX_COMPONENT_UIDComponentsCREATE UNIQUE INDEX IDX_COMPONENT_UID on Components(UID, RecurId, DateDeleted)'!SindexIDX_COMPONENTComponentsCREATE INDEX IDX_COMPONENT on Components(ComponentId, Notebook, DateStart, DateEndDue, DateDeleted)S%qindexIDX_CALENDARCalendarsCREATE INDEX IDX_CALENDAR on Calendars(CalendarId)C W1indexsqlite_autoindex_Calendarproperties_1CalendarpropertiesJ 11?tableCalendarpropertiesCalendarproperties CREATE TABLE Calendarproperties(CalendarId REFERENCES Calendars(CalendarId) ON DELETE CASCADE, Name TEXT NOT NULL, Value TEXT, UNIQUE (CalendarId, Name))# ## tableAttachmentsAttachments CREATE TABLE Attachments(ComponentId INTEGER, Data BLOB, Uri TEXT, MimeType TEXT, ShowInLine INTEGER, Label TEXT, Local INTEGER)G atableAttendeeAttendee CREATE TABLE Attendee(ComponentId INTEGER, Email TEXT, Name TEXT, IsOrganizer INTEGER, Role INTEGER, PartStat INTEGER, Rsvp INTEGER, DelegatedTo TEXT, DelegatedFrom TEXT)= YtableAlarmAlarm CREATE TABLE Alarm(ComponentId INTEGER, Action INTEGER, Repeat INTEGER, Duration INTEGER, Offset INTEGER, Relation TEXT, DateTrigger INTEGER, DateTriggerLocal INTEGER, triggerTimeZone TEXT, Description TEXT, Attachment TEXT, Summary TEXT, Address TEXT, CustomProperties TEXT, isEnabled INTEGER) ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-all-day-events.ics.in0000644000000000000000000000075214773244555023274 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2015-05-07T21:14:49.315443Z(0) BEGIN:VEVENT UID:20150521T111538Z-7449-1000-3572-0@ghidorah DTSTAMP:20150521T001128Z DTSTART;VALUE=DATE:20150525 DTEND;VALUE=DATE:20150526 TRANSP:TRANSPARENT SEQUENCE:2 SUMMARY:Memorial Day DESCRIPTION:Today is Memorial Day CLASS:PUBLIC CREATED:20150521T111638Z LAST-MODIFIED:20150521T111638Z END:VEVENT END:VCALENDAR ././@LongLink0000644000000000000000000000016000000000000007770 Lustar ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-config-files/.config/evolution/sources/system-proxy.sourceayatana-indicator-datetime-25.4.0/tests/test-eds-ics-config-files/.config/evolution/sources/system-p0000644000000000000000000000044014773244555030437 0ustar [Data Source] DisplayName=Default Proxy Settings Enabled=true Parent= [Proxy] Method=default IgnoreHosts=localhost;127.0.0.0/8;::1; AutoconfigUrl= FtpHost= FtpPort=0 HttpAuthPassword= HttpAuthUser= HttpHost= HttpPort=8080 HttpUseAuth=false HttpsHost= HttpsPort=0 SocksHost= SocksPort=0 ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-missing-trigger.cpp0000644000000000000000000001335614773244555023164 0ustar /* * Copyright 2015 Canonical Ltd. * Copyright 2021-2025 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" #include "wakeup-timer-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, MissingTriggers) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"America/Chicago"}; auto tz = std::make_shared(zone_str); #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone_str); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone_str); #endif // make a planner that looks at the first half of 2015 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2015,1, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2015,6,30,23,59,59.5}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // build expected: one-time alarm 1 std::vector expected1; Appointment a1; a1.type = Appointment::ALARM; #ifndef LOMIRI_FEATURES_ENABLED a1.uid = "20150617T211838Z-6217-32011-2036-1@lomiri-phablet"; a1.color = "#becedd"; #else a1.uid = "a0121159-8810-434f-9066-cc3b71e3793f"; a1.color = "#0000FF"; #endif a1.summary = "One Time Alarm"; a1.begin = DateTime { gtz, 2015, 6, 18, 10, 0, 0}; a1.end = a1.begin; a1.alarms.resize(1); a1.alarms[0].audio_url = "file://" ALARM_DEFAULT_SOUND; a1.alarms[0].time = a1.begin; a1.alarms[0].text = a1.summary; expected1.push_back(a1); // build expected: recurring alarm 1 #ifndef LOMIRI_FEATURES_ENABLED a1.uid = "20150617T211913Z-6217-32011-2036-5@lomiri-phablet"; #else a1.uid = "3b45cbc9-d5c3-49a4-ad29-acc776818259"; #endif a1.summary = "Recurring Alarm"; a1.alarms[0].text = a1.summary; std::array recurrences { DateTime{ gtz, 2015, 6, 18, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 19, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 20, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 21, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 22, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 23, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 24, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 25, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 26, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 27, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 28, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 29, 10, 1, 0 }, DateTime{ gtz, 2015, 6, 30, 10, 1, 0 }, }; for (const auto& time : recurrences) { a1.begin = a1.end = a1.alarms[0].time = time; expected1.push_back(a1); } // build expected: one-time alarm 2 std::vector expected2; Appointment a2; a2.type = Appointment::ALARM; #ifndef LOMIRI_FEATURES_ENABLED a2.uid = "20150617T211838Z-6217-32011-2036-1@lomiri-phablet"; a2.color = "#62a0ea"; #else a2.uid = "a0121159-8810-434f-9066-cc3b71e3793f"; a2.color = ""; #endif a2.summary = "One Time Alarm"; a2.begin = DateTime { gtz, 2015, 6, 18, 10, 0, 0}; a2.end = a2.begin; a2.alarms.resize(1); a2.alarms[0].audio_url = "file://" ALARM_DEFAULT_SOUND; a2.alarms[0].time = a2.begin; a2.alarms[0].text = a2.summary; expected2.push_back(a2); // build expected: recurring alarm 2 #ifndef LOMIRI_FEATURES_ENABLED a2.uid = "20150617T211913Z-6217-32011-2036-5@lomiri-phablet"; #else a2.uid = "3b45cbc9-d5c3-49a4-ad29-acc776818259"; #endif a2.summary = "Recurring Alarm"; a2.alarms[0].text = a2.summary; for (const auto& time : recurrences) { a2.begin = a2.end = a2.alarms[0].time = time; expected2.push_back(a2); } // the planner should match what we've got in the calendar.ics file const auto appts = planner->appointments().get(); EXPECT_PRED3([](auto lAppointmentsIn, auto lAppointmentsExpected1, auto lAppointmentsExpected2) { return lAppointmentsIn == lAppointmentsExpected1 || lAppointmentsIn == lAppointmentsExpected2; }, appts, expected1, expected2); // cleanup g_time_zone_unref(gtz); } ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-missing-trigger.db0000755000000000000000000033000014773244555022756 0ustar SQLite format 3@ !!.zq  LU    4949e45c-209a-4198-8eaa-cf565e0f4c42Alarms#0000FFgg 'U 4949e45c-209a-4198-8eaa-cf565e0f4c42 \  $/U)      U  4949e45c-209a-4198-8eaa-cf565e0f4c42TodoOne Time AlarmUUUTCU.gU.a0121159-8810-434f-9066-cc3b71e3793f%/U+      U  4949e45c-209a-4198-8eaa-cf565e0f4c42TodoRecurring AlarmU,UUTCUQgUQ3b45cbc9-d5c3-49a4-ad29-acc776818259 !Components       %F% ) One Time AlarmK  file:///usr/share/sounds/lomiri/ringtones/Alarm clock.ogg + Recurring AlarmJ   file:///usr/share/sounds/lomiri/ringtones/Alarm clock.ogg     'U 4949e45c-209a-4198-8eaa-cf565e0f4c42 1U4949e45c-209a-4198-8eaa-cf565e0f4c42U/ U 4949e45c-209a-4198-8eaa-cf565e0f4c42U, *Ua0121159-8810-434f-9066-cc3b71e3793f)U 3b45cbc9-d5c3-49a4-ad29-acc776818259 (U4949e45c-209a-4198-8eaa-cf565e0f4c42'U 4949e45c-209a-4198-8eaa-cf565e0f4c42       6{ / $s0o{FeindexIDXn+tableRecursiveRecursive CREATE TABLE Recursive(ComponentId INTEGER, RuleType INTEGER, Frequency INTEGER, Until INTEGER, UntilLocal INTEGER, untilTimeZone TEXT, Count INTEGER, Interval INTEGER, BySecond TEXT, ByMinute TEXT, ByHour TEXT, ByDay TEXT, ByDayPos Text, ByMonthDay TEXT, ByYearDay TEXT, ByWeekNum TEXT, ByMonth TEXT, BySetPos TEXT, WeekStart INTEGER)--AtableCustompropertiesCustompropertiesCREATE TABLE Customproperties(ComponentId INTEGER, Name TEXT, Value TEXT, Parameters TEXT)YtableRdatesRdatesCREATE TABLE Rdates(ComponentId INTEGER, Type INTEGER, Date INTEGER, DateLocal INTEGER, TimeZone TEXT)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)2!!/tableComponentsComponentsCREATE TABLE Components(ComponentId INTEGER PRIMARY KEY AUTOINCREMENT, Notebook TEXT, Type TEXT, Summary TEXT, Category TEXT, DateStart INTEGER, DateStartLocal INTEGER, StartTimeZone TEXT, HasDueDate INTEGER, DateEndDue INTEGER, DateEndDueLocal INTEGER, EndDueTimeZone TEXT, Duration INTEGER, Classification INTEGER, Location TEXT, Description TEXT, Status INTEGER, GeoLatitude REAL, GeoLongitude REAL, Priority INTEGER, Resources TEXT, DateCreated INTEGER, DateStamp INTEGER, DateLastModified INTEGER, Sequence INTEGER, Comments TEXT, Attachments TEXT, Contact TEXT, InvitationStatus INTEGER, RecurId INTEGER, RecurIdLocal INTEGER, RecurIdTimeZone TEXT, RelatedTo TEXT, URL TEXT, UID TEXT, Transparency INTEGER, LocalOnly INTEGER, Percent INTEGER, DateCompleted INTEGER, DateCompletedLocal INTEGER, CompletedTimeZone TEXT, DateDeleted INTEGER, extra1 STRING, extra2 STRING, extra3 INTEGER, thisAndFuture INTEGER)BStableCalendarsCalendarsCREATE TABLE Calendars(CalendarId TEXT PRIMARY KEY, Name TEXT, Description TEXT, Color INTEGER, Flags INTEGER, syncDate INTEGER, pluginName TEXT, account TEXT, attachmentSize INTEGER, modifiedDate INTEGER, sharedWith TEXT, syncProfile TEXT, createdDate INTEGER, extra1 STRING, extra2 STRING)1Eindexsqlite_autoindex_Calendars_1CalendarsHetableMetadataMetadataCREATE TABLE Metadata(transactionId INTEGER)   P > _ } 1 d hz91indexIDX_CALENDARPROPERTIESCalendarpropertiesCREATE INDEX IDX_CALENDARPROPERTIES on Calendarproperties(CalendarId)^+#}indexIDX_ATTACHMENTSAttachmentsCREATE INDEX IDX_ATTACHMENTS on Attachments(ComponentId)R%qindexIDX_ATTENDEEAttendeeCREATE INDEX IDX_ATTENDEE on Attendee(ComponentId)FeindexIDX_ALARMAlarmCREATE INDEX IDX_ALARM on Alarm(ComponentId)V'uindexIDX_RECURSIVERecursiveCREATE INDEX IDX_RECURSIVE on Recursive(ComponentId)s5-indexIDX_CUSTOMPROPERTIESCustompropertiesCREATE INDEX IDX_CUSTOMPROPERTIES on Customproperties(ComponentId)J!iindexIDX_RDATESRdatesCREATE INDEX IDX_RDATES on Rdates(ComponentId)h9!indexIDX_COMPONENT_NOTEBOOKComponentsCREATE INDEX IDX_COMPONENT_NOTEBOOK on Components(Notebook)v/!)indexIDX_COMPONENT_UIDComponentsCREATE UNIQUE INDEX IDX_COMPONENT_UID on Components(UID, RecurId, DateDeleted)'!SindexIDX_COMPONENTComponentsCREATE INDEX IDX_COMPONENT on Components(ComponentId, Notebook, DateStart, DateEndDue, DateDeleted)S%qindexIDX_CALENDARCalendarsCREATE INDEX IDX_CALENDAR on Calendars(CalendarId)C W1indexsqlite_autoindex_Calendarproperties_1CalendarpropertiesJ 11?tableCalendarpropertiesCalendarproperties CREATE TABLE Calendarproperties(CalendarId REFERENCES Calendars(CalendarId) ON DELETE CASCADE, Name TEXT NOT NULL, Value TEXT, UNIQUE (CalendarId, Name))# ## tableAttachmentsAttachments CREATE TABLE Attachments(ComponentId INTEGER, Data BLOB, Uri TEXT, MimeType TEXT, ShowInLine INTEGER, Label TEXT, Local INTEGER)G atableAttendeeAttendee CREATE TABLE Attendee(ComponentId INTEGER, Email TEXT, Name TEXT, IsOrganizer INTEGER, Role INTEGER, PartStat INTEGER, Rsvp INTEGER, DelegatedTo TEXT, DelegatedFrom TEXT)= YtableAlarmAlarm CREATE TABLE Alarm(ComponentId INTEGER, Action INTEGER, Repeat INTEGER, Duration INTEGER, Offset INTEGER, Relation TEXT, DateTrigger INTEGER, DateTriggerLocal INTEGER, triggerTimeZone TEXT, Description TEXT, Attachment TEXT, Summary TEXT, Address TEXT, CustomProperties TEXT, isEnabled INTEGER) ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-missing-trigger.ics.in0000644000000000000000000000235114773244555023556 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2015-06-17T21:19:13.980613Z(3) BEGIN:VTODO UID:20150617T211838Z-6217-32011-2036-1@lomiri-phablet DTSTAMP:20150617T211838Z DTSTART:20150618T100000 SUMMARY:One Time Alarm CATEGORIES:x-lomiri-alarm CREATED:20150617T211838Z LAST-MODIFIED:20150617T211838Z BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150617T211838Z-6217-32011-2036-2@lomiri-phablet ACTION:AUDIO ATTACH:file://@ALARM_DEFAULT_SOUND@ END:VALARM BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150617T211838Z-6217-32011-2036-3@lomiri-phablet ACTION:DISPLAY DESCRIPTION:One Time Alarm END:VALARM END:VTODO BEGIN:VTODO UID:20150617T211913Z-6217-32011-2036-5@lomiri-phablet DTSTAMP:20150617T211913Z DTSTART:20150618T100100 RRULE:FREQ=DAILY SUMMARY:Recurring Alarm CATEGORIES:x-lomiri-alarm CREATED:20150617T211913Z LAST-MODIFIED:20150617T211913Z BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150617T211913Z-6217-32011-2036-6@lomiri-phablet ACTION:AUDIO ATTACH:file://@ALARM_DEFAULT_SOUND@ END:VALARM BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150617T211913Z-6217-32011-2036-7@lomiri-phablet ACTION:DISPLAY DESCRIPTION:Recurring Alarm END:VALARM END:VTODO END:VCALENDAR ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-non-attending-alarms.cpp0000644000000000000000000000575714773244555024102 0ustar /* * Copyright 2015 Canonical Ltd. * Copyright 2021-2023 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" #include "wakeup-timer-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, NonAttendingEvent) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"America/Recife"}; auto tz = std::make_shared(zone_str); #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone_str); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone_str); #endif // make a planner that looks at the first half of 2016 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2016,1, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2016,6,30,23,59,59.5}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // the planner should match what we've got in the calendar.ics file const auto appts = planner->appointments().get(); EXPECT_EQ(3, appts.size()); EXPECT_EQ(appts[0].begin, DateTime(gtz, 2016, 4, 4, 16, 0, 0)); EXPECT_EQ(appts[1].begin, DateTime(gtz, 2016, 4, 5, 16, 0, 0)); EXPECT_EQ(appts[2].begin, DateTime(gtz, 2016, 4, 6, 16, 0, 0)); // cleanup g_time_zone_unref(gtz); } ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-non-attending-alarms.db0000644000000000000000000033000014773244555023663 0ustar SQLite format 3@ !!.v  MU    2385438e-04ce-4bb9-9c92-276c72304353Default#0000FFg^g^ 'U 2385438e-04ce-4bb9-9c92-276c72304353  /H/U- ))    U  2385438e-04ce-4bb9-9c92-276c72304353EventEvery day at 4PMWWAmerica/RecifeWWAmerica/RecifeWg^W8d144349-c7ca-4957-bd03-e96fd62d1ef4mN/U- //    U  2385438e-04ce-4bb9-9c92-276c72304353EventEvery day at 4PMW 0WAmerica/FortalezaW@WAmerica/FortalezaWg^W4715992f-e7aa-4c60-91bb-a4055fd88375 !Components   !  W\W\UTC"      'U 2385438e-04ce-4bb9-9c92-276c72304353 rr3 U 2385438e-04ce-4bb9-9c92-276c72304353WW$5U2385438e-04ce-4bb9-9c92-276c72304353W 0W@ *U4715992f-e7aa-4c60-91bb-a4055fd88375)U 8d144349-c7ca-4957-bd03-e96fd62d1ef4 (U2385438e-04ce-4bb9-9c92-276c72304353'U 2385438e-04ce-4bb9-9c92-276c72304353      6{ / $s0o{FeindexIDXn+tableRecursiveRecursive CREATE TABLE Recursive(ComponentId INTEGER, RuleType INTEGER, Frequency INTEGER, Until INTEGER, UntilLocal INTEGER, untilTimeZone TEXT, Count INTEGER, Interval INTEGER, BySecond TEXT, ByMinute TEXT, ByHour TEXT, ByDay TEXT, ByDayPos Text, ByMonthDay TEXT, ByYearDay TEXT, ByWeekNum TEXT, ByMonth TEXT, BySetPos TEXT, WeekStart INTEGER)--AtableCustompropertiesCustompropertiesCREATE TABLE Customproperties(ComponentId INTEGER, Name TEXT, Value TEXT, Parameters TEXT)YtableRdatesRdatesCREATE TABLE Rdates(ComponentId INTEGER, Type INTEGER, Date INTEGER, DateLocal INTEGER, TimeZone TEXT)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)2!!/tableComponentsComponentsCREATE TABLE Components(ComponentId INTEGER PRIMARY KEY AUTOINCREMENT, Notebook TEXT, Type TEXT, Summary TEXT, Category TEXT, DateStart INTEGER, DateStartLocal INTEGER, StartTimeZone TEXT, HasDueDate INTEGER, DateEndDue INTEGER, DateEndDueLocal INTEGER, EndDueTimeZone TEXT, Duration INTEGER, Classification INTEGER, Location TEXT, Description TEXT, Status INTEGER, GeoLatitude REAL, GeoLongitude REAL, Priority INTEGER, Resources TEXT, DateCreated INTEGER, DateStamp INTEGER, DateLastModified INTEGER, Sequence INTEGER, Comments TEXT, Attachments TEXT, Contact TEXT, InvitationStatus INTEGER, RecurId INTEGER, RecurIdLocal INTEGER, RecurIdTimeZone TEXT, RelatedTo TEXT, URL TEXT, UID TEXT, Transparency INTEGER, LocalOnly INTEGER, Percent INTEGER, DateCompleted INTEGER, DateCompletedLocal INTEGER, CompletedTimeZone TEXT, DateDeleted INTEGER, extra1 STRING, extra2 STRING, extra3 INTEGER, thisAndFuture INTEGER)BStableCalendarsCalendarsCREATE TABLE Calendars(CalendarId TEXT PRIMARY KEY, Name TEXT, Description TEXT, Color INTEGER, Flags INTEGER, syncDate INTEGER, pluginName TEXT, account TEXT, attachmentSize INTEGER, modifiedDate INTEGER, sharedWith TEXT, syncProfile TEXT, createdDate INTEGER, extra1 STRING, extra2 STRING)1Eindexsqlite_autoindex_Calendars_1CalendarsHetableMetadataMetadataCREATE TABLE Metadata(transactionId INTEGER)   P > _ } 1 d hz91indexIDX_CALENDARPROPERTIESCalendarpropertiesCREATE INDEX IDX_CALENDARPROPERTIES on Calendarproperties(CalendarId)^+#}indexIDX_ATTACHMENTSAttachmentsCREATE INDEX IDX_ATTACHMENTS on Attachments(ComponentId)R%qindexIDX_ATTENDEEAttendeeCREATE INDEX IDX_ATTENDEE on Attendee(ComponentId)FeindexIDX_ALARMAlarmCREATE INDEX IDX_ALARM on Alarm(ComponentId)V'uindexIDX_RECURSIVERecursiveCREATE INDEX IDX_RECURSIVE on Recursive(ComponentId)s5-indexIDX_CUSTOMPROPERTIESCustompropertiesCREATE INDEX IDX_CUSTOMPROPERTIES on Customproperties(ComponentId)J!iindexIDX_RDATESRdatesCREATE INDEX IDX_RDATES on Rdates(ComponentId)h9!indexIDX_COMPONENT_NOTEBOOKComponentsCREATE INDEX IDX_COMPONENT_NOTEBOOK on Components(Notebook)v/!)indexIDX_COMPONENT_UIDComponentsCREATE UNIQUE INDEX IDX_COMPONENT_UID on Components(UID, RecurId, DateDeleted)'!SindexIDX_COMPONENTComponentsCREATE INDEX IDX_COMPONENT on Components(ComponentId, Notebook, DateStart, DateEndDue, DateDeleted)S%qindexIDX_CALENDARCalendarsCREATE INDEX IDX_CALENDAR on Calendars(CalendarId)C W1indexsqlite_autoindex_Calendarproperties_1CalendarpropertiesJ 11?tableCalendarpropertiesCalendarproperties CREATE TABLE Calendarproperties(CalendarId REFERENCES Calendars(CalendarId) ON DELETE CASCADE, Name TEXT NOT NULL, Value TEXT, UNIQUE (CalendarId, Name))# ## tableAttachmentsAttachments CREATE TABLE Attachments(ComponentId INTEGER, Data BLOB, Uri TEXT, MimeType TEXT, ShowInLine INTEGER, Label TEXT, Local INTEGER)G atableAttendeeAttendee CREATE TABLE Attendee(ComponentId INTEGER, Email TEXT, Name TEXT, IsOrganizer INTEGER, Role INTEGER, PartStat INTEGER, Rsvp INTEGER, DelegatedTo TEXT, DelegatedFrom TEXT)= YtableAlarmAlarm CREATE TABLE Alarm(ComponentId INTEGER, Action INTEGER, Repeat INTEGER, Duration INTEGER, Offset INTEGER, Relation TEXT, DateTrigger INTEGER, DateTriggerLocal INTEGER, triggerTimeZone TEXT, Description TEXT, Attachment TEXT, Summary TEXT, Address TEXT, CustomProperties TEXT, isEnabled INTEGER) ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-non-attending-alarms.ics.in0000644000000000000000000000316014773244555024465 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2015-04-05T21:32:47.354433Z(2) BEGIN:VEVENT STATUS:CONFIRMED DTSTAMP:20160405T152128Z CREATED:20160405T152128Z UID:ddtvl069dn2cquo8dhg3j9c360@google.com SEQUENCE:1 TRANSP:OPAQUE SUMMARY:Every day at 4PM DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife: 20160404T160000 RRULE:FREQ=DAILY;UNTIL=20160406T190000Z DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife: 20160404T170000 ATTENDEE;CN=Uphablet;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT; CUTYPE=INDIVIDUAL:mailto:uphablet@lomiri.com LAST-MODIFIED:20160405T152128Z BEGIN:VALARM TRIGGER;VALUE=DURATION:-PT30M ACTION:EMAIL DESCRIPTION:This is an event reminder X-EVOLUTION-ALARM-UID:20160405T152128Z-2848-32011-1844-65@lomiri-phablet END:VALARM END:VEVENT BEGIN:VEVENT STATUS:CONFIRMED DTSTAMP:20160405T152128Z CREATED:20160405T151054Z UID:ddtvl069dn2cquo8dhg3j9c360@google.com SEQUENCE:1 TRANSP:OPAQUE SUMMARY::Every day at 4PM DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/America/Fortaleza: 20160405T160000 RECURRENCE-ID;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife: 20160405T160000 DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/America/Fortaleza: 20160405T170000 ATTENDEE;CN=Uphablet;PARTSTAT=DECLINED;ROLE=REQ-PARTICIPANT; CUTYPE=INDIVIDUAL:mailto:uphablet@lomiri.com LAST-MODIFIED:20160405T152128Z BEGIN:VALARM TRIGGER;VALUE=DURATION:-PT30M ACTION:EMAIL DESCRIPTION:This is an event reminder X-EVOLUTION-ALARM-UID:20160405T152128Z-2848-32011-1844-66@lomiri-phablet END:VALARM END:VEVENT END:VCALENDAR ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-nonrepeating-events.cpp0000644000000000000000000000752014773244555024041 0ustar /* * Copyright 2015 Canonical Ltd. * Copyright 2021-2025 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" #include "wakeup-timer-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, MultipleAppointments) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"America/Chicago"}; auto tz = std::make_shared(zone_str); #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone_str); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone_str); #endif // make a planner that looks at the first half of 2015 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2015,1, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2015,6,30,23,59,59.5}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // what we expect to get... Appointment expected_appt; #ifndef LOMIRI_FEATURES_ENABLED expected_appt.uid = "20150520T000726Z-3878-32011-1770-81@lomiri-phablet"; #else expected_appt.uid = "d7aeb192-8b2c-4427-834f-f30388e9e73c"; #endif expected_appt.summary = "Alarm"; std::array expected_alarms = { Alarm({"Alarm", "file://" ALARM_DEFAULT_SOUND, DateTime(gtz,2015,5,20,20,00,0)}) }; // compare it to what we actually loaded... const auto appts = planner->appointments().get(); EXPECT_EQ(expected_alarms.size(), appts.size()); for (size_t i=0, n=expected_alarms.size(); i _ } 1 d hz91indexIDX_CALENDARPROPERTIESCalendarpropertiesCREATE INDEX IDX_CALENDARPROPERTIES on Calendarproperties(CalendarId)^+#}indexIDX_ATTACHMENTSAttachmentsCREATE INDEX IDX_ATTACHMENTS on Attachments(ComponentId)R%qindexIDX_ATTENDEEAttendeeCREATE INDEX IDX_ATTENDEE on Attendee(ComponentId)FeindexIDX_ALARMAlarmCREATE INDEX IDX_ALARM on Alarm(ComponentId)V'uindexIDX_RECURSIVERecursiveCREATE INDEX IDX_RECURSIVE on Recursive(ComponentId)s5-indexIDX_CUSTOMPROPERTIESCustompropertiesCREATE INDEX IDX_CUSTOMPROPERTIES on Customproperties(ComponentId)J!iindexIDX_RDATESRdatesCREATE INDEX IDX_RDATES on Rdates(ComponentId)h9!indexIDX_COMPONENT_NOTEBOOKComponentsCREATE INDEX IDX_COMPONENT_NOTEBOOK on Components(Notebook)v/!)indexIDX_COMPONENT_UIDComponentsCREATE UNIQUE INDEX IDX_COMPONENT_UID on Components(UID, RecurId, DateDeleted)'!SindexIDX_COMPONENTComponentsCREATE INDEX IDX_COMPONENT on Components(ComponentId, Notebook, DateStart, DateEndDue, DateDeleted)S%qindexIDX_CALENDARCalendarsCREATE INDEX IDX_CALENDAR on Calendars(CalendarId)C W1indexsqlite_autoindex_Calendarproperties_1CalendarpropertiesJ 11?tableCalendarpropertiesCalendarproperties CREATE TABLE Calendarproperties(CalendarId REFERENCES Calendars(CalendarId) ON DELETE CASCADE, Name TEXT NOT NULL, Value TEXT, UNIQUE (CalendarId, Name))# ## tableAttachmentsAttachments CREATE TABLE Attachments(ComponentId INTEGER, Data BLOB, Uri TEXT, MimeType TEXT, ShowInLine INTEGER, Label TEXT, Local INTEGER)G atableAttendeeAttendee CREATE TABLE Attendee(ComponentId INTEGER, Email TEXT, Name TEXT, IsOrganizer INTEGER, Role INTEGER, PartStat INTEGER, Rsvp INTEGER, DelegatedTo TEXT, DelegatedFrom TEXT)= YtableAlarmAlarm CREATE TABLE Alarm(ComponentId INTEGER, Action INTEGER, Repeat INTEGER, Duration INTEGER, Offset INTEGER, Relation TEXT, DateTrigger INTEGER, DateTriggerLocal INTEGER, triggerTimeZone TEXT, Description TEXT, Attachment TEXT, Summary TEXT, Address TEXT, CustomProperties TEXT, isEnabled INTEGER) ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-nonrepeating-events.ics.in0000644000000000000000000000137214773244555024441 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2015-05-20T22:39:32.685099Z(1) BEGIN:VTODO UID:20150520T000726Z-3878-32011-1770-81@lomiri-phablet DTSTAMP:20150520T223932Z DTSTART:20150520T200000 SUMMARY:Alarm CATEGORIES:x-lomiri-alarm SEQUENCE:1 LAST-MODIFIED:20150520T223932Z BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150520T223932Z-22506-32011-1771-2@lomiri-phablet ACTION:AUDIO ATTACH:file://@ALARM_DEFAULT_SOUND@ TRIGGER;VALUE=DURATION;RELATED=START:PT0S END:VALARM BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150520T223932Z-22506-32011-1771-3@lomiri-phablet ACTION:DISPLAY DESCRIPTION:Alarm TRIGGER;VALUE=DURATION;RELATED=START:PT0S END:VALARM END:VTODO END:VCALENDAR ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-non-selected-source.cpp0000644000000000000000000000635414773244555023730 0ustar /* * Copyright 2015 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filh */ #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, NonSelectedSources) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"America/Chicago"}; auto tz = std::make_shared(zone_str); auto gtz = g_time_zone_new(zone_str); // make a planner that looks at the first half of 2015 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2015,1, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2015,6,31,23,59,59.5}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // appointmes are visible auto appts = planner->appointments().get(); EXPECT_TRUE(appts.size() > 0); // Unselect all sources auto registry = e_source_registry_new_sync(NULL, NULL); auto sources = e_source_registry_list_sources(registry, E_SOURCE_EXTENSION_TASK_LIST); for (auto l=sources; l!=nullptr; l=l->next) { auto source = static_cast(l->data); auto extension = e_source_get_extension(source, E_SOURCE_EXTENSION_CALENDAR); e_source_selectable_set_selected(E_SOURCE_SELECTABLE(extension), FALSE); e_source_write_sync(source, NULL, NULL); } g_list_free_full(sources, g_object_unref); g_object_unref(registry); // give some time to planner update wait_msec(5 * G_TIME_SPAN_MILLISECOND); // the planner should be empty at this point appts = planner->appointments().get(); EXPECT_TRUE(appts.size() == 0); // cleanup g_time_zone_unref(gtz); } ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-non-selected-source.ics.in0000644000000000000000000000140514773244555024321 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2015-05-07T21:14:49.315443Z(0) BEGIN:VTODO UID:20150507T211449Z-4262-32011-1418-1@lomiri-phablet DTSTAMP:20150508T211449Z DTSTART:20150508T164000 RRULE:FREQ=WEEKLY;BYDAY=FR SUMMARY:Alarm CATEGORIES:x-lomiri-alarm CREATED:20150507T211449Z LAST-MODIFIED:20150507T211449Z BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150507T211449Z-4262-32011-1418-2@lomiri-phablet ACTION:AUDIO ATTACH:file://@ALARM_DEFAULT_SOUND@ TRIGGER;VALUE=DURATION;RELATED=START:PT0S END:VALARM BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150507T211449Z-4262-32011-1418-3@lomiri-phablet ACTION:DISPLAY DESCRIPTION:Alarm TRIGGER;VALUE=DURATION;RELATED=START:PT0S END:VALARM END:VTODO END:VCALENDAR ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-repeating-events.cpp0000644000000000000000000001070514773244555023325 0ustar /* * Copyright 2015 Canonical Ltd. * Copyright 2021-2025 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" #include "wakeup-timer-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, MultipleAppointments) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"America/Chicago"}; auto tz = std::make_shared(zone_str); #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone_str); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone_str); #endif // make a planner that looks at the first half of 2015 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2015,1, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2015,6,30,23,59,59.5}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // what we expect to get... Appointment expected_appt; #ifndef LOMIRI_FEATURES_ENABLED expected_appt.uid = "20150507T211449Z-4262-32011-1418-1@lomiri-phablet"; #else expected_appt.uid = "840ab899-1b0e-4697-9514-dcd336a5e125"; #endif expected_appt.summary = "Alarm"; std::array expected_alarms = { Alarm({"Alarm", "file://" ALARM_DEFAULT_SOUND, DateTime(gtz,2015,5, 8,16,40,0)}), Alarm({"Alarm", "file://" ALARM_DEFAULT_SOUND, DateTime(gtz,2015,5,15,16,40,0)}), Alarm({"Alarm", "file://" ALARM_DEFAULT_SOUND, DateTime(gtz,2015,5,22,16,40,0)}), Alarm({"Alarm", "file://" ALARM_DEFAULT_SOUND, DateTime(gtz,2015,5,29,16,40,0)}), Alarm({"Alarm", "file://" ALARM_DEFAULT_SOUND, DateTime(gtz,2015,6, 5,16,40,0)}), Alarm({"Alarm", "file://" ALARM_DEFAULT_SOUND, DateTime(gtz,2015,6,12,16,40,0)}), Alarm({"Alarm", "file://" ALARM_DEFAULT_SOUND, DateTime(gtz,2015,6,19,16,40,0)}), Alarm({"Alarm", "file://" ALARM_DEFAULT_SOUND, DateTime(gtz,2015,6,26,16,40,0)}) }; // compare it to what we actually loaded... const auto appts = planner->appointments().get(); EXPECT_EQ(expected_alarms.size(), appts.size()); for (size_t i=0, n=expected_alarms.size(); i _ } 1 d hz91indexIDX_CALENDARPROPERTIESCalendarpropertiesCREATE INDEX IDX_CALENDARPROPERTIES on Calendarproperties(CalendarId)^+#}indexIDX_ATTACHMENTSAttachmentsCREATE INDEX IDX_ATTACHMENTS on Attachments(ComponentId)R%qindexIDX_ATTENDEEAttendeeCREATE INDEX IDX_ATTENDEE on Attendee(ComponentId)FeindexIDX_ALARMAlarmCREATE INDEX IDX_ALARM on Alarm(ComponentId)V'uindexIDX_RECURSIVERecursiveCREATE INDEX IDX_RECURSIVE on Recursive(ComponentId)s5-indexIDX_CUSTOMPROPERTIESCustompropertiesCREATE INDEX IDX_CUSTOMPROPERTIES on Customproperties(ComponentId)J!iindexIDX_RDATESRdatesCREATE INDEX IDX_RDATES on Rdates(ComponentId)h9!indexIDX_COMPONENT_NOTEBOOKComponentsCREATE INDEX IDX_COMPONENT_NOTEBOOK on Components(Notebook)v/!)indexIDX_COMPONENT_UIDComponentsCREATE UNIQUE INDEX IDX_COMPONENT_UID on Components(UID, RecurId, DateDeleted)'!SindexIDX_COMPONENTComponentsCREATE INDEX IDX_COMPONENT on Components(ComponentId, Notebook, DateStart, DateEndDue, DateDeleted)S%qindexIDX_CALENDARCalendarsCREATE INDEX IDX_CALENDAR on Calendars(CalendarId)C W1indexsqlite_autoindex_Calendarproperties_1CalendarpropertiesJ 11?tableCalendarpropertiesCalendarproperties CREATE TABLE Calendarproperties(CalendarId REFERENCES Calendars(CalendarId) ON DELETE CASCADE, Name TEXT NOT NULL, Value TEXT, UNIQUE (CalendarId, Name))# ## tableAttachmentsAttachments CREATE TABLE Attachments(ComponentId INTEGER, Data BLOB, Uri TEXT, MimeType TEXT, ShowInLine INTEGER, Label TEXT, Local INTEGER)G atableAttendeeAttendee CREATE TABLE Attendee(ComponentId INTEGER, Email TEXT, Name TEXT, IsOrganizer INTEGER, Role INTEGER, PartStat INTEGER, Rsvp INTEGER, DelegatedTo TEXT, DelegatedFrom TEXT)= YtableAlarmAlarm CREATE TABLE Alarm(ComponentId INTEGER, Action INTEGER, Repeat INTEGER, Duration INTEGER, Offset INTEGER, Relation TEXT, DateTrigger INTEGER, DateTriggerLocal INTEGER, triggerTimeZone TEXT, Description TEXT, Attachment TEXT, Summary TEXT, Address TEXT, CustomProperties TEXT, isEnabled INTEGER) ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-repeating-events.ics.in0000644000000000000000000000144114773244555023723 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2015-05-07T21:14:49.315443Z(0) BEGIN:VTODO UID:20150507T211449Z-4262-32011-1418-1@lomiri-phablet DTSTAMP:20150508T211449Z DTSTART:20150508T164000 RRULE:FREQ=WEEKLY;BYDAY=FR SUMMARY:Alarm CATEGORIES:x-lomiri-alarm CREATED:20150507T211449Z LAST-MODIFIED:20150507T211449Z BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150507T211449Z-4262-32011-1418-2@lomiri-phablet ACTION:AUDIO ATTACH:file://@ALARM_DEFAULT_SOUND@ TRIGGER;VALUE=DURATION;RELATED=START:PT0S END:VALARM BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150507T211449Z-4262-32011-1418-3@lomiri-phablet ACTION:DISPLAY DESCRIPTION:Alarm TRIGGER;VALUE=DURATION;RELATED=START:PT0S END:VALARM END:VTODO END:VCALENDAR ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-repeating-events-with-individual-change.cpp0000644000000000000000000000726414773244555027655 0ustar /* * Copyright 2016 Canonical Ltd. * Copyright 2021-2022 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Renato Araujo Oliveira Filho * Robert Tari */ #include #include #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" #include "wakeup-timer-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, RepeatingEventsWithIndividualChange) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"America/Recife"}; auto tz = std::make_shared(zone_str); #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone_str); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone_str); #endif // make a planner that looks at the year of 2016 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2016,1, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2016,12,31,23,59,59.5}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // what we expect to get... Appointment expected_appt; expected_appt.summary = "Alarm"; std::array expected_times = { DateTime(gtz,2016,6, 20,10,00,0), DateTime(gtz,2016,6, 21,10,00,0), DateTime(gtz,2016,6, 22,10,00,0), DateTime(gtz,2016,6, 23,10,00,0), DateTime(gtz,2016,6, 24,20,00,0), DateTime(gtz,2016,6, 25,10,00,0), DateTime(gtz,2016,6, 26,10,00,0), DateTime(gtz,2016,6, 27,10,00,0), DateTime(gtz,2016,6, 28,10,00,0), DateTime(gtz,2016,6, 29,10,00,0) }; // compare it to what we actually loaded... const auto appts = planner->appointments().get(); EXPECT_EQ(expected_times.size(), appts.size()); for (size_t i=0, n=expected_times.size(); i _ } 1 d hz91indexIDX_CALENDARPROPERTIESCalendarpropertiesCREATE INDEX IDX_CALENDARPROPERTIES on Calendarproperties(CalendarId)^+#}indexIDX_ATTACHMENTSAttachmentsCREATE INDEX IDX_ATTACHMENTS on Attachments(ComponentId)R%qindexIDX_ATTENDEEAttendeeCREATE INDEX IDX_ATTENDEE on Attendee(ComponentId)FeindexIDX_ALARMAlarmCREATE INDEX IDX_ALARM on Alarm(ComponentId)V'uindexIDX_RECURSIVERecursiveCREATE INDEX IDX_RECURSIVE on Recursive(ComponentId)s5-indexIDX_CUSTOMPROPERTIESCustompropertiesCREATE INDEX IDX_CUSTOMPROPERTIES on Customproperties(ComponentId)J!iindexIDX_RDATESRdatesCREATE INDEX IDX_RDATES on Rdates(ComponentId)h9!indexIDX_COMPONENT_NOTEBOOKComponentsCREATE INDEX IDX_COMPONENT_NOTEBOOK on Components(Notebook)v/!)indexIDX_COMPONENT_UIDComponentsCREATE UNIQUE INDEX IDX_COMPONENT_UID on Components(UID, RecurId, DateDeleted)'!SindexIDX_COMPONENTComponentsCREATE INDEX IDX_COMPONENT on Components(ComponentId, Notebook, DateStart, DateEndDue, DateDeleted)S%qindexIDX_CALENDARCalendarsCREATE INDEX IDX_CALENDAR on Calendars(CalendarId)C W1indexsqlite_autoindex_Calendarproperties_1CalendarpropertiesJ 11?tableCalendarpropertiesCalendarproperties CREATE TABLE Calendarproperties(CalendarId REFERENCES Calendars(CalendarId) ON DELETE CASCADE, Name TEXT NOT NULL, Value TEXT, UNIQUE (CalendarId, Name))# ## tableAttachmentsAttachments CREATE TABLE Attachments(ComponentId INTEGER, Data BLOB, Uri TEXT, MimeType TEXT, ShowInLine INTEGER, Label TEXT, Local INTEGER)G atableAttendeeAttendee CREATE TABLE Attendee(ComponentId INTEGER, Email TEXT, Name TEXT, IsOrganizer INTEGER, Role INTEGER, PartStat INTEGER, Rsvp INTEGER, DelegatedTo TEXT, DelegatedFrom TEXT)= YtableAlarmAlarm CREATE TABLE Alarm(ComponentId INTEGER, Action INTEGER, Repeat INTEGER, Duration INTEGER, Offset INTEGER, Relation TEXT, DateTrigger INTEGER, DateTriggerLocal INTEGER, triggerTimeZone TEXT, Description TEXT, Attachment TEXT, Summary TEXT, Address TEXT, CustomProperties TEXT, isEnabled INTEGER) ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-repeating-events-with-individual-change.ics.in0000644000000000000000000004033314773244555030250 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2016-06-21T21:42:08.507434Z(7) BEGIN:VTIMEZONE TZID:/freeassociation.sourceforge.net/Tzfile/America/Recife X-LIC-LOCATION:America/Recife BEGIN:STANDARD TZNAME:BRT DTSTART:19680301T000000 TZOFFSETFROM:-0200 TZOFFSETTO:-0300 END:STANDARD BEGIN:DAYLIGHT TZNAME:BRST DTSTART:19851102T000000 TZOFFSETFROM:-0300 TZOFFSETTO:-0200 END:DAYLIGHT BEGIN:STANDARD TZNAME:BRT DTSTART:19860315T000000 TZOFFSETFROM:-0200 TZOFFSETTO:-0300 END:STANDARD BEGIN:DAYLIGHT TZNAME:BRST DTSTART:19861025T000000 TZOFFSETFROM:-0300 TZOFFSETTO:-0200 END:DAYLIGHT BEGIN:STANDARD TZNAME:BRT DTSTART:19870214T000000 TZOFFSETFROM:-0200 TZOFFSETTO:-0300 END:STANDARD BEGIN:DAYLIGHT TZNAME:BRST DTSTART:19871025T000000 TZOFFSETFROM:-0300 TZOFFSETTO:-0200 END:DAYLIGHT BEGIN:STANDARD TZNAME:BRT DTSTART:19880207T000000 TZOFFSETFROM:-0200 TZOFFSETTO:-0300 END:STANDARD BEGIN:DAYLIGHT TZNAME:BRST DTSTART:19881016T000000 TZOFFSETFROM:-0300 TZOFFSETTO:-0200 END:DAYLIGHT BEGIN:STANDARD TZNAME:BRT DTSTART:19890129T000000 TZOFFSETFROM:-0200 TZOFFSETTO:-0300 END:STANDARD BEGIN:DAYLIGHT TZNAME:BRST DTSTART:19891015T000000 TZOFFSETFROM:-0300 TZOFFSETTO:-0200 END:DAYLIGHT BEGIN:STANDARD TZNAME:BRT DTSTART:19900211T000000 TZOFFSETFROM:-0200 TZOFFSETTO:-0300 END:STANDARD BEGIN:DAYLIGHT TZNAME:BRST DTSTART:19991003T000000 TZOFFSETFROM:-0300 TZOFFSETTO:-0200 END:DAYLIGHT BEGIN:STANDARD TZNAME:BRT DTSTART:20000227T000000 TZOFFSETFROM:-0200 TZOFFSETTO:-0300 END:STANDARD BEGIN:DAYLIGHT TZNAME:BRST DTSTART:20001008T000000 TZOFFSETFROM:-0300 TZOFFSETTO:-0200 END:DAYLIGHT BEGIN:STANDARD TZNAME:BRT DTSTART:20001015T000000 TZOFFSETFROM:-0200 TZOFFSETTO:-0300 END:STANDARD BEGIN:DAYLIGHT TZNAME:BRST DTSTART:20011014T000000 TZOFFSETFROM:-0300 TZOFFSETTO:-0200 END:DAYLIGHT BEGIN:STANDARD TZNAME:BRT DTSTART:20020217T000000 TZOFFSETFROM:-0200 TZOFFSETTO:-0300 END:STANDARD END:VTIMEZONE BEGIN:VTIMEZONE TZID:/freeassociation.sourceforge.net/Tzfile/America/New_York X-LIC-LOCATION:America/New_York BEGIN:STANDARD TZNAME:EST DTSTART:19691026T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19700426T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19701025T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19710425T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19711031T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19720430T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19721029T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19730429T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19731028T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19740106T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19741027T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19750223T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19751026T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19760425T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19761031T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19770424T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19771030T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19780430T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19781029T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19790429T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19791028T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19800427T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19801026T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19810426T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19811025T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19820425T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19821031T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19830424T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19831030T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19840429T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19841028T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19850428T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19851027T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19860427T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19861026T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19870405T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19871025T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19880403T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19881030T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19890402T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19891029T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19900401T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19901028T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19910407T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19911027T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19920405T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19921025T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19930404T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19931031T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19940403T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19941030T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19950402T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19951029T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19960407T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19961027T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19970406T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19971026T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19980405T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19981025T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:19990404T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:19991031T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20000402T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20001029T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20010401T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20011028T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20020407T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20021027T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20030406T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20031026T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20040404T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20041031T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20050403T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20051030T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20060402T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20061029T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20070311T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20071104T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20080309T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20081102T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20090308T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20091101T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20100314T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20101107T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20110313T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20111106T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20120311T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20121104T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20130310T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20131103T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20140309T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20141102T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20150308T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20151101T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20160313T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20161106T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20170312T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20171105T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20180311T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20181104T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20190310T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20191103T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20200308T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20201101T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20210314T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20211107T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20220313T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20221106T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20230312T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20231105T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20240310T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20241103T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20250309T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20251102T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20260308T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20261101T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20270314T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20271107T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20280312T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20281105T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20290311T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20291104T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20300310T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20301103T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20310309T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20311102T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20320314T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20321107T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20330313T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20331106T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20340312T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20341105T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20350311T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20351104T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20360309T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20361102T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD BEGIN:DAYLIGHT TZNAME:EDT DTSTART:20370308T020000 TZOFFSETFROM:-0500 TZOFFSETTO:-0400 END:DAYLIGHT BEGIN:STANDARD TZNAME:EST DTSTART:20371101T020000 TZOFFSETFROM:-0400 TZOFFSETTO:-0500 END:STANDARD END:VTIMEZONE BEGIN:VEVENT UID:20160621T214054Z-31488-1000-4151-27@rento-lomiri DTSTAMP:20160621T123718Z DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife: 20160620T100000 DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife: 20160620T103000 TRANSP:OPAQUE SEQUENCE:2 SUMMARY:Every day and every night CLASS:PUBLIC RRULE;X-EVOLUTION-ENDDATE=20160629T130000Z:FREQ=DAILY;COUNT=10 CREATED:20160621T214124Z LAST-MODIFIED:20160621T214124Z END:VEVENT BEGIN:VEVENT UID:20160621T214054Z-31488-1000-4151-27@rento-lomiri DTSTAMP:20160621T123718Z DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife: 20160624T200000 DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife: 20160624T203000 TRANSP:OPAQUE SEQUENCE:3 SUMMARY:At night CLASS:PUBLIC CREATED:20160621T214124Z LAST-MODIFIED:20160621T214208Z RECURRENCE-ID;TZID=/freeassociation.sourceforge.net/Tzfile/America/Recife: 20160624T100000 END:VEVENT END:VCALENDAR ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-repeating-valarms.cpp0000644000000000000000000001136514773244555023471 0ustar /* * Copyright 2015 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" #include "wakeup-timer-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, MultipleAppointments) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"America/Chicago"}; auto tz = std::make_shared(zone_str); #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone_str); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone_str); #endif // make a planner that looks at the first half of 2015 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2015,1, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2015,6,30,23,59,59.5}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // the planner should match what we've got in the calendar.ics file const auto appts = planner->appointments().get(); ASSERT_EQ(1, appts.size()); const auto& appt = appts.front(); ASSERT_EQ(8, appt.alarms.size()); EXPECT_EQ(Alarm({"Time to pack!", "file://" CALENDAR_DEFAULT_SOUND, DateTime(gtz,2015,4,23,13,35,0)}), appt.alarms[0]); EXPECT_EQ(Alarm({"Time to pack!", "file://" CALENDAR_DEFAULT_SOUND, DateTime(gtz,2015,4,23,13,37,0)}), appt.alarms[1]); EXPECT_EQ(Alarm({"Time to pack!", "file://" CALENDAR_DEFAULT_SOUND, DateTime(gtz,2015,4,23,13,39,0)}), appt.alarms[2]); EXPECT_EQ(Alarm({"Time to pack!", "file://" CALENDAR_DEFAULT_SOUND, DateTime(gtz,2015,4,23,13,41,0)}), appt.alarms[3]); EXPECT_EQ(Alarm({"Go to the airport!", "file://" CALENDAR_DEFAULT_SOUND, DateTime(gtz,2015,4,24,10,35,0)}), appt.alarms[4]); EXPECT_EQ(Alarm({"Go to the airport!", "file://" CALENDAR_DEFAULT_SOUND, DateTime(gtz,2015,4,24,10,37,0)}), appt.alarms[5]); EXPECT_EQ(Alarm({"Go to the airport!", "file://" CALENDAR_DEFAULT_SOUND, DateTime(gtz,2015,4,24,10,39,0)}), appt.alarms[6]); EXPECT_EQ(Alarm({"Go to the airport!", "file://" CALENDAR_DEFAULT_SOUND, DateTime(gtz,2015,4,24,10,41,0)}), appt.alarms[7]); // now let's try this out with AlarmQueue... // hook the planner up to a SimpleAlarmQueue and confirm that it triggers for each of the reminders auto mock_clock = std::make_shared(range_begin); std::shared_ptr clock = mock_clock; std::shared_ptr wakeup_timer = std::make_shared(clock); auto alarm_queue = std::make_shared(clock, planner, wakeup_timer); int triggered_count = 0; alarm_queue->alarm_reached().connect([&triggered_count, appt](const Appointment&, const Alarm& active_alarm) { EXPECT_TRUE(std::find(appt.alarms.begin(), appt.alarms.end(), active_alarm) != appt.alarms.end()); ++triggered_count; }); for (auto now=range_begin; nowset_localtime(now); EXPECT_EQ(appt.alarms.size(), triggered_count); // cleanup g_time_zone_unref(gtz); } ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-repeating-valarms.db0000644000000000000000000033000014773244555023262 0ustar SQLite format 3@ .zq  MU    c8867aec-320b-42b4-9f4a-f4ea928c6913Default#0000FFg^ xg^ x 'U c8867aec-320b-42b4-9f4a-f4ea928c6913 GG6/U5     U  c8867aec-320b-42b4-9f4a-f4ea928c6913EventLondon Sprint FlightU:U:UTCU:U:UTCU!g^ xU!094a2f55-8bec-4d52-b10c-f872ef902cf8  ! Components    5q5: 5 1 xstartTriggerRelationGo to the airport!) 5 xstartTriggerRelation6 5 ' xstartTriggerRelationTime to pack!* 5 xstartTriggerRelation     'U c8867aec-320b-42b4-9f4a-f4ea928c6913 3 U c8867aec-320b-42b4-9f4a-f4ea928c6913U:U: )U 094a2f55-8bec-4d52-b10c-f872ef902cf8 'U c8867aec-320b-42b4-9f4a-f4ea928c6913         6{ / $s0o{FeindexIDXn+tableRecursiveRecursive CREATE TABLE Recursive(ComponentId INTEGER, RuleType INTEGER, Frequency INTEGER, Until INTEGER, UntilLocal INTEGER, untilTimeZone TEXT, Count INTEGER, Interval INTEGER, BySecond TEXT, ByMinute TEXT, ByHour TEXT, ByDay TEXT, ByDayPos Text, ByMonthDay TEXT, ByYearDay TEXT, ByWeekNum TEXT, ByMonth TEXT, BySetPos TEXT, WeekStart INTEGER)--AtableCustompropertiesCustompropertiesCREATE TABLE Customproperties(ComponentId INTEGER, Name TEXT, Value TEXT, Parameters TEXT)YtableRdatesRdatesCREATE TABLE Rdates(ComponentId INTEGER, Type INTEGER, Date INTEGER, DateLocal INTEGER, TimeZone TEXT)P++Ytablesqlite_sequencesqlite_sequenceCREATE TABLE sqlite_sequence(name,seq)2!!/tableComponentsComponentsCREATE TABLE Components(ComponentId INTEGER PRIMARY KEY AUTOINCREMENT, Notebook TEXT, Type TEXT, Summary TEXT, Category TEXT, DateStart INTEGER, DateStartLocal INTEGER, StartTimeZone TEXT, HasDueDate INTEGER, DateEndDue INTEGER, DateEndDueLocal INTEGER, EndDueTimeZone TEXT, Duration INTEGER, Classification INTEGER, Location TEXT, Description TEXT, Status INTEGER, GeoLatitude REAL, GeoLongitude REAL, Priority INTEGER, Resources TEXT, DateCreated INTEGER, DateStamp INTEGER, DateLastModified INTEGER, Sequence INTEGER, Comments TEXT, Attachments TEXT, Contact TEXT, InvitationStatus INTEGER, RecurId INTEGER, RecurIdLocal INTEGER, RecurIdTimeZone TEXT, RelatedTo TEXT, URL TEXT, UID TEXT, Transparency INTEGER, LocalOnly INTEGER, Percent INTEGER, DateCompleted INTEGER, DateCompletedLocal INTEGER, CompletedTimeZone TEXT, DateDeleted INTEGER, extra1 STRING, extra2 STRING, extra3 INTEGER, thisAndFuture INTEGER)BStableCalendarsCalendarsCREATE TABLE Calendars(CalendarId TEXT PRIMARY KEY, Name TEXT, Description TEXT, Color INTEGER, Flags INTEGER, syncDate INTEGER, pluginName TEXT, account TEXT, attachmentSize INTEGER, modifiedDate INTEGER, sharedWith TEXT, syncProfile TEXT, createdDate INTEGER, extra1 STRING, extra2 STRING)1Eindexsqlite_autoindex_Calendars_1CalendarsHetableMetadataMetadataCREATE TABLE Metadata(transactionId INTEGER)   P > _ } 1 d hz91indexIDX_CALENDARPROPERTIESCalendarpropertiesCREATE INDEX IDX_CALENDARPROPERTIES on Calendarproperties(CalendarId)^+#}indexIDX_ATTACHMENTSAttachmentsCREATE INDEX IDX_ATTACHMENTS on Attachments(ComponentId)R%qindexIDX_ATTENDEEAttendeeCREATE INDEX IDX_ATTENDEE on Attendee(ComponentId)FeindexIDX_ALARMAlarmCREATE INDEX IDX_ALARM on Alarm(ComponentId)V'uindexIDX_RECURSIVERecursiveCREATE INDEX IDX_RECURSIVE on Recursive(ComponentId)s5-indexIDX_CUSTOMPROPERTIESCustompropertiesCREATE INDEX IDX_CUSTOMPROPERTIES on Customproperties(ComponentId)J!iindexIDX_RDATESRdatesCREATE INDEX IDX_RDATES on Rdates(ComponentId)h9!indexIDX_COMPONENT_NOTEBOOKComponentsCREATE INDEX IDX_COMPONENT_NOTEBOOK on Components(Notebook)v/!)indexIDX_COMPONENT_UIDComponentsCREATE UNIQUE INDEX IDX_COMPONENT_UID on Components(UID, RecurId, DateDeleted)'!SindexIDX_COMPONENTComponentsCREATE INDEX IDX_COMPONENT on Components(ComponentId, Notebook, DateStart, DateEndDue, DateDeleted)S%qindexIDX_CALENDARCalendarsCREATE INDEX IDX_CALENDAR on Calendars(CalendarId)C W1indexsqlite_autoindex_Calendarproperties_1CalendarpropertiesJ 11?tableCalendarpropertiesCalendarproperties CREATE TABLE Calendarproperties(CalendarId REFERENCES Calendars(CalendarId) ON DELETE CASCADE, Name TEXT NOT NULL, Value TEXT, UNIQUE (CalendarId, Name))# ## tableAttachmentsAttachments CREATE TABLE Attachments(ComponentId INTEGER, Data BLOB, Uri TEXT, MimeType TEXT, ShowInLine INTEGER, Label TEXT, Local INTEGER)G atableAttendeeAttendee CREATE TABLE Attendee(ComponentId INTEGER, Email TEXT, Name TEXT, IsOrganizer INTEGER, Role INTEGER, PartStat INTEGER, Rsvp INTEGER, DelegatedTo TEXT, DelegatedFrom TEXT)= YtableAlarmAlarm CREATE TABLE Alarm(ComponentId INTEGER, Action INTEGER, Repeat INTEGER, Duration INTEGER, Offset INTEGER, Relation TEXT, DateTrigger INTEGER, DateTriggerLocal INTEGER, triggerTimeZone TEXT, Description TEXT, Attachment TEXT, Summary TEXT, Address TEXT, CustomProperties TEXT, isEnabled INTEGER) ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-repeating-valarms.ics.in0000644000000000000000000000250014773244555024061 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2015-04-05T21:32:47.354433Z(2) BEGIN:VEVENT UID:20150405T213247Z-4371-32011-1698-1@lomiri-phablet DTSTAMP:20150405T213247Z DTSTART:20150424T183500Z DTEND:20150424T193554Z X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:Can't parse as RECUR value in RRULE property. Removing entire property: ERROR: No Value SUMMARY:London Sprint Flight CREATED:20150405T213247Z LAST-MODIFIED:20150405T213247Z BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150405T213247Z-4371-32011-1698-2@lomiri-phablet ACTION:AUDIO TRIGGER;VALUE=DURATION;RELATED=START:-P1D REPEAT:3 DURATION:PT2M END:VALARM BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150405T213247Z-4371-32011-1698-3@lomiri-phablet ACTION:DISPLAY DESCRIPTION:Time to pack! TRIGGER;VALUE=DURATION;RELATED=START:-P1D REPEAT:3 DURATION:PT2M END:VALARM BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150405T213247Z-4371-32011-1698-5@lomiri-phablet ACTION:AUDIO TRIGGER;VALUE=DURATION;RELATED=START:-PT3H REPEAT:3 DURATION:PT2M END:VALARM BEGIN:VALARM X-EVOLUTION-ALARM-UID:20150405T213247Z-4371-32011-1698-6@lomiri-phablet ACTION:DISPLAY DESCRIPTION:Go to the airport! TRIGGER;VALUE=DURATION;RELATED=START:-PT3H REPEAT:3 DURATION:PT2M END:VALARM END:VEVENT END:VCALENDAR ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-tzids-2.cpp0000644000000000000000000001065214773244555021342 0ustar /* * Copyright 2015 Canonical Ltd. * Copyright 2021-2025 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" #include "wakeup-timer-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, MultipleAppointments) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"America/Los_Angeles"}; auto tz = std::make_shared(zone_str); #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone_str); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone_str); #endif // make a planner that looks at the first half of 2015 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2006,1, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2015,12,31,23,59,59.5}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // what we expect to get... std::array expected_appts1; auto appt1 = &expected_appts1[0]; #ifndef LOMIRI_FEATURES_ENABLED appt1->uid = "109264742"; appt1->color = "#becedd"; #else appt1->uid = "4eade898-ffd4-49d6-a43a-c6ca9c20aace"; appt1->color = "#0000FF"; #endif appt1->summary = "National Incubator Initiative for Clean Energy (NIICE) FOA: Pre-Concept Paper Informational Webinar"; appt1->begin = DateTime{gtz,2014,1,21,11,0,0}; appt1->end = DateTime{gtz,2014,1,21,13,0,0}; appt1->alarms = std::vector{ Alarm({"Reminder", "", DateTime(gtz,2014,1,21,10,45,0)}) }; std::array expected_appts2; auto appt2 = &expected_appts2[0]; #ifndef LOMIRI_FEATURES_ENABLED appt2->uid = "109264742"; appt2->color = "#62a0ea"; #else appt2->uid = "4eade898-ffd4-49d6-a43a-c6ca9c20aace"; appt2->color = ""; #endif appt2->summary = "National Incubator Initiative for Clean Energy (NIICE) FOA: Pre-Concept Paper Informational Webinar"; appt2->begin = DateTime{gtz,2014,1,21,11,0,0}; appt2->end = DateTime{gtz,2014,1,21,13,0,0}; appt2->alarms = std::vector{ Alarm({"Reminder", "", DateTime(gtz,2014,1,21,10,45,0)}) }; // compare it to what we actually loaded... const auto appts = planner->appointments().get(); EXPECT_EQ(expected_appts1.size(), appts.size()); EXPECT_EQ(expected_appts2.size(), appts.size()); for (size_t i=0, n=std::min(appts.size(),expected_appts1.size()); i _ } 1 d hz91indexIDX_CALENDARPROPERTIESCalendarpropertiesCREATE INDEX IDX_CALENDARPROPERTIES on Calendarproperties(CalendarId)^+#}indexIDX_ATTACHMENTSAttachmentsCREATE INDEX IDX_ATTACHMENTS on Attachments(ComponentId)R%qindexIDX_ATTENDEEAttendeeCREATE INDEX IDX_ATTENDEE on Attendee(ComponentId)FeindexIDX_ALARMAlarmCREATE INDEX IDX_ALARM on Alarm(ComponentId)V'uindexIDX_RECURSIVERecursiveCREATE INDEX IDX_RECURSIVE on Recursive(ComponentId)s5-indexIDX_CUSTOMPROPERTIESCustompropertiesCREATE INDEX IDX_CUSTOMPROPERTIES on Customproperties(ComponentId)J!iindexIDX_RDATESRdatesCREATE INDEX IDX_RDATES on Rdates(ComponentId)h9!indexIDX_COMPONENT_NOTEBOOKComponentsCREATE INDEX IDX_COMPONENT_NOTEBOOK on Components(Notebook)v/!)indexIDX_COMPONENT_UIDComponentsCREATE UNIQUE INDEX IDX_COMPONENT_UID on Components(UID, RecurId, DateDeleted)'!SindexIDX_COMPONENTComponentsCREATE INDEX IDX_COMPONENT on Components(ComponentId, Notebook, DateStart, DateEndDue, DateDeleted)S%qindexIDX_CALENDARCalendarsCREATE INDEX IDX_CALENDAR on Calendars(CalendarId)C W1indexsqlite_autoindex_Calendarproperties_1CalendarpropertiesJ 11?tableCalendarpropertiesCalendarproperties CREATE TABLE Calendarproperties(CalendarId REFERENCES Calendars(CalendarId) ON DELETE CASCADE, Name TEXT NOT NULL, Value TEXT, UNIQUE (CalendarId, Name))# ## tableAttachmentsAttachments CREATE TABLE Attachments(ComponentId INTEGER, Data BLOB, Uri TEXT, MimeType TEXT, ShowInLine INTEGER, Label TEXT, Local INTEGER)G atableAttendeeAttendee CREATE TABLE Attendee(ComponentId INTEGER, Email TEXT, Name TEXT, IsOrganizer INTEGER, Role INTEGER, PartStat INTEGER, Rsvp INTEGER, DelegatedTo TEXT, DelegatedFrom TEXT)= YtableAlarmAlarm CREATE TABLE Alarm(ComponentId INTEGER, Action INTEGER, Repeat INTEGER, Duration INTEGER, Offset INTEGER, Relation TEXT, DateTrigger INTEGER, DateTriggerLocal INTEGER, triggerTimeZone TEXT, Description TEXT, Attachment TEXT, Summary TEXT, Address TEXT, CustomProperties TEXT, isEnabled INTEGER) ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-tzids-2.ics.in0000644000000000000000000000201314773244555021733 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2015-07-09T19:41:50.123217Z(3) BEGIN:VTIMEZONE TZID:Pacific Time (US & Canada) BEGIN:STANDARD DTSTART:20061105T020000 RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11 TZOFFSETFROM:-0700 TZOFFSETTO:-0800 END:STANDARD BEGIN:DAYLIGHT DTSTART:20070311T020000 RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3 TZOFFSETFROM:-0800 TZOFFSETTO:-0700 TZNAME:Daylight Savings Time END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT DTSTART;TZID=Pacific Time (US & Canada):20140121T110000 DTEND;TZID=Pacific Time (US & Canada):20140121T130000 UID:109264742 DTSTAMP:20140120T000718Z DESCRIPTION: Event description SUMMARY;ENCODING=QUOTED-PRINTABLE:National Incubator Initiative for Clean Energy (NIICE) FOA: Pre-Concept Paper Informational Webinar CREATED:20140120T000741Z LAST-MODIFIED:20140120T000741Z BEGIN:VALARM TRIGGER;VALUE=DURATION:-PT15M ACTION:DISPLAY DESCRIPTION:Reminder END:VALARM END:VEVENT END:VCALENDAR ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-tzids.cpp0000644000000000000000000001012414773244555021175 0ustar /* * Copyright 2015 Canonical Ltd. * Copyright 2021-2025 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" #include "wakeup-timer-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, MultipleAppointments) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"Europe/Berlin"}; auto tz = std::make_shared(zone_str); #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone_str); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone_str); #endif // make a planner that looks at the first half of 2015 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2015,7, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2015,7,31,23,59,59.5}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // what we expect to get... std::array expected_appts1; auto appt1 = &expected_appts1[0]; #ifndef LOMIRI_FEATURES_ENABLED appt1->uid = "8ggc30kh89qql8vjumgtug7l14@google.com"; appt1->color = "#becedd"; #else appt1->uid = "01fd35a6-8fbb-4c31-97e1-71d920190f18"; appt1->color = "#0000FF"; #endif appt1->summary = "Hello"; appt1->begin = DateTime{gtz,2015,7,1,20,0,0}; appt1->end = DateTime{gtz,2015,7,1,22,0,0}; std::array expected_appts2; auto appt2 = &expected_appts2[0]; #ifndef LOMIRI_FEATURES_ENABLED appt2->uid = "8ggc30kh89qql8vjumgtug7l14@google.com"; appt2->color = "#62a0ea"; #else appt2->uid = "01fd35a6-8fbb-4c31-97e1-71d920190f18"; appt2->color = ""; #endif appt2->summary = "Hello"; appt2->begin = DateTime{gtz,2015,7,1,20,0,0}; appt2->end = DateTime{gtz,2015,7,1,22,0,0}; // compare it to what we actually loaded... const auto appts = planner->appointments().get(); EXPECT_EQ(expected_appts1.size(), appts.size()); EXPECT_EQ(expected_appts2.size(), appts.size()); for (size_t i=0, n=std::min(appts.size(),expected_appts1.size()); i _ } 1 d hz91indexIDX_CALENDARPROPERTIESCalendarpropertiesCREATE INDEX IDX_CALENDARPROPERTIES on Calendarproperties(CalendarId)^+#}indexIDX_ATTACHMENTSAttachmentsCREATE INDEX IDX_ATTACHMENTS on Attachments(ComponentId)R%qindexIDX_ATTENDEEAttendeeCREATE INDEX IDX_ATTENDEE on Attendee(ComponentId)FeindexIDX_ALARMAlarmCREATE INDEX IDX_ALARM on Alarm(ComponentId)V'uindexIDX_RECURSIVERecursiveCREATE INDEX IDX_RECURSIVE on Recursive(ComponentId)s5-indexIDX_CUSTOMPROPERTIESCustompropertiesCREATE INDEX IDX_CUSTOMPROPERTIES on Customproperties(ComponentId)J!iindexIDX_RDATESRdatesCREATE INDEX IDX_RDATES on Rdates(ComponentId)h9!indexIDX_COMPONENT_NOTEBOOKComponentsCREATE INDEX IDX_COMPONENT_NOTEBOOK on Components(Notebook)v/!)indexIDX_COMPONENT_UIDComponentsCREATE UNIQUE INDEX IDX_COMPONENT_UID on Components(UID, RecurId, DateDeleted)'!SindexIDX_COMPONENTComponentsCREATE INDEX IDX_COMPONENT on Components(ComponentId, Notebook, DateStart, DateEndDue, DateDeleted)S%qindexIDX_CALENDARCalendarsCREATE INDEX IDX_CALENDAR on Calendars(CalendarId)C W1indexsqlite_autoindex_Calendarproperties_1CalendarpropertiesJ 11?tableCalendarpropertiesCalendarproperties CREATE TABLE Calendarproperties(CalendarId REFERENCES Calendars(CalendarId) ON DELETE CASCADE, Name TEXT NOT NULL, Value TEXT, UNIQUE (CalendarId, Name))# ## tableAttachmentsAttachments CREATE TABLE Attachments(ComponentId INTEGER, Data BLOB, Uri TEXT, MimeType TEXT, ShowInLine INTEGER, Label TEXT, Local INTEGER)G atableAttendeeAttendee CREATE TABLE Attendee(ComponentId INTEGER, Email TEXT, Name TEXT, IsOrganizer INTEGER, Role INTEGER, PartStat INTEGER, Rsvp INTEGER, DelegatedTo TEXT, DelegatedFrom TEXT)= YtableAlarmAlarm CREATE TABLE Alarm(ComponentId INTEGER, Action INTEGER, Repeat INTEGER, Duration INTEGER, Offset INTEGER, Relation TEXT, DateTrigger INTEGER, DateTriggerLocal INTEGER, triggerTimeZone TEXT, Description TEXT, Attachment TEXT, Summary TEXT, Address TEXT, CustomProperties TEXT, isEnabled INTEGER) ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-tzids.ics.in0000644000000000000000000000256114773244555021604 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2015-07-09T17:27:58.908570Z(0) BEGIN:VTIMEZONE TZID:/freeassociation.sourceforge.net/Tzfile/America/Sao_Paulo X-LIC-LOCATION:America/Sao_Paulo BEGIN:STANDARD TZNAME:BRT DTSTART:19700222T000000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=2 TZOFFSETFROM:-0200 TZOFFSETTO:-0300 END:STANDARD BEGIN:DAYLIGHT TZNAME:BRST DTSTART:19701018T000000 RRULE:FREQ=YEARLY;BYDAY=3SU;BYMONTH=10 TZOFFSETFROM:-0300 TZOFFSETTO:-0200 END:DAYLIGHT END:VTIMEZONE BEGIN:VTIMEZONE TZID:/freeassociation.sourceforge.net/Tzfile/Europe/Berlin X-LIC-LOCATION:Europe/Berlin BEGIN:STANDARD TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 TZOFFSETFROM:+0200 TZOFFSETTO:+0100 END:STANDARD BEGIN:DAYLIGHT TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 TZOFFSETFROM:+0100 TZOFFSETTO:+0200 END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT STATUS:CONFIRMED DTSTAMP:20150708T095820Z CREATED:20150708T095820Z UID:8ggc30kh89qql8vjumgtug7l14@google.com SEQUENCE:0 TRANSP:OPAQUE SUMMARY:Hello DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Berlin: 20150701T200000 DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Berlin: 20150701T220000 LAST-MODIFIED:20150708T095820Z END:VEVENT END:VCALENDAR ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-tzids-utc.cpp0000644000000000000000000001006214773244555021767 0ustar /* * Copyright 2015 Canonical Ltd. * Copyright 2021-2025 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include #include #include #include #include #include "glib-fixture.h" #include "timezone-mock.h" #include "wakeup-timer-mock.h" using namespace ayatana::indicator::datetime; using VAlarmFixture = GlibFixture; /*** **** ***/ TEST_F(VAlarmFixture, UTCAppointments) { // start the EDS engine auto engine = std::make_shared(std::make_shared()); // we need a consistent timezone for the planner and our local DateTimes constexpr char const * zone_str {"America/Recife"}; auto tz = std::make_shared(zone_str); #if GLIB_CHECK_VERSION(2, 68, 0) auto gtz = g_time_zone_new_identifier(zone_str); if (gtz == NULL) { gtz = g_time_zone_new_utc(); } #else auto gtz = g_time_zone_new(zone_str); #endif // make a planner that looks at the first half of 2015 in EDS auto planner = std::make_shared(engine, tz); const DateTime range_begin {gtz, 2016,1, 1, 0, 0, 0.0}; const DateTime range_end {gtz, 2017,1, 1, 0, 0, 0.0}; planner->range().set(std::make_pair(range_begin, range_end)); // give EDS a moment to load if (planner->appointments().get().empty()) { g_message("waiting a moment for EDS to load..."); auto on_appointments_changed = [this](const std::vector& appointments){ g_message("ah, they loaded"); if (!appointments.empty()) g_main_loop_quit(loop); }; core::ScopedConnection conn(planner->appointments().changed().connect(on_appointments_changed)); constexpr int max_wait_sec = 10; wait_msec(max_wait_sec * G_TIME_SPAN_MILLISECOND); } // what we expect to get... std::array expected_appts1; auto appt1 = &expected_appts1[0]; #ifndef LOMIRI_FEATURES_ENABLED appt1->uid = "20160322T132738Z"; appt1->color = "#becedd"; #else appt1->uid = "17ea8f73-4965-4a9c-9add-4a026a86ec60"; appt1->color = "#0000FF"; #endif appt1->summary = "UTC event"; appt1->begin = DateTime{gtz,2016,3,22,15,0,0}; appt1->end = DateTime{gtz,2016,3,22,16,0,0}; std::array expected_appts2; auto appt2 = &expected_appts2[0]; #ifndef LOMIRI_FEATURES_ENABLED appt2->uid = "20160322T132738Z"; appt2->color = "#62a0ea"; #else appt2->uid = "17ea8f73-4965-4a9c-9add-4a026a86ec60"; appt2->color = ""; #endif appt2->summary = "UTC event"; appt2->begin = DateTime{gtz,2016,3,22,15,0,0}; appt2->end = DateTime{gtz,2016,3,22,16,0,0}; // compare it to what we actually loaded... const auto appts = planner->appointments().get(); EXPECT_EQ(expected_appts1.size(), appts.size()); EXPECT_EQ(expected_appts2.size(), appts.size()); for (size_t i=0, n=std::min(appts.size(),expected_appts1.size()); i _ } 1 d hz91indexIDX_CALENDARPROPERTIESCalendarpropertiesCREATE INDEX IDX_CALENDARPROPERTIES on Calendarproperties(CalendarId)^+#}indexIDX_ATTACHMENTSAttachmentsCREATE INDEX IDX_ATTACHMENTS on Attachments(ComponentId)R%qindexIDX_ATTENDEEAttendeeCREATE INDEX IDX_ATTENDEE on Attendee(ComponentId)FeindexIDX_ALARMAlarmCREATE INDEX IDX_ALARM on Alarm(ComponentId)V'uindexIDX_RECURSIVERecursiveCREATE INDEX IDX_RECURSIVE on Recursive(ComponentId)s5-indexIDX_CUSTOMPROPERTIESCustompropertiesCREATE INDEX IDX_CUSTOMPROPERTIES on Customproperties(ComponentId)J!iindexIDX_RDATESRdatesCREATE INDEX IDX_RDATES on Rdates(ComponentId)h9!indexIDX_COMPONENT_NOTEBOOKComponentsCREATE INDEX IDX_COMPONENT_NOTEBOOK on Components(Notebook)v/!)indexIDX_COMPONENT_UIDComponentsCREATE UNIQUE INDEX IDX_COMPONENT_UID on Components(UID, RecurId, DateDeleted)'!SindexIDX_COMPONENTComponentsCREATE INDEX IDX_COMPONENT on Components(ComponentId, Notebook, DateStart, DateEndDue, DateDeleted)S%qindexIDX_CALENDARCalendarsCREATE INDEX IDX_CALENDAR on Calendars(CalendarId)C W1indexsqlite_autoindex_Calendarproperties_1CalendarpropertiesJ 11?tableCalendarpropertiesCalendarproperties CREATE TABLE Calendarproperties(CalendarId REFERENCES Calendars(CalendarId) ON DELETE CASCADE, Name TEXT NOT NULL, Value TEXT, UNIQUE (CalendarId, Name))# ## tableAttachmentsAttachments CREATE TABLE Attachments(ComponentId INTEGER, Data BLOB, Uri TEXT, MimeType TEXT, ShowInLine INTEGER, Label TEXT, Local INTEGER)G atableAttendeeAttendee CREATE TABLE Attendee(ComponentId INTEGER, Email TEXT, Name TEXT, IsOrganizer INTEGER, Role INTEGER, PartStat INTEGER, Rsvp INTEGER, DelegatedTo TEXT, DelegatedFrom TEXT)= YtableAlarmAlarm CREATE TABLE Alarm(ComponentId INTEGER, Action INTEGER, Repeat INTEGER, Duration INTEGER, Offset INTEGER, Relation TEXT, DateTrigger INTEGER, DateTriggerLocal INTEGER, triggerTimeZone TEXT, Description TEXT, Attachment TEXT, Summary TEXT, Address TEXT, CustomProperties TEXT, isEnabled INTEGER) ayatana-indicator-datetime-25.4.0/tests/test-eds-ics-tzids-utc.ics.in0000644000000000000000000000053114773244555022370 0ustar BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//Ximian//NONSGML Evolution Calendar//EN VERSION:2.0 X-EVOLUTION-DATA-REVISION:2016-03-22T16:13:53.714952Z(2) BEGIN:VEVENT UID:20160322T132738Z DTSTAMP:20160322T133534Z DTSTART:20160322T180000Z DTEND:20160322T190000Z SUMMARY:UTC event SEQUENCE:1 LAST-MODIFIED:20160322T133534Z END:VEVENT END:VCALENDAR ayatana-indicator-datetime-25.4.0/tests/test-exporter.cpp0000644000000000000000000002052714773244555020373 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include "actions-mock.h" #include "state-mock.h" #include "glib-fixture.h" #include "dbus-alarm-properties.h" #include #include #include #include #include using namespace ayatana::indicator::datetime; class ExporterFixture: public GlibFixture { private: typedef GlibFixture super; protected: GTestDBus* bus = nullptr; void SetUp() override { super::SetUp(); // bring up the test bus bus = g_test_dbus_new(G_TEST_DBUS_NONE); g_test_dbus_up(bus); const auto address = g_test_dbus_get_bus_address(bus); g_setenv("DBUS_SYSTEM_BUS_ADDRESS", address, true); g_setenv("DBUS_SESSION_BUS_ADDRESS", address, true); } void TearDown() override { GError * error = nullptr; GDBusConnection* connection = g_bus_get_sync(G_BUS_TYPE_SESSION, nullptr, &error); if(!g_dbus_connection_is_closed(connection)) g_dbus_connection_close_sync(connection, nullptr, &error); g_assert_no_error(error); g_clear_object(&connection); g_test_dbus_down(bus); g_clear_object(&bus); super::TearDown(); } }; TEST_F(ExporterFixture, HelloWorld) { // confirms that the Test DBus SetUp() and TearDown() works } TEST_F(ExporterFixture, Publish) { auto state = std::make_shared(); auto actions = std::make_shared(state); auto settings = std::make_shared(); std::vector> menus; MenuFactory menu_factory (actions, state); for(int i=0; i names; for(int i=0; names_strv && names_strv[i]; i++) names.insert(names_strv[i]); // confirm the actions that we expect EXPECT_EQ(1, names.count("desktop.open-alarm-app")); EXPECT_EQ(1, names.count("desktop.open-appointment")); EXPECT_EQ(1, names.count("desktop.open-calendar-app")); EXPECT_EQ(1, names.count("desktop.open-settings-app")); EXPECT_EQ(1, names.count("phone.open-alarm-app")); EXPECT_EQ(1, names.count("phone.open-appointment")); EXPECT_EQ(1, names.count("phone.open-calendar-app")); EXPECT_EQ(1, names.count("phone.open-settings-app")); EXPECT_EQ(1, names.count("calendar")); EXPECT_EQ(1, names.count("desktop_greeter-header")); EXPECT_EQ(1, names.count("desktop-header")); EXPECT_EQ(1, names.count("phone_greeter-header")); EXPECT_EQ(1, names.count("phone-header")); EXPECT_EQ(1, names.count("set-location")); // try closing the connection prematurely // to test Exporter's name-lost signal bool name_lost = false; exporter.name_lost().connect([this,&name_lost](){ name_lost = true; g_main_loop_quit(loop); }); g_dbus_connection_close_sync(connection, nullptr, nullptr); g_main_loop_run(loop); EXPECT_TRUE(name_lost); // cleanup g_strfreev(names_strv); g_clear_object(&exported); g_clear_object(&connection); } TEST_F(ExporterFixture, AlarmProperties) { /*** **** Set up the exporter ***/ std::shared_ptr state(new MockState); std::shared_ptr actions(new MockActions(state)); std::shared_ptr settings(new Settings); std::vector> menus; MenuFactory menu_factory (actions, state); for(int i=0; i(gproxy) = datetime_alarm_properties_proxy_new_for_bus_finish(res, &error); EXPECT_TRUE(error == nullptr); }; DatetimeAlarmProperties* proxy = nullptr; datetime_alarm_properties_proxy_new_for_bus(G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, BUS_DATETIME_NAME, BUS_DATETIME_PATH"/AlarmProperties", nullptr, on_proxy_ready, &proxy); wait_msec(100); ASSERT_TRUE(proxy != nullptr); /*** **** Try changing the Settings -- do the DBus properties change to match it? ***/ auto expected_volume = 1; int expected_duration = 4; int expected_snooze_duration = 5; const char * expected_sound = "/tmp/foo.wav"; const char * expected_haptic = "pulse"; settings->alarm_volume.set(expected_volume); settings->alarm_duration.set(expected_duration); settings->snooze_duration.set(expected_snooze_duration); settings->alarm_sound.set(expected_sound); settings->alarm_haptic.set(expected_haptic); wait_msec(); static constexpr const char* const SOUND_PROP {"default-sound"}; static constexpr const char* const VOLUME_PROP {"default-volume"}; static constexpr const char* const DURATION_PROP {"duration"}; static constexpr const char* const HAPTIC_PROP {"haptic-feedback"}; static constexpr const char* const SNOOZE_PROP {"snooze-duration"}; char* sound = nullptr; char* haptic = nullptr; int volume = -1; int duration = -1; int snooze = -1; g_object_get(proxy, SOUND_PROP, &sound, HAPTIC_PROP, &haptic, VOLUME_PROP, &volume, DURATION_PROP, &duration, SNOOZE_PROP, &snooze, nullptr); EXPECT_STREQ(expected_sound, sound); EXPECT_STREQ(expected_haptic, haptic); EXPECT_EQ(expected_volume, volume); EXPECT_EQ(expected_duration, duration); EXPECT_EQ(expected_snooze_duration, snooze); g_clear_pointer (&sound, g_free); g_clear_pointer (&haptic, g_free); /*** **** Try changing the DBus properties -- do the Settings change to match it? ***/ expected_volume = 100; expected_duration = 30; expected_sound = "/tmp/bar.wav"; expected_haptic = "none"; expected_snooze_duration = 5; g_object_set(proxy, SOUND_PROP, expected_sound, HAPTIC_PROP, expected_haptic, VOLUME_PROP, expected_volume, DURATION_PROP, expected_duration, SNOOZE_PROP, expected_snooze_duration, nullptr); wait_msec(); EXPECT_STREQ(expected_sound, settings->alarm_sound.get().c_str()); EXPECT_STREQ(expected_haptic, settings->alarm_haptic.get().c_str()); EXPECT_EQ(expected_volume, settings->alarm_volume.get()); EXPECT_EQ(expected_duration, settings->alarm_duration.get()); EXPECT_EQ(expected_snooze_duration, settings->snooze_duration.get()); // cleanup g_clear_object(&proxy); } ayatana-indicator-datetime-25.4.0/tests/test-formatter.cpp0000644000000000000000000001730414773244555020525 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * Authors: * Charles Kerr * Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "glib-fixture.h" #include #include #include #include #include #include using namespace ayatana::indicator::datetime; /*** **** ***/ class FormatterFixture: public GlibFixture { private: typedef GlibFixture super; gchar* m_original_locale = nullptr; protected: std::shared_ptr m_settings; void SetUp() override { super::SetUp(); m_settings.reset(new Settings); m_original_locale = g_strdup(setlocale(LC_TIME, nullptr)); } void TearDown() override { m_settings.reset(); setlocale(LC_TIME, m_original_locale); g_clear_pointer(&m_original_locale, g_free); super::TearDown(); } bool SetLocale(const char* expected_locale, const char* name) { if (setlocale(LC_TIME, expected_locale) != nullptr) { return true; } else { g_message("Unable to set locale to %s; skipping %s locale tests. (Current LC_TIME: %s)", expected_locale, name, setlocale(LC_TIME, nullptr)); return false; } } inline bool Set24hLocale() { return SetLocale("C", "24h"); } inline bool Set12hLocale() { return SetLocale("en_US.UTF-8", "12h"); } }; /** * Test the phone header format */ TEST_F(FormatterFixture, DISABLED_TestPhoneHeader) { auto now = DateTime::Local(2020, 10, 31, 18, 30, 59); auto clock = std::make_shared(now); // test the default value in a 24h locale if(Set24hLocale()) { PhoneFormatter formatter(clock); EXPECT_EQ(std::string("%H:%M"), formatter.header_format.get()); EXPECT_EQ(std::string("18:30"), formatter.header.get()); } // test the default value in a 12h locale if(Set12hLocale()) { PhoneFormatter formatter(clock); EXPECT_EQ(std::string("%l:%M %p"), formatter.header_format.get()); EXPECT_EQ(std::string(" 6:30 PM"), formatter.header.get()); } } #define EM_SPACE "\u2003" /** * Test the default values of the desktop header format */ TEST_F(FormatterFixture, DISABLED_TestDesktopHeader) { struct { bool is_12h; bool show_day; bool show_date; bool show_year; const char* expected_format_string; } test_cases[] = { { false, false, false, false, "%H:%M" }, { false, false, false, true, "%H:%M" }, // show_year is ignored iff show_date is false { false, false, true, false, "%b %e" EM_SPACE "%H:%M" }, { false, false, true, true, "%b %e %Y" EM_SPACE "%H:%M" }, { false, true, false, false, "%a" EM_SPACE "%H:%M" }, { false, true, false, true, "%a" EM_SPACE "%H:%M" }, // show_year is ignored iff show_date is false { false, true, true, false, "%a %b %e" EM_SPACE "%H:%M" }, { false, true, true, true, "%a %b %e %Y" EM_SPACE "%H:%M" }, { true, false, false, false, "%l:%M %p" }, { true, false, false, true, "%l:%M %p" }, // show_year is ignored iff show_date is false { true, false, true, false, "%b %e" EM_SPACE "%l:%M %p" }, { true, false, true, true, "%b %e %Y" EM_SPACE "%l:%M %p" }, { true, true, false, false, "%a" EM_SPACE "%l:%M %p" }, { true, true, false, true, "%a" EM_SPACE "%l:%M %p" }, // show_year is ignored iff show_date is false { true, true, true, false, "%a %b %e" EM_SPACE "%l:%M %p" }, { true, true, true, true, "%a %b %e %Y" EM_SPACE "%l:%M %p" } }; auto now = DateTime::Local(2020, 10, 31, 18, 30, 59); auto clock = std::make_shared(now); for(const auto& test_case : test_cases) { bool locale_set = test_case.is_12h ? Set12hLocale() : Set24hLocale(); DesktopFormatter f(clock, m_settings); m_settings->show_day.set(test_case.show_day); m_settings->show_date.set(test_case.show_date); m_settings->show_year.set(test_case.show_year); if (locale_set) { ASSERT_STREQ(test_case.expected_format_string, f.header_format.get().c_str()); } else { g_message("Ignoring test (expected: %s, probably flawed test result: %s).", test_case.expected_format_string, f.header_format.get().c_str()); } } } /** * Test the default values of the desktop header format */ TEST_F(FormatterFixture, TestUpcomingTimes) { auto a = DateTime::Local(2020, 10, 31, 18, 30, 59); struct { gboolean is_12h; DateTime now; DateTime then; const char* expected_format_string; } test_cases[] = { { true, a, a, "%l:%M %p" }, // identical time { true, a, a.add_full(0,0,0,1,0,0), "%l:%M %p" }, // later today { true, a, a.add_days(1), "Tomorrow" EM_SPACE "%l:%M %p" }, // tomorrow { true, a, a.add_days(2), "%a" EM_SPACE "%l:%M %p" }, { true, a, a.add_days(6), "%a" EM_SPACE "%l:%M %p" }, { true, a, a.add_days(7), "%a %d %b" EM_SPACE "%l:%M %p" }, // over one week away { false, a, a, "%H:%M" }, // identical time { false, a, a.add_full(0,0,0,1,0,0), "%H:%M" }, // later today { false, a, a.add_days(1), "Tomorrow" EM_SPACE "%H:%M" }, // tomorrow { false, a, a.add_days(2), "%a" EM_SPACE "%H:%M" }, { false, a, a.add_days(6), "%a" EM_SPACE "%H:%M" }, { false, a, a.add_days(7), "%a %d %b" EM_SPACE "%H:%M" } // over one week away }; for(const auto& test_case : test_cases) { if (test_case.is_12h ? Set12hLocale() : Set24hLocale()) { auto clock = std::make_shared(test_case.now); DesktopFormatter f(clock, m_settings); const auto fmt = f.relative_format(test_case.then.get()); ASSERT_EQ(test_case.expected_format_string, fmt); } } } /** * Test the default values of the desktop header format */ TEST_F(FormatterFixture, TestEventTimes) { auto day = DateTime::Local(2013, 1, 1, 13, 0, 0); auto day_begin = DateTime::Local(2013, 1, 1, 13, 0, 0); auto day_end = day_begin.add_days(1); auto tomorrow_begin = day_begin.add_days(1); auto tomorrow_end = tomorrow_begin.add_days(1); struct { bool is_12h; DateTime now; DateTime then; DateTime then_end; const char* expected_format_string; } test_cases[] = { { false, day, day_begin, day_end, _("Today") }, { true, day, day_begin, day_end, _("Today") }, { false, day, tomorrow_begin, tomorrow_end, _("Tomorrow") }, { true, day, tomorrow_begin, tomorrow_end, _("Tomorrow") } }; for(const auto& test_case : test_cases) { if (test_case.is_12h ? Set12hLocale() : Set24hLocale()) { auto clock = std::make_shared(test_case.now); DesktopFormatter f(clock, m_settings); const auto fmt = f.relative_format(test_case.then.get(), test_case.then_end.get()); ASSERT_STREQ(test_case.expected_format_string, fmt.c_str()); } } } ayatana-indicator-datetime-25.4.0/tests/test-live-actions.cpp0000644000000000000000000002354414773244555021122 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include "state-mock.h" #include "timedated-fixture.h" #include extern "C" { #include } using namespace ayatana::indicator::datetime; class MockLiveActions: public LiveActions { public: explicit MockLiveActions(const std::shared_ptr& state_in): LiveActions(state_in) {} ~MockLiveActions() {} }; class TestLiveActionsFixture: public TimedatedFixture { private: using super = TimedatedFixture; protected: std::shared_ptr m_mock_state; std::shared_ptr m_state; std::shared_ptr m_live_actions; std::shared_ptr m_actions; void SetUp() override { super::SetUp(); // create the State and Actions m_mock_state.reset(new MockState); m_mock_state->settings.reset(new Settings); m_state = std::dynamic_pointer_cast(m_mock_state); m_live_actions.reset(new MockLiveActions(m_state)); m_actions = std::dynamic_pointer_cast(m_live_actions); // start the timedate1 dbusmock start_timedate1("Etc/Utc"); } void TearDown() override { m_actions.reset(); m_live_actions.reset(); m_state.reset(); m_mock_state.reset(); super::TearDown(); } }; /*** **** ***/ TEST_F(TestLiveActionsFixture, HelloWorld) { EXPECT_TRUE(true); } TEST_F(TestLiveActionsFixture, SetLocation) { const std::string tzid = "America/Chicago"; const std::string name = "Oklahoma City"; const std::string expected = tzid + " " + name; EXPECT_NE(expected, m_state->settings->timezone_name.get()); std::string new_name; m_state->settings->timezone_name.changed().connect( [&new_name](const std::string& n){new_name = n;} ); m_actions->set_location(tzid, name); EXPECT_TRUE(wait_for([&new_name](){return !new_name.empty();})); EXPECT_EQ(expected, new_name); EXPECT_EQ(expected, m_state->settings->timezone_name.get()); EXPECT_EQ(tzid, get_timedate1_timezone()); } /*** **** ***/ TEST_F(TestLiveActionsFixture, DesktopOpenAlarmApp) { std::string sReturn = m_actions->open_alarm_app(); std::string expected = "evolution -c calendar"; if (ayatana_common_utils_is_lomiri()) { expected = "alarm://"; } EXPECT_EQ(expected, sReturn); } TEST_F(TestLiveActionsFixture, DesktopOpenAppointment) { if (ayatana_common_utils_is_lomiri()) { // PhoneOpenAppointment will handle this return; } Appointment a; a.uid = "some-uid"; a.begin = DateTime::NowLocal(); std::string sReturn = m_actions->open_appointment(a, a.begin); const std::string expected_substr = "evolution \"calendar:///?startdate="; EXPECT_NE(sReturn.find(expected_substr), std::string::npos); } TEST_F(TestLiveActionsFixture, DesktopOpenCalendarApp) { if (ayatana_common_utils_is_lomiri()) { // PhoneOpenCalendarApp will handle this return; } std::string sReturn = m_actions->open_calendar_app(DateTime::NowLocal()); const std::string expected_substr = "evolution \"calendar:///?startdate="; EXPECT_NE(sReturn.find(expected_substr), std::string::npos); } TEST_F(TestLiveActionsFixture, DesktopOpenSettingsApp) { std::string sReturn = m_actions->open_settings_app(); std::string expected_substr = "gnome-control-center datetime"; if (ayatana_common_utils_is_unity()) { expected_substr = "unity-control-center datetime"; } else if (ayatana_common_utils_is_mate()) { expected_substr = "mate-time-admin"; } else if (ayatana_common_utils_is_lomiri()) { expected_substr = "settings:///system/time-date"; } EXPECT_EQ(expected_substr, sReturn); } /*** **** ***/ namespace { const std::string clock_app_url = "alarm://"; } TEST_F(TestLiveActionsFixture, PhoneOpenAlarmApp) { setenv("XDG_CURRENT_DESKTOP", "Lomiri", 1); std::string sReturn = m_actions->open_alarm_app(); EXPECT_EQ(clock_app_url, sReturn); unsetenv("XDG_CURRENT_DESKTOP"); } TEST_F(TestLiveActionsFixture, PhoneOpenAppointment) { setenv("XDG_CURRENT_DESKTOP", "Lomiri", 1); Appointment a; a.uid = "event-uid"; a.source_uid = "source-uid"; a.begin = DateTime::NowLocal(); a.type = Appointment::EVENT; auto ocurrenceDate = DateTime::Local(2014, 1, 1, 0, 0, 0); std::string sReturn = m_actions->open_appointment(a, ocurrenceDate); const std::string appointment_app_url = ocurrenceDate.to_timezone("UTC").format("calendar://startdate=%Y-%m-%dT%H:%M:%S+00:00"); EXPECT_EQ(appointment_app_url, sReturn); a.type = Appointment::ALARM; sReturn = m_actions->open_appointment(a, a.begin); EXPECT_EQ(clock_app_url, sReturn); unsetenv("XDG_CURRENT_DESKTOP"); } TEST_F(TestLiveActionsFixture, PhoneOpenCalendarApp) { setenv("XDG_CURRENT_DESKTOP", "Lomiri", 1); auto now = DateTime::NowLocal(); std::string sReturn = m_actions->open_calendar_app(now); const std::string expected = now.to_timezone("UTC").format("calendar://startdate=%Y-%m-%dT%H:%M:%S+00:00"); EXPECT_EQ(expected, sReturn); unsetenv("XDG_CURRENT_DESKTOP"); } TEST_F(TestLiveActionsFixture, PhoneOpenSettingsApp) { setenv("XDG_CURRENT_DESKTOP", "Lomiri", 1); std::string sReturn = m_actions->open_settings_app(); const std::string expected = "settings:///system/time-date"; EXPECT_EQ(expected, sReturn); unsetenv("XDG_CURRENT_DESKTOP"); } /*** **** ***/ TEST_F(TestLiveActionsFixture, CalendarState) { // init the clock auto now = DateTime::Local(2014, 1, 1, 0, 0, 0); m_mock_state->mock_clock->set_localtime (now); m_state->calendar_month->month().set(now); //m_state->planner->time.set(now); /// /// Test the default calendar state. /// auto action_group = m_actions->action_group(); auto calendar_state = g_action_group_get_action_state (action_group, "calendar"); EXPECT_TRUE (calendar_state != nullptr); EXPECT_TRUE (g_variant_is_of_type (calendar_state, G_VARIANT_TYPE_DICTIONARY)); // there's nothing in the planner yet, so appointment-days should be an empty array auto v = g_variant_lookup_value (calendar_state, "appointment-days", G_VARIANT_TYPE_ARRAY); EXPECT_TRUE (v != nullptr); EXPECT_EQ (0, g_variant_n_children (v)); g_clear_pointer (&v, g_variant_unref); // calendar-day should be in sync with m_state->calendar_day v = g_variant_lookup_value (calendar_state, "calendar-day", G_VARIANT_TYPE_INT64); EXPECT_TRUE (v != nullptr); EXPECT_EQ (m_state->calendar_month->month().get().to_unix(), g_variant_get_int64(v)); g_clear_pointer (&v, g_variant_unref); // show-week-numbers should be false because MockSettings defaults everything to 0 v = g_variant_lookup_value (calendar_state, "show-week-numbers", G_VARIANT_TYPE_BOOLEAN); EXPECT_TRUE (v != nullptr); EXPECT_FALSE (g_variant_get_boolean (v)); g_clear_pointer (&v, g_variant_unref); // cleanup this step g_clear_pointer (&calendar_state, g_variant_unref); /// /// Now add appointments to the planner and confirm that the state keeps in sync /// auto tomorrow = now.add_days(1); auto tomorrow_begin = tomorrow.start_of_day(); auto tomorrow_end = tomorrow.end_of_day(); Appointment a1; a1.color = "green"; a1.summary = "write unit tests"; a1.uid = "D4B57D50247291478ED31DED17FF0A9838DED402"; a1.begin = tomorrow_begin; a1.end = tomorrow_end; auto ubermorgen = now.add_days(2); auto ubermorgen_begin = ubermorgen.start_of_day(); auto ubermorgen_end = ubermorgen.end_of_day(); Appointment a2; a2.color = "orange"; a2.summary = "code review"; a2.uid = "2756ff7de3745bbffd65d2e4779c37c7ca60d843"; a2.begin = ubermorgen_begin; a2.end = ubermorgen_end; m_state->calendar_month->appointments().set(std::vector({a1, a2})); /// /// Now test the calendar state again. /// The this_month field should now contain the appointments we just added. /// calendar_state = g_action_group_get_action_state (action_group, "calendar"); v = g_variant_lookup_value (calendar_state, "appointment-days", G_VARIANT_TYPE_ARRAY); EXPECT_TRUE (v != nullptr); int i; g_variant_get_child (v, 0, "i", &i); EXPECT_EQ (a1.begin.day_of_month(), i); g_variant_get_child (v, 1, "i", &i); EXPECT_EQ (a2.begin.day_of_month(), i); g_clear_pointer(&v, g_variant_unref); g_clear_pointer(&calendar_state, g_variant_unref); /// /// Confirm that the action state's dictionary /// keeps in sync with settings.show_week_numbers /// auto b = m_state->settings->show_week_numbers.get(); for (i=0; i<2; i++) { b = !b; m_state->settings->show_week_numbers.set(b); calendar_state = g_action_group_get_action_state (action_group, "calendar"); v = g_variant_lookup_value (calendar_state, "show-week-numbers", G_VARIANT_TYPE_BOOLEAN); EXPECT_TRUE(v != nullptr); EXPECT_EQ(b, g_variant_get_boolean(v)); g_clear_pointer(&v, g_variant_unref); g_clear_pointer(&calendar_state, g_variant_unref); } } ayatana-indicator-datetime-25.4.0/tests/test-locations.cpp0000644000000000000000000001231614773244555020513 0ustar /* * Copyright 2013 Canonical Ltd. * * Authors: * Charles Kerr * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "glib-fixture.h" #include using ayatana::indicator::datetime::Location; using ayatana::indicator::datetime::Locations; using ayatana::indicator::datetime::Settings; using ayatana::indicator::datetime::SettingsLocations; using ayatana::indicator::datetime::Timezones; /*** **** ***/ class LocationsFixture: public GlibFixture { private: typedef GlibFixture super; protected: //GSettings * settings = nullptr; std::shared_ptr m_settings; std::shared_ptr m_timezones; const std::string nyc = "America/New_York"; const std::string chicago = "America/Chicago"; void SetUp() override { super::SetUp(); m_settings.reset(new Settings); m_settings->show_locations.set(true); m_settings->locations.set({"America/Los_Angeles Oakland", "America/Chicago Chicago", "America/Chicago Oklahoma City", "America/Toronto Toronto", "Europe/London London", "Europe/Berlin Berlin"}); m_timezones.reset(new Timezones); m_timezones->timezone.set(chicago); m_timezones->timezones.set(std::set({ nyc, chicago })); } void TearDown() override { m_timezones.reset(); m_settings.reset(); super::TearDown(); } }; TEST_F(LocationsFixture, Timezones) { m_settings->show_locations.set(false); SettingsLocations locations(m_settings, m_timezones); const auto l = locations.locations.get(); EXPECT_EQ(2, l.size()); EXPECT_STREQ("Chicago", l[0].name().c_str()); EXPECT_EQ(chicago, l[0].zone()); EXPECT_EQ("New York", l[1].name()); EXPECT_EQ(nyc, l[1].zone()); } TEST_F(LocationsFixture, SettingsLocations) { SettingsLocations locations(m_settings, m_timezones); const auto l = locations.locations.get(); EXPECT_EQ(7, l.size()); EXPECT_EQ("Chicago", l[0].name()); EXPECT_EQ(chicago, l[0].zone()); EXPECT_EQ("New York", l[1].name()); EXPECT_EQ(nyc, l[1].zone()); EXPECT_EQ("Oakland", l[2].name()); EXPECT_EQ("America/Los_Angeles", l[2].zone()); EXPECT_EQ("Oklahoma City", l[3].name()); EXPECT_EQ("America/Chicago", l[3].zone()); EXPECT_EQ("Toronto", l[4].name()); EXPECT_EQ("America/Toronto", l[4].zone()); EXPECT_EQ("London", l[5].name()); EXPECT_EQ("Europe/London", l[5].zone()); EXPECT_EQ("Berlin", l[6].name()); EXPECT_EQ("Europe/Berlin", l[6].zone()); } TEST_F(LocationsFixture, ChangeLocationStrings) { SettingsLocations locations(m_settings, m_timezones); bool locations_changed = false; locations.locations.changed().connect([&locations_changed, this](const std::vector&){ locations_changed = true; g_main_loop_quit(loop); }); g_idle_add([](gpointer settings){ static_cast(settings)->locations.set({"America/Los_Angeles Oakland", "Europe/London London", "Europe/Berlin Berlin"}); return G_SOURCE_REMOVE; }, m_settings.get()); g_main_loop_run(loop); EXPECT_TRUE(locations_changed); const auto l = locations.locations.get(); EXPECT_EQ(5, l.size()); EXPECT_EQ("Chicago", l[0].name()); EXPECT_EQ(chicago, l[0].zone()); EXPECT_EQ("New York", l[1].name()); EXPECT_EQ(nyc, l[1].zone()); EXPECT_EQ("Oakland", l[2].name()); EXPECT_EQ("America/Los_Angeles", l[2].zone()); EXPECT_EQ("London", l[3].name()); EXPECT_EQ("Europe/London", l[3].zone()); EXPECT_EQ("Berlin", l[4].name()); EXPECT_EQ("Europe/Berlin", l[4].zone()); } TEST_F(LocationsFixture, ChangeLocationVisibility) { SettingsLocations locations(m_settings, m_timezones); bool locations_changed = false; locations.locations.changed().connect([&locations_changed, this](const std::vector&){ locations_changed = true; g_main_loop_quit(loop); }); g_idle_add([](gpointer settings){ static_cast(settings)->show_locations.set(false); return G_SOURCE_REMOVE; }, m_settings.get()); g_main_loop_run(loop); EXPECT_TRUE(locations_changed); const auto l = locations.locations.get(); EXPECT_EQ(2, l.size()); EXPECT_EQ("Chicago", l[0].name()); EXPECT_EQ(chicago, l[0].zone()); EXPECT_EQ("New York", l[1].name()); EXPECT_EQ(nyc, l[1].zone()); } ayatana-indicator-datetime-25.4.0/tests/test-menu-appointments.cpp0000644000000000000000000001504614773244555022206 0ustar /* * Copyright 2016 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include "glib-fixture.h" #include #include #include #include using MenuAppointmentFixture = GlibFixture; using namespace ayatana::indicator::datetime; namespace { Appointment create_appointment( const Appointment::Type& type, const std::string& uid, const std::string& summary, const DateTime& begin, const DateTime& end) { Appointment a; a.type = type; a.uid = uid; a.summary = summary; a.begin = begin; a.end = end; return a; } } TEST_F(MenuAppointmentFixture, DisplayEvents) { const auto airport = create_appointment( Appointment::ALARM, "uid-airport", "Pick Aunt Mabel up at the airport", DateTime::Local(2016,12,24,10,0,0), DateTime::Local(2016,12,24,10,0,0) ); const auto christmas_eve_candle_service = create_appointment( Appointment::EVENT, "uid-christmas-eve-candle-service", "Christmas Eve Candle Service", DateTime::Local(2016,12,24,22,0,0), DateTime::Local(2016,12,24,23,0,0) ); const auto christmas = create_appointment( Appointment::EVENT, "uid-christmas", "Christmas", DateTime::Local(2016,12,25,0,0,0), DateTime::Local(2016,12,26,0,0,0) ); const auto santa = create_appointment( Appointment::ALARM, "uid-santa", "Time to set out cookies and milk for Santa", DateTime::Local(2016,12,25,1,0,0), DateTime::Local(2016,12,25,1,0,0) ); const auto bike = create_appointment( Appointment::ALARM, "uid-bike", "Remember to put out the bike, it's in the garage", DateTime::Local(2016,12,25,1,0,0), DateTime::Local(2016,12,25,1,0,0) ); const auto christmas_lunch = create_appointment( Appointment::EVENT, "uid-christmas-lunch", "Christmas Lunch at Grandma's", DateTime::Local(2016,12,25,12,0,0), DateTime::Local(2016,12,25,14,0,0) ); const auto boxing_day = create_appointment( Appointment::EVENT, "uid-boxing-day", "Boxing Day", DateTime::Local(2016,12,26,0,0,0), DateTime::Local(2016,12,27,0,0,0) ); const auto new_years_eve = create_appointment( Appointment::EVENT, "uid-new-years-eve", "New Years' Eve", DateTime::Local(2016,12,31,0,0,0), DateTime::Local(2017,1,1,0,0,0) ); const struct { const char* const description; DateTime start; std::vector appointments; std::vector expected_display_appointments; int max_items; } tests[] = { { "test presentation order: full-day events come before part-day events", DateTime::Local(2016,12,25,6,0,0), std::vector({christmas, christmas_lunch, boxing_day, new_years_eve}), std::vector({christmas, christmas_lunch, boxing_day, new_years_eve}), 5 }, { "test presentation order: part-day events in chronological order", DateTime::Local(2016,12,24,0,0,0), std::vector({airport, christmas_eve_candle_service, christmas, santa, christmas_lunch}), std::vector({airport, christmas_eve_candle_service, christmas, santa, christmas_lunch}), 5 }, { "test presentation order: multiple events with the same start+end sorted alphabetically", DateTime::Local(2016,12,25,0,0,0), std::vector({christmas, bike, santa, christmas_lunch}), std::vector({christmas, bike, santa, christmas_lunch}), 5 }, { "test culling priority: today's part-day events outrank today's full-day events", DateTime::Local(2016,12,25,1,0,0), std::vector({christmas, santa, christmas_lunch}), std::vector({santa, christmas_lunch}), 2 }, { "test culling priority: events later today outrank both tomorrow's full-day and part-day events", DateTime::Local(2016,12,24,0,0,0), std::vector({christmas_eve_candle_service, christmas, santa}), std::vector({christmas_eve_candle_service}), 1 }, { "test edge cases: confirm ({christmas, christmas_lunch}), std::vector({christmas, christmas_lunch}), 5 }, { "test edge cases: confirm 0 events works ok", DateTime::Local(2016,12,24,0,0,0), std::vector({}), std::vector({}), 5 }, { "test edge cases: confirm max-events of 0 doesn't crash", DateTime::Local(2016,12,24,0,0,0), std::vector({christmas, bike, santa, christmas_lunch}), std::vector({}), 0 } }; for (const auto& test : tests) { g_debug("running test: %s", test.description); // run the test... ASSERT_EQ(test.expected_display_appointments, Menu::get_display_appointments(test.appointments, test.start, test.max_items)); // ...and again with a reversed vector to confirm input order doesn't matter auto reversed = test.appointments; std::reverse(reversed.begin(), reversed.end()); ASSERT_EQ(test.expected_display_appointments, Menu::get_display_appointments(reversed, test.start, test.max_items)); } } ayatana-indicator-datetime-25.4.0/tests/test-menus.cpp0000644000000000000000000005341714773244555017656 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include "actions-mock.h" #include "state-fixture.h" #include #include #include #include #include using namespace ayatana::indicator::datetime; class MenuFixture: public StateFixture { private: typedef StateFixture super; protected: std::shared_ptr m_menu_factory; std::vector> m_menus; void SetUp() override { super::SetUp(); // build the menus on top of the actions and state m_menu_factory.reset(new MenuFactory(m_actions, m_state)); for(int i=0; ibuildMenu(Menu::Profile(i))); } void TearDown() override { m_menus.clear(); m_menu_factory.reset(); super::TearDown(); } void InspectHeader(GMenuModel* menu_model, const std::string& name) { // check that there's a header menuitem EXPECT_EQ(1,g_menu_model_get_n_items(menu_model)); gchar* str = nullptr; g_menu_model_get_item_attribute(menu_model, 0, "x-ayatana-type", "s", &str); EXPECT_STREQ("org.ayatana.indicator.root", str); g_clear_pointer(&str, g_free); g_menu_model_get_item_attribute(menu_model, 0, G_MENU_ATTRIBUTE_ACTION, "s", &str); const auto action_name = name + "-header"; EXPECT_EQ(std::string("indicator.")+action_name, str); g_clear_pointer(&str, g_free); // check the header auto dict = g_action_group_get_action_state(m_actions->action_group(), action_name.c_str()); EXPECT_TRUE(dict != nullptr); EXPECT_TRUE(g_variant_is_of_type(dict, G_VARIANT_TYPE_VARDICT)); auto v = g_variant_lookup_value(dict, "accessible-desc", G_VARIANT_TYPE_STRING); EXPECT_TRUE(v != nullptr); g_variant_unref(v); v = g_variant_lookup_value(dict, "label", G_VARIANT_TYPE_STRING); EXPECT_TRUE(v != nullptr); g_variant_unref(v); v = g_variant_lookup_value(dict, "title", G_VARIANT_TYPE_STRING); EXPECT_TRUE(v != nullptr); g_variant_unref(v); v = g_variant_lookup_value(dict, "visible", G_VARIANT_TYPE_BOOLEAN); EXPECT_TRUE(v != nullptr); g_variant_unref(v); g_variant_unref(dict); } void InspectCalendar(GMenuModel* menu_model, Menu::Profile profile) { gchar* str = nullptr; const char * expected_action; if (profile == Menu::Desktop) expected_action = "indicator.desktop.open-calendar-app"; else if (profile == Menu::Phone) expected_action = "indicator.phone.open-calendar-app"; else expected_action = nullptr; const auto calendar_expected = ((profile == Menu::Desktop) || (profile == Menu::DesktopGreeter) || (profile == Menu::Phone)) && (m_state->settings->show_calendar.get()); // get the calendar section auto submenu = g_menu_model_get_item_link(menu_model, 0, G_MENU_LINK_SUBMENU); auto section = g_menu_model_get_item_link(submenu, Menu::Calendar, G_MENU_LINK_SECTION); // should be one or two items: a date label and maybe a calendar ASSERT_TRUE(section != nullptr); auto n_expected = calendar_expected ? 2 : 1; EXPECT_EQ(n_expected, g_menu_model_get_n_items(section)); // look at the date menuitem g_menu_model_get_item_attribute(section, 0, G_MENU_ATTRIBUTE_LABEL, "s", &str); const auto now = m_state->clock->localtime(); EXPECT_EQ(now.format("%A, %e %B %Y"), str); g_clear_pointer(&str, g_free); g_menu_model_get_item_attribute(section, 0, G_MENU_ATTRIBUTE_ACTION, "s", &str); if (expected_action != nullptr) EXPECT_STREQ(expected_action, str); else EXPECT_TRUE(str == nullptr); g_clear_pointer(&str, g_free); // look at the calendar menuitem if (calendar_expected) { g_menu_model_get_item_attribute(section, 1, "x-ayatana-type", "s", &str); EXPECT_STREQ("org.ayatana.indicator.calendar", str); g_clear_pointer(&str, g_free); g_menu_model_get_item_attribute(section, 1, G_MENU_ATTRIBUTE_ACTION, "s", &str); EXPECT_STREQ("indicator.calendar", str); g_clear_pointer(&str, g_free); g_menu_model_get_item_attribute(section, 1, "activation-action", "s", &str); if (expected_action != nullptr) EXPECT_STREQ(expected_action, str); else EXPECT_TRUE(str == nullptr); g_clear_pointer(&str, g_free); } g_clear_object(§ion); // now change the clock and see if the date label changes appropriately auto tomorrow = now.add_days(1).start_of_day(); m_mock_state->mock_clock->set_localtime(tomorrow); wait_msec(); section = g_menu_model_get_item_link(submenu, Menu::Calendar, G_MENU_LINK_SECTION); g_menu_model_get_item_attribute(section, 0, G_MENU_ATTRIBUTE_LABEL, "s", &str); EXPECT_EQ(tomorrow.format("%A, %e %B %Y"), str); g_clear_pointer(&str, g_free); g_clear_object(§ion); // cleanup g_object_unref(submenu); } private: void InspectEmptySection(GMenuModel* menu_model, Menu::Section section) { // get the Appointments section auto submenu = g_menu_model_get_item_link(menu_model, 0, G_MENU_LINK_SUBMENU); auto menu_section = g_menu_model_get_item_link(submenu, section, G_MENU_LINK_SECTION); EXPECT_EQ(0, g_menu_model_get_n_items(menu_section)); g_clear_object(&menu_section); g_clear_object(&submenu); } std::vector build_some_appointments() { const auto now = m_state->clock->localtime(); const auto tomorrow = now.add_days(1); Appointment a1; // an alarm clock appointment a1.color = "red"; a1.summary = "http://www.example.com/"; a1.uid = "example"; a1.type = Appointment::ALARM; a1.begin = a1.end = tomorrow; Appointment a2; // a non-alarm appointment a2.color = "green"; a2.summary = "http://www.monkey.com/"; a2.uid = "monkey"; a2.type = Appointment::EVENT; a2.begin = a2.end = tomorrow; return std::vector({a1, a2}); } void InspectAppointmentMenuItem(GMenuModel* section, int index, const Appointment& appt) { // confirm it has the right x-ayatana-type gchar * str = nullptr; g_menu_model_get_item_attribute(section, index, "x-ayatana-type", "s", &str); if (appt.is_alarm()) EXPECT_STREQ("org.ayatana.indicator.alarm", str); else EXPECT_STREQ("org.ayatana.indicator.appointment", str); g_clear_pointer(&str, g_free); // confirm it has a nonempty x-ayatana-time-format g_menu_model_get_item_attribute(section, index, "x-ayatana-time-format", "s", &str); EXPECT_TRUE(str && *str); g_clear_pointer(&str, g_free); // confirm the color hint, if it exists, // is in the x-ayatana-color attribute if (appt.color.empty()) { EXPECT_FALSE(g_menu_model_get_item_attribute(section, index, "x-ayatana-color", "s", &str)); } else { EXPECT_TRUE(g_menu_model_get_item_attribute(section, index, "x-ayatana-color", "s", &str)); EXPECT_EQ(appt.color, str); } g_clear_pointer(&str, g_free); // confirm that alarms have an icon if (appt.is_alarm()) { auto v = g_menu_model_get_item_attribute_value(section, index, G_MENU_ATTRIBUTE_ICON, nullptr); EXPECT_TRUE(v != nullptr); auto icon = g_icon_deserialize(v); EXPECT_TRUE(icon != nullptr); g_clear_object(&icon); g_clear_pointer(&v, g_variant_unref); } } void InspectAppointmentMenuItems(GMenuModel* section, int first_appt_index, const std::vector& appointments, bool can_open_planner) { // try adding a few appointments and see if the menu updates itself m_state->calendar_upcoming->appointments().set(appointments); wait_msec(); // wait a moment for the menu to update //auto submenu = g_menu_model_get_item_link(menu_model, 0, G_MENU_LINK_SUBMENU); //auto section = g_menu_model_get_item_link(submenu, Menu::Appointments, G_MENU_LINK_SECTION); const int n_add_event_buttons = can_open_planner ? 1 : 0; EXPECT_EQ(n_add_event_buttons + appointments.size(), g_menu_model_get_n_items(section)); for (int i=0, n=appointments.size(); isettings->show_alarms.set(false); wait_msec(); std::vector display_appointments = Menu::get_display_appointments(appointments, m_state->clock->localtime(), 5, m_state->settings->show_alarms.get()); for (int i=0, n=display_appointments.size(); isettings->show_alarms.set(true); wait_msec(); display_appointments = Menu::get_display_appointments(appointments, m_state->clock->localtime(), 5, m_state->settings->show_alarms.get()); for (int i=0, n=display_appointments.size(); isettings->show_alarms.set(true); const int n_add_event_buttons = can_open_planner ? 1 : 0; // get the Appointments section auto submenu = g_menu_model_get_item_link(menu_model, 0, G_MENU_LINK_SUBMENU); // there shouldn't be any menuitems when "show events" is false m_state->settings->show_events.set(false); wait_msec(); auto section = g_menu_model_get_item_link(submenu, Menu::Appointments, G_MENU_LINK_SECTION); EXPECT_EQ(0, g_menu_model_get_n_items(section)); g_clear_object(§ion); std::vector appointments; m_state->settings->show_events.set(true); m_state->calendar_upcoming->appointments().set(appointments); wait_msec(); section = g_menu_model_get_item_link(submenu, Menu::Appointments, G_MENU_LINK_SECTION); EXPECT_EQ(n_add_event_buttons, g_menu_model_get_n_items(section)); if (can_open_planner) { // when "show_events" is true, // there should be an "add event" button even if there aren't any appointments gchar* action = nullptr; EXPECT_TRUE(g_menu_model_get_item_attribute(section, 0, G_MENU_ATTRIBUTE_ACTION, "s", &action)); const char* expected_action = "desktop.open-calendar-app"; EXPECT_EQ(std::string("indicator.")+expected_action, action); EXPECT_TRUE(g_action_group_has_action(m_actions->action_group(), expected_action)); g_free(action); } g_clear_object(§ion); // try adding a few appointments and see if the menu updates itself appointments = build_some_appointments(); m_state->calendar_upcoming->appointments().set(appointments); wait_msec(); // wait a moment for the menu to update section = g_menu_model_get_item_link(submenu, Menu::Appointments, G_MENU_LINK_SECTION); EXPECT_EQ(n_add_event_buttons + 2, g_menu_model_get_n_items(section)); InspectAppointmentMenuItems(section, 0, appointments, can_open_planner); g_clear_object(§ion); // cleanup g_clear_object(&submenu); } void InspectPhoneAppointments(GMenuModel* menu_model, bool can_open_planner) { m_state->settings->show_alarms.set(true); auto submenu = g_menu_model_get_item_link(menu_model, 0, G_MENU_LINK_SUBMENU); // there shouldn't be any menuitems when "show events" is false m_state->settings->show_events.set(false); wait_msec(); auto section = g_menu_model_get_item_link(submenu, Menu::Appointments, G_MENU_LINK_SECTION); EXPECT_EQ(0, g_menu_model_get_n_items(section)); g_clear_object(§ion); // clear all the appointments std::vector appointments; m_state->settings->show_events.set(true); m_state->calendar_upcoming->appointments().set(appointments); wait_msec(); // wait a moment for the menu to update // check that there's a "clock app" menuitem even when there are no appointments section = g_menu_model_get_item_link(submenu, Menu::Appointments, G_MENU_LINK_SECTION); const char* expected_action = "phone.open-alarm-app"; EXPECT_EQ(1, g_menu_model_get_n_items(section)); gchar* action = nullptr; EXPECT_TRUE(g_menu_model_get_item_attribute(section, 0, G_MENU_ATTRIBUTE_ACTION, "s", &action)); EXPECT_EQ(std::string("indicator.")+expected_action, action); EXPECT_TRUE(g_action_group_has_action(m_actions->action_group(), expected_action)); g_free(action); g_clear_object(§ion); // add some appointments and test them appointments = build_some_appointments(); m_state->calendar_upcoming->appointments().set(appointments); wait_msec(); // wait a moment for the menu to update section = g_menu_model_get_item_link(submenu, Menu::Appointments, G_MENU_LINK_SECTION); EXPECT_EQ(3, g_menu_model_get_n_items(section)); InspectAppointmentMenuItems(section, 1, appointments, can_open_planner); g_clear_object(§ion); // cleanup g_clear_object(&submenu); } protected: void InspectAppointments(GMenuModel* menu_model, Menu::Profile profile) { const auto can_open_planner = m_actions->desktop_has_calendar_app(); switch (profile) { case Menu::Desktop: InspectDesktopAppointments(menu_model, can_open_planner); break; case Menu::DesktopGreeter: InspectEmptySection(menu_model, Menu::Appointments); break; case Menu::Phone: InspectPhoneAppointments(menu_model, can_open_planner); break; case Menu::PhoneGreeter: InspectEmptySection(menu_model, Menu::Appointments); break; default: g_warn_if_reached(); break; } } void CompareLocationsTo(GMenuModel* menu_model, const std::vector& locations) { // get the Locations section auto submenu = g_menu_model_get_item_link(menu_model, 0, G_MENU_LINK_SUBMENU); auto section = g_menu_model_get_item_link(submenu, Menu::Locations, G_MENU_LINK_SECTION); // confirm that section's menuitems mirror the "locations" vector const auto n = locations.size(); ASSERT_EQ(n, g_menu_model_get_n_items(section)); for (guint i=0; i empty; m_state->locations->locations.set(empty); wait_msec(); CompareLocationsTo(menu_model, empty); // add some locations and confirm the menu picked up our changes Location l1 ("America/Chicago", "Dallas"); Location l2 ("America/Arizona", "Phoenix"); std::vector locations({l1, l2}); m_state->locations->locations.set(locations); wait_msec(); CompareLocationsTo(menu_model, locations_expected ? locations : empty); // now remove one of the locations... locations.pop_back(); m_state->locations->locations.set(locations); wait_msec(); CompareLocationsTo(menu_model, locations_expected ? locations : empty); } void InspectSettings(GMenuModel* menu_model, Menu::Profile profile) { std::string expected_action; if (profile == Menu::Desktop) expected_action = "indicator.desktop.open-settings-app"; else if (profile == Menu::Phone) expected_action = "indicator.phone.open-settings-app"; // get the Settings section auto submenu = g_menu_model_get_item_link(menu_model, 0, G_MENU_LINK_SUBMENU); auto section = g_menu_model_get_item_link(submenu, Menu::Settings, G_MENU_LINK_SECTION); if (expected_action.empty()) { EXPECT_EQ(0, g_menu_model_get_n_items(section)); } else { EXPECT_EQ(1, g_menu_model_get_n_items(section)); gchar* str = nullptr; g_menu_model_get_item_attribute(section, 0, G_MENU_ATTRIBUTE_ACTION, "s", &str); EXPECT_EQ(expected_action, str); g_clear_pointer(&str, g_free); } g_clear_object(§ion); g_object_unref(submenu); } }; TEST_F(MenuFixture, HelloWorld) { EXPECT_EQ(Menu::NUM_PROFILES, m_menus.size()); for (int i=0; imenu_model() != nullptr); EXPECT_EQ(i, m_menus[i]->profile()); } EXPECT_EQ(m_menus[Menu::Desktop]->name(), "desktop"); } TEST_F(MenuFixture, Header) { for(auto& menu : m_menus) InspectHeader(menu->menu_model(), menu->name()); } TEST_F(MenuFixture, Sections) { for(auto& menu : m_menus) { // check that the header has a submenu auto menu_model = menu->menu_model(); auto submenu = g_menu_model_get_item_link(menu_model, 0, G_MENU_LINK_SUBMENU); EXPECT_TRUE(submenu != nullptr); EXPECT_EQ(Menu::NUM_SECTIONS, g_menu_model_get_n_items(submenu)); g_object_unref(submenu); } } TEST_F(MenuFixture, Calendar) { m_state->settings->show_calendar.set(true); for(auto& menu : m_menus) InspectCalendar(menu->menu_model(), menu->profile()); m_state->settings->show_calendar.set(false); for(auto& menu : m_menus) InspectCalendar(menu->menu_model(), menu->profile()); } TEST_F(MenuFixture, Appointments) { for(auto& menu : m_menus) InspectAppointments(menu->menu_model(), menu->profile()); // toggle can_open_planner() and test the desktop again // to confirm that the "Add Event…" menuitem appears iff // there's a calendar available user-agent m_mock_actions->set_desktop_has_calendar_app (!m_actions->desktop_has_calendar_app()); std::shared_ptr menu = m_menu_factory->buildMenu(Menu::Desktop); InspectAppointments(menu->menu_model(), menu->profile()); } TEST_F(MenuFixture, Locations) { for(auto& menu : m_menus) InspectLocations(menu->menu_model(), menu->profile()); } TEST_F(MenuFixture, Settings) { for(auto& menu : m_menus) InspectSettings(menu->menu_model(), menu->profile()); } ayatana-indicator-datetime-25.4.0/tests/test-notification.cpp0000644000000000000000000001723414773244555021212 0ustar /* * Copyright 2014-2016 Canonical Ltd. * Copyright 2021 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include "notification-fixture.h" /*** **** ***/ using namespace ayatana::indicator::datetime; namespace { static constexpr char const * APP_NAME {"indicator-datetime-service"}; gboolean quit_idle (gpointer gloop) { g_main_loop_quit(static_cast(gloop)); return G_SOURCE_REMOVE; } } /*** **** ***/ TEST_F(NotificationFixture,Notification) { // Feed different combinations of system settings, // indicator-datetime settings, and event types, // then see if notifications and haptic feedback behave as expected. auto settings = std::make_shared(); auto ne = std::make_shared(APP_NAME); auto sb = std::make_shared(); auto func = [this](const Appointment&, const Alarm&, const Snap::Response&){g_idle_add(quit_idle, loop);}; // combinatorial factor #1: event type struct { Appointment appt; const char* icon_name; const char* prefix; bool expected_notify_called; bool expected_vibrate_called; } test_appts[] = { { appt, "calendar-app", "Event", true, true }, { ualarm, "alarm-clock", "Alarm", true, true } }; // combinatorial factor #2: indicator-datetime's haptic mode struct { const char* haptic_mode; bool expected_notify_called; bool expected_vibrate_called; } test_haptics[] = { { "none", true, false }, { "pulse", true, true } }; // combinatorial factor #3: system settings' "other vibrations" enabled struct { bool other_vibrations; bool expected_notify_called; bool expected_vibrate_called; } test_other_vibrations[] = { { true, true, true }, { false, true, false } }; // combinatorial factor #4: system settings' notifications disabled struct { bool cal_notification_enabled; // calendar app can trigger notifications std::set expected_notify_called; // do we expect the notification to show? std::set expected_vibrate_called; // do we expect the phone to vibrate? } test_cal_disabled[] = { { true, std::set{ Appointment::Type::ALARM, Appointment::Type::EVENT }, std::set{ Appointment::Type::ALARM, Appointment::Type::EVENT } }, { false, std::set{ Appointment::Type::ALARM }, std::set{ Appointment::Type::ALARM } } }; for (const auto& test_appt : test_appts) { for (const auto& test_haptic : test_haptics) { for (const auto& test_vibes : test_other_vibrations) { for (const auto& test_disabled : test_cal_disabled) { const bool expected_notify_called = test_appt.expected_notify_called && test_vibes.expected_notify_called && (test_disabled.expected_notify_called.count(test_appt.appt.type) > 0) && test_haptic.expected_notify_called; const bool expected_vibrate_called = test_appt.expected_vibrate_called && test_vibes.expected_vibrate_called && (test_disabled.expected_vibrate_called.count(test_appt.appt.type) > 0) && test_haptic.expected_vibrate_called; // set test case properties: cal_notification_enabled settings->cal_notification_enabled.set(test_disabled.cal_notification_enabled); settings->cal_notification_sounds.set(test_disabled.cal_notification_enabled); settings->cal_notification_vibrations.set(test_disabled.cal_notification_enabled); settings->cal_notification_bubbles.set(test_disabled.cal_notification_enabled); settings->cal_notification_list.set(test_disabled.cal_notification_enabled); // set test case properties: haptic mode settings->alarm_haptic.set(test_haptic.haptic_mode); // set test case properties: other-vibrations flag // (and wait for the PropertiesChanged signal so we know the dbusmock got it) GError * error {}; dbus_test_dbus_mock_object_update_property(as_mock, as_obj, PROP_OTHER_VIBRATIONS, g_variant_new_boolean(test_vibes.other_vibrations), &error); g_assert_no_error(error); // wait for previous iterations' bus noise to finish and reset the counters wait_msec(500); dbus_test_dbus_mock_object_clear_method_calls(haptic_mock, haptic_obj, &error); dbus_test_dbus_mock_object_clear_method_calls(notify_mock, notify_obj, &error); g_assert_no_error(error); // run the test auto snap = create_snap(ne, sb, settings); (*snap)(test_appt.appt, appt.alarms.front(), func); // confirm that the notification was as expected if (expected_notify_called) { EXPECT_METHOD_CALLED_EVENTUALLY(notify_mock, notify_obj, METHOD_NOTIFY); } else { EXPECT_METHOD_NOT_CALLED_EVENTUALLY(notify_mock, notify_obj, METHOD_NOTIFY); } // confirm that the vibration was as expected if (expected_vibrate_called) { EXPECT_METHOD_CALLED_EVENTUALLY(haptic_mock, haptic_obj, HAPTIC_METHOD_VIBRATE); } else { EXPECT_METHOD_NOT_CALLED_EVENTUALLY(haptic_mock, haptic_obj, HAPTIC_METHOD_VIBRATE); } // confirm that the notification was as expected guint num_notify_calls = 0; const auto notify_calls = dbus_test_dbus_mock_object_get_method_calls(notify_mock, notify_obj, METHOD_NOTIFY, &num_notify_calls, &error); g_assert_no_error(error); if (num_notify_calls > 0) { // test that Notify was called with the app_name const gchar* app_name {nullptr}; g_variant_get_child(notify_calls[0].params, 0, "&s", &app_name); ASSERT_STREQ(APP_NAME, app_name); // test that Notify was called with the type-appropriate icon const gchar* icon_name {nullptr}; g_variant_get_child(notify_calls[0].params, 2, "&s", &icon_name); ASSERT_STREQ(test_appt.icon_name, icon_name); // test that the Notification title has the correct prefix const gchar* title {nullptr}; g_variant_get_child(notify_calls[0].params, 3, "&s", &title); ASSERT_TRUE(g_str_has_prefix(title, test_appt.prefix)); // test that Notify was called with the appointment's body const gchar* body {nullptr}; g_variant_get_child(notify_calls[0].params, 4, "&s", &body); ASSERT_STREQ(test_appt.appt.summary.c_str(), body); } } } } } } ayatana-indicator-datetime-25.4.0/tests/test-notification-response.cpp0000644000000000000000000001143614773244555023044 0ustar /* * Copyright 2014-2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include #include #include #include "notification-fixture.h" /*** **** ***/ using namespace ayatana::indicator::datetime; namespace { static constexpr char const * APP_NAME {"indicator-datetime-service"}; gboolean quit_idle (gpointer gloop) { g_main_loop_quit(static_cast(gloop)); return G_SOURCE_REMOVE; } } /*** **** ***/ TEST_F(NotificationFixture,Response) { // create the world mock_capabilities(); auto ne = std::make_shared(APP_NAME); auto sb = std::make_shared(); auto settings = std::make_shared(); int next_notification_id {FIRST_NOTIFY_ID}; // set a response callback that remembers what response we got bool on_response_called {}; Snap::Response response {}; auto on_response = [this, &on_response_called, &response] (const Appointment&, const Alarm&, const Snap::Response& r){ on_response_called = true; response = r; g_idle_add(quit_idle, loop); }; // our tests! const struct { Appointment appt; std::vector expected_actions; std::string action; Snap::Response expected_response; } tests[] = { { appt, {"show-app"}, "show-app", Snap::Response::ShowApp }, { ualarm, {"none", "snooze"}, "snooze", Snap::Response::Snooze }, { ualarm, {"none", "snooze"}, "none", Snap::Response::None } }; settings->cal_notification_enabled.set(true); settings->cal_notification_sounds.set(true); settings->cal_notification_vibrations.set(true); settings->cal_notification_bubbles.set(true); settings->cal_notification_list.set(true); // walk through the tests for (const auto& test : tests) { // wait for previous iterations' bus noise to finish and reset the counters GError* error {}; wait_msec(500); dbus_test_dbus_mock_object_clear_method_calls(notify_mock, notify_obj, &error); g_assert_no_error(error); on_response_called = false; // create a snap decision auto snap = create_snap(ne, sb, settings); (*snap)(test.appt, test.appt.alarms.front(), on_response); // wait for the notification to show up EXPECT_METHOD_CALLED_EVENTUALLY(notify_mock, notify_obj, METHOD_NOTIFY); // test that Notify was called the right number of times static constexpr int expected_num_notify_calls {1}; guint num_notify_calls {}; const auto notify_calls = dbus_test_dbus_mock_object_get_method_calls( notify_mock, notify_obj, METHOD_NOTIFY, &num_notify_calls, &error); g_assert_no_error(error); EXPECT_EQ(expected_num_notify_calls, num_notify_calls); // test that Notify was called with the correct list of actions if (num_notify_calls > 0) { std::vector actions; const gchar** as {nullptr}; g_variant_get_child(notify_calls[0].params, 5, "^a&s", &as); for (int i=0; as && as[i]; i+=2) // actions are in pairs of (name, i18n), skip the i18n actions.push_back(as[i]); EXPECT_EQ(test.expected_actions, actions); } // make the notification mock tell the world that the user invoked an action const auto notification_id = next_notification_id++; idle_add([this, notification_id, test](){ GError* err {}; dbus_test_dbus_mock_object_emit_signal(notify_mock, notify_obj, "ActionInvoked", G_VARIANT_TYPE("(us)"), g_variant_new("(us)", guint(notification_id), test.action.c_str()), &err); dbus_test_dbus_mock_object_emit_signal(notify_mock, notify_obj, "NotificationClosed", G_VARIANT_TYPE("(uu)"), g_variant_new("(uu)", guint(notification_id), guint(NOTIFICATION_CLOSED_DISMISSED)), &err); g_assert_no_error(err); return G_SOURCE_REMOVE; }); // confirm that the response callback got the right response EXPECT_TRUE(wait_for([&on_response_called](){return on_response_called;})); EXPECT_EQ(int(test.expected_response), int(response)) << "notification_id " << notification_id; } } ayatana-indicator-datetime-25.4.0/tests/test-planner.cpp0000644000000000000000000000336514773244555020163 0ustar /* * Copyright 2013 Canonical Ltd. * * Authors: * Charles Kerr * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "glib-fixture.h" #include "timezone-mock.h" #include #include #include #include #include #include #include using namespace ayatana::indicator::datetime; /*** **** ***/ typedef GlibFixture PlannerFixture; TEST_F(PlannerFixture, HelloWorld) { auto halloween = DateTime::Local(2020, 10, 31, 18, 30, 59); auto christmas = DateTime::Local(2020, 12, 25, 0, 0, 0); Appointment a; a.summary = "Test"; a.begin = halloween; a.end = a.begin.add_full(0,0,0,1,0,0); const Appointment b = a; a.summary = "Foo"; EXPECT_EQ(a.summary, "Foo"); EXPECT_EQ(b.summary, "Test"); EXPECT_EQ(a.begin, b.begin); EXPECT_EQ(a.end, b.end); Appointment c; c.begin = christmas; c.end = c.begin.add_days(1); Appointment d; d = c; EXPECT_EQ(c.begin, d.begin); EXPECT_EQ(c.end, d.end); a = d; EXPECT_EQ(d.begin, a.begin); EXPECT_EQ(d.end, a.end); } ayatana-indicator-datetime-25.4.0/tests/test-settings.cpp0000644000000000000000000002113514773244555020357 0ustar /* * Copyright 2013 Canonical Ltd. * * Authors: * Charles Kerr * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "glib-fixture.h" #include #include extern "C" { #include } using namespace ayatana::indicator::datetime; /*** **** ***/ class SettingsFixture: public GlibFixture { private: typedef GlibFixture super; protected: std::shared_ptr m_live; std::shared_ptr m_settings; GSettings * m_gsettings {}; GSettings * m_gsettings_cal_notification {}; void SetUp() override { super::SetUp(); m_gsettings = g_settings_new(SETTINGS_INTERFACE); GSettingsSchemaSource *pSource = g_settings_schema_source_get_default(); GSettingsSchema *pSchema = g_settings_schema_source_lookup(pSource, SETTINGS_NOTIFY_SCHEMA_ID, TRUE); if (pSchema != NULL) { g_settings_schema_unref(pSchema); m_gsettings_cal_notification = g_settings_new_with_path(SETTINGS_NOTIFY_SCHEMA_ID, SETTINGS_NOTIFY_CALENDAR_PATH); } else { m_gsettings_cal_notification = NULL; } m_live.reset(new LiveSettings); m_settings = std::dynamic_pointer_cast(m_live); } void TearDown() override { g_clear_object(&m_gsettings_cal_notification); g_clear_object(&m_gsettings); m_settings.reset(); m_live.reset(); super::TearDown(); } void TestBoolProperty(GSettings* gsettings, core::Property& property, const gchar* key) { EXPECT_EQ(g_settings_get_boolean(gsettings, key), property.get()); g_settings_set_boolean(gsettings, key, false); EXPECT_FALSE(property.get()); g_settings_set_boolean(gsettings, key, true); EXPECT_TRUE(property.get()); property.set(false); EXPECT_FALSE(g_settings_get_boolean(gsettings, key)); property.set(true); EXPECT_TRUE(g_settings_get_boolean(gsettings, key)); } void TestStringProperty(GSettings* gsettings, core::Property& property, const gchar* key) { gchar* tmp; std::string str; tmp = g_settings_get_string(gsettings, key); EXPECT_EQ(tmp, property.get()); g_clear_pointer(&tmp, g_free); str = "a"; g_settings_set_string(gsettings, key, str.c_str()); EXPECT_EQ(str, property.get()); str = "b"; g_settings_set_string(gsettings, key, str.c_str()); EXPECT_EQ(str, property.get()); str = "a"; property.set(str); tmp = g_settings_get_string(gsettings, key); EXPECT_EQ(str, tmp); g_clear_pointer(&tmp, g_free); str = "b"; property.set(str); tmp = g_settings_get_string(gsettings, key); EXPECT_EQ(str, tmp); g_clear_pointer(&tmp, g_free); } void TestUIntProperty(GSettings* gsettings, core::Property& property, const gchar* key) { EXPECT_EQ(g_settings_get_uint(gsettings, key), property.get()); unsigned int expected_values[] = { 1, 2, 3 }; // modify GSettings and confirm that the new value is propagated for(const auto& expected_value : expected_values) { g_settings_set_uint(gsettings, key, expected_value); EXPECT_EQ(expected_value, property.get()); EXPECT_EQ(expected_value, g_settings_get_uint(gsettings, key)); } // modify the property and confirm that the new value is propagated for(const auto& expected_value : expected_values) { property.set(expected_value); EXPECT_EQ(expected_value, property.get()); EXPECT_EQ(expected_value, g_settings_get_uint(gsettings, key)); } } }; /*** **** ***/ TEST_F(SettingsFixture, HelloWorld) { EXPECT_TRUE(true); } TEST_F(SettingsFixture, BoolProperties) { TestBoolProperty(m_gsettings, m_settings->show_seconds, SETTINGS_SHOW_SECONDS_S); TestBoolProperty(m_gsettings, m_settings->show_calendar, SETTINGS_SHOW_CALENDAR_S); TestBoolProperty(m_gsettings, m_settings->show_date, SETTINGS_SHOW_DATE_S); TestBoolProperty(m_gsettings, m_settings->show_day, SETTINGS_SHOW_DAY_S); TestBoolProperty(m_gsettings, m_settings->show_detected_location, SETTINGS_SHOW_DETECTED_S); TestBoolProperty(m_gsettings, m_settings->show_events, SETTINGS_SHOW_EVENTS_S); TestBoolProperty(m_gsettings, m_settings->show_locations, SETTINGS_SHOW_LOCATIONS_S); TestBoolProperty(m_gsettings, m_settings->show_week_numbers, SETTINGS_SHOW_WEEK_NUMBERS_S); TestBoolProperty(m_gsettings, m_settings->show_year, SETTINGS_SHOW_YEAR_S); } TEST_F(SettingsFixture, UIntProperties) { TestUIntProperty(m_gsettings, m_settings->alarm_duration, SETTINGS_ALARM_DURATION_S); TestUIntProperty(m_gsettings, m_settings->alarm_volume, SETTINGS_ALARM_VOLUME_S); TestUIntProperty(m_gsettings, m_settings->snooze_duration, SETTINGS_SNOOZE_DURATION_S); } TEST_F(SettingsFixture, StringProperties) { TestStringProperty(m_gsettings, m_settings->custom_time_format, SETTINGS_CUSTOM_TIME_FORMAT_S); TestStringProperty(m_gsettings, m_settings->timezone_name, SETTINGS_TIMEZONE_NAME_S); TestStringProperty(m_gsettings, m_settings->alarm_sound, SETTINGS_ALARM_SOUND_S); TestStringProperty(m_gsettings, m_settings->calendar_sound, SETTINGS_CALENDAR_SOUND_S); TestStringProperty(m_gsettings, m_settings->alarm_haptic, SETTINGS_ALARM_HAPTIC_S); } TEST_F(SettingsFixture, TimeFormatMode) { const auto key = SETTINGS_TIME_FORMAT_S; const TimeFormatMode modes[] = { TIME_FORMAT_MODE_LOCALE_DEFAULT, TIME_FORMAT_MODE_12_HOUR, TIME_FORMAT_MODE_24_HOUR, TIME_FORMAT_MODE_CUSTOM }; for(const auto& mode : modes) { g_settings_set_enum(m_gsettings, key, mode); EXPECT_EQ(mode, m_settings->time_format_mode.get()); } for(const auto& mode : modes) { m_settings->time_format_mode.set(mode); EXPECT_EQ(mode, g_settings_get_enum(m_gsettings, key)); } } namespace { std::vector strv_to_vector(const gchar** strv) { std::vector v; for(int i=0; strv && strv[i]; i++) v.push_back(strv[i]); return v; } }; TEST_F(SettingsFixture, Locations) { const auto key = SETTINGS_LOCATIONS_S; const gchar* astrv[] = {"America/Los_Angeles Oakland", "America/Chicago Oklahoma City", "Europe/London London", nullptr}; const gchar* bstrv[] = {"America/Denver", "Europe/London London", "Europe/Berlin Berlin", nullptr}; const std::vector av = strv_to_vector(astrv); const std::vector bv = strv_to_vector(bstrv); g_settings_set_strv(m_gsettings, key, astrv); EXPECT_EQ(av, m_settings->locations.get()); g_settings_set_strv(m_gsettings, key, bstrv); EXPECT_EQ(bv, m_settings->locations.get()); m_settings->locations.set(av); auto tmp = g_settings_get_strv(m_gsettings, key); auto vtmp = strv_to_vector((const gchar**)tmp); g_strfreev(tmp); EXPECT_EQ(av, vtmp); m_settings->locations.set(bv); tmp = g_settings_get_strv(m_gsettings, key); vtmp = strv_to_vector((const gchar**)tmp); g_strfreev(tmp); EXPECT_EQ(bv, vtmp); } TEST_F(SettingsFixture, MutedApps) { if (!m_gsettings_cal_notification) { return; } TestBoolProperty(m_gsettings_cal_notification, m_settings->cal_notification_enabled, SETTINGS_NOTIFY_ENABLED_KEY); TestBoolProperty(m_gsettings_cal_notification, m_settings->cal_notification_sounds, SETTINGS_NOTIFY_SOUNDS_KEY); TestBoolProperty(m_gsettings_cal_notification, m_settings->cal_notification_vibrations, SETTINGS_NOTIFY_VIBRATIONS_KEY); TestBoolProperty(m_gsettings_cal_notification, m_settings->cal_notification_bubbles, SETTINGS_NOTIFY_BUBBLES_KEY); TestBoolProperty(m_gsettings_cal_notification, m_settings->cal_notification_list, SETTINGS_NOTIFY_LIST_KEY); } ayatana-indicator-datetime-25.4.0/tests/test-sound.cpp0000644000000000000000000001446714773244555017661 0ustar /* * Copyright 2014-2016 Canonical Ltd. * Copyright 2023 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include #include #include #include "notification-fixture.h" using namespace ayatana::indicator::datetime; namespace uin = ayatana::indicator::notifications; /*** **** ***/ namespace { static constexpr char const * APP_NAME {"indicator-datetime-service"}; } namespace { gboolean quit_idle (gpointer gloop) { g_main_loop_quit(static_cast(gloop)); return G_SOURCE_REMOVE; }; class SoundNotificationFixture : public NotificationFixture { }; } /*** **** ***/ TEST_F(SoundNotificationFixture, InteractiveDuration) { static constexpr int duration_minutes = 120; auto settings = std::make_shared(); settings->alarm_duration.set(duration_minutes); auto ne = std::make_shared(APP_NAME); auto sb = std::make_shared(); auto snap = create_snap(ne, sb, settings); settings->cal_notification_enabled.set(true); settings->cal_notification_sounds.set(true); settings->cal_notification_vibrations.set(true); settings->cal_notification_bubbles.set(true); settings->cal_notification_list.set(true); #ifdef LOMIRI_FEATURES_ENABLED /* Here both values true|false should succeed. */ mock_capabilities(true); #else mock_capabilities(false); #endif // call the Snap Decision auto func = [this](const Appointment&, const Alarm&, const Snap::Response&){g_idle_add(quit_idle, loop);}; (*snap)(appt, appt.alarms.front(), func); // confirm that Notify got called once guint len = 0; GError * error = nullptr; const auto calls = dbus_test_dbus_mock_object_get_method_calls (notify_mock, notify_obj, METHOD_NOTIFY, &len, &error); g_assert_no_error(error); ASSERT_EQ(1, len); // confirm that the app_name passed to Notify was APP_NAME const auto& params = calls[0].params; ASSERT_EQ(8, g_variant_n_children(params)); const char * str = nullptr; g_variant_get_child (params, 0, "&s", &str); ASSERT_STREQ(APP_NAME, str); // confirm that the icon passed to Notify was "calendar-app" g_variant_get_child (params, 2, "&s", &str); ASSERT_STREQ("calendar-app", str); // confirm that the timeout passed to Notify matches duration_minutes int32_t i32; g_variant_get_child (params, 7, "i", &i32); const auto duration = std::chrono::minutes(duration_minutes); EXPECT_EQ(std::chrono::duration_cast(duration).count(), i32); #ifdef LOMIRI_FEATURES_ENABLED /* If setting mock_capabilities to false, set the below to false, as well. */ if (true) { // Due to custom logic in Lomiri, also make sure custom timeout hint is set. bool b; auto hints = g_variant_get_child_value (params, 6); i32 = 0; b = g_variant_lookup (hints, HINT_LOMIRI_TIMEOUT, "i", &i32); EXPECT_TRUE(b); EXPECT_EQ(std::chrono::duration_cast(duration).count(), i32); g_variant_unref(hints); } #endif ne.reset(); } /*** **** ***/ /** * A DefaultSoundBuilder wrapper which remembers the parameters of the last sound created. */ class TestSoundBuilder: public uin::SoundBuilder { public: TestSoundBuilder() =default; ~TestSoundBuilder() =default; virtual std::shared_ptr create(const std::string& role, const std::string& uri, unsigned int volume, bool loop) override { m_role = role; m_uri = uri; m_volume = volume; m_loop = loop; return m_impl.create(role, uri, volume, loop); } const std::string& role() { return m_role; } const std::string& uri() { return m_uri; } unsigned int volume() { return m_volume; } bool loop() { return m_loop; } private: std::string m_role; std::string m_uri; unsigned int m_volume; bool m_loop; uin::DefaultSoundBuilder m_impl; }; std::string path_to_uri_if_exists(const std::string& path) { std::string uri; auto file = g_file_new_for_path(path.c_str()); if (g_file_query_exists(file, /* cancellable */ nullptr)) { auto uri_cstr = g_file_get_uri(file); uri = std::string(uri_cstr); g_free(uri_cstr); } g_clear_pointer(&file, g_object_unref); return uri; } TEST_F(NotificationFixture,DefaultSounds) { auto settings = std::make_shared(); auto ne = std::make_shared(APP_NAME); auto sb = std::make_shared(); auto func = [this](const Appointment&, const Alarm&, const Snap::Response&){g_idle_add(quit_idle, loop);}; settings->cal_notification_enabled.set(true); settings->cal_notification_sounds.set(true); settings->cal_notification_vibrations.set(true); settings->cal_notification_bubbles.set(true); settings->cal_notification_list.set(true); const struct { Appointment appointment; std::string expected_role; std::string expected_uri; } test_cases[] = { { ualarm, "alarm", path_to_uri_if_exists(ALARM_DEFAULT_SOUND) } // No sound for appointments // { appt, "alert", path_to_uri_if_exists(CALENDAR_DEFAULT_SOUND) } }; auto snap = create_snap(ne, sb, settings); for(const auto& test_case : test_cases) { (*snap)(test_case.appointment, test_case.appointment.alarms.front(), func); EXPECT_EQ(test_case.expected_uri, sb->uri()); EXPECT_EQ(test_case.expected_role, sb->role()); } } ayatana-indicator-datetime-25.4.0/tests/test-timezone-geoclue.cpp0000644000000000000000000000305214773244555021770 0ustar /* * Copyright 2013 Canonical Ltd. * * Authors: * Charles Kerr * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "geoclue-fixture.h" #include using ayatana::indicator::datetime::GeoclueTimezone; // This test looks small because the interesting // work is all happening in GeoclueFixture... TEST_F(GeoclueFixture, ChangeDetected) { GeoclueTimezone tz; wait_msec(500); // wait for the bus to get set up EXPECT_EQ(timezone_1, tz.timezone.get()); // Start listening for a timezone change, then change the timezone. bool changed = false; auto connection = tz.timezone.changed().connect( [&changed, this](const std::string& s){ g_debug("timezone changed to %s", s.c_str()); changed = true; g_main_loop_quit(loop); }); const std::string timezone_2 = "America/Chicago"; setGeoclueTimezoneOnIdle(timezone_2); g_main_loop_run(loop); EXPECT_EQ(timezone_2, tz.timezone.get()); } ayatana-indicator-datetime-25.4.0/tests/test-timezones.cpp0000644000000000000000000000725414773244555020542 0ustar /* * Copyright 2013 Canonical Ltd. * Copyright 2025 Robert Tari * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Robert Tari */ #include "geoclue-fixture.h" #include "timezone-mock.h" #include #include #include #include // std::shared_ptr #include // fopen() #include // sync() using namespace ayatana::indicator::datetime; typedef GeoclueFixture TimezonesFixture; #define TIMEZONE_FILE (SANDBOX "/timezone") namespace { /* convenience func to set the timezone file */ void set_file(const std::string& text) { auto fp = fopen(TIMEZONE_FILE, "w+"); if (fp) { fprintf(fp, "%s\n", text.c_str()); fclose(fp); sync(); } } } TEST_F(TimezonesFixture, ManagerTest) { std::string timezone_file = "America/New_York"; std::string timezone_geo = "America/Denver"; set_file(timezone_file); auto settings = std::make_shared(); auto timezone = std::make_shared(timezone_file); LiveTimezones z(settings, timezone); wait_msec(500); // wait for the bus to get set up EXPECT_EQ(timezone_file, z.timezone.get()); auto zones = z.timezones.get(); //std::set zones = z.timezones.get(); EXPECT_EQ(1, zones.size()); EXPECT_EQ(1, zones.count(timezone_file)); bool zone_changed = false; auto zone_connection = z.timezone.changed().connect([&zone_changed, this](const std::string&) { zone_changed = true; g_main_loop_quit(loop); }); // start listening for a timezone change, then change the timezone bool zones_changed = false; auto zones_connection = z.timezones.changed().connect([&zones_changed, &zones, this](const std::set& timezones) { zones_changed = true; zones = timezones; g_main_loop_quit(loop); }); g_idle_add([](gpointer s_in) { auto s = static_cast(s_in); g_message("geolocation was %d", (int)s->show_detected_location.get()); g_message("turning geolocation on"); s->show_detected_location.set(true); return G_SOURCE_REMOVE; }, settings.get()); // turn on geoclue during the idle... this should add timezone_1 to the 'timezones' property g_main_loop_run(loop); EXPECT_TRUE(zones_changed); EXPECT_EQ(timezone_file, z.timezone.get()); EXPECT_EQ(2, zones.size()); EXPECT_EQ(1, zones.count(timezone_file)); EXPECT_EQ(1, zones.count(timezone_geo)); zones_changed = false; // now tweak the geoclue value... the geoclue-detected timezone should change, // causing the 'timezones' property to change zone_changed = false; zones_changed = false; timezone_geo = "America/Chicago"; setGeoclueTimezoneOnIdle(timezone_geo); g_main_loop_run(loop); EXPECT_FALSE(zone_changed); EXPECT_TRUE(zones_changed); EXPECT_EQ(timezone_file, z.timezone.get()); EXPECT_EQ(2, zones.size()); EXPECT_EQ(1, zones.count(timezone_file)); EXPECT_EQ(1, zones.count(timezone_geo)); } ayatana-indicator-datetime-25.4.0/tests/test-timezone-timedated.cpp0000644000000000000000000000433314773244555022310 0ustar /* * Copyright © 2014-2016 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr * Ted Gould */ #include "timedated-fixture.h" #include using namespace ayatana::indicator::datetime; using TestTimedatedFixture = TimedatedFixture; /*** **** ***/ TEST_F(TestTimedatedFixture, HelloWorld) { } /** * Test that the tzid is right if timedated isn't available */ TEST_F(TestTimedatedFixture, DefaultTimezone) { const std::string expected_tzid{"Etc/Utc"}; TimedatedTimezone tmp {m_bus}; EXPECT_TZID(expected_tzid, tmp); } /** * Test that the tzid is right if timedated shows BEFORE we start */ TEST_F(TestTimedatedFixture, Timedate1First) { const std::string expected_tzid{"America/Chicago"}; start_timedate1(expected_tzid); TimedatedTimezone tmp {m_bus}; EXPECT_TZID(expected_tzid, tmp); } /** * Test that the tzid is right if timedated shows AFTER we start */ TEST_F(TestTimedatedFixture, Timedate1Last) { const std::string expected_tzid("America/Los_Angeles"); TimedatedTimezone tmp {m_bus}; start_timedate1(expected_tzid); EXPECT_TZID(expected_tzid, tmp); } /** * Test that the tzid is right if timedated's property changes */ TEST_F(TestTimedatedFixture, TimezoneChange) { const std::vector expected_tzids{"America/Los_Angeles", "America/Chicago", "Etc/Utc"}; TimedatedTimezone tmp {m_bus}; start_timedate1("America/New_York"); for(const auto& expected_tzid : expected_tzids) { set_timedate1_timezone(expected_tzid); EXPECT_TZID(expected_tzid, tmp); } } ayatana-indicator-datetime-25.4.0/tests/test-utils.cpp0000644000000000000000000000625214773244555017662 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #include #include #include TEST(UtilsTest, SplitSettingsLocation) { struct { const char* location; const char* expected_zone; const char* expected_name; } test_cases[] = { { "America/Chicago Chicago", "America/Chicago", "Chicago" }, { "America/Chicago Oklahoma City", "America/Chicago", "Oklahoma City" }, { "America/Los_Angeles", "America/Los_Angeles", "Los Angeles" }, { "America/Los_Angeles ", "America/Los_Angeles", "Los Angeles" }, { " America/Los_Angeles", "America/Los_Angeles", "Los Angeles" }, { " America/Los_Angeles ", "America/Los_Angeles", "Los Angeles" }, { "UTC UTC", "UTC", "UTC" } }; for(const auto& test_case : test_cases) { char * zone = nullptr; char * name = nullptr; split_settings_location(test_case.location, &zone, &name); ASSERT_STREQ(test_case.expected_zone, zone); ASSERT_STREQ(test_case.expected_name, name); g_free(zone); g_free(name); } } namespace { struct { const char* timezone; const char* location; const char* expected_name; } beautify_timezone_test_cases[] = { { "America/Chicago", "", "Chicago" }, { "America/Chicago", "America/Chicago", "Chicago" }, { "America/Chicago", "America/Chigago Chicago", "Chicago" }, { "America/Chicago", "America/Chicago Oklahoma City", "Oklahoma City" }, { "America/Chicago", "Europe/London London", "Chicago" } }; } TEST(UtilsTest, BeautifulTimezoneName) { for(const auto& test_case : beautify_timezone_test_cases) { auto name = get_beautified_timezone_name(test_case.timezone, test_case.location); EXPECT_STREQ(test_case.expected_name, name); g_free(name); } } TEST(UtilsTest, GetTimezonename) { // set up a local GSettings g_assert(g_setenv("GSETTINGS_SCHEMA_DIR", SCHEMA_DIR, true)); g_assert(g_setenv("GSETTINGS_BACKEND", "memory", true)); g_debug("SCHEMA_DIR is %s", SCHEMA_DIR); auto settings = g_settings_new(SETTINGS_INTERFACE); for(const auto& test_case : beautify_timezone_test_cases) { g_settings_set_string(settings, SETTINGS_TIMEZONE_NAME_S, test_case.location); auto name = get_timezone_name (test_case.timezone, settings); EXPECT_STREQ(test_case.expected_name, name); g_free(name); } g_clear_object(&settings); } ayatana-indicator-datetime-25.4.0/tests/timedated-fixture.h0000644000000000000000000001043014773244555020627 0ustar /* * Copyright 2013 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #pragma once #include #include "glib-fixture.h" #include #include /*** **** ***/ struct TimedatedFixture: public GlibFixture { private: using super = GlibFixture; protected: GDBusConnection* m_bus {}; GTestDBus* m_test_bus {}; virtual void SetUp() override { super::SetUp(); // use a fake bus m_test_bus = g_test_dbus_new(G_TEST_DBUS_NONE); g_test_dbus_up(m_test_bus); const char * address = g_test_dbus_get_bus_address(m_test_bus); g_setenv("DBUS_SYSTEM_BUS_ADDRESS", address, true); g_setenv("DBUS_SESSION_BUS_ADDRESS", address, true); g_debug("test_dbus's address is %s", address); // get the bus m_bus = g_bus_get_sync(G_BUS_TYPE_SESSION, nullptr, nullptr); g_dbus_connection_set_exit_on_close(m_bus, FALSE); g_object_add_weak_pointer(G_OBJECT(m_bus), (gpointer*)&m_bus); } virtual void TearDown() override { g_clear_object(&m_bus); g_clear_object(&m_test_bus); super::TearDown(); } void start_timedate1(const std::string& tzid) { // start dbusmock with the timedated template auto json_parameters = g_strdup_printf("{\"Timezone\": \"%s\"}", tzid.c_str()); const gchar* child_argv[] = { "python3", "-m", "dbusmock", "--template", "timedated", "--parameters", json_parameters, nullptr }; GError* error = nullptr; g_spawn_async(nullptr, (gchar**)child_argv, nullptr, G_SPAWN_SEARCH_PATH, nullptr, nullptr, nullptr, &error); g_assert_no_error(error); g_free(json_parameters); // wait for it to appear on the bus wait_for_name_owned(m_bus, Bus::Timedate1::BUSNAME); } bool wait_for_tzid(const std::string& tzid, ayatana::indicator::datetime::Timezone& tz) { return wait_for([&tzid, &tz](){return tzid == tz.timezone.get();}); } void set_timedate1_timezone(const std::string& tzid) { GError* error {}; auto v = g_dbus_connection_call_sync( m_bus, Bus::Timedate1::BUSNAME, Bus::Timedate1::ADDR, Bus::Timedate1::IFACE, Bus::Timedate1::Methods::SET_TIMEZONE, g_variant_new("(sb)", tzid.c_str(), FALSE), nullptr, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, &error); g_assert_no_error(error); g_clear_pointer(&v, g_variant_unref); } std::string get_timedate1_timezone() { GError* error {}; auto v = g_dbus_connection_call_sync( m_bus, Bus::Timedate1::BUSNAME, Bus::Timedate1::ADDR, Bus::Properties::IFACE, Bus::Properties::Methods::GET, g_variant_new("(ss)", Bus::Timedate1::IFACE, Bus::Timedate1::Properties::TIMEZONE), G_VARIANT_TYPE("(v)"), G_DBUS_CALL_FLAGS_NONE, -1, nullptr, &error); g_assert_no_error(error); GVariant* tzv {}; g_variant_get(v, "(v)", &tzv); std::string tzid; const char* tz = g_variant_get_string(tzv, nullptr); if (tz != nullptr) tzid = tz; g_clear_pointer(&tzv, g_variant_unref); g_clear_pointer(&v, g_variant_unref); return tzid; } }; #define EXPECT_TZID(expected_tzid, tmp) \ EXPECT_TRUE(wait_for_tzid(expected_tzid, tmp)) \ << "expected " << expected_tzid \ << " got " << tmp.timezone.get(); ayatana-indicator-datetime-25.4.0/tests/timezone-mock.h0000644000000000000000000000225414773244555017771 0ustar /* * Copyright 2014 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_TIMEZONE_MOCK_H #define INDICATOR_DATETIME_TIMEZONE_MOCK_H #include namespace ayatana { namespace indicator { namespace datetime { class MockTimezone: public Timezone { public: MockTimezone() =default; explicit MockTimezone(const std::string& zone) {timezone.set(zone);} ~MockTimezone() =default; }; } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_TIMEZONE_MOCK_H ayatana-indicator-datetime-25.4.0/tests/wakeup-timer-mock.h0000644000000000000000000000361614773244555020554 0ustar /* * Copyright 2015 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3, as published * by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . * * Authors: * Charles Kerr */ #ifndef INDICATOR_DATETIME_WAKEUP_TIMER_MOCK_H #define INDICATOR_DATETIME_WAKEUP_TIMER_MOCK_H #include #include namespace ayatana { namespace indicator { namespace datetime { /*** **** ***/ /** * \brief A one-shot timer that emits a signal when its timeout is reached. */ class MockWakeupTimer: public WakeupTimer { public: explicit MockWakeupTimer(const std::shared_ptr& clock): m_clock(clock) { m_clock->minute_changed.connect([this](){ test_for_wakeup(); }); } virtual ~MockWakeupTimer() =default; virtual void set_wakeup_time (const DateTime& wakeup_time) override { m_wakeup_time = wakeup_time; test_for_wakeup(); } virtual core::Signal<>& timeout() override { return m_timeout; } private: void test_for_wakeup() { if (DateTime::is_same_minute(m_clock->localtime(), m_wakeup_time)) m_timeout(); } core::Signal<> m_timeout; const std::shared_ptr& m_clock; DateTime m_wakeup_time; }; /*** **** ***/ } // namespace datetime } // namespace indicator } // namespace ayatana #endif // INDICATOR_DATETIME_WAKEUP_TIMER_MOCK_H ayatana-indicator-datetime-25.4.0/.travis.yml0000644000000000000000000000170614773244555016007 0ustar # vim: set ts=2 sts=2 sw=2 expandtab : dist: focal language: shell os: linux arch: - amd64 # - ppc64le services: - docker addons: apt: packages: - python3-pip - python3-setuptools before_install: # let's use the MATE project's docker build script... - curl -Ls -o docker-build https://github.com/AyatanaIndicators/ayatana-dev-scripts/raw/main/travis/docker-build - chmod +x docker-build install: - pip3 install wheel - pip3 install PyGithub - ./docker-build --name ${DISTRO} --config .build.yml --install script: - ./docker-build --name ${DISTRO} --verbose --config .build.yml --build scripts env: # temp disable of archlinux builds, see https://gitlab.archlinux.org/archlinux/archlinux-docker/-/issues/56 # - DISTRO="archlinux:latest" - DISTRO="debian:testing" - DISTRO="debian:stable" # - DISTRO="ubuntu:rolling" - DISTRO="ubuntu:focal" jobs: exclude: - env: DISTRO="archlinux:latest" arch: ppc64le ayatana-indicator-datetime-25.4.0/update-po.sh0000755000000000000000000000262514773244555016134 0ustar #!/bin/bash set -x # Copyright (C) 2017 by Mike Gabriel # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 3 of the License. # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see GETTEXT_DOMAIN=$(cat CMakeLists.txt | grep 'set.*(.*GETTEXT_PACKAGE' | sed -r -e 's/.*\"([^"]+)\"\)/\1/') cp po/${GETTEXT_DOMAIN}.pot po/${GETTEXT_DOMAIN}.pot~ cd po/ cat LINGUAS | while read lingua; do if [ ! -e ${lingua}.po ]; then msginit --input=${GETTEXT_DOMAIN}.pot --locale=${lingua} --no-translator --output-file=$lingua.po else intltool-update --gettext-package ${GETTEXT_DOMAIN} $(basename ${lingua}) fi sed -E \ -e 's/\.xml\.in\.h:/.xml.in:/g' \ -e 's/\.ini\.in\.h:/.ini.in:/g' \ -e 's/\.xml\.h:/.xml:/g' \ -e 's/\.ini\.h:/.ini:/g' \ -e 's@^#: \.\./@#: @g' \ -e 's@(:[0-9]+) \.\./@\1 @g' \ -i ${lingua}.po done cd - 1>/dev/null mv po/${GETTEXT_DOMAIN}.pot~ po/${GETTEXT_DOMAIN}.pot ayatana-indicator-datetime-25.4.0/update-pot.sh0000755000000000000000000000372714773244555016324 0ustar #!/bin/bash # Copyright (C) 2017 by Mike Gabriel # # This package is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 3 of the License. # # This package is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see GETTEXT_DOMAIN=$(cat CMakeLists.txt | grep 'set.*(.*GETTEXT_PACKAGE' | sed -r -e 's/.*\"([^"]+)\"\)/\1/') # Rename function calls 'T_([...])' to 'T _([...])' # This hack is needed to also process T_() function calls correctly with intltool-update # (in time formatter code). cd src/ && for file in *.cpp *.c; do sed -e "s/ T_/ T _/g" -i $file; done && cd - 1>/dev/null # Yet another hack to include .gschema.xml translations sed -i po/POTFILES.in -e 's/org.ayatana.indicator.datetime.gschema.xml.in$/org.ayatana.indicator.datetime.gschema.xml/g' cp data/org.ayatana.indicator.datetime.gschema.xml.in data/org.ayatana.indicator.datetime.gschema.xml # Run the intltool-update... cd po/ && intltool-update --gettext-package ${GETTEXT_DOMAIN} --pot && cd - 1>/dev/null # And revert... sed -i po/POTFILES.in -e 's/org.ayatana.indicator.datetime.gschema.xml$/org.ayatana.indicator.datetime.gschema.xml.in/g' rm data/org.ayatana.indicator.datetime.gschema.xml # And undo the renamings again. cd src/ && for file in *.cpp *.c; do sed -e "s/ T _/ T_/g" -i $file; done && cd - 1>/dev/null sed -E \ -e 's/\.xml\.in\.h:/.xml.in:/g' \ -e 's/\.ini\.in\.h:/.ini.in:/g' \ -e 's/\.xml\.h:/.xml:/g' \ -e 's/\.ini\.h:/.ini:/g' \ -e 's@^#: \.\./@#: @g' \ -e 's@(:[0-9]+) \.\./@\1 @g' \ -i po/${GETTEXT_DOMAIN}.pot