diff --git a/core/i18n/src/main/res/values-cs/strings.xml b/core/i18n/src/main/res/values-cs/strings.xml
index 473fe8936..f86cf3eb5 100644
--- a/core/i18n/src/main/res/values-cs/strings.xml
+++ b/core/i18n/src/main/res/values-cs/strings.xml
@@ -409,7 +409,7 @@
Štítek s tímto názvem již existuje
Štítek s tímto názvem již existuje. Pokud budete pokračovat, budou oba štítky spojeny
K tomuto štítku nejsou přiřazeny žádné položky. Pokud budete pokračovat, štítek bude odstraněn
- Vybrané položky:
+ Vybrat položky
Název štítku
- Vybrána %1$d položka
@@ -910,4 +910,7 @@
Nová rychlá akce
Upravit rychlou akci
Ukončit bez uložení?
+ Název nemůže být prázdný
+ Nový štítek
+ Upravit štítek
diff --git a/core/i18n/src/main/res/values-hu/strings.xml b/core/i18n/src/main/res/values-hu/strings.xml
index aa526ea41..9088ef5b7 100644
--- a/core/i18n/src/main/res/values-hu/strings.xml
+++ b/core/i18n/src/main/res/values-hu/strings.xml
@@ -305,7 +305,7 @@
Keresés és alkalmazásfiók
Médiaalkalmazások
Használat: 1,5 kg, vagy 4 cm >> in
- Ugrás a kiemelt keresési találatra vagy gyorsműveletre, ha megérinti az „Enter” gombot
+ Ugrás a kiemelt keresési találatra vagy gyorsműveletre, az „Enter” gomb megérintésekor
Kizárt keresési eredmények
Minden ikoncsomag
Internetes keresés
diff --git a/core/i18n/src/main/res/values-iw/strings.xml b/core/i18n/src/main/res/values-iw/strings.xml
index c68b21e83..ebf548c49 100644
--- a/core/i18n/src/main/res/values-iw/strings.xml
+++ b/core/i18n/src/main/res/values-iw/strings.xml
@@ -104,18 +104,18 @@
עריכת היישומונים
מזג האוויר
לוח שנה
- מוזיקה
+ מדיה
פתק
- ווידג\'ט יישומון לא ידוע
+ בלתי ידוע
הוספת יישומון
היישומון הוסר
- כתוב פתק…
+ כתיבת פתק
פתק חדש
שמירה
פתק_%1$s
סגירה
מחיקה
- פתק בוטל.
+ הפתק בוטל
מ%1$s
ללא בחירה
שמירה
@@ -135,7 +135,7 @@
גררו פריטים לכאן
תגיות
תגיות נעוצות יוצגו כאן
- צור תגית…
+ יצירת תגית
כתובת URL שרת Nextcloud
כתובת URL זו לא מצביעה על התקנה תקינה של Nextcloud
כתובת URL שרת Owncloud
@@ -216,29 +216,29 @@
גשם כבד ורעמים
רוחות
לא ידוע
- אין נתוני מזג אוויר זמינים.
+ אין נתוני מזג אוויר זמינים
קביעת מיקום
- מיקום לא נמצא.
+ המיקום לא נמצא
יחסי המרה מפורסמים פעם ביום על ידי הבנק המרכזי האירופאי. כל המידע מסופק \"כפי שהוא\" ללא כל אחריות. אין כל אחריות למידע זה. \n \nעדכון אחרון: %1$s
נדרשת גישה למיקום כדי לקבוע את המיקום באופן אוטומטי
נדרשת גישה להתראות כדי לשלוט בהפעלת מדיה
- נדרשת הרשאת איש קשר כדי לחפש אנשי קשר
- נדרשת הרשאת שיחה כדי להתחיל שיחות
+ נדרשת הרשאה לאנשי הקשר כדי לחפש
+ נדרשת הרשאת שיחה כדי להתקשר
נדרשת הרשאה ללוח השנה כדי לחפש בלוח השנה
- נדרשת הרשאת משימות כדי לחפש משימות
+ נדרשת הרשאה למשימות כדי לחפש משימות ביישום
נדרשת הרשאה למטלות כדי להשתמש באינטגרציית המטלות
- ווידג\'ט זה דורש הרשאת לוח שנה
+ יישומון זה מחייב הרשאה ללוח השנה
לא מצליחים למצוא את לוח השנה שלכם?
- נדרשת הרשאת אחסון חיצוני כדי לחפש קבצים מקומיים
- נדרשת הרשאת ניהול כל הקבצים כדי לחפש קבצים מקומיים
+ נדרשת הרשאה לאחסון החיצוני כדי לחפש קבצים במכשיר זה
+ נדרשת הרשאה לכל הקבצים כדי לחפש קבצים מקומיים
יש להגדיר את %1$s כיישום הבית המוגדר כברירת מחדל כדי לחפש קיצורי דרך ליישומים
נדרשת גישה להתראות כדי להציג תגי התראה
הגדרת %1$s כיישום הבית המוגדר כברירת מחדל כדי לחפש קיצורי דרך ליישומים.
הענקה
- הענק הרשאת לוח שנה כדי לחפש בלוח השנה שלך.
- הענק הרשאת מיקום כדי לחפש מקומות קרובים.
- הענק הרשאת אחסון כדי לחפש תמונות, מדיה וקבצים במכשיר זה.
- הענק הרשאת איש קשר כדי לחפש את איש הקשר שלך.
+ דרושה הרשאה ללוח השנה כדי לחפש בלוח השנה שלך
+ דרושה הרשאה למיקום כדי לחפש מיקומים קרובים
+ דרושה הרשאה לאחסון כדי לחפש קבצים במכשיר זה
+ דרושה הרשאה לאנשי הקשר כדי לחפש בין אנשי הקשר שלך
מראֶה
ערכת נושא
בהיר
@@ -269,10 +269,10 @@
מידע על היישום ורשיון
שירות מזג האוויר הגרמני (גרמניה בלבד)
HERE
- התאם אישית את המראה והתחושה
+ התאמה אישית של המראה והתחושה
סַפָּק
מתקדם
- השתמש ב-GPS ושירותי מיקום כדי לקבוע מיקום באופן אוטומטי
+ שימוש בשירותי המיקום כדי לקבוע מיקום באופן אוטומטי
מיקום אוטומטי
מיקום
מנוהל על ידי תוסף
@@ -288,9 +288,9 @@
כרטיסים
התאמה אישית של מראה הכרטיס
- - %1$d ערך הוסר.
- - %1$d ערכים הוסרו.
- - %1$d ערכים הוסרו.
+ - הוסר ערך %1$d
+ - הוסרו %1$d ערכים
+ - הוסרו %1$d ערכים
סמלים
צורה
@@ -366,7 +366,7 @@
ייצוא ההעדפות ונתוני המשגר
הצגת רמת הסוללה הנוכחית כאשר הסוללה חלשה או בעת טעינה
חיפוש
- חיפוש, תגיות, פריטים מוסתרים
+ חיפוש, תגיות, תוצאות מוחרגות
הצגת פריטים נעוצים ובשימוש נפוץ מעל רשת היישומים
קבצים
מועדפים
@@ -396,10 +396,10 @@
מידע על בניית התוכנה
לוחות שנה
הפעלת ההתאמה המודגשת או פעולה מהירה בעת הקשה על \'המשך\'
- תוצאות חיפוש מוסתרות
+ תוצאות חיפוש מוחרגות
הצגת כפתור החשיפה
תגיות
- ניהול יישומים ותוצאות חיפוש שהוסתרו
+ ניהול יישומים ותוצאות חיפוש שהוחרגו
ניהול תגיות ופריטים מתוייגים
הצגת פריטים בשימוש תדיר במועדפים
מקש עריכה
@@ -407,12 +407,12 @@
כתובת URL בויקיפדיה
שינוי סדר הפריטים הנעוצים
בשימוש תדיר
- הצג ווידג\'טים במסך הבית במקום בעמוד נוסף
+ הצגת יישומונים במסך הבית במקום בעמוד נפרד
בקרת מדיה
מסך הבית
Tasks
שעון, שורת החיפוש, רקע, סרגלי מערכת
- רשת ואייקונים
+ רשת וסמלים
גודל הרשת, סמלים, תגים
מזג אוויר
הצגת מקש להוספה, הסרה או סידור מחדש של יישומונים (Widgets)
@@ -420,7 +420,7 @@
כדי להשתמש ב-Breezy Weather כספק מזג אוויר:\n\n1. עברו ל-Breezy Weather > הגדרות > ווידג\'טים ורקע חי > שליחת נתוני Gadgetbridge > הפעלת %1$s\n\n2. ב-%1$s, בחרו ב-Breezy Weather כספק מזג אוויר
פתיחת Breezy Weather
לחצו כדי להתקשר
- התחל שיחה באופן מיידי בעת לחיצה על מספר טלפון
+ התחלת שיחה ללא בקשת אישור בעת לחיצה על מספר טלפון
היישום Tasks הוא יישום חופשי בקוד פתוח המשמש לרשימת מטלות ותזכורות. אם היישום מותקן, %1$s יכול להציג ולחפש את המטלות שלך מתוך היישום Tasks.
אינטגרציית Tasks הוגדרה במלואה ומוכנה לשימוש.
פתיחת היישום Tasks
@@ -466,7 +466,7 @@
סרגלי המערכת
סמלי שורת המצב
יציאה
- אינך מחובר כרגע
+ לא נכנסת
מחומש
תמונת הרקע
עמעום תמונת הרקע
@@ -516,7 +516,7 @@
תגיות קומפקטיות
הסתרת תוויות או סמלים של תגיות כדי לצמצם את השטח שממלאות התגיות
חיבור חשבון
- הענק הרשאת לוח שנה כדי להציג כאן פגישות ואירועים קרובים.
+ דרושה הרשאה ללוח השנה כדי להציג כאן אירועים קרובים
מחובר בתור %1$s
הגדרת %1$s כיישום הבית המוגדר כברירת מחדל כדי ליצור קיצורי דרך.
נוצר ב-%1$s ב-%2$s באמצעות %3$s.
@@ -528,8 +528,8 @@
התקשרות
שליחת הודעה
דואר אלקטרוני
- מגירת חיפוש / יישומון
- בחירת פריטים:
+ חיפוש ומגירת היישומים
+ בחירת פריטים
שם תגית
החלקה מטה
@@ -551,7 +551,7 @@
כיבוי המסך
פתיחת לוח ההגדרות המהירות
הצגת תפריט ההפעלה
- פתח אחרונים
+ פתיחת היישומים שהיו לאחרונה בשימוש
פעולה זו דורשת הפעלת שירות הנגישות של הלאנצ\'ר.
גמישות הדירוג
יציבה
@@ -559,9 +559,9 @@
לא נמצאו לוחות שנה
בחירת יישומון (Widget)
ניתוק הקישור
- הפתק לא יכול להיכתב לקובץ המקושר. ייתכן שהוא הועבר או נמחק. עותק נשמר לאחסון הפנימי של הלאנצ\'ר.
+ לא התאפשרה כתיבת ההערה לקובץ המקושר. נשמר עותק באחסון הפנימי של הלאנצ\'ר.
שגיאה בקריאת הפתק
- לא ניתן היה לקרוא את הקובץ המקושר. ייתכן שהוא הועבר או נמחק. עותק שוחזר מהאחסון הפנימי של הלאנצ\'ר. אם תערוך את הפתק, ייתכן שהקובץ המקושר יידרס.
+ לא ניתן היה לקרוא את הקובץ המקושר. שוחזר עותק מהאחסון הפנימי של הלאנצ\'ר. אם תערכו את ההערה, הקובץ המקושר עשוי להידרס.
שגיאה בשמירת הפתק
הגיבוי שוחזר.
ברירת המחדל
@@ -580,22 +580,22 @@
הוספה לאנשי הקשר
הצגת אתר האינטרנט
הגדרת מועד האירוע
- איזה סוג פעולה תרצה ליצור?
+ איזה סוג פעולה ברצונך ליצור?
חיפוש באתר אינטרנט
חיפוש ביישום
כוונה (intent) מותאמת
בחירת היישום לחיפוש:
הזינו את כתובת אתר האינטרנט:
- לא ניתן לייבא את האתר האינטרנט הנתון לא יכול כחיפוש ברשת. ניתן לנסות אתר אינטרנט אחר או להזין את הנתונים הנדרשים באופן ידני בשלב הבא.
+ לא ניתן לייבא אוטומטית את אתר האינטרנט הנתון כחיפוש ברשת. ניתן לנסות אתר אינטרנט אחר או להזין את הנתונים הנדרשים באופן ידני בשלב הבא
שם
יישום
תבנית כתובת URL
- תבנית כתובת ה-URL שמשמשת ליצור את כתובת ה-URL לחיפוש ברשת. השתמש ב-‘${1}’ כמציין מקום עבור מונח החיפוש בפועל, לדוגמה https://google.com/search?q=${1}.
+ תבנית כתובת ה-URL שמשמשת להרכבת כתובת ה-URL לחיפוש ברשת. השתמשו ב-‘${1}’ כמציין מקום עבור מונח החיפוש בפועל
מידע נוסף
ניסיוני
- תגית עם שם זה כבר קיימת.
- תגית עם שם זה כבר קיימת. אם תמשיך, שתי התגיות ימוזגו.
- לא הוקצו פריטים לתגית זו. אם תמשיך, התגית תימחק.
+ תגית בשם זה כבר קיימת
+ תגית בשם זה כבר קיימת. אם תמשיכו, שתי התגיות ימוזגו
+ לא הוקצו פריטים לתגית זו. אם תמשיכו, התגית תימחק
סידור תוצאות החיפוש
מלמעלה למטה
מלמטה למעלה
@@ -619,7 +619,7 @@
הגדרות היישומון (Widget)
שינוי הגודל
הגדרות שילוב מזג אוויר
- טעינת ווידג\'ט היישומון נכשלה.
+ טעינת היישומון נכשלה
הגדרות שילוב בקרת המדיה
קישור לקובץ
סינכרון תוכן היישומון (Widget) הזה עם קובץ חיצוני
@@ -684,8 +684,8 @@
היום הבא
יצירת אירוע חדש
פתיחת יישום לוח השנה
- המרחב הפרטי נעול.
- יישומוני העבודה מושהים.
+ המרחב הפרטי נעול
+ יישומי העבודה מושהים
ביטול הנעילה
ביטול ההשהיה
השהיית יישומי עבודה
@@ -700,7 +700,7 @@
- נבחרו %1$s רשימות
מועד היציאה
- גילית שילוב של הגדרות שהופך גם את החיפוש וגם את ההגדרות לבלתי נגישים — ובכך למעשה נועל אותך מחוץ ללאנצ\'ר.
+ גילית שילוב של הגדרות שהופך את החיפוש וגם את ההגדרות לבלתי נגישים — ובכך למעשה נועל אותך מחוץ ללאנצ\'ר
ייצוא ערכת הנושא
כל הכבוד, נעלת את עצמך בחוץ!
ייבוא ערכת נושא
@@ -814,7 +814,7 @@
ספק מזג אוויר
הגדרה כספק מזג אוויר
מוגדר כעת כספק מזג אוויר
- פריט זה אינו קיים עוד.
+ פריט זה אינו קיים עוד
מודגש
ללא שעון
יישומון (Widget) מותאם
@@ -904,4 +904,11 @@
לא מותקן ספק הזנה
אמוג\'י
הזנה
+ סגירה
+ פעולה מהירה חדשה
+ עריכת פעולה מהירה
+ השם לא יכול להיות ריק
+ תגית חדשה
+ עריכת תגית
+ לצאת מבלי לשמור?
diff --git a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/TextClassifier.kt b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/TextClassifier.kt
index 8bbfcc164..2555b6fda 100644
--- a/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/TextClassifier.kt
+++ b/data/search-actions/src/main/java/de/mm20/launcher2/searchactions/TextClassifier.kt
@@ -17,33 +17,34 @@ internal interface TextClassifier {
internal class TextClassifierImpl : TextClassifier {
override suspend fun classify(context: Context, query: String): TextClassificationResult {
+ val trimmedQuery = query.trim()
return when {
- query.matches(Regex("^\\S+@\\S+$")) -> TextClassificationResult(
+ trimmedQuery.matches(Regex("^\\S+@\\S+$")) -> TextClassificationResult(
type = TextType.Email,
- text = query,
- email = query
+ text = trimmedQuery,
+ email = trimmedQuery
)
- query.matches(Regex("^\\+?[0-9- /.]{4,18}$")) -> TextClassificationResult(
+ trimmedQuery.matches(Regex("^\\+?[0-9- /.]{4,18}$")) -> TextClassificationResult(
type = TextType.PhoneNumber,
- text = query,
- phoneNumber = query
+ text = trimmedQuery,
+ phoneNumber = trimmedQuery
)
- query.matches(Regex("^(http(s)?://.)?(www\\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$")) -> TextClassificationResult(
+ trimmedQuery.matches(Regex("^(http(s)?://.)?(www\\.)?[-a-zA-Z0-9@:%._+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$")) -> TextClassificationResult(
type = TextType.Url,
- text = query,
- url = query
+ text = trimmedQuery,
+ url = trimmedQuery
)
else -> {
- parseDate(context, query)?.let { return it }
- TextClassificationResult(type = TextType.Text, text = query)
+ parseDate(context, trimmedQuery)?.let { return it }
+ TextClassificationResult(type = TextType.Text, text = trimmedQuery)
}
}
}
- private fun parseDate(context: Context, query: String): TextClassificationResult? {
+ private fun parseDate(context: Context, trimmedQuery: String): TextClassificationResult? {
val dateTimeFormat = SimpleDateFormat(
DateFormat.getBestDateTimePattern(
Locale.getDefault(),
@@ -52,11 +53,11 @@ internal class TextClassifierImpl : TextClassifier {
context.resources.configuration.locales[0]
)
try {
- dateTimeFormat.parse(query)?.let {
+ dateTimeFormat.parse(trimmedQuery)?.let {
val dateTime = LocalDateTime.ofInstant(it.toInstant(), ZoneId.systemDefault())
return TextClassificationResult(
type = TextType.DateTime,
- text = query,
+ text = trimmedQuery,
time = dateTime.toLocalTime(),
date = dateTime.toLocalDate(),
)
@@ -66,10 +67,10 @@ internal class TextClassifierImpl : TextClassifier {
}
val dateFormat = DateFormat.getDateFormat(context)
try {
- dateFormat.parse(query)?.let {
+ dateFormat.parse(trimmedQuery)?.let {
return TextClassificationResult(
type = TextType.Date,
- text = query,
+ text = trimmedQuery,
date = LocalDateTime.ofInstant(it.toInstant(), ZoneId.systemDefault())
.toLocalDate()
)
@@ -85,10 +86,10 @@ internal class TextClassifierImpl : TextClassifier {
context.resources.configuration.locales[0]
)
try {
- timeFormat.parse(query)?.let {
+ timeFormat.parse(trimmedQuery)?.let {
return TextClassificationResult(
type = TextType.Time,
- text = query,
+ text = trimmedQuery,
time = LocalDateTime.ofInstant(it.toInstant(), ZoneId.systemDefault())
.toLocalTime(),
)
@@ -98,40 +99,46 @@ internal class TextClassifierImpl : TextClassifier {
}
val seconds = context.getString(R.string.unit_second_symbol)
- if (query.matches(Regex("^[0-9]+ ${seconds}$"))) {
- val value = query.substringBefore(" ").toLong()
+ val secondsMatch = Regex("^([0-9]+)\\s?${seconds}$").find(trimmedQuery)
+ if (secondsMatch != null) {
+ val value = secondsMatch.groups[1]!!.value.toLong()
return TextClassificationResult(
type = TextType.Timespan,
- text = query,
+ text = trimmedQuery,
timespan = Duration.ofSeconds(value)
)
}
val days = context.getString(R.string.unit_day_symbol)
- if (query.matches(Regex("^[0-9]+ ${days}$"))) {
- val value = query.substringBefore(" ").toLong()
+ val daysMatch = Regex("^([0-9]+)\\s?${days}$").find(trimmedQuery)
+ if (daysMatch != null) {
+ val value = daysMatch.groups[1]!!.value.toLong()
return TextClassificationResult(
type = TextType.Timespan,
- text = query,
+ text = trimmedQuery,
timespan = Duration.ofDays(value)
)
}
+
val minutes = context.getString(R.string.unit_minute_symbol)
- if (query.matches(Regex("^[0-9]+ ${minutes}$"))) {
- val value = query.substringBefore(" ").toLong()
+ val minutesMatch = Regex("^([0-9]+)\\s?${minutes}$").find(trimmedQuery)
+ if (minutesMatch != null) {
+ val value = minutesMatch.groups[1]!!.value.toLong()
val then = LocalDateTime.now().plusMinutes(value)
return TextClassificationResult(
type = TextType.Timespan,
- text = query,
+ text = trimmedQuery,
timespan = Duration.ofMinutes(value)
)
}
+
val hours = context.getString(R.string.unit_hour_symbol)
- if (query.matches(Regex("^[0-9]+ ${hours}$"))) {
- val value = query.substringBefore(" ").toLong()
+ val hoursMatch = Regex("^([0-9]+)\\s?${hours}$").find(trimmedQuery)
+ if (hoursMatch != null) {
+ val value = hoursMatch.groups[1]!!.value.toLong()
return TextClassificationResult(
type = TextType.Timespan,
- text = query,
+ text = trimmedQuery,
timespan = Duration.ofHours(value)
)
}