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) ) }