Three Glance widgets, mirroring state the app already computes rather than owning any of their own: the next alarm (AlarmEngine.upcoming()), the live pill's subject timer (same selection logic, no ticker of its own — a running countdown is the platform chronometer, exactly like the ring notification), and the local time growing to world clocks at larger sizes. WidgetSync collects the same read-only flows the shell already reads and redraws on change, event-driven (updatePeriodMillis = 0) — it touches no engine, only re-renders, and covers every write path including SystemEventReceiver's since the process is already alive whenever those run. Tapping a widget reuses the same internal navigation actions the AlarmClock contract's door already produces; the timer buttons send the same unexported broadcasts its notification does. A widget is just another caller of machinery that already exists. ManifestRulesTest is updated deliberately: three GlanceAppWidgetReceivers join the exported set, each pinned to exactly the platform-required APPWIDGET_UPDATE filter and no permission — no new permission is requested anywhere in this change.
354 lines
20 KiB
XML
354 lines
20 KiB
XML
<resources>
|
||
<string name="app_name">Clockula</string>
|
||
<string name="app_tagline">A modern Material 3 Expressive clock app.\nComing into bloom.</string>
|
||
|
||
<!-- Alarms (M3): the notification channels and the ring actions -->
|
||
<string name="channel_alarm_ring_name">Ringing alarms</string>
|
||
<string name="channel_alarm_ring_description">The full-screen alarm while it is ringing. Turning this off does not silence an alarm.</string>
|
||
<string name="channel_alarm_snoozed_name">Snoozed alarms</string>
|
||
<string name="channel_alarm_snoozed_description">A quiet reminder that an alarm is snoozed, and when it comes back.</string>
|
||
<string name="alarm_notification_title">Alarm</string>
|
||
<string name="alarm_action_snooze">Snooze</string>
|
||
<string name="alarm_action_dismiss">Dismiss</string>
|
||
<string name="alarm_snoozed_until">Snoozed until %1$s</string>
|
||
|
||
<!-- Crash reporting (floret-kit core-crash) -->
|
||
<string name="report_issue_url" translatable="false">https://codeberg.org/jlmakiola/clockula/issues/new</string>
|
||
|
||
<!-- M4: the app shell's four tabs -->
|
||
<string name="tab_alarms">Alarms</string>
|
||
<string name="tab_timers">Timers</string>
|
||
<string name="tab_stopwatch">Stopwatch</string>
|
||
<string name="tab_world_clock">World clock</string>
|
||
|
||
<!-- M4: the tabs' empty states -->
|
||
<string name="alarms_empty">No alarms yet</string>
|
||
<string name="world_clocks_empty">No world clocks yet</string>
|
||
|
||
<!-- M6: the timers tab, its rows and the setup panel -->
|
||
<string name="timers_set_title">Set timer</string>
|
||
<string name="timers_setup_start">Start</string>
|
||
<string name="timers_setup_range_hint">Between 1 second and 24 hours</string>
|
||
<string name="timers_presets">Presets</string>
|
||
<string name="timers_preset_save">Save</string>
|
||
<string name="timers_preset_remove">Remove preset</string>
|
||
<string name="timer_keypad_backspace">Delete a digit</string>
|
||
<string name="timer_keypad_digit">Type %1$s</string>
|
||
<string name="timer_keypad_double_zero">Type 00</string>
|
||
<string name="timers_setup_clear">Clear</string>
|
||
<string name="timer_unit_hours">h</string>
|
||
<string name="timer_unit_minutes">m</string>
|
||
<string name="timer_unit_seconds">s</string>
|
||
<string name="timer_start">Start</string>
|
||
<string name="timer_pause">Pause</string>
|
||
<string name="timer_resume">Resume</string>
|
||
<string name="timer_reset">Reset</string>
|
||
<string name="timer_stop">Stop</string>
|
||
<string name="timer_add_minute">+1 min</string>
|
||
<string name="timer_subtract_minute">−1 min</string>
|
||
<string name="timer_adjustment_added">+%1$d min</string>
|
||
<string name="timer_adjustment_removed">−%1$d min</string>
|
||
<string name="timer_finished">Finished</string>
|
||
<string name="timer_paused_at">Paused \u00b7 %1$s</string>
|
||
<string name="timer_untitled">Timer</string>
|
||
<string name="timer_row_progress">%1$s left</string>
|
||
<string name="timer_row_open">Timer settings</string>
|
||
|
||
<!-- M6: the timer editor -->
|
||
<string name="timer_editor_title">Countdown</string>
|
||
<string name="timer_editor_label">Label</string>
|
||
<string name="timer_editor_duration">Length</string>
|
||
<string name="timer_editor_duration_locked">Reset the timer to change its length</string>
|
||
<string name="timer_editor_sound">Sound</string>
|
||
<string name="timer_editor_delete">Delete timer</string>
|
||
<string name="timer_editor_delete_confirm">Delete this timer?</string>
|
||
|
||
<!-- M6: the timer notification. One channel, one id, however many timers. -->
|
||
<string name="channel_timers_name">Timers</string>
|
||
<string name="channel_timers_description">The running countdown and the sound when a timer finishes. Turning this off does not silence a timer.</string>
|
||
<string name="timer_notification_title">Timer</string>
|
||
<plurals name="timer_more_active">
|
||
<item quantity="one">+%1$d more timer</item>
|
||
<item quantity="other">+%1$d more timers</item>
|
||
</plurals>
|
||
|
||
<!-- M4: the live pill -->
|
||
<string name="live_pill_pause">Pause</string>
|
||
<string name="live_pill_resume">Resume</string>
|
||
<string name="live_pill_stop">Stop</string>
|
||
<plurals name="live_pill_more_timers">
|
||
<item quantity="one">+%1$d more</item>
|
||
<item quantity="other">+%1$d more</item>
|
||
</plurals>
|
||
<string name="live_pill_timer_running">Timer %1$s, %2$s remaining</string>
|
||
<string name="live_pill_timer_paused">Timer %1$s paused, %2$s remaining</string>
|
||
<string name="live_pill_timer_expired">Timer %1$s finished</string>
|
||
<string name="live_pill_timer_untitled">Timer</string>
|
||
<string name="live_pill_stopwatch_running">Stopwatch running, %1$s</string>
|
||
<string name="live_pill_stopwatch_paused">Stopwatch paused at %1$s</string>
|
||
|
||
<!-- M4: the ring screen's dismiss challenge -->
|
||
<string name="ring_challenge_math_prompt">What is %1$s?</string>
|
||
<string name="ring_challenge_math_hint">Answer</string>
|
||
<string name="ring_challenge_wrong">Not quite \u2014 here is another</string>
|
||
<string name="ring_challenge_hold">Hold to dismiss</string>
|
||
<string name="ring_challenge_escape">Dismiss without solving</string>
|
||
<string name="ring_snooze_unavailable">No snoozes left</string>
|
||
|
||
<!-- M5: the alarms list -->
|
||
<string name="alarms_add">Add alarm</string>
|
||
<string name="alarms_empty_hint">Tap + to set your first alarm</string>
|
||
<string name="alarm_row_toggle">Alarm at %1$s</string>
|
||
<string name="alarm_next_imminent">in less than a minute</string>
|
||
<plurals name="alarm_next_in_minutes">
|
||
<item quantity="one">in %1$d min</item>
|
||
<item quantity="other">in %1$d min</item>
|
||
</plurals>
|
||
<string name="alarm_next_in_hours">in %1$dh</string>
|
||
<string name="alarm_next_in_hours_minutes">in %1$dh %2$dm</string>
|
||
<string name="alarm_next_in_days">in %1$dd</string>
|
||
<string name="alarm_next_in_days_hours">in %1$dd %2$dh</string>
|
||
<string name="alarm_next_ringing">Ringing now</string>
|
||
<string name="alarm_next_snoozed">Snoozed \u00b7 %1$s</string>
|
||
<string name="alarm_skipping_next">Skipping next</string>
|
||
<string name="alarm_repeat_once">Once</string>
|
||
<string name="alarm_repeat_every_day">Every day</string>
|
||
<string name="alarm_repeat_weekdays">Weekdays</string>
|
||
<string name="alarm_repeat_weekends">Weekends</string>
|
||
<string name="alarm_summary_separator" translatable="false">" \u00b7 "</string>
|
||
|
||
<!-- M5: the alarm editor -->
|
||
<string name="editor_title">Alarm</string>
|
||
<string name="editor_repeat">Repeat</string>
|
||
<string name="editor_skip_next">Skip next alarm</string>
|
||
<string name="editor_skip_next_summary">Ring the one after this</string>
|
||
<string name="editor_label_placeholder">Alarm name</string>
|
||
<string name="editor_section_sound">Sound and vibration</string>
|
||
<string name="editor_section_snooze">Snooze and dismiss</string>
|
||
<string name="editor_ringtone">Sound</string>
|
||
<string name="editor_vibrate">Vibrate</string>
|
||
<string name="editor_volume_ramp">Gradual volume</string>
|
||
<string name="editor_snooze_length">Snooze length</string>
|
||
<string name="editor_snooze_limit">Snooze limit</string>
|
||
<string name="editor_dismiss_challenge">To dismiss</string>
|
||
<string name="editor_delete">Delete alarm</string>
|
||
<string name="editor_delete_title">Delete this alarm?</string>
|
||
<string name="editor_delete_message">The %1$s alarm will be removed.</string>
|
||
<string name="action_delete">Delete</string>
|
||
<string name="action_cancel">Cancel</string>
|
||
<string name="action_ok">OK</string>
|
||
|
||
<!-- M5: the per-alarm overrides -->
|
||
<string name="override_app_default">App default</string>
|
||
<string name="override_app_default_value">App default (%1$s)</string>
|
||
<string name="value_on">On</string>
|
||
<string name="value_off">Off</string>
|
||
<string name="volume_ramp_none">No gradual volume</string>
|
||
<plurals name="volume_ramp_seconds">
|
||
<item quantity="one">%1$d second</item>
|
||
<item quantity="other">%1$d seconds</item>
|
||
</plurals>
|
||
<plurals name="snooze_minutes">
|
||
<item quantity="one">%1$d minute</item>
|
||
<item quantity="other">%1$d minutes</item>
|
||
</plurals>
|
||
<string name="snooze_limit_none">No snoozing</string>
|
||
<plurals name="snooze_limit_times">
|
||
<item quantity="one">%1$d time</item>
|
||
<item quantity="other">%1$d times</item>
|
||
</plurals>
|
||
<string name="challenge_none">Just tap Dismiss</string>
|
||
<string name="challenge_math">Solve a sum</string>
|
||
<string name="challenge_hold">Press and hold</string>
|
||
|
||
<!-- M5: the ringtone picker -->
|
||
<string name="ringtone_picker_title">Alarm sound</string>
|
||
<string name="ringtone_silent">Silent</string>
|
||
<string name="ringtone_silent_summary">Vibration only</string>
|
||
<string name="ringtone_device_default">Device default alarm sound</string>
|
||
<string name="ringtone_pick_file">Choose from files\u2026</string>
|
||
<string name="ringtone_none_available">This device has no alarm sounds. Clockula will use the system default.</string>
|
||
<string name="ringtone_unavailable">Unavailable \u2014 the default alarm sound will be used</string>
|
||
<string name="ringtone_unknown">Unknown sound</string>
|
||
<string name="ringtone_access_may_lapse">Clockula may lose access to this file later</string>
|
||
<!-- M7: the stopwatch tab -->
|
||
<string name="stopwatch_start">Start</string>
|
||
<string name="stopwatch_pause">Pause</string>
|
||
<string name="stopwatch_resume">Resume</string>
|
||
<string name="stopwatch_reset">Reset</string>
|
||
<string name="stopwatch_lap">Lap</string>
|
||
<string name="stopwatch_lap_limit">Lap limit reached</string>
|
||
<string name="stopwatch_readout">Elapsed %1$s</string>
|
||
<string name="stopwatch_laps_header_lap">Lap</string>
|
||
<string name="stopwatch_laps_header_split">Split</string>
|
||
<string name="stopwatch_laps_header_total">Total</string>
|
||
<string name="stopwatch_lap_number">Lap %1$d</string>
|
||
<string name="stopwatch_lap_row">Lap %1$d, split %2$s, total %3$s</string>
|
||
<string name="stopwatch_lap_row_best">Lap %1$d, fastest, split %2$s, total %3$s</string>
|
||
<string name="stopwatch_lap_row_worst">Lap %1$d, slowest, split %2$s, total %3$s</string>
|
||
<string name="stopwatch_lap_row_in_progress">Lap %1$d in progress, split %2$s, total %3$s</string>
|
||
|
||
<!-- M7: the stopwatch notification. It makes no sound. -->
|
||
<string name="channel_stopwatch_name">Stopwatch</string>
|
||
<string name="channel_stopwatch_description">The running stopwatch and its controls. It makes no sound.</string>
|
||
<string name="stopwatch_notification_title">Stopwatch</string>
|
||
<string name="stopwatch_paused_at">Paused \u00b7 %1$s</string>
|
||
<plurals name="stopwatch_laps_recorded">
|
||
<item quantity="one">%1$d lap</item>
|
||
<item quantity="other">%1$d laps</item>
|
||
</plurals>
|
||
<!-- M8: the world clock tab, its rows and the zone picker -->
|
||
<string name="world_clock_add">Add city</string>
|
||
<string name="world_clock_limit">Add up to %1$d cities</string>
|
||
<string name="world_clock_home_action">Home time zone</string>
|
||
<string name="world_clock_home">Home</string>
|
||
<string name="world_clock_empty_hint">Add a city to compare its time with your own.</string>
|
||
<string name="world_clock_offset_same">Same time as home</string>
|
||
<string name="world_clock_ahead">%1$s ahead</string>
|
||
<string name="world_clock_behind">%1$s behind</string>
|
||
<string name="world_clock_hours_minutes">%1$s %2$s</string>
|
||
<string name="world_clock_summary">%1$s \u00b7 %2$s</string>
|
||
<string name="world_clock_day_yesterday">Yesterday</string>
|
||
<string name="world_clock_day_today">Today</string>
|
||
<string name="world_clock_day_tomorrow">Tomorrow</string>
|
||
<string name="world_clock_unknown_zone">This time zone is no longer on your device</string>
|
||
<string name="world_clock_face_description">%1$s, %2$s</string>
|
||
<string name="world_clock_row_description">%1$s, %2$s, %3$s</string>
|
||
<!-- A row whose zone the device no longer knows has no time to read out. -->
|
||
<string name="world_clock_row_description_unknown">%1$s, %2$s</string>
|
||
<string name="world_clock_row_drag">Reorder %1$s</string>
|
||
<string name="world_clock_row_move_up">Move up</string>
|
||
<string name="world_clock_row_move_down">Move down</string>
|
||
<string name="world_clock_row_remove">Remove</string>
|
||
<string name="world_clock_remove_title">Remove %1$s?</string>
|
||
<string name="world_clock_remove_message">The city will be removed from your world clocks.</string>
|
||
<string name="action_remove">Remove</string>
|
||
<string name="zone_picker_add_title">Add city</string>
|
||
<string name="zone_picker_home_title">Home time zone</string>
|
||
<string name="zone_picker_search">Search cities</string>
|
||
<string name="zone_picker_search_clear">Clear search</string>
|
||
<string name="zone_picker_no_results">No city matches \u201c%1$s\u201d</string>
|
||
<string name="zone_picker_device_zone">Device time zone</string>
|
||
<plurals name="world_clock_hours">
|
||
<item quantity="one">%d hour</item>
|
||
<item quantity="other">%d hours</item>
|
||
</plurals>
|
||
<plurals name="world_clock_minutes">
|
||
<item quantity="one">%d minute</item>
|
||
<item quantity="other">%d minutes</item>
|
||
</plurals>
|
||
|
||
<!-- M9: the one question the AlarmClock contract has to ask -->
|
||
<string name="interop_dismiss_title">Which alarm?</string>
|
||
<!-- %1$s is the time, followed by the label when the alarm has one. -->
|
||
<string name="interop_dismiss_row_description">Dismiss the alarm at %1$s</string>
|
||
|
||
<!-- M10: settings -->
|
||
<string name="settings_title">Settings</string>
|
||
<string name="settings_coming_soon">Coming soon</string>
|
||
<string name="settings_author" translatable="false">Jean-Luc Makiola</string>
|
||
<string name="settings_source">Source</string>
|
||
<string name="settings_source_url" translatable="false">https://codeberg.org/jlmakiola/clockula</string>
|
||
<string name="settings_section_appearance">Appearance</string>
|
||
<string name="settings_theme">Theme</string>
|
||
<string name="settings_theme_system">Follow system</string>
|
||
<string name="settings_theme_light">Light</string>
|
||
<string name="settings_theme_dark">Dark</string>
|
||
<string name="settings_dynamic_color">Dynamic colour</string>
|
||
<string name="settings_language">Language</string>
|
||
<string name="settings_language_auto">Follow system</string>
|
||
<string name="settings_section_alarm_defaults">Alarm defaults</string>
|
||
<string name="settings_section_timer_defaults">Timer defaults</string>
|
||
<string name="settings_timer_duration">Default duration</string>
|
||
<plurals name="settings_duration_minutes">
|
||
<item quantity="one">%1$d minute</item>
|
||
<item quantity="other">%1$d minutes</item>
|
||
</plurals>
|
||
<string name="settings_section_clock">Clock</string>
|
||
<string name="settings_home_zone">Home time zone</string>
|
||
<string name="settings_section_reliability">Reliability</string>
|
||
<string name="settings_self_check">Why might my alarm not ring?</string>
|
||
<string name="settings_self_check_title">Why might my alarm not ring?</string>
|
||
<string name="settings_self_check_summary">Check exact-alarm, notification and battery settings</string>
|
||
<plurals name="settings_self_check_problems">
|
||
<item quantity="one">%1$d problem found</item>
|
||
<item quantity="other">%1$d problems found</item>
|
||
</plurals>
|
||
<string name="settings_self_check_all_clear">Everything looks fine</string>
|
||
<string name="settings_section_data">Data</string>
|
||
<string name="settings_backup">Back up & restore</string>
|
||
<string name="settings_backup_title">Back up & restore</string>
|
||
<string name="settings_backup_summary">Export or import your alarms, timers and world clocks</string>
|
||
<string name="settings_section_help">Help</string>
|
||
<string name="settings_report_issue">Report an issue</string>
|
||
<string name="settings_send_crash_report">Send last crash report</string>
|
||
<string name="settings_version">Version</string>
|
||
<string name="settings_version_value" translatable="false">%1$s</string>
|
||
<string name="settings_ringtone_custom">Custom sound</string>
|
||
|
||
<!-- M10: backup -->
|
||
<string name="settings_backup_section">Back up & restore</string>
|
||
<string name="settings_backup_export">Export backup</string>
|
||
<string name="settings_backup_export_summary">Choose a folder to save clockula-backup-v1.json in</string>
|
||
<string name="settings_backup_import">Import backup</string>
|
||
<string name="settings_backup_import_summary">Replaces all your alarms, timers and world clocks</string>
|
||
<string name="settings_backup_export_succeeded">Backup saved</string>
|
||
<string name="settings_backup_export_failed">Couldn\'t save the backup</string>
|
||
<string name="settings_backup_import_succeeded">Backup restored</string>
|
||
<string name="settings_backup_import_failed">Couldn\'t restore the backup</string>
|
||
<string name="settings_backup_import_confirm_title">Replace everything?</string>
|
||
<string name="settings_backup_import_confirm_message">This replaces all your current alarms, timers, world clocks and settings with what\'s in the backup file. This can\'t be undone.</string>
|
||
<string name="settings_backup_import_confirm_action">Replace</string>
|
||
|
||
<!-- M10: self-check -->
|
||
<string name="selfcheck_fix">Fix</string>
|
||
|
||
<string name="selfcheck_exact_alarm_title">Exact alarms</string>
|
||
<string name="selfcheck_exact_alarm_ok">Allowed — your alarm will fire on time</string>
|
||
<string name="selfcheck_exact_alarm_problem">Not allowed — alarms may fire late</string>
|
||
|
||
<string name="selfcheck_notifications_title">Notifications</string>
|
||
<string name="selfcheck_notifications_ok">Allowed — the ring screen can show over other apps</string>
|
||
<string name="selfcheck_notifications_warn">Off — your alarm will still sound, but no screen or heads-up banner will show</string>
|
||
|
||
<string name="selfcheck_alarm_channel_title">Alarm channel</string>
|
||
<string name="selfcheck_alarm_channel_ok">Not blocked</string>
|
||
<string name="selfcheck_alarm_channel_warn">Blocked — your alarm will still sound, but no screen or heads-up banner will show</string>
|
||
|
||
<string name="selfcheck_fsi_title">Full-screen alarm</string>
|
||
<string name="selfcheck_fsi_ok">Allowed — the ring screen can show over the lock screen</string>
|
||
<string name="selfcheck_fsi_warn">Not allowed — your alarm will still sound, as a heads-up notification instead</string>
|
||
|
||
<string name="selfcheck_battery_title">Battery optimisation</string>
|
||
<string name="selfcheck_battery_ok">Exempt</string>
|
||
<string name="selfcheck_battery_warn">Not exempt — exempting Clockula can make alarms more reliable</string>
|
||
|
||
<string name="selfcheck_background_restricted_title">Background activity</string>
|
||
<string name="selfcheck_background_restricted_ok">Not restricted</string>
|
||
<string name="selfcheck_background_restricted_problem">Restricted — alarms may not fire reliably</string>
|
||
|
||
<string name="selfcheck_dnd_title">Do Not Disturb</string>
|
||
<string name="selfcheck_dnd_ok">Not blocking alarms</string>
|
||
<string name="selfcheck_dnd_problem">Total silence is on — it blocks alarms too</string>
|
||
|
||
<string name="selfcheck_alarm_volume_title">Alarm volume</string>
|
||
<string name="selfcheck_alarm_volume_ok">On</string>
|
||
<string name="selfcheck_alarm_volume_problem">Muted — your alarm will fire silently</string>
|
||
|
||
<string name="selfcheck_oem_title">Device manufacturer</string>
|
||
<string name="selfcheck_oem_warn">Some manufacturers aggressively close background apps — see how to keep Clockula exempt</string>
|
||
|
||
<string name="selfcheck_next_alarm_title">Next alarm, as the system sees it</string>
|
||
<string name="selfcheck_next_alarm_ok">Matches what Clockula scheduled</string>
|
||
<string name="selfcheck_next_alarm_problem">Doesn\'t match what Clockula scheduled — open the app to re-check</string>
|
||
|
||
<!-- M10: widgets -->
|
||
<string name="widget_next_alarm_description">Next alarm</string>
|
||
<string name="widget_next_alarm_empty">No alarms set</string>
|
||
<string name="widget_next_alarm_today">Today</string>
|
||
<string name="widget_timer_description">Timer</string>
|
||
<string name="widget_timer_new">New timer</string>
|
||
<string name="widget_timer_expired">Time\'s up</string>
|
||
<string name="widget_clock_description">Clock</string>
|
||
</resources>
|