Tours: filter a tour list by source, routing limit and type where it varies (PR1-13)

This commit is contained in:
Maurice
2026-10-15 22:02:41 +02:00
parent 3d9095ccde
commit cd1b1410bd
36 changed files with 632 additions and 87 deletions
+8
View File
@@ -269,5 +269,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'إظهار الكل',
'tours.visibility.show': 'إظهار على الخريطة',
'tours.visibility.hide': 'إخفاء على الخريطة',
'tours.filter.status': 'الحالة',
'tours.filter.source': 'المصدر',
'tours.filter.grade': 'حد المسار',
'tours.filter.gradeHint':
'أعلى صعوبة سُمح للمسار باستخدامها عند التخطيط، كما حُفظت مع الجولة. وليست الصعوبة المقاسة على الدرب.',
'tours.filter.type': 'النوع',
'tours.filter.empty': 'لا توجد جولة تطابق هذه المرشحات.',
'tours.filter.reset': 'إعادة ضبط المرشحات',
};
export default tours;
+8
View File
@@ -258,5 +258,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Hamısını göstər',
'tours.visibility.show': 'Xəritədə göstər',
'tours.visibility.hide': 'Xəritədə gizlət',
'tours.filter.status': 'Vəziyyət',
'tours.filter.source': 'Mənbə',
'tours.filter.grade': 'Marşrut həddi',
'tours.filter.gradeHint':
'Marşrutun planlaşdırılarkən istifadə edə biləcəyi ən yüksək çətinlik, turla birlikdə saxlandığı kimi. Cığırda ölçülən çətinlik deyil.',
'tours.filter.type': 'Növ',
'tours.filter.empty': 'Bu filtrlərə uyğun tur yoxdur.',
'tours.filter.reset': 'Filtrləri sıfırla',
};
export default tours;
+8
View File
@@ -263,5 +263,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Mostrar todos',
'tours.visibility.show': 'Mostrar no mapa',
'tours.visibility.hide': 'Ocultar no mapa',
'tours.filter.status': 'Situação',
'tours.filter.source': 'Fonte',
'tours.filter.grade': 'Limite de rota',
'tours.filter.gradeHint':
'A dificuldade máxima que a rota podia usar no planejamento, como salva no passeio. Não é a dificuldade medida na trilha.',
'tours.filter.type': 'Tipo',
'tours.filter.empty': 'Nenhum passeio corresponde a esses filtros.',
'tours.filter.reset': 'Limpar filtros',
};
export default tours;
+8
View File
@@ -264,5 +264,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Mostra-les totes',
'tours.visibility.show': 'Mostra al mapa',
'tours.visibility.hide': 'Amaga al mapa',
'tours.filter.status': 'Estat',
'tours.filter.source': 'Font',
'tours.filter.grade': 'Límit de ruta',
'tours.filter.gradeHint':
'La dificultat màxima que la ruta podia fer servir en planificar-la, tal com es va desar amb l’excursió. No la dificultat mesurada al camí.',
'tours.filter.type': 'Tipus',
'tours.filter.empty': 'Cap excursió no coincideix amb aquests filtres.',
'tours.filter.reset': 'Restableix els filtres',
};
export default tours;
+8
View File
@@ -258,5 +258,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Zobrazit vše',
'tours.visibility.show': 'Zobrazit na mapě',
'tours.visibility.hide': 'Skrýt na mapě',
'tours.filter.status': 'Stav',
'tours.filter.source': 'Zdroj',
'tours.filter.grade': 'Limit trasy',
'tours.filter.gradeHint':
'Nejvyšší obtížnost, kterou trasa směla při plánování použít, jak je uložena u túry. Ne naměřená obtížnost cesty.',
'tours.filter.type': 'Druh',
'tours.filter.empty': 'Těmto filtrům neodpovídá žádná túra.',
'tours.filter.reset': 'Zrušit filtry',
};
export default tours;
+8
View File
@@ -265,6 +265,14 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Alle einblenden',
'tours.visibility.show': 'Auf der Karte einblenden',
'tours.visibility.hide': 'Auf der Karte ausblenden',
'tours.filter.status': 'Status', // same-as-en
'tours.filter.source': 'Quelle',
'tours.filter.grade': 'Routing-Grenze',
'tours.filter.gradeHint':
'Die höchste Schwierigkeit, die die Route beim Planen nutzen durfte, wie sie an der Tour gespeichert ist. Nicht die gemessene Schwierigkeit des Weges.',
'tours.filter.type': 'Art',
'tours.filter.empty': 'Keine Tour passt zu diesen Filtern.',
'tours.filter.reset': 'Filter zurücksetzen',
};
export default tours;
+8
View File
@@ -257,5 +257,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Show all',
'tours.visibility.show': 'Show on the map',
'tours.visibility.hide': 'Hide on the map',
'tours.filter.status': 'Status',
'tours.filter.source': 'Source',
'tours.filter.grade': 'Routing limit',
'tours.filter.gradeHint':
'The highest difficulty the route was planned to allow, as stored with the tour. Not the difficulty measured on the trail.',
'tours.filter.type': 'Type',
'tours.filter.empty': 'No tour matches these filters.',
'tours.filter.reset': 'Reset filters',
};
export default tours;
+8
View File
@@ -262,5 +262,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Mostrar todas',
'tours.visibility.show': 'Mostrar en el mapa',
'tours.visibility.hide': 'Ocultar en el mapa',
'tours.filter.status': 'Estado',
'tours.filter.source': 'Fuente',
'tours.filter.grade': 'Límite de ruta',
'tours.filter.gradeHint':
'La dificultad máxima que la ruta podía usar al planificarse, tal como se guardó con la excursión. No la dificultad medida en el sendero.',
'tours.filter.type': 'Tipo',
'tours.filter.empty': 'Ninguna excursión coincide con estos filtros.',
'tours.filter.reset': 'Restablecer filtros',
};
export default tours;
+8
View File
@@ -260,5 +260,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Näita kõiki',
'tours.visibility.show': 'Näita kaardil',
'tours.visibility.hide': 'Peida kaardil',
'tours.filter.status': 'Olek',
'tours.filter.source': 'Allikas',
'tours.filter.grade': 'Marsruudi piir',
'tours.filter.gradeHint':
'Suurim raskusaste, mida marsruut planeerimisel kasutada tohtis, nagu see on matkaga salvestatud. Mitte rajal mõõdetud raskus.',
'tours.filter.type': 'Liik',
'tours.filter.empty': 'Ükski matk ei vasta neile filtritele.',
'tours.filter.reset': 'Lähtesta filtrid',
};
export default tours;
+8
View File
@@ -267,5 +267,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Tout afficher',
'tours.visibility.show': 'Afficher sur la carte',
'tours.visibility.hide': 'Masquer sur la carte',
'tours.filter.status': 'Statut',
'tours.filter.source': 'Source', // same-as-en
'tours.filter.grade': 'Limite d’itinéraire',
'tours.filter.gradeHint':
'La difficulté maximale que l’itinéraire pouvait emprunter à la planification, telle qu’enregistrée avec la sortie. Pas la difficulté mesurée sur le sentier.',
'tours.filter.type': 'Type', // same-as-en
'tours.filter.empty': 'Aucune sortie ne correspond à ces filtres.',
'tours.filter.reset': 'Réinitialiser les filtres',
};
export default tours;
+8
View File
@@ -269,5 +269,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Εμφάνιση όλων',
'tours.visibility.show': 'Εμφάνιση στον χάρτη',
'tours.visibility.hide': 'Απόκρυψη στον χάρτη',
'tours.filter.status': 'Κατάσταση',
'tours.filter.source': 'Πηγή',
'tours.filter.grade': 'Όριο διαδρομής',
'tours.filter.gradeHint':
'Η μέγιστη δυσκολία που επιτρεπόταν στη διαδρομή κατά τον σχεδιασμό, όπως αποθηκεύτηκε με την εκδρομή. Όχι η μετρημένη δυσκολία του μονοπατιού.',
'tours.filter.type': 'Είδος',
'tours.filter.empty': 'Καμία εκδρομή δεν ταιριάζει με αυτά τα φίλτρα.',
'tours.filter.reset': 'Επαναφορά φίλτρων',
};
export default tours;
+8
View File
@@ -264,5 +264,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Összes megjelenítése',
'tours.visibility.show': 'Megjelenítés a térképen',
'tours.visibility.hide': 'Elrejtés a térképen',
'tours.filter.status': 'Állapot',
'tours.filter.source': 'Forrás',
'tours.filter.grade': 'Útvonalkorlát',
'tours.filter.gradeHint':
'A legnagyobb nehézség, amelyet az útvonal tervezéskor használhatott, a túrával mentve. Nem az ösvényen mért nehézség.',
'tours.filter.type': 'Fajta',
'tours.filter.empty': 'Egy túra sem felel meg ezeknek a szűrőknek.',
'tours.filter.reset': 'Szűrők törlése',
};
export default tours;
+8
View File
@@ -257,5 +257,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Tampilkan semua',
'tours.visibility.show': 'Tampilkan di peta',
'tours.visibility.hide': 'Sembunyikan di peta',
'tours.filter.status': 'Status', // same-as-en
'tours.filter.source': 'Sumber',
'tours.filter.grade': 'Batas rute',
'tours.filter.gradeHint':
'Tingkat kesulitan tertinggi yang boleh dipakai rute saat direncanakan, seperti tersimpan pada tur. Bukan kesulitan yang diukur di jalur.',
'tours.filter.type': 'Jenis',
'tours.filter.empty': 'Tidak ada tur yang cocok dengan filter ini.',
'tours.filter.reset': 'Atur ulang filter',
};
export default tours;
+8
View File
@@ -264,5 +264,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Mostra tutti',
'tours.visibility.show': 'Mostra sulla mappa',
'tours.visibility.hide': 'Nascondi sulla mappa',
'tours.filter.status': 'Stato',
'tours.filter.source': 'Fonte',
'tours.filter.grade': 'Limite di percorso',
'tours.filter.gradeHint':
'La difficoltà massima che il percorso poteva usare in fase di pianificazione, come salvata con il tour. Non la difficoltà misurata sul sentiero.',
'tours.filter.type': 'Tipo',
'tours.filter.empty': 'Nessun tour corrisponde a questi filtri.',
'tours.filter.reset': 'Reimposta filtri',
};
export default tours;
+8
View File
@@ -251,5 +251,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'すべて表示',
'tours.visibility.show': '地図に表示',
'tours.visibility.hide': '地図で非表示にする',
'tours.filter.status': '状態',
'tours.filter.source': 'ソース',
'tours.filter.grade': 'ルートの上限',
'tours.filter.gradeHint':
'計画時にルートが使ってよい最大の難易度で、ツアーに保存されている値です。道で測った難易度ではありません。',
'tours.filter.type': '種類',
'tours.filter.empty': 'この条件に合うツアーはありません。',
'tours.filter.reset': 'フィルターをリセット',
};
export default tours;
+8
View File
@@ -249,5 +249,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': '모두 표시',
'tours.visibility.show': '지도에 표시',
'tours.visibility.hide': '지도에서 숨기기',
'tours.filter.status': '상태',
'tours.filter.source': '소스',
'tours.filter.grade': '경로 한도',
'tours.filter.gradeHint':
'계획할 때 경로가 쓸 수 있었던 최고 난이도로, 투어에 저장된 값입니다. 길에서 측정한 난이도가 아닙니다.',
'tours.filter.type': '종류',
'tours.filter.empty': '이 필터에 맞는 투어가 없습니다.',
'tours.filter.reset': '필터 초기화',
};
export default tours;
+8
View File
@@ -263,5 +263,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Alles tonen',
'tours.visibility.show': 'Tonen op de kaart',
'tours.visibility.hide': 'Verbergen op de kaart',
'tours.filter.status': 'Status', // same-as-en
'tours.filter.source': 'Bron',
'tours.filter.grade': 'Routelimiet',
'tours.filter.gradeHint':
'De hoogste moeilijkheid die de route bij het plannen mocht gebruiken, zoals opgeslagen bij de tocht. Niet de gemeten moeilijkheid van het pad.',
'tours.filter.type': 'Soort',
'tours.filter.empty': 'Geen tocht past bij deze filters.',
'tours.filter.reset': 'Filters wissen',
};
export default tours;
+8
View File
@@ -271,5 +271,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Pokaż wszystkie',
'tours.visibility.show': 'Pokaż na mapie',
'tours.visibility.hide': 'Ukryj na mapie',
'tours.filter.status': 'Stan',
'tours.filter.source': 'Źródło',
'tours.filter.grade': 'Limit trasy',
'tours.filter.gradeHint':
'Najwyższa trudność, jaką trasa mogła wykorzystać przy planowaniu, zapisana przy trasie. To nie zmierzona trudność szlaku.',
'tours.filter.type': 'Rodzaj',
'tours.filter.empty': 'Żadna trasa nie pasuje do tych filtrów.',
'tours.filter.reset': 'Wyczyść filtry',
};
export default tours;
+8
View File
@@ -274,5 +274,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Показать все',
'tours.visibility.show': 'Показать на карте',
'tours.visibility.hide': 'Скрыть на карте',
'tours.filter.status': 'Статус',
'tours.filter.source': 'Источник',
'tours.filter.grade': 'Предел маршрута',
'tours.filter.gradeHint':
'Наибольшая сложность, которую маршрут мог использовать при планировании, как она сохранена с походом. Это не измеренная сложность тропы.',
'tours.filter.type': 'Тип',
'tours.filter.empty': 'Ни один поход не подходит под эти фильтры.',
'tours.filter.reset': 'Сбросить фильтры',
};
export default tours;
+8
View File
@@ -259,5 +259,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Zobraziť všetky',
'tours.visibility.show': 'Zobraziť na mape',
'tours.visibility.hide': 'Skryť na mape',
'tours.filter.status': 'Stav',
'tours.filter.source': 'Zdroj',
'tours.filter.grade': 'Limit trasy',
'tours.filter.gradeHint':
'Najvyššia náročnosť, ktorú trasa smela pri plánovaní použiť, ako je uložená pri túre. Nie nameraná náročnosť chodníka.',
'tours.filter.type': 'Druh',
'tours.filter.empty': 'Týmto filtrom nezodpovedá žiadna túra.',
'tours.filter.reset': 'Zrušiť filtre',
};
export default tours;
+8
View File
@@ -256,5 +256,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Visa alla',
'tours.visibility.show': 'Visa på kartan',
'tours.visibility.hide': 'Dölj på kartan',
'tours.filter.status': 'Status', // same-as-en
'tours.filter.source': 'Källa',
'tours.filter.grade': 'Ruttgräns',
'tours.filter.gradeHint':
'Den högsta svårighet som rutten fick använda vid planeringen, sparad med turen. Inte den uppmätta svårigheten på leden.',
'tours.filter.type': 'Typ',
'tours.filter.empty': 'Ingen tur matchar de här filtren.',
'tours.filter.reset': 'Återställ filter',
};
export default tours;
+8
View File
@@ -245,5 +245,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'แสดงทั้งหมด',
'tours.visibility.show': 'แสดงบนแผนที่',
'tours.visibility.hide': 'ซ่อนบนแผนที่',
'tours.filter.status': 'สถานะ',
'tours.filter.source': 'แหล่งข้อมูล',
'tours.filter.grade': 'ขีดจำกัดเส้นทาง',
'tours.filter.gradeHint':
'ความยากสูงสุดที่เส้นทางใช้ได้ตอนวางแผน ตามที่บันทึกไว้กับทัวร์ ไม่ใช่ความยากที่วัดได้บนเส้นทางจริง',
'tours.filter.type': 'ประเภท',
'tours.filter.empty': 'ไม่มีทัวร์ที่ตรงกับตัวกรองเหล่านี้',
'tours.filter.reset': 'รีเซ็ตตัวกรอง',
};
export default tours;
+2 -2
View File
@@ -20,7 +20,7 @@ const tokens = (value: string) => [...value.matchAll(/\{[^{}]+\}/g)].map((match)
// placeholder spec; here only the general keys are.
const groups = pluralGroups(Object.keys(english));
const generalKeys = (keys: string[]) => keys.filter((key) => !pluralFormOf(key, groups));
const GENERAL_KEY_COUNT = 231;
const GENERAL_KEY_COUNT = 238;
function literalKeys(source: string): string[] {
const tree = ts.createSourceFile('locale.ts', source, ts.ScriptTarget.Latest, true);
@@ -34,7 +34,7 @@ function literalKeys(source: string): string[] {
}
describe('Tours locale contracts', () => {
it('covers all 27 supported locales with 231 general source keys', () => {
it('covers all 27 supported locales with 238 general source keys', () => {
expect(Object.keys(domains)).toHaveLength(27);
expect(Object.keys(domains).sort()).toEqual(SUPPORTED_LANGUAGE_CODES.map((code) => `./${code}/tours.ts`).sort());
expect(generalKeys(Object.keys(english))).toHaveLength(GENERAL_KEY_COUNT);
+8
View File
@@ -258,5 +258,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Tümünü göster',
'tours.visibility.show': 'Haritada göster',
'tours.visibility.hide': 'Haritada gizle',
'tours.filter.status': 'Durum',
'tours.filter.source': 'Kaynak',
'tours.filter.grade': 'Rota sınırı',
'tours.filter.gradeHint':
'Rotanın planlanırken kullanabileceği en yüksek zorluk, turla birlikte saklandığı gibi. Parkurda ölçülen zorluk değildir.',
'tours.filter.type': 'Tür',
'tours.filter.empty': 'Bu filtrelere uyan tur yok.',
'tours.filter.reset': 'Filtreleri sıfırla',
};
export default tours;
+8
View File
@@ -271,5 +271,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Показати всі',
'tours.visibility.show': 'Показати на мапі',
'tours.visibility.hide': 'Приховати на мапі',
'tours.filter.status': 'Стан',
'tours.filter.source': 'Джерело',
'tours.filter.grade': 'Межа маршруту',
'tours.filter.gradeHint':
'Найвища складність, яку маршрут міг використати під час планування, як її збережено з походом. Це не виміряна складність стежки.',
'tours.filter.type': 'Тип',
'tours.filter.empty': 'Жоден похід не відповідає цим фільтрам.',
'tours.filter.reset': 'Скинути фільтри',
};
export default tours;
+8
View File
@@ -257,5 +257,13 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': 'Hiện tất cả',
'tours.visibility.show': 'Hiện trên bản đồ',
'tours.visibility.hide': 'Ẩn trên bản đồ',
'tours.filter.status': 'Trạng thái',
'tours.filter.source': 'Nguồn',
'tours.filter.grade': 'Giới hạn lộ trình',
'tours.filter.gradeHint':
'Độ khó cao nhất mà lộ trình được phép dùng khi lên kế hoạch, như đã lưu cùng chuyến đi bộ. Không phải độ khó đo được trên đường mòn.',
'tours.filter.type': 'Loại',
'tours.filter.empty': 'Không có chuyến đi bộ nào khớp với bộ lọc này.',
'tours.filter.reset': 'Đặt lại bộ lọc',
};
export default tours;
+7
View File
@@ -236,5 +236,12 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': '全部顯示',
'tours.visibility.show': '在地圖上顯示',
'tours.visibility.hide': '在地圖上隱藏',
'tours.filter.status': '狀態',
'tours.filter.source': '出處',
'tours.filter.grade': '路線上限',
'tours.filter.gradeHint': '規劃時允許路線使用的最高難度,隨遊程一起儲存。不是在步道上量測到的難度。',
'tours.filter.type': '類型',
'tours.filter.empty': '沒有符合這些篩選條件的遊程。',
'tours.filter.reset': '重設篩選',
};
export default tours;
+7
View File
@@ -237,5 +237,12 @@ const tours: TranslationStrings = {
'tours.visibility.showAll': '全部显示',
'tours.visibility.show': '在地图上显示',
'tours.visibility.hide': '在地图上隐藏',
'tours.filter.status': '状态',
'tours.filter.source': '来源',
'tours.filter.grade': '路线上限',
'tours.filter.gradeHint': '规划时允许路线使用的最高难度,随路线一起保存。不是在步道上测得的难度。',
'tours.filter.type': '类型',
'tours.filter.empty': '没有符合这些筛选条件的路线。',
'tours.filter.reset': '重置筛选',
};
export default tours;