diff --git a/public/locales/ar.json b/public/locales/ar.json index 864ece636..fdc2ea096 100644 --- a/public/locales/ar.json +++ b/public/locales/ar.json @@ -180,6 +180,16 @@ "season": "الموسم", "season_start_to_stop_short": "إلى" }, + "hints": { + "add_description": "إضافة وصف", + "add_season_end": "إضافة نهاية الموسم", + "add_season_start": "إضافة بداية الموسم", + "confirm_still_exists": "تأكيد أنه لا يزال موجوداً", + "over_x_years_ago": "منذ أكثر من {{yearsAgo}} سنة", + "report_comment_placeholder_no_longer_exists": "لم يعد موجودًا", + "report_no_longer_exists": "الإبلاغ عن عدم وجوده", + "review_comment_placeholder_still_exists": "لا يزال موجودًا!" + }, "index": { "editmarker_html": "انتقل إلى موضع المصدر.
تحقق من عرض القمر الصناعي - قد يكون المصدر مرئيًا من الفضاء!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "أضيف بواسطة {{name}}", "added_by_you": "أضيف بواسطتك", - "date_edited": "تم التحديث في {{date}}", + "date_added": "تمت الإضافة {{date}}", + "date_last_updated": "آخر تحديث {{date}}", "imported_from": "تم الاستيراد من {{name}}", "season": { "in_season": "في الموسم من {{start_month}} إلى {{stop_month}}", diff --git a/public/locales/cs.json b/public/locales/cs.json index 6736465ce..1cc435a3d 100644 --- a/public/locales/cs.json +++ b/public/locales/cs.json @@ -180,6 +180,16 @@ "season": "Sezóna", "season_start_to_stop_short": "do" }, + "hints": { + "add_description": "Přidat popis", + "add_season_end": "Přidat konec sezóny", + "add_season_start": "Přidat začátek sezóny", + "confirm_still_exists": "Potvrdit, že stále existuje", + "over_x_years_ago": "Před více než {{yearsAgo}} lety", + "report_comment_placeholder_no_longer_exists": "Již neexistuje", + "report_no_longer_exists": "Nahlásit, že již neexistuje", + "review_comment_placeholder_still_exists": "Stále tam je!" + }, "index": { "editmarker_html": "Přesuňte na pozici zdroje.

Zkontrolujte satelitní zobrazení - zdroj může být viditelný z vesmíru!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Přidal(a) {{name}}", "added_by_you": "Přidáno vámi", - "date_edited": "Aktualizováno {{date}}", + "date_added": "Přidáno {{date}}", + "date_last_updated": "Naposledy aktualizováno {{date}}", "imported_from": "Importováno z {{name}}", "season": { "in_season": "V sezóně od {{start_month}} do {{stop_month}}", diff --git a/public/locales/de.json b/public/locales/de.json index 1e9e460bc..d80cbf718 100644 --- a/public/locales/de.json +++ b/public/locales/de.json @@ -180,6 +180,16 @@ "season": "Saison", "season_start_to_stop_short": "bis" }, + "hints": { + "add_description": "Beschreibung hinzufügen", + "add_season_end": "Saisonende hinzufügen", + "add_season_start": "Saisonbeginn hinzufügen", + "confirm_still_exists": "Bestätigen, dass es noch existiert", + "over_x_years_ago": "Vor über {{yearsAgo}} Jahren", + "report_comment_placeholder_no_longer_exists": "Existiert nicht mehr", + "report_no_longer_exists": "Melden, dass es nicht mehr existiert", + "review_comment_placeholder_still_exists": "Immer noch da!" + }, "index": { "editmarker_html": "Gehe zum Standort dieser Quelle.

Satellitenansicht betrachten - der Standort könnte aus dem All sichtbar sein!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Hinzugefügt von {{name}}", "added_by_you": "Von dir hinzugefügt", - "date_edited": "Aktualisiert am {{date}}", + "date_added": "Hinzugefügt am {{date}}", + "date_last_updated": "Zuletzt aktualisiert {{date}}", "imported_from": "Importiert von {{name}}", "season": { "in_season": "Saison von {{start_month}} bis {{stop_month}}", diff --git a/public/locales/el.json b/public/locales/el.json index b7620bb06..5a91f1ed7 100644 --- a/public/locales/el.json +++ b/public/locales/el.json @@ -180,6 +180,16 @@ "season": "Εποχή", "season_start_to_stop_short": "έως" }, + "hints": { + "add_description": "Προσθήκη περιγραφής", + "add_season_end": "Προσθήκη λήξης περιόδου", + "add_season_start": "Προσθήκη έναρξης εποχής", + "confirm_still_exists": "Επιβεβαίωση ότι εξακολουθεί να υπάρχει", + "over_x_years_ago": "Πριν από πάνω από {{yearsAgo}} χρόνια", + "report_comment_placeholder_no_longer_exists": "Δεν υπάρχει πλέον", + "report_no_longer_exists": "Αναφορά ότι δεν υπάρχει πλέον", + "review_comment_placeholder_still_exists": "Εξακολουθεί να υπάρχει!" + }, "index": { "editmarker_html": "Μετακίνηση στην θέση της πηγής.

Έλεγξε την δορυφορική προβολή - η τοποθεσία μπορεί να έιναι ορατή από το διάστημα!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Προστέθηκε από {{name}}", "added_by_you": "Προστέθηκε από εσάς", - "date_edited": "Ενημερώθηκε {{date}}", + "date_added": "Προστέθηκε {{date}}", + "date_last_updated": "Τελευταία ενημέρωση {{date}}", "imported_from": "Εισήχθη από {{name}}", "season": { "in_season": "Σε εποχή από {{start_month}} έως {{stop_month}}", diff --git a/public/locales/en.json b/public/locales/en.json index a67c3b838..ce35ba5fb 100644 --- a/public/locales/en.json +++ b/public/locales/en.json @@ -180,6 +180,16 @@ "season": "Season", "season_start_to_stop_short": "to" }, + "hints": { + "add_description": "Add description", + "add_season_end": "Add season end", + "add_season_start": "Add season start", + "confirm_still_exists": "Confirm still exists", + "over_x_years_ago": "Over {{yearsAgo}} years ago", + "review_comment_placeholder_still_exists": "Still there!", + "report_no_longer_exists": "Report no longer exists", + "report_comment_placeholder_no_longer_exists": "No longer exists" + }, "index": { "editmarker_html": "Move to the position of the source.

Check the satellite view - the source may be visible from space!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Added by {{name}}", "added_by_you": "Added by you", - "date_edited": "Updated {{date}}", + "date_added": "Added {{date}}", + "date_last_updated": "Last updated {{date}}", "imported_from": "Imported from {{name}}", "season": { "in_season": "In season from {{start_month}} to {{stop_month}}", diff --git a/public/locales/es.json b/public/locales/es.json index 25409e16b..8d7f0c7b5 100644 --- a/public/locales/es.json +++ b/public/locales/es.json @@ -180,6 +180,16 @@ "season": "Temporada", "season_start_to_stop_short": "a" }, + "hints": { + "add_description": "Añadir descripción", + "add_season_end": "Añadir fin de temporada", + "add_season_start": "Añadir inicio de temporada", + "confirm_still_exists": "Confirmar que aún existe", + "over_x_years_ago": "Hace más de {{yearsAgo}} años", + "report_comment_placeholder_no_longer_exists": "Ya no existe", + "report_no_longer_exists": "Reportar que ya no existe", + "review_comment_placeholder_still_exists": "¡Todavía está ahí!" + }, "index": { "editmarker_html": "Mueve a la posición del sitio.

Comprueba la vista de satélite - ¡el sitio puede ser visible desde el espacio!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Añadido por {{name}}", "added_by_you": "Añadido por ti", - "date_edited": "Actualizado {{date}}", + "date_added": "Añadido el {{date}}", + "date_last_updated": "Última actualización {{date}}", "imported_from": "Importado de {{name}}", "season": { "in_season": "En temporada desde {{start_month}} hasta {{stop_month}}", diff --git a/public/locales/fr.json b/public/locales/fr.json index 36a1d4c18..85c54561f 100644 --- a/public/locales/fr.json +++ b/public/locales/fr.json @@ -180,6 +180,16 @@ "season": "Saison", "season_start_to_stop_short": "à" }, + "hints": { + "add_description": "Ajouter une description", + "add_season_end": "Ajouter la fin de saison", + "add_season_start": "Ajouter le début de saison", + "confirm_still_exists": "Confirmer qu'il existe toujours", + "over_x_years_ago": "Il y a plus de {{yearsAgo}} ans", + "report_comment_placeholder_no_longer_exists": "N'existe plus", + "report_no_longer_exists": "Signaler qu'il n'existe plus", + "review_comment_placeholder_still_exists": "Toujours là !" + }, "index": { "editmarker_html": "Déplacez à la position de la source.

Vérifiez la vue satellite - la source pourrait être visible depuis l'espace!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Ajouté par {{name}}", "added_by_you": "Ajouté par toi", - "date_edited": "Modifié le {{date}}", + "date_added": "Ajouté le {{date}}", + "date_last_updated": "Dernière mise à jour {{date}}", "imported_from": "Importé de {{name}}", "season": { "in_season": "En saison de {{start_month}} à {{stop_month}}", diff --git a/public/locales/he.json b/public/locales/he.json index 62381d31e..07fade743 100644 --- a/public/locales/he.json +++ b/public/locales/he.json @@ -180,6 +180,16 @@ "season": "עונה", "season_start_to_stop_short": "עד" }, + "hints": { + "add_description": "הוסף תיאור", + "add_season_end": "הוסף סוף עונה", + "add_season_start": "הוסף תחילת עונה", + "confirm_still_exists": "אשר שעדיין קיים", + "over_x_years_ago": "לפני יותר מ-{{yearsAgo}} שנים", + "report_comment_placeholder_no_longer_exists": "לא קיים יותר", + "report_no_longer_exists": "דווח שלא קיים יותר", + "review_comment_placeholder_still_exists": "עדיין שם!" + }, "index": { "editmarker_html": "עבור למיקום המקור.

בדוק את תצוגת הלוויין - ייתכן שהמקור נראה מהחלל!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "נוסף על ידי {{name}}", "added_by_you": "נוסף על ידך", - "date_edited": "עודכן {{date}}", + "date_added": "נוסף ב-{{date}}", + "date_last_updated": "עודכן לאחרונה ב-{{date}}", "imported_from": "יובא מ {{name}}", "season": { "in_season": "בעונה מ {{start_month}} עד {{stop_month}}", diff --git a/public/locales/it.json b/public/locales/it.json index 170485bd3..83f318d0c 100644 --- a/public/locales/it.json +++ b/public/locales/it.json @@ -180,6 +180,16 @@ "season": "Stagione", "season_start_to_stop_short": "a" }, + "hints": { + "add_description": "Aggiungi descrizione", + "add_season_end": "Aggiungi fine stagione", + "add_season_start": "Aggiungi inizio stagione", + "confirm_still_exists": "Conferma che esiste ancora", + "over_x_years_ago": "Oltre {{yearsAgo}} anni fa", + "report_comment_placeholder_no_longer_exists": "Non esiste più", + "report_no_longer_exists": "Segnala che non esiste più", + "review_comment_placeholder_still_exists": "Ancora presente!" + }, "index": { "editmarker_html": "Sposta la posizione della sorgente.

Controlla l'immagine satellitare - la fonte può essere visibile dallo spazio!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Aggiunto da {{name}}", "added_by_you": "Aggiunto da te", - "date_edited": "Aggiornato {{date}}", + "date_added": "Aggiunto il {{date}}", + "date_last_updated": "Ultimo aggiornamento {{date}}", "imported_from": "Importato da {{name}}", "season": { "in_season": "In stagione da {{start_month}} a {{stop_month}}", diff --git a/public/locales/ja.json b/public/locales/ja.json index f7fad65e4..db7b61ceb 100644 --- a/public/locales/ja.json +++ b/public/locales/ja.json @@ -180,6 +180,16 @@ "season": "季節", "season_start_to_stop_short": "から" }, + "hints": { + "add_description": "説明を追加", + "add_season_end": "シーズン終了日を追加", + "add_season_start": "シーズン開始を追加", + "confirm_still_exists": "まだ存在することを確認", + "over_x_years_ago": "{{yearsAgo}}年以上前", + "report_comment_placeholder_no_longer_exists": "存在しなくなりました", + "report_no_longer_exists": "存在しなくなったことを報告", + "review_comment_placeholder_still_exists": "まだあります!" + }, "index": { "editmarker_html": "ソースの位置に移動してください。

衛星ビューを確認してください - ソースは宇宙から見えるかもしれません!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "{{name}}によって追加されました", "added_by_you": "あなたによって追加されました", - "date_edited": "{{date}}に更新されました", + "date_added": "{{date}}に追加されました", + "date_last_updated": "最終更新日 {{date}}", "imported_from": "{{name}}からインポートされました", "season": { "in_season": "{{start_month}}から{{stop_month}}まで旬です", diff --git a/public/locales/nl.json b/public/locales/nl.json index 7c9f87f5b..d210bc1c2 100644 --- a/public/locales/nl.json +++ b/public/locales/nl.json @@ -180,6 +180,16 @@ "season": "Seizoen", "season_start_to_stop_short": "tot" }, + "hints": { + "add_description": "Beschrijving toevoegen", + "add_season_end": "Seizoenseinde toevoegen", + "add_season_start": "Seizoensstart toevoegen", + "confirm_still_exists": "Bevestig dat het nog bestaat", + "over_x_years_ago": "Meer dan {{yearsAgo}} jaar geleden", + "report_comment_placeholder_no_longer_exists": "Bestaat niet meer", + "report_no_longer_exists": "Meld dat het niet meer bestaat", + "review_comment_placeholder_still_exists": "Nog steeds daar!" + }, "index": { "editmarker_html": "Verplaats naar de bronlocatie.

Gebruik de satellietweergave - er bestaat een kans dat de bron zichtbaar is vanuit de ruimte!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Toegevoegd door {{name}}", "added_by_you": "Door jou toegevoegd", - "date_edited": "Bijgewerkt {{date}}", + "date_added": "Toegevoegd op {{date}}", + "date_last_updated": "Laatst bijgewerkt {{date}}", "imported_from": "Geïmporteerd van {{name}}", "season": { "in_season": "In seizoen van {{start_month}} tot {{stop_month}}", diff --git a/public/locales/pl.json b/public/locales/pl.json index 4a5fd3b2b..d6acbe0de 100644 --- a/public/locales/pl.json +++ b/public/locales/pl.json @@ -180,6 +180,16 @@ "season": "Sezon", "season_start_to_stop_short": "do" }, + "hints": { + "add_description": "Dodaj opis", + "add_season_end": "Dodaj koniec sezonu", + "add_season_start": "Dodaj początek sezonu", + "confirm_still_exists": "Potwierdź, że nadal istnieje", + "over_x_years_ago": "Ponad {{yearsAgo}} lat temu", + "report_comment_placeholder_no_longer_exists": "Już nie istnieje", + "report_no_longer_exists": "Zgłoś, że już nie istnieje", + "review_comment_placeholder_still_exists": "Wciąż tam jest!" + }, "index": { "editmarker_html": "Przesuń do pozycji źródła.

Sprawdź widok satelitarny - źródło może być widoczne z powietrza!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Dodane przez {{name}}", "added_by_you": "Dodane przez Ciebie", - "date_edited": "Zaktualizowano {{date}}", + "date_added": "Dodano {{date}}", + "date_last_updated": "Ostatnia aktualizacja {{date}}", "imported_from": "Zaimportowane z {{name}}", "season": { "in_season": "W sezonie {{start_month}} - {{stop_month}}", diff --git a/public/locales/pt.json b/public/locales/pt.json index d77c2bdeb..e7af03cad 100644 --- a/public/locales/pt.json +++ b/public/locales/pt.json @@ -180,6 +180,16 @@ "season": "Estação", "season_start_to_stop_short": "até" }, + "hints": { + "add_description": "Adicionar descrição", + "add_season_end": "Adicionar fim da temporada", + "add_season_start": "Adicionar início da estação", + "confirm_still_exists": "Confirmar que ainda existe", + "over_x_years_ago": "Há mais de {{yearsAgo}} anos", + "report_comment_placeholder_no_longer_exists": "Não existe mais", + "report_no_longer_exists": "Reportar que não existe mais", + "review_comment_placeholder_still_exists": "Ainda está lá!" + }, "index": { "editmarker_html": "Mover para a código da fonte

Verifique a visão por satélite - a fonte pode ser visível do espaço!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Adicionado por {{name}}", "added_by_you": "Adicionado por você", - "date_edited": "Atualizado {{date}}", + "date_added": "Adicionado em {{date}}", + "date_last_updated": "Última atualização {{date}}", "imported_from": "Importado de {{name}}", "season": { "in_season": "Na estação de {{start_month}} até {{stop_month}}", diff --git a/public/locales/ru.json b/public/locales/ru.json index 7568bb06a..8bca666d8 100644 --- a/public/locales/ru.json +++ b/public/locales/ru.json @@ -180,6 +180,16 @@ "season": "Сезон", "season_start_to_stop_short": "до" }, + "hints": { + "add_description": "Добавить описание", + "add_season_end": "Добавить конец сезона", + "add_season_start": "Добавить начало сезона", + "confirm_still_exists": "Подтвердить, что существует", + "over_x_years_ago": "Более {{yearsAgo}} лет назад", + "report_comment_placeholder_no_longer_exists": "Больше не существует", + "report_no_longer_exists": "Сообщить, что больше не существует", + "review_comment_placeholder_still_exists": "Всё ещё здесь!" + }, "index": { "editmarker_html": "Переместите в позицию источника.

Проверьте спутниковый вид - источник может быть виден из космоса!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Добавлено {{name}}", "added_by_you": "Добавлено вами", - "date_edited": "Обновлено {{date}}", + "date_added": "Добавлено {{date}}", + "date_last_updated": "Последнее обновление {{date}}", "imported_from": "Импортировано из {{name}}", "season": { "in_season": "В сезоне с {{start_month}} по {{stop_month}}", diff --git a/public/locales/sv.json b/public/locales/sv.json index 720a06e38..cce7075d7 100644 --- a/public/locales/sv.json +++ b/public/locales/sv.json @@ -180,6 +180,16 @@ "season": "Säsong", "season_start_to_stop_short": "till" }, + "hints": { + "add_description": "Lägg till beskrivning", + "add_season_end": "Lägg till säsongsslut", + "add_season_start": "Lägg till säsongsstart", + "confirm_still_exists": "Bekräfta att den fortfarande finns", + "over_x_years_ago": "Över {{yearsAgo}} år sedan", + "report_comment_placeholder_no_longer_exists": "Finns inte längre", + "report_no_longer_exists": "Rapportera att den inte längre finns", + "review_comment_placeholder_still_exists": "Finns fortfarande där!" + }, "index": { "editmarker_html": "Flytta till källans position.

Kontrollera satellitvy - källan kan vara synlig från rymden!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Tillagd av {{name}}", "added_by_you": "Tillagd av dig", - "date_edited": "Uppdaterad {{date}}", + "date_added": "Tillagd {{date}}", + "date_last_updated": "Senast uppdaterad {{date}}", "imported_from": "Importerad från {{name}}", "season": { "in_season": "I säsong från {{start_month}} till {{stop_month}}", diff --git a/public/locales/tr.json b/public/locales/tr.json index 740e3a2d4..88b5a4f29 100644 --- a/public/locales/tr.json +++ b/public/locales/tr.json @@ -180,6 +180,16 @@ "season": "Sezon", "season_start_to_stop_short": "ile" }, + "hints": { + "add_description": "Açıklama ekle", + "add_season_end": "Sezon sonu ekle", + "add_season_start": "Sezon başlangıcını ekle", + "confirm_still_exists": "Hala var olduğunu onayla", + "over_x_years_ago": "{{yearsAgo}} yıldan fazla önce", + "report_comment_placeholder_no_longer_exists": "Artık var olmadığını bildir", + "report_no_longer_exists": "Artık var olmadığını bildir", + "review_comment_placeholder_still_exists": "Hâlâ orada!" + }, "index": { "editmarker_html": "Kaynağın konumuna taşıyın.

Uydu görünümünü kontrol edin - kaynak uzaydan görünür olabilir!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "{{name}} tarafından eklendi", "added_by_you": "Sizin tarafınızdan eklendi", - "date_edited": "{{date}} tarihinde güncellendi", + "date_added": "{{date}} tarihinde eklendi", + "date_last_updated": "Son güncelleme {{date}}", "imported_from": "{{name}} kaynağından içe aktarıldı", "season": { "in_season": "{{start_month}} ile {{stop_month}} arasında mevsiminde", diff --git a/public/locales/uk.json b/public/locales/uk.json index 2e194632d..e1f999973 100644 --- a/public/locales/uk.json +++ b/public/locales/uk.json @@ -180,6 +180,16 @@ "season": "Сезон", "season_start_to_stop_short": "до" }, + "hints": { + "add_description": "Додати опис", + "add_season_end": "Додати кінець сезону", + "add_season_start": "Додати початок сезону", + "confirm_still_exists": "Підтвердити, що все ще існує", + "over_x_years_ago": "Понад {{yearsAgo}} років тому", + "report_comment_placeholder_no_longer_exists": "Більше не існує", + "report_no_longer_exists": "Повідомити, що більше не існує", + "review_comment_placeholder_still_exists": "Все ще тут!" + }, "index": { "editmarker_html": "Перемістіть до позиції джерела.

Перевірте супутниковий вигляд - джерело може бути видно з космосу!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Додано користувачем {{name}}", "added_by_you": "Додано вами", - "date_edited": "Оновлено {{date}}", + "date_added": "Додано {{date}}", + "date_last_updated": "Останнє оновлення {{date}}", "imported_from": "Імпортовано з {{name}}", "season": { "in_season": "В сезоні з {{start_month}} по {{stop_month}}", diff --git a/public/locales/vi.json b/public/locales/vi.json index e99a5df4c..9910f6d40 100644 --- a/public/locales/vi.json +++ b/public/locales/vi.json @@ -180,6 +180,16 @@ "season": "Mùa", "season_start_to_stop_short": "đến" }, + "hints": { + "add_description": "Thêm mô tả", + "add_season_end": "Thêm ngày kết thúc mùa", + "add_season_start": "Thêm mùa bắt đầu", + "confirm_still_exists": "Xác nhận vẫn tồn tại", + "over_x_years_ago": "Hơn {{yearsAgo}} năm trước", + "report_comment_placeholder_no_longer_exists": "Không còn tồn tại", + "report_no_longer_exists": "Báo cáo không còn tồn tại", + "review_comment_placeholder_still_exists": "Vẫn còn đó!" + }, "index": { "editmarker_html": "Di chuyển đến vị trí của nguồn.

Kiểm tra chế độ xem vệ tinh - nguồn có thể được nhìn thấy từ không gian!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "Được thêm bởi {{name}}", "added_by_you": "Thêm bởi bạn", - "date_edited": "Cập nhật {{date}}", + "date_added": "Đã thêm {{date}}", + "date_last_updated": "Cập nhật lần cuối {{date}}", "imported_from": "Được nhập từ {{name}}", "season": { "in_season": "Trong mùa từ {{start_month}} đến {{stop_month}}", diff --git a/public/locales/zh-hans.json b/public/locales/zh-hans.json index ac3b3a5c0..64b3cdddc 100644 --- a/public/locales/zh-hans.json +++ b/public/locales/zh-hans.json @@ -180,6 +180,16 @@ "season": "采摘季节", "season_start_to_stop_short": "至" }, + "hints": { + "add_description": "添加描述", + "add_season_end": "添加季节结束", + "add_season_start": "添加采摘期开始时间", + "confirm_still_exists": "确认仍然存在", + "over_x_years_ago": "{{yearsAgo}}年前", + "report_comment_placeholder_no_longer_exists": "不再存在", + "report_no_longer_exists": "报告不再存在", + "review_comment_placeholder_still_exists": "还在那里!" + }, "index": { "editmarker_html": "拖动到确切位置。

建议切换到卫星视图——有时可以从空中直接看到果树!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "由 {{name}} 添加", "added_by_you": "由你添加", - "date_edited": "更新于 {{date}}", + "date_added": "添加于 {{date}}", + "date_last_updated": "最后更新于 {{date}}", "imported_from": "导入自 {{name}}", "season": { "in_season": "采摘期:{{start_month}} 至 {{stop_month}}", diff --git a/public/locales/zh-hant.json b/public/locales/zh-hant.json index b32c1aa18..08e77dd8d 100644 --- a/public/locales/zh-hant.json +++ b/public/locales/zh-hant.json @@ -180,6 +180,16 @@ "season": "季節", "season_start_to_stop_short": "至" }, + "hints": { + "add_description": "新增描述", + "add_season_end": "新增季節結束", + "add_season_start": "新增季節開始", + "confirm_still_exists": "確認仍然存在", + "over_x_years_ago": "超過{{yearsAgo}}年前", + "report_comment_placeholder_no_longer_exists": "不再存在", + "report_no_longer_exists": "報告不再存在", + "review_comment_placeholder_still_exists": "還在那裡!" + }, "index": { "editmarker_html": "移動到源的位置。

檢查衛星視圖 - 從太空中可以看到源!" }, @@ -210,7 +220,8 @@ "overview": { "added_by": "由{{name}}添加", "added_by_you": "由您添加", - "date_edited": "更新於{{date}}", + "date_added": "已於{{date}}添加", + "date_last_updated": "最後更新於{{date}}", "imported_from": "從{{name}}導入", "season": { "in_season": "從{{start_month}}到{{stop_month}}的季節", diff --git a/scripts/less b/scripts/less deleted file mode 100644 index e69de29bb..000000000 diff --git a/scripts/translation_manager.py b/scripts/translation_manager.py index 799877483..d32d6709c 100755 --- a/scripts/translation_manager.py +++ b/scripts/translation_manager.py @@ -11,6 +11,10 @@ logger = logging.getLogger(__name__) +SCRIPT_DIR = Path(__file__).parent +DEFAULT_SOURCE_PATH = str(SCRIPT_DIR / "../src") +DEFAULT_JSON_FOLDER_PATH = str(SCRIPT_DIR / "../public/locales") + class TranslationManager: def __init__(self, source_path, json_folder_path): @@ -222,8 +226,10 @@ def fill_up_translations(self): def main(): parser = argparse.ArgumentParser(description="Manage translations") - parser.add_argument("--source_path", help="Path to source file or directory to scan for translations") - parser.add_argument("--json_folder_path", help="Path to the folder for JSON locale files") + parser.add_argument("--source_path", default=DEFAULT_SOURCE_PATH, + help="Path to source file or directory to scan for translations (default: ../src relative to script)") + parser.add_argument("--json_folder_path", default=DEFAULT_JSON_FOLDER_PATH, + help="Path to the folder for JSON locale files (default: ../public/locales relative to script)") parser.add_argument("--list-in-source", action="store_true", help="List all translation keys in the component file") parser.add_argument("--list-in-json", action="store_true", help="List all translation keys and values from JSON files") parser.add_argument("--rename-key", nargs=2, metavar=('OLD_KEY', 'NEW_KEY'), diff --git a/src/components/entry/EntryOverview.js b/src/components/entry/EntryOverview.js index 6bd67153c..987acc2fe 100644 --- a/src/components/entry/EntryOverview.js +++ b/src/components/entry/EntryOverview.js @@ -1,11 +1,12 @@ import { Calendar, Data, + EditAlt as Created, StreetView, User, } from '@styled-icons/boxicons-regular' import { EditAlt, Map, User as UserYou } from '@styled-icons/boxicons-solid' -import { useRef } from 'react' +import { useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' import { Link } from 'react-router-dom' @@ -17,6 +18,13 @@ import { useAppHistory } from '../../utils/useAppHistory' import { useIsDesktop, useIsEmbed } from '../../utils/useBreakpoint' import { theme } from '../ui/GlobalStyle' import IconBesideText from '../ui/IconBesideText' +import { + AddDescriptionHint, + AddSeasonStartHint, + AddSeasonStopHint, + StaleLocationHintActions, + StaleLocationHintToggle, +} from './overview/Hints' import { ReportButton } from './overview/ReportButton' import SaveToListButton from './overview/SaveToListButton' import Tags from './overview/Tags' @@ -26,14 +34,8 @@ import ReviewSummary from './ReviewSummary' import { formatISOString, formatMonth } from './textFormatters' import useLocationPane from './useLocationPane' -const hasSeasonality = (locationData) => - !!( - locationData.no_season != null || - locationData.season_start != null || - locationData.season_stop != null - ) +const TEN_YEARS_MS = 10 * 365.25 * 24 * 60 * 60 * 1000 -// Wraps description, last updated text, and review and report buttons const Description = styled.section` word-break: normal; overflow-wrap: anywhere; @@ -63,6 +65,24 @@ const DisabledIconBesideText = styled(IconBesideText)` `} ` +const ButtonRow = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +` + +const ButtonGroupStart = styled.div` + display: flex; + flex-direction: row; + align-items: center; + gap: 10px; +` + +const OverviewContainer = styled.div` + padding-block-end: env(safe-area-inset-bottom, 0); +` + const AddressInfo = ({ locationData, onClick }) => ( @@ -73,8 +93,28 @@ const AddressInfo = ({ locationData, onClick }) => ( ) -const StreetViewInfo = ({ streetViewOpen, isDisabled, onOpen, onClose }) => - streetViewOpen ? ( +const StreetViewInfo = () => { + const history = useAppHistory() + const { + streetViewOpen, + locationId, + location: locationData, + } = useSelector((state) => state.location) + const { locationsWithoutPanorama } = useSelector((state) => state.misc) + + const isDisabled = !!locationsWithoutPanorama[locationData.id] + + const onOpen = (event) => { + event.stopPropagation() + history.push(`/locations/${locationId}/panorama`) + } + + const onClose = (event) => { + event.stopPropagation() + history.push(`/locations/${locationId}`) + } + + return streetViewOpen ? (

Google Maps

@@ -89,15 +129,15 @@ const StreetViewInfo = ({ streetViewOpen, isDisabled, onOpen, onClose }) =>

Google Street View

) +} const SeasonalityInfo = ({ locationData }) => { const { t, i18n } = useTranslation() return ( - +

- {locationData.no_season || - (locationData.season_start === 0 && locationData.season_stop === 11) + {locationData.season_start === 0 && locationData.season_stop === 11 ? t('locations.overview.season.year_round') : t('locations.overview.season.in_season', { start_month: @@ -109,6 +149,14 @@ const SeasonalityInfo = ({ locationData }) => { ? formatMonth(locationData.season_stop, i18n.language) : '?', })} + {locationData.season_stop != null && + locationData.season_start == null && ( + + )} + {locationData.season_start != null && + locationData.season_stop == null && ( + + )}

) @@ -171,49 +219,58 @@ const AuthorInfo = ({ locationData, user }) => const LastEditedInfo = ({ locationData }) => { const { t, i18n } = useTranslation() + const [expanded, setExpanded] = useState(false) + const wasCreatedSameDay = + locationData.created_at.slice(0, 10) === + locationData.updated_at.slice(0, 10) + + const icon = wasCreatedSameDay ? : + + const dateTime = wasCreatedSameDay + ? locationData.created_at + : locationData.updated_at + + const label = wasCreatedSameDay + ? t('locations.overview.date_added', { + date: formatISOString(locationData.created_at, i18n.language), + }) + : t('locations.overview.date_last_updated', { + date: formatISOString(locationData.updated_at, i18n.language), + }) + + const isStale = + Date.now() - new Date(locationData.updated_at).getTime() > TEN_YEARS_MS + return ( - - -

- -

-
+ <> + + {icon} +

+ +

+ {isStale && ( + setExpanded((prev) => !prev)} + /> + )} +
+ {isStale && expanded && ( + + )} + ) } -const ButtonRow = styled.div` - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: center; -` - -const ButtonGroupStart = styled.div` - display: flex; - flex-direction: row; - align-items: center; - gap: 10px; -` - -const OverviewContainer = styled.div` - padding-block-end: env(safe-area-inset-bottom, 0); -` const EntryOverview = () => { const typesAccess = useSelector((state) => state.type.typesAccess) const history = useAppHistory() const { googleMap } = useSelector((state) => state.map) - const { - streetViewOpen, - locationId, - location: locationData, - reviews, - } = useSelector((state) => state.location) + const { location: locationData, reviews } = useSelector( + (state) => state.location, + ) const isEmbed = useIsEmbed() - const { locationsWithoutPanorama } = useSelector((state) => state.misc) const user = useSelector((state) => state.auth.user) const isDesktop = useIsDesktop() @@ -251,32 +308,21 @@ const EntryOverview = () => { } } - const openStreetView = (event) => { - event.stopPropagation() - history.push(`/locations/${locationId}/panorama`) - } - const closeStreetView = (event) => { - event.stopPropagation() - history.push(`/locations/${locationId}`) - } - return ( -

{locationData.description}

- +

+ {locationData.description || ( + + )} +

- - {hasSeasonality(locationData) && ( - - )} + + {!!( + locationData.season_start != null || locationData.season_stop != null + ) && } {(locationData.import_id || locationData.author || locationData.user_id) && ( diff --git a/src/components/entry/overview/Hints.js b/src/components/entry/overview/Hints.js new file mode 100644 index 000000000..10d2d4c1a --- /dev/null +++ b/src/components/entry/overview/Hints.js @@ -0,0 +1,173 @@ +import { ChevronDown, ChevronUp } from '@styled-icons/boxicons-regular' +import { useTranslation } from 'react-i18next' +import styled from 'styled-components/macro' + +import { useAppHistory } from '../../../utils/useAppHistory' +import ResetButton from '../../ui/ResetButton' +import useLocationPane from '../useLocationPane' + +const HintAction = styled(ResetButton)` + font-style: italic; + text-decoration: underline; + color: ${({ theme }) => theme.tertiaryText}; + + &:hover { + color: ${({ theme }) => theme.secondaryText}; + } +` +const HintsContainerInline = styled.span` + margin-inline: 0.5em; +` + +const OldLabelInline = styled(ResetButton)` + display: inline-flex; + align-items: center; + gap: 0.25em; + margin-inline-start: 0.5em; + font-style: italic; + color: ${({ theme }) => theme.tertiaryText}; + + &:hover { + color: ${({ theme }) => theme.secondaryText}; + } +` + +const ExistenceActionsContainer = styled.div` + display: flex; + flex-direction: row; + flex-wrap: wrap; + gap: 1em; + margin-block-start: 0.75em; +` + +export const AddDescriptionHint = ({ locationData }) => { + const { t } = useTranslation() + const history = useAppHistory() + const { fullyOpenPaneDrawerIfMobile } = useLocationPane() + + return ( + { + fullyOpenPaneDrawerIfMobile() + history.push(`/locations/${locationData.id}/edit`, { + focus: 'description', + }) + }} + > + {t('locations.hints.add_description')} + + ) +} + +export const AddSeasonStartHint = ({ locationData }) => { + const { t } = useTranslation() + const history = useAppHistory() + const { fullyOpenPaneDrawerIfMobile } = useLocationPane() + + return ( + + { + fullyOpenPaneDrawerIfMobile() + history.push(`/locations/${locationData.id}/edit`, { + focus: 'season_start', + }) + }} + > + {t('locations.hints.add_season_start')} + + + ) +} + +export const AddSeasonStopHint = ({ locationData }) => { + const { t } = useTranslation() + const history = useAppHistory() + const { fullyOpenPaneDrawerIfMobile } = useLocationPane() + + return ( + + { + fullyOpenPaneDrawerIfMobile() + history.push(`/locations/${locationData.id}/edit`, { + focus: 'season_stop', + }) + }} + > + {t('locations.hints.add_season_end')} + + + ) +} + +export const StaleLocationHintToggle = ({ + locationData, + expanded, + onToggle, +}) => { + const { t } = useTranslation() + const { fullyOpenPaneDrawerIfMobile } = useLocationPane() + + const updatedAt = new Date(locationData.updated_at) + const yearsAgo = Math.floor( + (Date.now() - updatedAt.getTime()) / (365.25 * 24 * 60 * 60 * 1000), + ) + + return ( + { + e.stopPropagation() + fullyOpenPaneDrawerIfMobile() + onToggle() + }} + role="button" + aria-expanded={expanded} + > + {t('locations.hints.over_x_years_ago', { yearsAgo })} + {expanded ? : } + + ) +} + +export const StaleLocationHintActions = ({ locationData }) => { + const { t } = useTranslation() + const history = useAppHistory() + const { fullyOpenPaneDrawerIfMobile } = useLocationPane() + + const comment = t( + 'locations.hints.report_comment_placeholder_no_longer_exists', + ) + + const reviewComment = t( + 'locations.hints.review_comment_placeholder_still_exists', + ) + + return ( + + { + fullyOpenPaneDrawerIfMobile() + history.push(`/locations/${locationData.id}/review`, { + defaultComment: reviewComment, + focus: 'review.comment', + }) + }} + > + {t('locations.hints.confirm_still_exists')} + + { + fullyOpenPaneDrawerIfMobile() + history.addParam('report', 'true', { + problem_code: 1, + comment: comment, + focus: 'comment', + }) + }} + > + {t('locations.hints.report_no_longer_exists')} + + + ) +} diff --git a/src/components/entry/overview/ReportButton.js b/src/components/entry/overview/ReportButton.js index f08a64074..7ba11b13d 100644 --- a/src/components/entry/overview/ReportButton.js +++ b/src/components/entry/overview/ReportButton.js @@ -1,29 +1,36 @@ import { Flag } from '@styled-icons/boxicons-solid' -import { useState } from 'react' import { useTranslation } from 'react-i18next' import { useSelector } from 'react-redux' +import { useLocation } from 'react-router-dom' +import { useAppHistory } from '../../../utils/useAppHistory' import { ReportModal } from '../../form/ReportModal' import Button from '../../ui/Button' -import useLocationPane from '../useLocationPane' export const ReportButton = () => { const { location: locationData } = useSelector((state) => state.location) const { t } = useTranslation() const typesAccess = useSelector((state) => state.type.typesAccess) - const { drawerFullyOpen, fullyOpenPaneDrawer } = useLocationPane() + const history = useAppHistory() + const location = useLocation() + + const isReportModalOpen = + new URLSearchParams(location.search).get('report') === 'true' + + const defaultProblemCode = location.state?.problem_code ?? null + const defaultComment = location.state?.comment ?? null const locationName = locationData?.type_ids .map((id) => typesAccess?.getType(id)?.commonName) .filter(Boolean) .join(', ') - const [isReportModalOpen, setIsReportModalOpen] = useState(false) const handleReportClick = () => { - if (!drawerFullyOpen) { - fullyOpenPaneDrawer() - } - setIsReportModalOpen(true) + history.addParam('report', 'true') + } + + const handleDismiss = () => { + history.removeParam('report') } return ( @@ -33,7 +40,9 @@ export const ReportButton = () => { locationId={locationData.id} title={`${t('form.button.report')} ${locationName}`} name={locationName} - onDismiss={() => setIsReportModalOpen(false)} + onDismiss={handleDismiss} + defaultProblemCode={defaultProblemCode} + defaultComment={defaultComment} /> )}