Compare commits
4 Commits
19b86936e6
...
renovate/l
| Author | SHA1 | Date | |
|---|---|---|---|
| b3617d60e5 | |||
|
|
66dbdc8913 | ||
|
|
6a125b7c73 | ||
|
|
44233cff35 |
10
CHANGELOG.md
10
CHANGELOG.md
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [2.18.1] — 2026-08-06
|
||||
|
||||
### Fixed
|
||||
- Tapping an empty slot in week or day view creates the event at the hour you
|
||||
tapped, after the timeline has been zoomed. Pinching the day taller or shorter
|
||||
— or changing **Hour height** in Settings — left the tap still being measured
|
||||
against the old spacing, so the new event landed at some other hour entirely
|
||||
([#148]).
|
||||
|
||||
## [2.18.0] — 2026-07-31
|
||||
|
||||
### Added
|
||||
@@ -1323,3 +1332,4 @@ automatically, with zero telemetry and no internet permission.
|
||||
[#57]: https://codeberg.org/jlmakiola/calendula/issues/57
|
||||
[#56]: https://codeberg.org/jlmakiola/calendula/issues/56
|
||||
[#114]: https://codeberg.org/jlmakiola/calendula/issues/114
|
||||
[#148]: https://codeberg.org/jlmakiola/calendula/issues/148
|
||||
|
||||
@@ -28,8 +28,8 @@ android {
|
||||
// which builds this version and then creates the matching vX.Y.Z tag +
|
||||
// release itself (versionCode is pinned to MAJOR*10000 + MINOR*100 +
|
||||
// PATCH from versionName, e.g. 2.7.2 -> 20702). See docs/RELEASING.md.
|
||||
versionCode = 21800
|
||||
versionName = "2.18.0"
|
||||
versionCode = 21801
|
||||
versionName = "2.18.1"
|
||||
|
||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
@@ -76,6 +76,18 @@ fun TimelineScale.hourHeight(viewportHeight: Dp): Dp = when (this) {
|
||||
.coerceAtLeast(fillHourHeight(viewportHeight))
|
||||
}
|
||||
|
||||
/**
|
||||
* The minute of the day a tap [offsetY] px down a timeline column means, snapped
|
||||
* to the hour it landed in.
|
||||
*
|
||||
* [hourPx] must be the hour height the column is drawing at *now* — a tap
|
||||
* detector that captured it when it was installed maps taps to a pre-pinch grid
|
||||
* (#148). A zero or negative height (a viewport measured at nothing) has no grid
|
||||
* to read, so it answers midnight rather than dividing by it.
|
||||
*/
|
||||
fun tappedMinuteOfDay(offsetY: Float, hourPx: Float): Int =
|
||||
if (hourPx <= 0f) 0 else (offsetY / hourPx).toInt().coerceIn(0, 23) * 60
|
||||
|
||||
/**
|
||||
* Shortest an event block may render, as a fraction of an hour. Blocks keep a
|
||||
* floor so a 15-minute event stays tappable, but the floor scales with the hour
|
||||
|
||||
@@ -45,6 +45,7 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableIntStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.rememberUpdatedState
|
||||
import androidx.compose.runtime.snapshotFlow
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
@@ -96,6 +97,7 @@ import de.jeanlucmakiola.calendula.ui.common.rememberTimelinePinchZoom
|
||||
import de.jeanlucmakiola.calendula.ui.common.formatHourLabel
|
||||
import de.jeanlucmakiola.calendula.ui.common.formatMinuteOfDay
|
||||
import de.jeanlucmakiola.calendula.ui.common.hourSeparatorLines
|
||||
import de.jeanlucmakiola.calendula.ui.common.tappedMinuteOfDay
|
||||
import de.jeanlucmakiola.calendula.ui.week.TimedBlock
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.launch
|
||||
@@ -577,6 +579,12 @@ private fun DayColumnCard(
|
||||
val hourPx = with(LocalDensity.current) { hourHeight.toPx() }
|
||||
val showHourLines = LocalShowHourLines.current
|
||||
val hourLineColor = MaterialTheme.colorScheme.outlineVariant
|
||||
// The tap detector outlives the composition that installed it — a pinch or a
|
||||
// Settings change moves the hour height without restarting it — so it reads
|
||||
// the height and the callback through state handles instead of capturing
|
||||
// them, or taps land on the scale the column had before the zoom (#148).
|
||||
val currentHourPx = rememberUpdatedState(hourPx)
|
||||
val currentOnCreateAt = rememberUpdatedState(onCreateAt)
|
||||
Card(
|
||||
// Plain rectangular column — the soft corners come from the outer
|
||||
// rounded scroll viewport, so inner rounding would look odd at the edges.
|
||||
@@ -597,8 +605,10 @@ private fun DayColumnCard(
|
||||
// only fires on the column background. Snaps to the tapped hour.
|
||||
.pointerInput(date) {
|
||||
detectTapGestures { offset ->
|
||||
val hour = (offset.y / hourPx).toInt().coerceIn(0, 23)
|
||||
onCreateAt(date, hour * 60)
|
||||
currentOnCreateAt.value(
|
||||
date,
|
||||
tappedMinuteOfDay(offset.y, currentHourPx.value),
|
||||
)
|
||||
}
|
||||
},
|
||||
) {
|
||||
|
||||
@@ -51,6 +51,7 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableIntStateOf
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.rememberUpdatedState
|
||||
import androidx.compose.runtime.snapshotFlow
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.Alignment
|
||||
@@ -107,6 +108,7 @@ import de.jeanlucmakiola.calendula.ui.common.rememberTimelinePinchZoom
|
||||
import de.jeanlucmakiola.calendula.ui.common.formatHourLabel
|
||||
import de.jeanlucmakiola.calendula.ui.common.formatMinuteOfDay
|
||||
import de.jeanlucmakiola.calendula.ui.common.hourSeparatorLines
|
||||
import de.jeanlucmakiola.calendula.ui.common.tappedMinuteOfDay
|
||||
import de.jeanlucmakiola.calendula.ui.common.rememberCalendarSlideSpec
|
||||
import de.jeanlucmakiola.calendula.ui.common.next
|
||||
import de.jeanlucmakiola.floret.time.isoWeekNumber
|
||||
@@ -722,6 +724,12 @@ private fun DayColumnCard(
|
||||
val hourPx = with(LocalDensity.current) { hourHeight.toPx() }
|
||||
val showHourLines = LocalShowHourLines.current
|
||||
val hourLineColor = MaterialTheme.colorScheme.outlineVariant
|
||||
// The tap detector outlives the composition that installed it — a pinch or a
|
||||
// Settings change moves the hour height without restarting it — so it reads
|
||||
// the height and the callback through state handles instead of capturing
|
||||
// them, or taps land on the scale the column had before the zoom (#148).
|
||||
val currentHourPx = rememberUpdatedState(hourPx)
|
||||
val currentOnCreateAt = rememberUpdatedState(onCreateAt)
|
||||
Card(
|
||||
// Plain rectangular columns — the soft corners come from the outer
|
||||
// rounded scroll viewport, so inner rounding would look odd at the edges.
|
||||
@@ -741,8 +749,10 @@ private fun DayColumnCard(
|
||||
// blocks are consumed by their own handler first. Snaps to hour.
|
||||
.pointerInput(date) {
|
||||
detectTapGestures { offset ->
|
||||
val hour = (offset.y / hourPx).toInt().coerceIn(0, 23)
|
||||
onCreateAt(date, hour * 60)
|
||||
currentOnCreateAt.value(
|
||||
date,
|
||||
tappedMinuteOfDay(offset.y, currentHourPx.value),
|
||||
)
|
||||
}
|
||||
},
|
||||
) {
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
<string name="month_prev">الشهر السابق</string>
|
||||
<string name="month_next">الشهر القادم</string>
|
||||
<string name="month_today_action">اليوم</string>
|
||||
<string name="month_action_settings">إعدادات</string>
|
||||
<string name="month_action_settings">الإعدادات</string>
|
||||
<string name="settings_title">الإعدادات</string>
|
||||
<string name="settings_theme">الثيم</string>
|
||||
<string name="settings_theme_system">النظام</string>
|
||||
@@ -137,7 +137,7 @@
|
||||
<string name="event_detail_calendar">التقويم</string>
|
||||
<string name="event_detail_calendar_unknown">تقويم غير معروف</string>
|
||||
<string name="event_detail_description">الوصف</string>
|
||||
<string name="event_detail_all_day">كل يوم</string>
|
||||
<string name="event_detail_all_day">طوال اليوم</string>
|
||||
<string name="event_detail_location">الموقع</string>
|
||||
<string name="event_detail_attendees">الحضور</string>
|
||||
<string name="event_detail_recurrence">التكرار</string>
|
||||
@@ -219,8 +219,8 @@
|
||||
<string name="settings_dynamic_color">اللون الديناميكي</string>
|
||||
<string name="settings_dynamic_color_unavailable">يتطلب أندرويد ١٢ أو أحدث</string>
|
||||
<string name="settings_default_view">طريقة العرض الافتراضية</string>
|
||||
<string name="settings_soften_colors">ألوان تقويم ناعمة</string>
|
||||
<string name="settings_soften_colors_summary">خفف ألوان التقويم والأحداث لتتناسب مع الثيم. قم بإيقافه لإظهار الألوان الخام من مصدر التقويم.</string>
|
||||
<string name="settings_soften_colors">ألوان تقويم متناسقة</string>
|
||||
<string name="settings_soften_colors_summary">حافظ على درجة لون كل تقويم لكن قم بتسوية سطوعه، بحيث كل حدث يظل مقروءًا و تتناسق الألوان معًا. قم بإيقافه لإظهار الألوان الخام من مصدر التقويم.</string>
|
||||
<string name="settings_font_headings">خط العناوين</string>
|
||||
<string name="settings_font_body">خط النص</string>
|
||||
<string name="settings_font_system">افتراضي النظام</string>
|
||||
@@ -309,4 +309,237 @@
|
||||
<string name="agenda_range_showing_label">إظهار جميع الأحداث القادمة لـ</string>
|
||||
<string name="settings_reminders">تذكيرات الحدث</string>
|
||||
<string name="settings_default_reminder">التذكير الافتراضي</string>
|
||||
<string name="reminder_custom_set">تعيين</string>
|
||||
<string name="settings_autofocus_title_hint">عند بدء حدث جديد، ضع المؤشر في حقل العنوان وافتح لوحة المفاتيح على الفور.</string>
|
||||
<string name="settings_form_fields_hint">الخانات المعروضة افتراضيًا — كل شيء آخر موجود ضمن \"المزيد من الخانات\"</string>
|
||||
<string name="settings_section_event_form">نموذج حدث جديد</string>
|
||||
<string name="settings_quick_switch_header">زر التبديل السريع</string>
|
||||
<string name="app_name">التقويم</string>
|
||||
<string name="settings_theme_system_summary">الحالي %1$s</string>
|
||||
<string name="settings_theme_hint">سواء التطبيق فاتحًا أو داكنًا. الاختيار يُطبق على الفور.</string>
|
||||
<string name="settings_week_start_auto_summary">الحالي %1$s</string>
|
||||
<string name="settings_time_format_auto_summary">اتباع النظام: %1$s</string>
|
||||
<string name="settings_hour_lines">خطوط الساعات</string>
|
||||
<string name="settings_hour_lines_summary">إظهار خط فاصل في كل ساعة في طريقة عرض الأسبوع واليوم</string>
|
||||
<string name="timeline_scale_fit_day_summary">جميع الـ 24 ساعة على شاشة واحدة، لا تمرير</string>
|
||||
<string name="timeline_scale_custom">مخصص</string>
|
||||
<string name="settings_widget_size_small">صغير</string>
|
||||
<string name="settings_widget_size_medium">متوسط</string>
|
||||
<string name="settings_widget_size_large">كبير</string>
|
||||
<string name="settings_widget_size_extra_large">كبير جدًا</string>
|
||||
<plurals name="agenda_range_days">
|
||||
<item quantity="zero">(%d) لا أيام</item>
|
||||
<item quantity="one">(%d) يوم واحد</item>
|
||||
<item quantity="two">%d يومان</item>
|
||||
<item quantity="few">%d أيام</item>
|
||||
<item quantity="many">%d يوم</item>
|
||||
<item quantity="other">%d يوم</item>
|
||||
</plurals>
|
||||
<string name="settings_agenda_range_bar_hint">اعرض شريطًا في الجزء العلوي من الجدول يحدد التواريخ المعروضة، مع زر لتبديل النطاق للجلسة</string>
|
||||
<string name="settings_agenda_range_bar">شريط النطاق</string>
|
||||
<string name="settings_month_header">عرض الشهر</string>
|
||||
<string name="month_style_continuous">تمرير الشهور</string>
|
||||
<string name="month_style_dense">أسابيع سلسة</string>
|
||||
<string name="month_style_continuous_summary">كل شهر يقع تحت عنوانه الخاص، مع مساحة صغيرة تميزه عن الشهر التالي.</string>
|
||||
<string name="month_style_dense_summary">تمر الأسابيع دون انقطاع، ويتدفق كل شهر مباشرة إلى الشهر التالي دون وجود فجوة بينهما.</string>
|
||||
<string name="month_split_no_events">لا شيء مجدول</string>
|
||||
<string name="month_style_split_summary">شبكة مدمجة تحدد الأيام التي تتضمن أحداثًا، ويتم إدراج اليوم الذي تنقر عليه تحتها.</string>
|
||||
<string name="settings_autofocus_title">تركيز العنوان على حدث جديد</string>
|
||||
<string name="settings_event_duration">المدة الافتراضية</string>
|
||||
<string name="settings_event_duration_hint">مدة الحدث الجديد تبقى كما هي حتى أنت تغيير وقت نهايته. أما أحداث التي هي طوال اليوم فلن تتأثر.</string>
|
||||
<string name="settings_section_notifications">الإشعارات</string>
|
||||
<string name="settings_reminders_hint">ترى التذكيرات مرتين؟ هناك تطبيق تقويم آخر ينشرهم أيضًا — قم بإيقافهم في أحد من الاثنين.</string>
|
||||
<string name="settings_group_look">المظهر و السلوك</string>
|
||||
<string name="settings_group_data">البيانات</string>
|
||||
<string name="settings_group_app">التطبيق</string>
|
||||
<string name="settings_language">لغة التطبيق</string>
|
||||
<string name="settings_dynamic_color_summary">أخذ ألوان التطبيق من خلفيتك.</string>
|
||||
<string name="settings_group_about">حول</string>
|
||||
<string name="settings_about_author">بواسطة Jean-Luc Makiola</string>
|
||||
<string name="settings_about_source">المصدر</string>
|
||||
<string name="settings_about_privacy">سياسة الخصوصية</string>
|
||||
<string name="settings_about_support">دَعم التطوير</string>
|
||||
<string name="settings_about_version">الإصدار %1$s</string>
|
||||
<string name="settings_about_logo_desc">رمز تطبيق Calendula</string>
|
||||
<string name="crash_report_body_template">شكرًا لإبلاغ عن عطل في %1$s. يُرجى إضافة أي شيء تتذكره حول ما كنت تفعله، ثم إرسال.\n\n### ماذا حدث\n\n\n### تقرير العطل\n%2$s\n</string>
|
||||
<string name="settings_section_about">حول</string>
|
||||
<string name="settings_report_problem">الإبلاغ عن مشكلة</string>
|
||||
<string name="settings_report_problem_hint">أرسل تقرير الأعطال أو افتح متعقب المشكلات</string>
|
||||
<string name="settings_language_auto">افتراضي النظام</string>
|
||||
<string name="settings_section_backup">النسخ الاحتياطي والاستعادة</string>
|
||||
<string name="settings_special_dates_enable">إظهار تواريخ جهات الاتصال</string>
|
||||
<string name="settings_special_dates_enable_hint">اعكس أعياد ميلاد جهات اتصالك والتواريخ الأخرى إلى التقويمات المحلية. يقرأ جهات الاتصال على هذا الجهاز فقط — لا يتم رفع أي شئ، وجهات اتصالك لا يتم تغييرها أبدًا.</string>
|
||||
<string name="settings_section_language">اللغة</string>
|
||||
<string name="qs_tile_new_event_label">حدث جديد</string>
|
||||
<string name="shortcut_new_event_long">إنشاء حدث جديد</string>
|
||||
<string name="shortcut_new_event_short">حدث جديد</string>
|
||||
<string name="settings_qs_tile_hint">أضف مربع ”حدث جديد“ إلى لوحة الإعدادات السريعة.</string>
|
||||
<string name="calendars_local_header">تقويماتك</string>
|
||||
<string name="settings_section_special_dates">تواريخ جهات الاتصال الخاصة</string>
|
||||
<string name="calendars_title">التقويمات</string>
|
||||
<string name="calendars_add">إضافة تقويم</string>
|
||||
<string name="settings_section_calendars">التقويمات</string>
|
||||
<string name="settings_manage_calendars">إدارة التقويمات</string>
|
||||
<string name="event_edit_recurrence_next">التالي: %1$s</string>
|
||||
<plurals name="reminder_minutes">
|
||||
<item quantity="zero">(%d) لا دقائق قبل</item>
|
||||
<item quantity="one">(%d) دقيقة واحده قبل</item>
|
||||
<item quantity="two">%d دقيقتان قبل</item>
|
||||
<item quantity="few">%d دقائق قبل</item>
|
||||
<item quantity="many">%d دقيقة قبل</item>
|
||||
<item quantity="other">%d دقيقة قبل</item>
|
||||
</plurals>
|
||||
<plurals name="reminder_hours">
|
||||
<item quantity="zero">(%d) لا ساعات قبل</item>
|
||||
<item quantity="one">(%d) ساعة واحده قبل</item>
|
||||
<item quantity="two">%d ساعتان قبل</item>
|
||||
<item quantity="few">%d ساعات قبل</item>
|
||||
<item quantity="many">%d ساعة قبل</item>
|
||||
<item quantity="other">%d ساعة قبل</item>
|
||||
</plurals>
|
||||
<plurals name="reminder_days">
|
||||
<item quantity="zero">(%d) لا أيام قبل</item>
|
||||
<item quantity="one">(%d) يوم واحد قبل</item>
|
||||
<item quantity="two">%d يومان قبل</item>
|
||||
<item quantity="few">%d أيام قبل</item>
|
||||
<item quantity="many">%d يوم قبل</item>
|
||||
<item quantity="other">%d يوم قبل</item>
|
||||
</plurals>
|
||||
<plurals name="reminder_weeks">
|
||||
<item quantity="zero">(%d) لا أسابيع قبل</item>
|
||||
<item quantity="one">(%d) أسبوع واحد قبل</item>
|
||||
<item quantity="two">%d أسبوعان قبل</item>
|
||||
<item quantity="few">%d أسابيع قبل</item>
|
||||
<item quantity="many">%d أسبوع قبل</item>
|
||||
<item quantity="other">%d أسبوع قبل</item>
|
||||
</plurals>
|
||||
<string name="reminder_benefit_reversible_body">يوجد المفتاح في الإعدادات، ضمن الإشعارات.</string>
|
||||
<string name="reminder_custom_amount">القيمة</string>
|
||||
<string name="settings_manage_calendars_hint">إنشاء تقويمات محلية؛ إدارة التقويمات المتزامنة</string>
|
||||
<string name="settings_snooze_duration">مدة التأجيل</string>
|
||||
<string name="settings_calendar_reminder_inherits">الافتراضي (%1$s)</string>
|
||||
<string name="settings_translate">المساعدة في الترجمة</string>
|
||||
<string name="settings_translate_hint">إضافة أو تحسين لغة على Weblate</string>
|
||||
<string name="settings_appearance_subtitle">الثيم، الألوان، الخطوط</string>
|
||||
<string name="settings_views_subtitle">العرض، التخطيط، الترتيب</string>
|
||||
<string name="settings_event_form_subtitle">الخانات الافتراضية و السلوك</string>
|
||||
<string name="settings_notifications_subtitle">التذكيرات و التسليم</string>
|
||||
<string name="settings_special_dates_subtitle">أعياد ميلاد جهات الاتصال و احتفالات ذكرى</string>
|
||||
<string name="settings_special_dates_type_birthday">أعياد الميلاد</string>
|
||||
<string name="settings_special_dates_type_custom">تواريخ أخرى</string>
|
||||
<string name="settings_license">الترخيص</string>
|
||||
<string name="settings_special_dates_disable_title">إيقاف تشغيل تواريخ جهات الاتصال؟</string>
|
||||
<string name="settings_special_dates_disable_confirm">إيقاف</string>
|
||||
<string name="settings_special_dates_sync_now">زامن الآن</string>
|
||||
<string name="settings_special_dates_never_synced">لم تتم المزامنة بعد</string>
|
||||
<string name="settings_special_dates_paused_hint">لم يعد بإمكان Calendula قراءة جهات الاتصال الخاصة بك، لذلك لا يتم تحديث هذه التقويمات.</string>
|
||||
<string name="calendars_manage_in_app">الإدارة في التطبيق</string>
|
||||
<string name="calendars_enable_all">تفعيل الكل</string>
|
||||
<string name="calendars_disable_all">تعطيل الكل</string>
|
||||
<string name="calendars_add_account">إضافة حساب</string>
|
||||
<string name="calendars_new_title">تقويم جديد</string>
|
||||
<string name="calendars_edit_title">تعديل التقويم</string>
|
||||
<string name="calendars_name_label">الاسم</string>
|
||||
<string name="calendars_color_label">اللون</string>
|
||||
<string name="calendars_description_hint">أضف وصفًا</string>
|
||||
<string name="calendars_delete_confirm_title">حذف التقويم؟</string>
|
||||
<string name="calendars_delete_confirm_message">\"%1$s\" وجميع أحداثه ستتم إزالتها نهائيًا من هذا الجهاز.</string>
|
||||
<string name="calendars_write_error">تعذّر حفظ التغيير.</string>
|
||||
<string name="calendars_backup_header">النسخ الاحتياطي</string>
|
||||
<string name="calendars_backup_hint">التقويمات المحلية لا تتم مزامنتها في أي مكان، لذا قم بتصديرها إلى ملف .ics للاحتفاظ بنسخة.</string>
|
||||
<string name="dialog_save">حفظ</string>
|
||||
<string name="settings_special_dates_grant">منح الوصول</string>
|
||||
<string name="calendars_backup_action">تصدير كملف .ics</string>
|
||||
<string name="calendars_export_title">تصدير التقويمات</string>
|
||||
<string name="calendars_export_hint">اختر التقويمات التي تريد تضمينها في .ics الملف.</string>
|
||||
<string name="calendars_export_action">تصدير</string>
|
||||
<string name="calendars_restore_header">استعادة</string>
|
||||
<string name="calendars_restore_action">استعادة من ملف .ics</string>
|
||||
<string name="calendars_restore_hint">استيراد الأحداث من نسخة احتياطية أو تطبيق تقويم آخر.</string>
|
||||
<string name="calendars_auto_backup">النسخ الاحتياطي التلقائي</string>
|
||||
<string name="calendars_auto_backup_hint">قم بتصدير تقويماتك المحلية بشكل دوري إلى مجلد كـ .ics الملف.</string>
|
||||
<string name="calendars_auto_backup_folder">مجلد النسخ الاحتياطي</string>
|
||||
<string name="calendars_auto_backup_folder_unset">اضغط لاختيار مجلد</string>
|
||||
<string name="calendars_auto_backup_every">كل %1$s</string>
|
||||
<string name="calendars_auto_backup_interval_min">الحد الأدني ٣٠ دقيقة.</string>
|
||||
<string name="calendars_auto_backup_status_never">لا نسخ احتياطي تلقائي بعد</string>
|
||||
<string name="calendars_auto_backup_status_ok">آخر نسخة احتياطية: %1$s</string>
|
||||
<string name="calendars_auto_backup_status_failed">فشل آخر نسخ احتياطي: %1$s</string>
|
||||
<string name="backup_channel_name">النسخ الاحتياطي</string>
|
||||
<string name="backup_channel_description">يحذّر إذا تفشل النسخ الاحتياطي التلقائي بشكل متكرر.</string>
|
||||
<string name="backup_failed_title">فشل النسخ الاحتياطي التلقائي</string>
|
||||
<string name="backup_failed_text">Calendula تعذَّر في كتابة ملف النسخ الاحتياطي. تحقق من مجلد النسخ الاحتياطي في الإعدادات.</string>
|
||||
<string name="calendars_backup_failed">تعذّر تصدير النسخة الاحتياطية.</string>
|
||||
<plurals name="calendars_backup_done">
|
||||
<item quantity="zero">تم تصدير (%d) لا أحداث.</item>
|
||||
<item quantity="one">تم تصدير (%d) حدث واحد.</item>
|
||||
<item quantity="two">تم تصدير %d حدثان.</item>
|
||||
<item quantity="few">تم تصدير %d أحداث.</item>
|
||||
<item quantity="many">تم تصدير %d حدث.</item>
|
||||
<item quantity="other">تم تصدير %d حدث.</item>
|
||||
</plurals>
|
||||
<string name="import_title">استيراد الأحداث</string>
|
||||
<string name="import_target_header">إضافة إلى تقويم</string>
|
||||
<string name="import_empty">لم يتم العثور على أحداث في هذا الملف.</string>
|
||||
<string name="import_failed">تعذَّر قراءة هذا الملف.</string>
|
||||
<string name="import_no_calendar">لا تقويم قابل للكتابة لاستيراد إليه. أنشئ تقويمًا محليًا أولاً.</string>
|
||||
<string name="import_done_title">اكتمل الاستيراد</string>
|
||||
<string name="import_done_dedup_note">تم تخطي الأحداث الموجودة بالفعل في التقويم.</string>
|
||||
<string name="settings_special_dates_reminders">التذكيرات</string>
|
||||
<string name="calendars_account_menu_a11y">المزيد من الخيارات لـ %1$s</string>
|
||||
<string name="calendars_synced_hint">تأتي هذه من الحسابات الموجودة على جهازك. يمكنك إنشاؤها وتعديلها في تطبيقها الخاص.</string>
|
||||
<string name="calendars_synced_header">التقويمات المتزامنة</string>
|
||||
<string name="calendars_local_empty">لا تقويمات محلية حتى الآن. أنشئ واحدًا للاحتفاظ بالأحداث على هذا الجهاز فقط.</string>
|
||||
<string name="calendars_auto_backup_interval">الفاصل الزمني</string>
|
||||
<string name="import_warning_no_start">تم تخطي حدث بدون وقت بدء.</string>
|
||||
<string name="import_warning_recurrence">تم تخطي بعض التكرارات التي تم تغييرها للأحداث المتكررة.</string>
|
||||
<string name="import_close">إغلاق</string>
|
||||
<string name="import_done_skipped_label">التكرارات</string>
|
||||
<string name="import_done_added_label">أُضيف</string>
|
||||
<string name="crash_dialog_title">%1$s تعطل</string>
|
||||
<string name="settings_qs_tile">إضافة مربع الإعدادات السريعة</string>
|
||||
<string name="import_button">استيراد</string>
|
||||
<string name="crash_dialog_dismiss">ليس الآن</string>
|
||||
<string name="crash_report_copied">تم نسخ التقرير إلى الحافظة</string>
|
||||
<string name="crash_report_open_failed">تعذّر فتح متتبع المشكلات. التقرير موجود في الحافظة الخاصة بك.</string>
|
||||
<string name="crash_report_issue_title">تقرير العطل</string>
|
||||
<string name="crash_report_clip_label">%1$s تقرير العطل</string>
|
||||
<string name="crash_report_body_paste">_(كان التقرير طويلًا جدًا لهذا الرابط — الصقه من الحافظة هنا.)_</string>
|
||||
<string name="special_dates_calendar_birthday">أعياد الميلاد</string>
|
||||
<string name="special_dates_calendar_custom">التواريخ الخاصة</string>
|
||||
<string name="event_edit_recurrence_next_none">هذه القاعدة لا تتكرر أبدًا</string>
|
||||
<string name="event_access_public_summary">يري كل شخص لديه حق الوصول التفاصيل الكاملة</string>
|
||||
<string name="event_access_private_summary">الآخرون يرون فقط أنك مشغول</string>
|
||||
<string name="event_access_default_summary">أينما كان ما يفعله هذا التقويم عادةً</string>
|
||||
<string name="month_split_collapse">عرض أحداث اليوم</string>
|
||||
<string name="month_split_expand">إظهار الشهر بأكمله</string>
|
||||
<string name="settings_week_day_header">الأسبوع و اليوم</string>
|
||||
<string name="settings_default_view_hint">طريقة العرض التي يفتحها Calendula عندما تقوم ببدءه.</string>
|
||||
<string name="settings_week_start_hint">اليوم الذي يبدأ به كل أسبوع، في جميع طرق العرض والودجتز.</string>
|
||||
<string name="settings_time_format_hint">كيف الأوقات تُكتب في جميع أنحاء التطبيق. تلقائيًا يتبع إعداد نظامك.</string>
|
||||
<string name="settings_past_events_hint">ما الذي يفعله جدول بالأحداث التي انتهت بالفعل.</string>
|
||||
<string name="calendars_visibility_a11y">إظهار \"%1$s\"</string>
|
||||
<string name="calendars_visibility_notice_title">بعض التقويمات متوقفة</string>
|
||||
<string name="calendars_visibility_notice_message">Calendula يعرض الآن التقويمات التي تم تشغيلها لهذا الجهاز، لذلك ما تراه وما يذكرك لم يعد بإمكانه أن يختلف. بعض تقويماتك متوقفة حاليًا — تم إيقافها هنا أو في تطبيق تقويم آخر. أعد تشغيل أي منها في الإعدادات ← التقويمات.</string>
|
||||
<string name="calendar_picker_missing_title">تفتقد تقويمًا؟</string>
|
||||
<string name="calendar_picker_missing_summary">قد يكون متوقفًا عن التشغيل، للقراءة فقط أو مملوءًا من جهات الاتصال الخاصة بك — يمكنك إدارة تقويماتك هنا.</string>
|
||||
<string name="calendars_state_read_only">للقراءة فقط</string>
|
||||
<string name="calendars_state_not_synced">لم تتم المزامنة مع هذا الجهاز</string>
|
||||
<string name="calendars_state_managed">تم ملؤه من جهات اتصالك</string>
|
||||
<string name="calendars_managed_delete_locked">تم ملء هذا التقويم من جهات الاتصال الخاصة بك، لذلك سيقوم Calendula بإنشائه مرة أخرى في المزامنة التالية. قم بإيقاف تشغيل التواريخ الخاصة ضمن الإعدادات ← التواريخ الخاصة لحذفها.</string>
|
||||
<string name="duration_custom_max">كحد أقصى %1$s</string>
|
||||
<string name="settings_calendar_duration_inherits">الافتراضي (%1$s)</string>
|
||||
<string name="settings_calendar_duration_use_default">استخدام المدة الافتراضية (%1$s)</string>
|
||||
<string name="reminder_benefit_delivery_title">التذكيرات، تُسلَّم</string>
|
||||
<string name="reminder_use_default">استخدام التذكير الافتراضي</string>
|
||||
<string name="settings_timeline_scale">ارتفاع الساعة</string>
|
||||
<string name="settings_timeline_scale_hint">كم مدى المساحة العمودية التي تأخذها الساعة الواحده في عرض الأسبوع واليوم. كلا العرضين يشتركا في هذا الإعداد. يمكنك أيضًا الضغط على المخطط الزمني بإصبعين لتعيين أي ارتفاع بين.</string>
|
||||
<string name="timeline_scale_fit_day">الملائمة لليوم بأكمله</string>
|
||||
<string name="timeline_scale_compact">مضغوط</string>
|
||||
<string name="timeline_scale_regular_summary">المساحة القياسية</string>
|
||||
<string name="timeline_scale_comfortable">مُريَّح</string>
|
||||
<string name="timeline_scale_compact_summary">المزيد من الساعات لكل شاشة، ومجموعات أصغر</string>
|
||||
<string name="timeline_scale_regular">العادي</string>
|
||||
<string name="timeline_scale_comfortable_summary">مجموعات أوسع، تمرير أكثر</string>
|
||||
<string name="timeline_scale_custom_summary">الارتفاع الذي قمت بضغظت المخطط الزمني إليه</string>
|
||||
</resources>
|
||||
|
||||
@@ -491,4 +491,5 @@
|
||||
<item quantity="many">Importando %d eventos</item>
|
||||
<item quantity="other">Importando %d eventos</item>
|
||||
</plurals>
|
||||
<string name="settings_soften_colors">Armoniza los colores del calendario</string>
|
||||
</resources>
|
||||
|
||||
@@ -126,4 +126,24 @@ class TimelineScaleTest {
|
||||
assertThat(parseTimelineScale(stored)).isEqualTo(TimelineScale.Regular)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `a tap creates at the hour it landed in, at whatever scale`() {
|
||||
// Same point on the same column reads as a different hour once the
|
||||
// timeline has been pinched — which is the whole of #148: the tap has to
|
||||
// be measured against the height the column is drawing at now.
|
||||
assertThat(tappedMinuteOfDay(offsetY = 500f, hourPx = 100f)).isEqualTo(5 * 60)
|
||||
assertThat(tappedMinuteOfDay(offsetY = 500f, hourPx = 50f)).isEqualTo(10 * 60)
|
||||
// Within an hour it snaps back to that hour's start.
|
||||
assertThat(tappedMinuteOfDay(offsetY = 599f, hourPx = 100f)).isEqualTo(5 * 60)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `a tap outside the day stays inside it`() {
|
||||
assertThat(tappedMinuteOfDay(offsetY = -20f, hourPx = 56f)).isEqualTo(0)
|
||||
assertThat(tappedMinuteOfDay(offsetY = 99_999f, hourPx = 56f)).isEqualTo(23 * 60)
|
||||
// A viewport measured at nothing has no grid to read — midnight, not a
|
||||
// division by zero.
|
||||
assertThat(tappedMinuteOfDay(offsetY = 500f, hourPx = 0f)).isEqualTo(0)
|
||||
}
|
||||
}
|
||||
|
||||
2
fastlane/metadata/android/ar/changelogs/21801.txt
Normal file
2
fastlane/metadata/android/ar/changelogs/21801.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
إصلاحات
|
||||
• عرض الأسبوع واليوم: النقر على مساحة فارغة يُنشئ الحدث في الساعة التي نقرت عليها، حتى بعد تكبير شريط الوقت أو تغيير ارتفاع الساعة.
|
||||
2
fastlane/metadata/android/de-DE/changelogs/21801.txt
Normal file
2
fastlane/metadata/android/de-DE/changelogs/21801.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Behoben
|
||||
• Wochen- und Tagesansicht: Ein Tippen auf einen freien Bereich legt den Termin jetzt zur angetippten Uhrzeit an – auch nachdem die Zeitleiste gezoomt oder die Stundenhöhe geändert wurde.
|
||||
2
fastlane/metadata/android/en-GB/changelogs/21801.txt
Normal file
2
fastlane/metadata/android/en-GB/changelogs/21801.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Fixed
|
||||
• Week and day view: tapping an empty slot now creates the event at the hour you tapped, even after zooming the timeline or changing the hour height.
|
||||
2
fastlane/metadata/android/en-US/changelogs/21801.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/21801.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Fixed
|
||||
• Week and day view: tapping an empty slot now creates the event at the hour you tapped, even after zooming the timeline or changing the hour height.
|
||||
2
fastlane/metadata/android/es-ES/changelogs/21801.txt
Normal file
2
fastlane/metadata/android/es-ES/changelogs/21801.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Corregido
|
||||
• Vista de semana y día: al tocar un hueco libre, el evento se crea a la hora que has tocado, incluso después de ampliar la línea de tiempo o cambiar la altura de la hora.
|
||||
2
fastlane/metadata/android/fr-FR/changelogs/21801.txt
Normal file
2
fastlane/metadata/android/fr-FR/changelogs/21801.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Corrigé
|
||||
• Vues Semaine et Jour : appuyer sur un créneau vide crée désormais l'événement à l'heure touchée, même après avoir zoomé sur la grille ou modifié la hauteur d'une heure.
|
||||
2
fastlane/metadata/android/it-IT/changelogs/21801.txt
Normal file
2
fastlane/metadata/android/it-IT/changelogs/21801.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Corretto
|
||||
• Vista settimana e giorno: toccando uno spazio libero l'evento viene creato all'ora toccata, anche dopo aver ingrandito la linea temporale o cambiato l'altezza dell'ora.
|
||||
2
fastlane/metadata/android/pl-PL/changelogs/21801.txt
Normal file
2
fastlane/metadata/android/pl-PL/changelogs/21801.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Poprawki
|
||||
• Widok tygodnia i dnia: dotknięcie pustego miejsca tworzy teraz wydarzenie o dotkniętej godzinie, także po powiększeniu osi czasu lub zmianie wysokości godziny.
|
||||
2
fastlane/metadata/android/pt-PT/changelogs/21801.txt
Normal file
2
fastlane/metadata/android/pt-PT/changelogs/21801.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Corrigido
|
||||
• Vista de semana e de dia: tocar num espaço livre cria o evento à hora tocada, mesmo depois de ampliar a linha temporal ou alterar a altura da hora.
|
||||
2
fastlane/metadata/android/ru-RU/changelogs/21801.txt
Normal file
2
fastlane/metadata/android/ru-RU/changelogs/21801.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Исправлено
|
||||
• Вид недели и дня: нажатие на свободное место создаёт событие на выбранный час — в том числе после масштабирования шкалы времени или изменения высоты часа.
|
||||
2
fastlane/metadata/android/zh-CN/changelogs/21801.txt
Normal file
2
fastlane/metadata/android/zh-CN/changelogs/21801.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
修复
|
||||
• 周视图和日视图:点按空白处会在所点的时间创建事件,即使在缩放时间轴或更改小时高度之后也是如此。
|
||||
@@ -22,7 +22,7 @@ kotlinxDatetime = "0.7.0"
|
||||
kotlinxCoroutines = "1.10.2"
|
||||
turbine = "1.2.1"
|
||||
hiltNavigationCompose = "1.3.0"
|
||||
lifecycleCompose = "2.10.0"
|
||||
lifecycleCompose = "2.11.0"
|
||||
androidxTestRules = "1.7.0"
|
||||
# Glance: 1.1.1 is the latest stable (1.2.0 is still rc, 1.3.0 alpha).
|
||||
glance = "1.1.1"
|
||||
|
||||
Reference in New Issue
Block a user