sbb-i18n 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/index.d.ts +4 -0
  2. package/dist/index.js +4 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/resolve.d.ts +14 -0
  5. package/dist/resolve.js +22 -0
  6. package/dist/resolve.js.map +1 -0
  7. package/dist/translations/ar.d.ts +2 -0
  8. package/dist/translations/ar.js +68 -0
  9. package/dist/translations/ar.js.map +1 -0
  10. package/dist/translations/de.d.ts +2 -0
  11. package/dist/translations/de.js +68 -0
  12. package/dist/translations/de.js.map +1 -0
  13. package/dist/translations/en.d.ts +2 -0
  14. package/dist/translations/en.js +68 -0
  15. package/dist/translations/en.js.map +1 -0
  16. package/dist/translations/es.d.ts +2 -0
  17. package/dist/translations/es.js +68 -0
  18. package/dist/translations/es.js.map +1 -0
  19. package/dist/translations/fr.d.ts +2 -0
  20. package/dist/translations/fr.js +68 -0
  21. package/dist/translations/fr.js.map +1 -0
  22. package/dist/translations/index.d.ts +5 -0
  23. package/dist/translations/index.js +26 -0
  24. package/dist/translations/index.js.map +1 -0
  25. package/dist/translations/it.d.ts +2 -0
  26. package/dist/translations/it.js +68 -0
  27. package/dist/translations/it.js.map +1 -0
  28. package/dist/translations/pt.d.ts +2 -0
  29. package/dist/translations/pt.js +68 -0
  30. package/dist/translations/pt.js.map +1 -0
  31. package/dist/translations/ru.d.ts +2 -0
  32. package/dist/translations/ru.js +68 -0
  33. package/dist/translations/ru.js.map +1 -0
  34. package/dist/translations/zh.d.ts +2 -0
  35. package/dist/translations/zh.js +68 -0
  36. package/dist/translations/zh.js.map +1 -0
  37. package/dist/types.d.ts +64 -0
  38. package/dist/types.js +7 -0
  39. package/dist/types.js.map +1 -0
  40. package/package.json +47 -0
@@ -0,0 +1,4 @@
1
+ export type { Lang, Translations } from './types.js';
2
+ export { SUPPORTED_LANGS, isLang } from './types.js';
3
+ export { resolveLang } from './resolve.js';
4
+ export { t } from './translations/index.js';
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { SUPPORTED_LANGS, isLang } from './types.js';
2
+ export { resolveLang } from './resolve.js';
3
+ export { t } from './translations/index.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,yBAAyB,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { type Lang, SUPPORTED_LANGS } from './types.js';
2
+ /**
3
+ * Resolve an arbitrary language input to a supported Lang code.
4
+ *
5
+ * Priority:
6
+ * 1. Exact match against supported codes (case-insensitive)
7
+ * 2. BCP-47 primary subtag (e.g. "de-CH" → "de")
8
+ * 3. `fallback` (default: "en")
9
+ *
10
+ * Unknown inputs do not throw — they fall back silently. This keeps MCP tool
11
+ * calls safe when an AI agent passes something unexpected.
12
+ */
13
+ export declare function resolveLang(input: unknown, fallback?: Lang): Lang;
14
+ export { SUPPORTED_LANGS };
@@ -0,0 +1,22 @@
1
+ import { SUPPORTED_LANGS, isLang } from './types.js';
2
+ /**
3
+ * Resolve an arbitrary language input to a supported Lang code.
4
+ *
5
+ * Priority:
6
+ * 1. Exact match against supported codes (case-insensitive)
7
+ * 2. BCP-47 primary subtag (e.g. "de-CH" → "de")
8
+ * 3. `fallback` (default: "en")
9
+ *
10
+ * Unknown inputs do not throw — they fall back silently. This keeps MCP tool
11
+ * calls safe when an AI agent passes something unexpected.
12
+ */
13
+ export function resolveLang(input, fallback = 'en') {
14
+ if (typeof input === 'string' && input.length > 0) {
15
+ const primary = input.toLowerCase().split('-')[0];
16
+ if (isLang(primary))
17
+ return primary;
18
+ }
19
+ return fallback;
20
+ }
21
+ export { SUPPORTED_LANGS };
22
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,eAAe,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAE/D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,WAAiB,IAAI;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACjD,IAAI,MAAM,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAA;IACrC,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { Translations } from '../types.js';
2
+ export declare const ar: Translations;
@@ -0,0 +1,68 @@
1
+ export const ar = {
2
+ prices: 'الأسعار',
3
+ later: 'لاحقاً',
4
+ earlier: 'أبكر',
5
+ halfFare: 'Half-Fare',
6
+ gaTravelcard: 'GA',
7
+ noCard: 'بدون',
8
+ dep: 'مغاد',
9
+ arr: 'وصول',
10
+ dur: 'المدة',
11
+ changes: 'تحويل',
12
+ pl: 'رصيف',
13
+ price: 'السعر',
14
+ direct: 'مباشر',
15
+ oneChange: 'تحويل ١',
16
+ nChanges: (n) => `${n} تحويلات`,
17
+ platform: 'رصيف',
18
+ onboardingCard: 'ما هي بطاقة التخفيض لديك؟',
19
+ cardSaved: (label) => `✅ تم الحفظ: ${label}. سيتم استخدامه لجميع استعلامات الأسعار.`,
20
+ searchExpired: 'انتهت صلاحية بحثك السابق. أخبرني إلى أين تريد الذهاب!',
21
+ errorGeneric: 'عذراً، حدث خطأ. يرجى المحاولة مرة أخرى.',
22
+ stationNotFound: (station) => `لم أتمكن من العثور على "${station}". أنا في وضع تجريبي مع محطات محدودة.\n\n` +
23
+ 'جرّب: زيورخ، برن، إنترلاكن، لوزيرن، جنيف، زيرمات\n\n' +
24
+ 'شبكة سويسرا الكاملة قريباً!',
25
+ noConnections: 'لم يتم العثور على اتصالات.',
26
+ buyTicket: 'اشترِ تذكرتك على SBB',
27
+ opensInApp: 'يفتح في تطبيق SBB على الهاتف!',
28
+ pricesHeader: (cardLabel) => `الأسعار (الدرجة الثانية، ${cardLabel})`,
29
+ couldNotLoadPrices: 'تعذر تحميل الأسعار. حاول مرة أخرى.',
30
+ couldNotLoadTrains: (direction) => `تعذر تحميل القطارات ${direction}. ابدأ بحثاً جديداً.`,
31
+ welcome: '\u{1F44B} مرحباً! أساعدك في العثور على القطارات في سويسرا. أخبرني إلى أين تريد الذهاب!',
32
+ welcomeBack: '\u{1F44B} مرحباً بعودتك! إلى أين تريد السفر اليوم؟',
33
+ helpIntro: 'أساعدك في العثور على القطارات في سويسرا!',
34
+ helpExamples: [
35
+ 'برن إلى زيورخ',
36
+ 'زيورخ غداً الساعة 9',
37
+ 'Bergstrasse 10, Liebefeld إلى جنيف',
38
+ ],
39
+ helpCommands: '/train <من> إلى <إلى> — البحث عن قطارات\n/card — تغيير البطاقة\n/help — عرض المساعدة',
40
+ nearestStation: 'أقرب محطة',
41
+ whereToGo: 'إلى أين تريد الذهاب؟',
42
+ noStationNearby: 'لم أتمكن من العثور على محطة بالقرب من موقعك.',
43
+ weatherUnavailable: (location) => `بيانات الطقس لـ ${location} غير متاحة حالي\u0627\u064b.`,
44
+ weeklyLimitReached: (d) => `\u0644\u0642\u062f \u0648\u0635\u0644\u062a \u0625\u0644\u0649 \u0627\u0644\u062d\u062f \u0627\u0644\u0645\u062c\u0627\u0646\u064a. \u064a\u062a\u062c\u062f\u062f \u062e\u0644\u0627\u0644 ${d} \u064a\u0648\u0645!`,
45
+ weeklyLimitSearch: (n) => `${n} \u0639\u0645\u0644\u064a\u0627\u062a \u0628\u062d\u062b \u0645\u062c\u0627\u0646\u064a\u0629 \u0645\u062a\u0628\u0642\u064a\u0629.`,
46
+ offTopicRedirect: '\u0644\u0643\u0646\u0646\u064a \u0623\u0641\u0636\u0644 \u0641\u064a \u0627\u0644\u0628\u062d\u062b \u0639\u0646 \u0627\u0644\u0642\u0637\u0627\u0631\u0627\u062a! \u062c\u0631\u0628: \u0628\u0631\u0646 \u0625\u0644\u0649 \u0632\u064a\u0648\u0631\u064a\u062e',
47
+ offTopicHardStop: '\u0623\u0646\u0627 \u0645\u0633\u0627\u0639\u062f \u0642\u0637\u0627\u0631\u0627\u062a \u0633\u0648\u064a\u0633\u0631\u064a\u0629. \u0623\u062e\u0628\u0631\u0646\u064a \u0625\u0644\u0649 \u0623\u064a\u0646 \u062a\u0631\u064a\u062f \u0627\u0644\u0630\u0647\u0627\u0628! \u{1F686}',
48
+ upgradePremium: '\u2B50 \u062a\u0631\u0642\u064a\u0629 \u0625\u0644\u0649 \u0628\u0631\u064a\u0645\u064a\u0648\u0645',
49
+ upgradeTrainPass: '\u{1F686} \u0628\u0627\u0633 \u0627\u0644\u0642\u0637\u0627\u0631 \u00b7 CHF 5',
50
+ upgradeFullPremium: '\u{1F4AC} \u0628\u0631\u064a\u0645\u064a\u0648\u0645 \u00b7 CHF 10',
51
+ upgradePrompt: '\u0647\u0644 \u062a\u0631\u064a\u062f \u0627\u0644\u062f\u0631\u062f\u0634\u0629 \u0639\u0646 \u0643\u0644 \u0645\u0627 \u064a\u062a\u0639\u0644\u0642 \u0628\u0633\u0648\u064a\u0633\u0631\u0627\u061f \u0642\u0645 \u0628\u0627\u0644\u062a\u0631\u0642\u064a\u0629 \u0625\u0644\u0649 \u0628\u0631\u064a\u0645\u064a\u0648\u0645 \u0644\u0645\u062d\u0627\u062f\u062b\u0627\u062a \u063a\u064a\u0631 \u0645\u062d\u062f\u0648\u062f\u0629!',
52
+ premiumActivated: (tier, days) => `\u2705 \u062a\u0645 \u062a\u0641\u0639\u064a\u0644 ${tier}! \u063a\u064a\u0631 \u0645\u062d\u062f\u0648\u062f \u0644\u0645\u062f\u0629 ${days} \u064a\u0648\u0645.`,
53
+ imageNotSupported: '\u{1F4F7} \u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u0635\u0648\u0631 \u0645\u064a\u0632\u0629 \u0628\u0631\u064a\u0645\u064a\u0648\u0645. \u0642\u0645 \u0628\u0627\u0644\u062a\u0631\u0642\u064a\u0629 \u0644\u062a\u062d\u0644\u064a\u0644 \u0627\u0644\u062c\u062f\u0627\u0648\u0644 \u0648\u0627\u0644\u062a\u0630\u0627\u0643\u0631!',
54
+ welcomeFreemium: '\u0645\u062c\u0627\u0646\u064a: 30 \u0628\u062d\u062b \u0642\u0637\u0627\u0631\u0627\u062a + 10 \u0627\u0633\u062a\u0639\u0644\u0627\u0645\u0627\u062a \u0637\u0642\u0633 \u0623\u0633\u0628\u0648\u0639\u064a\u0627\u064b. \u0642\u0645 \u0628\u0627\u0644\u062a\u0631\u0642\u064a\u0629 \u0641\u064a \u0623\u064a \u0648\u0642\u062a!',
55
+ details: 'التفاصيل',
56
+ share: 'مشاركة',
57
+ shareIntro: 'ابحث عن قطاراتك الخاصة:',
58
+ detailsHint: 'اكتب "تفاصيل" لرؤية تفاصيل الرحلة',
59
+ shareHint: 'اكتب "مشاركة" لمشاركة هذه النتائج',
60
+ transfer: 'تحويل',
61
+ connectionDetail: (n) => `تفاصيل الاتصال ${n}:`,
62
+ cardLabels: {
63
+ HALF_FARE: 'Half-Fare',
64
+ GA: 'GA',
65
+ NONE: 'بدون بطاقة',
66
+ },
67
+ };
68
+ //# sourceMappingURL=ar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ar.js","sourceRoot":"","sources":["../../src/translations/ar.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAiB;IAC9B,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,WAAW;IACrB,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,MAAM;IAEd,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,OAAO;IACZ,OAAO,EAAE,OAAO;IAChB,EAAE,EAAE,MAAM;IACV,KAAK,EAAE,OAAO;IAEd,MAAM,EAAE,OAAO;IACf,SAAS,EAAE,SAAS;IACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU;IAC/B,QAAQ,EAAE,MAAM;IAEhB,cAAc,EAAE,2BAA2B;IAC3C,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,KAAK,0CAA0C;IACpF,aAAa,EAAE,uDAAuD;IACtE,YAAY,EAAE,yCAAyC;IACvD,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,CAC3B,2BAA2B,OAAO,2CAA2C;QAC7E,sDAAsD;QACtD,6BAA6B;IAC/B,aAAa,EAAE,4BAA4B;IAC3C,SAAS,EAAE,sBAAsB;IACjC,UAAU,EAAE,+BAA+B;IAC3C,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,4BAA4B,SAAS,GAAG;IACrE,kBAAkB,EAAE,oCAAoC;IACxD,kBAAkB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,uBAAuB,SAAS,sBAAsB;IAEzF,OAAO,EAAE,wFAAwF;IACjG,WAAW,EAAE,oDAAoD;IAEjE,SAAS,EAAE,0CAA0C;IACrD,YAAY,EAAE;QACZ,eAAe;QACf,qBAAqB;QACrB,oCAAoC;KACrC;IACD,YAAY,EAAE,sFAAsF;IAEpG,cAAc,EAAE,WAAW;IAC3B,SAAS,EAAE,sBAAsB;IACjC,eAAe,EAAE,8CAA8C;IAE/D,kBAAkB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,QAAQ,8BAA8B;IAE3F,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,+LAA+L,CAAC,sBAAsB;IACjP,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,qIAAqI;IACnK,gBAAgB,EAAE,mQAAmQ;IACrR,gBAAgB,EAAE,wRAAwR;IAC1S,cAAc,EAAE,qGAAqG;IACrH,gBAAgB,EAAE,gFAAgF;IAClG,kBAAkB,EAAE,oEAAoE;IACxF,aAAa,EAAE,+aAA+a;IAC9b,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,sDAAsD,IAAI,gFAAgF,IAAI,sBAAsB;IACtM,iBAAiB,EAAE,oVAAoV;IACvW,eAAe,EAAE,yUAAyU;IAE1V,OAAO,EAAE,UAAU;IACnB,KAAK,EAAE,QAAQ;IACf,UAAU,EAAE,yBAAyB;IACrC,WAAW,EAAE,mCAAmC;IAChD,SAAS,EAAE,mCAAmC;IAC9C,QAAQ,EAAE,OAAO;IACjB,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG;IAE/C,UAAU,EAAE;QACV,SAAS,EAAE,WAAW;QACtB,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,YAAY;KACnB;CACF,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { Translations } from '../types.js';
2
+ export declare const de: Translations;
@@ -0,0 +1,68 @@
1
+ export const de = {
2
+ prices: 'Preise',
3
+ later: 'Sp\u00e4ter',
4
+ earlier: 'Fr\u00fcher',
5
+ halfFare: 'Halbtax',
6
+ gaTravelcard: 'GA',
7
+ noCard: 'Keine',
8
+ dep: 'Ab',
9
+ arr: 'An',
10
+ dur: 'Dauer',
11
+ changes: 'Umst.',
12
+ pl: 'Gl',
13
+ price: 'Preis',
14
+ direct: 'Direkt',
15
+ oneChange: '1 Umstieg',
16
+ nChanges: (n) => `${n} Umst.`,
17
+ platform: 'Gleis',
18
+ onboardingCard: 'Welches Abo hast du?',
19
+ cardSaved: (label) => `\u2705 Gespeichert: ${label}. Wird f\u00fcr alle Preisabfragen verwendet.`,
20
+ searchExpired: 'Deine letzte Suche ist abgelaufen. Sag mir einfach, wohin du willst!',
21
+ errorGeneric: 'Entschuldigung, etwas ist schiefgelaufen. Bitte versuche es nochmal.',
22
+ stationNotFound: (station) => `Ich konnte "${station}" nicht finden. Ich bin im Demo-Modus mit wenigen Stationen.\n\n` +
23
+ 'Probiere: Z\u00fcrich, Bern, Interlaken, Luzern, Genf, Zermatt\n\n' +
24
+ 'Das ganze Schweizer Netz kommt bald!',
25
+ noConnections: 'Keine Verbindungen gefunden.',
26
+ buyTicket: 'Ticket bei SBB kaufen',
27
+ opensInApp: '\u00d6ffnet die SBB App auf dem Handy!',
28
+ pricesHeader: (cardLabel) => `Preise (2. Klasse, ${cardLabel})`,
29
+ couldNotLoadPrices: 'Preise konnten nicht geladen werden. Versuche es nochmal.',
30
+ couldNotLoadTrains: (direction) => `Konnte keine ${direction} Z\u00fcge laden. Starte eine neue Suche.`,
31
+ welcome: '\u{1F44B} Willkommen! Ich helfe dir, Schweizer Zugverbindungen zu finden. Sag mir einfach, wohin du willst!',
32
+ welcomeBack: '\u{1F44B} Willkommen zur\u00fcck! Wohin soll es heute gehen?',
33
+ helpIntro: 'Ich helfe dir, Schweizer Zugverbindungen zu finden!',
34
+ helpExamples: [
35
+ 'Bern nach Z\u00fcrich',
36
+ 'Z\u00fcrich morgen um 9',
37
+ 'Bergstrasse 10, Liebefeld nach Genf',
38
+ ],
39
+ helpCommands: '/train <von> nach <nach> — Z\u00fcge suchen\n/card — Abo \u00e4ndern\n/help — Hilfe anzeigen',
40
+ nearestStation: 'N\u00e4chste Station',
41
+ whereToGo: 'Wohin m\u00f6chtest du?',
42
+ noStationNearby: 'Ich konnte keine Station in deiner N\u00e4he finden.',
43
+ weatherUnavailable: (location) => `Wetterdaten f\u00fcr ${location} sind momentan nicht verf\u00fcgbar.`,
44
+ weeklyLimitReached: (d) => `Du hast dein Gratislimit erreicht. Erneuerung in ${d} Tag${d === 1 ? '' : 'en'}!`,
45
+ weeklyLimitSearch: (n) => `Noch ${n} Gratissuche${n === 1 ? '' : 'n'}.`,
46
+ offTopicRedirect: 'Ich bin aber am besten beim Z\u00fcge suchen! Versuch: Bern nach Z\u00fcrich',
47
+ offTopicHardStop: 'Ich bin ein Schweizer Zugassistent. Sag mir wohin du willst! \u{1F686}',
48
+ upgradePremium: '\u2B50 Premium freischalten',
49
+ upgradeTrainPass: '\u{1F686} Zug-Pass \u00b7 CHF 5',
50
+ upgradeFullPremium: '\u{1F4AC} Premium \u00b7 CHF 10',
51
+ upgradePrompt: 'M\u00f6chtest du \u00fcber alles rund um die Schweiz chatten? Upgrade auf Premium f\u00fcr unbegrenzte Gespr\u00e4che!',
52
+ premiumActivated: (tier, days) => `\u2705 ${tier} aktiviert! Unbegrenzt f\u00fcr ${days} Tage.`,
53
+ imageNotSupported: '\u{1F4F7} Bildverarbeitung ist eine Premium-Funktion. Upgrade um Fahrpl\u00e4ne, Tickets und mehr zu analysieren!',
54
+ welcomeFreemium: 'Gratis: 30 Zugsuchen + 10 Wetterabfragen pro Woche. Jederzeit upgraden f\u00fcr unbegrenzten Zugang!',
55
+ details: 'Details',
56
+ share: 'Teilen',
57
+ shareIntro: 'Finde deine eigenen Z\u00fcge:',
58
+ detailsHint: 'Schreibe "details" f\u00fcr Reisedetails',
59
+ shareHint: 'Schreibe "teilen" um die Ergebnisse zu teilen',
60
+ transfer: 'Umstieg',
61
+ connectionDetail: (n) => `Verbindung ${n} Details:`,
62
+ cardLabels: {
63
+ HALF_FARE: 'Halbtax',
64
+ GA: 'GA',
65
+ NONE: 'Kein Abo',
66
+ },
67
+ };
68
+ //# sourceMappingURL=de.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"de.js","sourceRoot":"","sources":["../../src/translations/de.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAiB;IAC9B,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,aAAa;IACpB,OAAO,EAAE,aAAa;IACtB,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,OAAO;IAEf,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,OAAO;IACZ,OAAO,EAAE,OAAO;IAChB,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,OAAO;IAEd,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ;IAC7B,QAAQ,EAAE,OAAO;IAEjB,cAAc,EAAE,sBAAsB;IACtC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,KAAK,+CAA+C;IACjG,aAAa,EAAE,sEAAsE;IACrF,YAAY,EAAE,sEAAsE;IACpF,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,CAC3B,eAAe,OAAO,kEAAkE;QACxF,oEAAoE;QACpE,sCAAsC;IACxC,aAAa,EAAE,8BAA8B;IAC7C,SAAS,EAAE,uBAAuB;IAClC,UAAU,EAAE,wCAAwC;IACpD,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,sBAAsB,SAAS,GAAG;IAC/D,kBAAkB,EAAE,2DAA2D;IAC/E,kBAAkB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,SAAS,2CAA2C;IAEvG,OAAO,EAAE,6GAA6G;IACtH,WAAW,EAAE,8DAA8D;IAE3E,SAAS,EAAE,qDAAqD;IAChE,YAAY,EAAE;QACZ,uBAAuB;QACvB,yBAAyB;QACzB,qCAAqC;KACtC;IACD,YAAY,EAAE,8FAA8F;IAE5G,cAAc,EAAE,sBAAsB;IACtC,SAAS,EAAE,yBAAyB;IACpC,eAAe,EAAE,sDAAsD;IAEvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,wBAAwB,QAAQ,sCAAsC;IAExG,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,oDAAoD,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG;IAC7G,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG;IACvE,gBAAgB,EAAE,8EAA8E;IAChG,gBAAgB,EAAE,wEAAwE;IAC1F,cAAc,EAAE,6BAA6B;IAC7C,gBAAgB,EAAE,iCAAiC;IACnD,kBAAkB,EAAE,iCAAiC;IACrD,aAAa,EAAE,wHAAwH;IACvI,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,mCAAmC,IAAI,QAAQ;IAC/F,iBAAiB,EAAE,mHAAmH;IACtI,eAAe,EAAE,sGAAsG;IAEvH,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,QAAQ;IACf,UAAU,EAAE,gCAAgC;IAC5C,WAAW,EAAE,0CAA0C;IACvD,SAAS,EAAE,+CAA+C;IAC1D,QAAQ,EAAE,SAAS;IACnB,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,WAAW;IAEnD,UAAU,EAAE;QACV,SAAS,EAAE,SAAS;QACpB,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,UAAU;KACjB;CACF,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { Translations } from '../types.js';
2
+ export declare const en: Translations;
@@ -0,0 +1,68 @@
1
+ export const en = {
2
+ prices: 'Prices',
3
+ later: 'Later',
4
+ earlier: 'Earlier',
5
+ halfFare: 'Half-Fare',
6
+ gaTravelcard: 'GA Travelcard',
7
+ noCard: 'None',
8
+ dep: 'Dep',
9
+ arr: 'Arr',
10
+ dur: 'Dur',
11
+ changes: 'Changes',
12
+ pl: 'Pl',
13
+ price: 'Price',
14
+ direct: 'Direct',
15
+ oneChange: '1 change',
16
+ nChanges: (n) => `${n} changes`,
17
+ platform: 'Platform',
18
+ onboardingCard: 'What reduction card do you have?',
19
+ cardSaved: (label) => `\u2705 Saved: ${label}. I'll use this for all price searches.`,
20
+ searchExpired: 'Your previous search has expired. Just tell me where you want to go and I\'ll find new connections!',
21
+ errorGeneric: 'Sorry, something went wrong. Please try again.',
22
+ stationNotFound: (station) => `I couldn't find "${station}". I'm currently in demo mode with limited stations.\n\n` +
23
+ 'Try one of these: Zurich, Bern, Interlaken, Luzern, Geneva, Zermatt\n\n' +
24
+ 'Full Swiss network available soon!',
25
+ noConnections: 'No connections found.',
26
+ buyTicket: 'Buy your ticket on SBB',
27
+ opensInApp: 'Opens in the SBB app on mobile!',
28
+ pricesHeader: (cardLabel) => `Prices (2nd class, ${cardLabel})`,
29
+ couldNotLoadPrices: 'Sorry, could not load prices. Try again.',
30
+ couldNotLoadTrains: (direction) => `Could not load ${direction} trains. Try a new search.`,
31
+ welcome: '\u{1F44B} Welcome! I help you find Swiss train connections. Just tell me where you want to go!',
32
+ welcomeBack: '\u{1F44B} Welcome back! Where would you like to travel today?',
33
+ helpIntro: 'I help you find Swiss train connections!',
34
+ helpExamples: [
35
+ 'Bern to Zurich',
36
+ 'Zurich tomorrow at 9',
37
+ 'Bergstrasse 10, Liebefeld to Geneva',
38
+ ],
39
+ helpCommands: '/train <from> to <to> — Search trains\n/card — Change reduction card\n/help — Show this help',
40
+ nearestStation: 'Nearest station',
41
+ whereToGo: 'Where would you like to go?',
42
+ noStationNearby: 'I couldn\'t find a station near your location.',
43
+ weatherUnavailable: (location) => `Weather data is not available for ${location} right now.`,
44
+ weeklyLimitReached: (d) => `You've reached your free limit. Resets in ${d} day${d === 1 ? '' : 's'}!`,
45
+ weeklyLimitSearch: (n) => `${n} free search${n === 1 ? '' : 'es'} remaining.`,
46
+ offTopicRedirect: 'I\'m best at finding Swiss trains though! Try: Bern to Zurich',
47
+ offTopicHardStop: 'I\'m a Swiss train assistant. Tell me where you want to go! \u{1F686}',
48
+ upgradePremium: '\u2B50 Upgrade to Premium',
49
+ upgradeTrainPass: '\u{1F686} Train Pass \u00b7 CHF 5',
50
+ upgradeFullPremium: '\u{1F4AC} Premium \u00b7 CHF 10',
51
+ upgradePrompt: 'Want to chat about anything Swiss? Upgrade to Premium for unlimited conversations!',
52
+ premiumActivated: (tier, days) => `\u2705 ${tier} activated! Unlimited for ${days} days.`,
53
+ imageNotSupported: '\u{1F4F7} Image processing is a Premium feature. Upgrade to analyze timetables, tickets, and more!',
54
+ welcomeFreemium: 'Free: 30 train searches + 10 weather queries per week. Upgrade anytime for unlimited access!',
55
+ details: 'Details',
56
+ share: 'Share',
57
+ shareIntro: 'Search your own trains:',
58
+ detailsHint: 'Type "details" to see trip details',
59
+ shareHint: 'Type "share" to share these results',
60
+ transfer: 'Transfer',
61
+ connectionDetail: (n) => `Connection ${n} details:`,
62
+ cardLabels: {
63
+ HALF_FARE: 'Half-Fare',
64
+ GA: 'GA',
65
+ NONE: 'No card',
66
+ },
67
+ };
68
+ //# sourceMappingURL=en.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/translations/en.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAiB;IAC9B,MAAM,EAAE,QAAQ;IAChB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,WAAW;IACrB,YAAY,EAAE,eAAe;IAC7B,MAAM,EAAE,MAAM;IAEd,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,OAAO,EAAE,SAAS;IAClB,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,OAAO;IAEd,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU;IAC/B,QAAQ,EAAE,UAAU;IAEpB,cAAc,EAAE,kCAAkC;IAClD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,KAAK,yCAAyC;IACrF,aAAa,EAAE,qGAAqG;IACpH,YAAY,EAAE,gDAAgD;IAC9D,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,CAC3B,oBAAoB,OAAO,0DAA0D;QACrF,yEAAyE;QACzE,oCAAoC;IACtC,aAAa,EAAE,uBAAuB;IACtC,SAAS,EAAE,wBAAwB;IACnC,UAAU,EAAE,iCAAiC;IAC7C,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,sBAAsB,SAAS,GAAG;IAC/D,kBAAkB,EAAE,0CAA0C;IAC9D,kBAAkB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,kBAAkB,SAAS,4BAA4B;IAE1F,OAAO,EAAE,gGAAgG;IACzG,WAAW,EAAE,+DAA+D;IAE5E,SAAS,EAAE,0CAA0C;IACrD,YAAY,EAAE;QACZ,gBAAgB;QAChB,sBAAsB;QACtB,qCAAqC;KACtC;IACD,YAAY,EAAE,8FAA8F;IAE5G,cAAc,EAAE,iBAAiB;IACjC,SAAS,EAAE,6BAA6B;IACxC,eAAe,EAAE,gDAAgD;IAEjE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,qCAAqC,QAAQ,aAAa;IAE5F,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,6CAA6C,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG;IACrG,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,aAAa;IAC7E,gBAAgB,EAAE,+DAA+D;IACjF,gBAAgB,EAAE,uEAAuE;IACzF,cAAc,EAAE,2BAA2B;IAC3C,gBAAgB,EAAE,mCAAmC;IACrD,kBAAkB,EAAE,iCAAiC;IACrD,aAAa,EAAE,oFAAoF;IACnG,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,6BAA6B,IAAI,QAAQ;IACzF,iBAAiB,EAAE,oGAAoG;IACvH,eAAe,EAAE,8FAA8F;IAE/G,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,UAAU,EAAE,yBAAyB;IACrC,WAAW,EAAE,oCAAoC;IACjD,SAAS,EAAE,qCAAqC;IAChD,QAAQ,EAAE,UAAU;IACpB,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,WAAW;IAEnD,UAAU,EAAE;QACV,SAAS,EAAE,WAAW;QACtB,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,SAAS;KAChB;CACF,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { Translations } from '../types.js';
2
+ export declare const es: Translations;
@@ -0,0 +1,68 @@
1
+ export const es = {
2
+ prices: 'Precios',
3
+ later: 'M\u00e1s tarde',
4
+ earlier: 'M\u00e1s temprano',
5
+ halfFare: 'Half-Fare',
6
+ gaTravelcard: 'GA Travelcard',
7
+ noCard: 'Ninguno',
8
+ dep: 'Sal',
9
+ arr: 'Lleg',
10
+ dur: 'Dur',
11
+ changes: 'Camb.',
12
+ pl: 'V\u00eda',
13
+ price: 'Precio',
14
+ direct: 'Directo',
15
+ oneChange: '1 cambio',
16
+ nChanges: (n) => `${n} camb.`,
17
+ platform: 'V\u00eda',
18
+ onboardingCard: '\u00bfQu\u00e9 tarjeta de reducci\u00f3n tienes?',
19
+ cardSaved: (label) => `\u2705 Guardado: ${label}. Lo usar\u00e9 para todas las consultas de precios.`,
20
+ searchExpired: 'Tu b\u00fasqueda anterior ha expirado. \u00a1Dime a d\u00f3nde quieres ir!',
21
+ errorGeneric: 'Lo siento, algo sali\u00f3 mal. Intenta de nuevo.',
22
+ stationNotFound: (station) => `No pude encontrar "${station}". Estoy en modo demo con estaciones limitadas.\n\n` +
23
+ 'Prueba: Z\u00farich, Berna, Interlaken, Lucerna, Ginebra, Zermatt\n\n' +
24
+ '\u00a1Toda la red suiza disponible pronto!',
25
+ noConnections: 'No se encontraron conexiones.',
26
+ buyTicket: 'Compra tu billete en SBB',
27
+ opensInApp: '\u00a1Abre la app de SBB en el m\u00f3vil!',
28
+ pricesHeader: (cardLabel) => `Precios (2a clase, ${cardLabel})`,
29
+ couldNotLoadPrices: 'No se pudieron cargar los precios. Intenta de nuevo.',
30
+ couldNotLoadTrains: (direction) => `No se pudieron cargar los trenes ${direction}. Inicia una nueva b\u00fasqueda.`,
31
+ welcome: '\u{1F44B} \u00a1Bienvenido! Te ayudo a encontrar trenes en Suiza. \u00a1Dime a d\u00f3nde quieres ir!',
32
+ welcomeBack: '\u{1F44B} \u00a1Bienvenido de nuevo! \u00bfA d\u00f3nde quieres viajar hoy?',
33
+ helpIntro: '\u00a1Te ayudo a encontrar trenes en Suiza!',
34
+ helpExamples: [
35
+ 'Berna a Z\u00farich',
36
+ 'Z\u00farich ma\u00f1ana a las 9',
37
+ 'Bergstrasse 10, Liebefeld a Ginebra',
38
+ ],
39
+ helpCommands: '/train <desde> a <hasta> — Buscar trenes\n/card — Cambiar tarjeta\n/help — Mostrar ayuda',
40
+ nearestStation: 'Estaci\u00f3n m\u00e1s cercana',
41
+ whereToGo: '\u00bfA d\u00f3nde quieres ir?',
42
+ noStationNearby: 'No pude encontrar una estaci\u00f3n cerca de tu ubicaci\u00f3n.',
43
+ weatherUnavailable: (location) => `Los datos meteorol\u00f3gicos de ${location} no est\u00e1n disponibles en este momento.`,
44
+ weeklyLimitReached: (d) => `\u00a1Has alcanzado tu l\u00edmite gratuito! Se renueva en ${d} d\u00eda${d === 1 ? '' : 's'}.`,
45
+ weeklyLimitSearch: (n) => `${n} b\u00fasqueda${n === 1 ? '' : 's'} gratuita${n === 1 ? '' : 's'} restante${n === 1 ? '' : 's'}.`,
46
+ offTopicRedirect: '\u00a1Soy mejor buscando trenes! Prueba: Berna a Z\u00farich',
47
+ offTopicHardStop: 'Soy un asistente de trenes suizos. \u00a1Dime a d\u00f3nde quieres ir! \u{1F686}',
48
+ upgradePremium: '\u2B50 Actualizar a Premium',
49
+ upgradeTrainPass: '\u{1F686} Pase de Tren \u00b7 CHF 5',
50
+ upgradeFullPremium: '\u{1F4AC} Premium \u00b7 CHF 10',
51
+ upgradePrompt: '\u00bfQuieres hablar de todo sobre Suiza? \u00a1Actualiza a Premium para conversaciones ilimitadas!',
52
+ premiumActivated: (tier, days) => `\u2705 \u00a1${tier} activado! Ilimitado por ${days} d\u00edas.`,
53
+ imageNotSupported: '\u{1F4F7} El procesamiento de im\u00e1genes es Premium. \u00a1Actualiza para analizar horarios, billetes y m\u00e1s!',
54
+ welcomeFreemium: 'Gratis: 30 b\u00fasquedas de trenes + 10 consultas meteorol\u00f3gicas por semana. \u00a1Actualiza cuando quieras!',
55
+ details: 'Detalles',
56
+ share: 'Compartir',
57
+ shareIntro: 'Busca tus propios trenes:',
58
+ detailsHint: 'Escribe "detalles" para ver los detalles del viaje',
59
+ shareHint: 'Escribe "compartir" para compartir estos resultados',
60
+ transfer: 'Transbordo',
61
+ connectionDetail: (n) => `Detalles de la conexi\u00f3n ${n}:`,
62
+ cardLabels: {
63
+ HALF_FARE: 'Half-Fare',
64
+ GA: 'GA',
65
+ NONE: 'Sin tarjeta',
66
+ },
67
+ };
68
+ //# sourceMappingURL=es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"es.js","sourceRoot":"","sources":["../../src/translations/es.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Translations } from '../types.js';
2
+ export declare const fr: Translations;
@@ -0,0 +1,68 @@
1
+ export const fr = {
2
+ prices: 'Prix',
3
+ later: 'Plus tard',
4
+ earlier: 'Plus t\u00f4t',
5
+ halfFare: 'Demi-tarif',
6
+ gaTravelcard: 'AG',
7
+ noCard: 'Aucun',
8
+ dep: 'D\u00e9p',
9
+ arr: 'Arr',
10
+ dur: 'Dur\u00e9e',
11
+ changes: 'Corr.',
12
+ pl: 'Voie',
13
+ price: 'Prix',
14
+ direct: 'Direct',
15
+ oneChange: '1 corr.',
16
+ nChanges: (n) => `${n} corr.`,
17
+ platform: 'Voie',
18
+ onboardingCard: 'Quel abonnement avez-vous ?',
19
+ cardSaved: (label) => `\u2705 Enregistr\u00e9 : ${label}. Utilis\u00e9 pour toutes les recherches de prix.`,
20
+ searchExpired: 'Votre recherche pr\u00e9c\u00e9dente a expir\u00e9. Dites-moi o\u00f9 vous voulez aller !',
21
+ errorGeneric: 'D\u00e9sol\u00e9, une erreur est survenue. Veuillez r\u00e9essayer.',
22
+ stationNotFound: (station) => `Je n'ai pas trouv\u00e9 "${station}". Je suis en mode d\u00e9mo avec des gares limit\u00e9es.\n\n` +
23
+ 'Essayez : Zurich, Berne, Interlaken, Lucerne, Gen\u00e8ve, Zermatt\n\n' +
24
+ 'Tout le r\u00e9seau suisse arrive bient\u00f4t !',
25
+ noConnections: 'Aucune correspondance trouv\u00e9e.',
26
+ buyTicket: 'Acheter votre billet sur CFF',
27
+ opensInApp: 'Ouvre l\'app CFF sur mobile !',
28
+ pricesHeader: (cardLabel) => `Prix (2e classe, ${cardLabel})`,
29
+ couldNotLoadPrices: 'Impossible de charger les prix. R\u00e9essayez.',
30
+ couldNotLoadTrains: (direction) => `Impossible de charger les trains ${direction}. Lancez une nouvelle recherche.`,
31
+ welcome: '\u{1F44B} Bienvenue ! Je vous aide \u00e0 trouver des trains en Suisse. Dites-moi o\u00f9 vous voulez aller !',
32
+ welcomeBack: '\u{1F44B} Content de vous revoir ! O\u00f9 souhaitez-vous voyager aujourd\'hui ?',
33
+ helpIntro: 'Je vous aide \u00e0 trouver des trains en Suisse !',
34
+ helpExamples: [
35
+ 'Berne \u00e0 Zurich',
36
+ 'Zurich demain \u00e0 9h',
37
+ 'Bergstrasse 10, Liebefeld \u00e0 Gen\u00e8ve',
38
+ ],
39
+ helpCommands: '/train <de> \u00e0 <vers> — Chercher des trains\n/card — Changer d\'abonnement\n/help — Afficher l\'aide',
40
+ nearestStation: 'Gare la plus proche',
41
+ whereToGo: 'O\u00f9 souhaitez-vous aller ?',
42
+ noStationNearby: 'Je n\'ai pas trouv\u00e9 de gare pr\u00e8s de votre position.',
43
+ weatherUnavailable: (location) => `Les donn\u00e9es m\u00e9t\u00e9o pour ${location} ne sont pas disponibles actuellement.`,
44
+ weeklyLimitReached: (d) => `Vous avez atteint votre limite gratuite. Renouvellement dans ${d} jour${d === 1 ? '' : 's'} !`,
45
+ weeklyLimitSearch: (n) => `${n} recherche${n === 1 ? '' : 's'} gratuite${n === 1 ? '' : 's'} restante${n === 1 ? '' : 's'}.`,
46
+ offTopicRedirect: 'Je suis surtout dou\u00e9 pour trouver des trains ! Essayez : Berne \u00e0 Zurich',
47
+ offTopicHardStop: 'Je suis un assistant de trains suisses. Dites-moi o\u00f9 vous voulez aller ! \u{1F686}',
48
+ upgradePremium: '\u2B50 Passer \u00e0 Premium',
49
+ upgradeTrainPass: '\u{1F686} Pass Train \u00b7 CHF 5',
50
+ upgradeFullPremium: '\u{1F4AC} Premium \u00b7 CHF 10',
51
+ upgradePrompt: 'Envie de discuter de tout ce qui concerne la Suisse ? Passez \u00e0 Premium pour des conversations illimit\u00e9es !',
52
+ premiumActivated: (tier, days) => `\u2705 ${tier} activ\u00e9 ! Illimit\u00e9 pour ${days} jours.`,
53
+ imageNotSupported: '\u{1F4F7} Le traitement d\'images est une fonctionnalit\u00e9 Premium. Passez \u00e0 Premium pour analyser horaires, billets et plus !',
54
+ welcomeFreemium: 'Gratuit : 30 recherches de trains + 10 requ\u00eates m\u00e9t\u00e9o par semaine. Passez \u00e0 Premium \u00e0 tout moment !',
55
+ details: 'D\u00e9tails',
56
+ share: 'Partager',
57
+ shareIntro: 'Trouvez vos propres trains :',
58
+ detailsHint: 'Tapez "d\u00e9tails" pour voir les d\u00e9tails du trajet',
59
+ shareHint: 'Tapez "partager" pour partager ces r\u00e9sultats',
60
+ transfer: 'Correspondance',
61
+ connectionDetail: (n) => `D\u00e9tails de la connexion ${n} :`,
62
+ cardLabels: {
63
+ HALF_FARE: 'Demi-tarif',
64
+ GA: 'AG',
65
+ NONE: 'Sans abonnement',
66
+ },
67
+ };
68
+ //# sourceMappingURL=fr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fr.js","sourceRoot":"","sources":["../../src/translations/fr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Lang, Translations } from '../types.js';
2
+ declare const translations: Record<Lang, Translations>;
3
+ /** Get translations for a language. Returns English if the language isn't supported. */
4
+ export declare function t(lang: Lang | string): Translations;
5
+ export { translations };
@@ -0,0 +1,26 @@
1
+ import { en } from './en.js';
2
+ import { de } from './de.js';
3
+ import { fr } from './fr.js';
4
+ import { it } from './it.js';
5
+ import { es } from './es.js';
6
+ import { pt } from './pt.js';
7
+ import { ru } from './ru.js';
8
+ import { ar } from './ar.js';
9
+ import { zh } from './zh.js';
10
+ const translations = {
11
+ en,
12
+ de,
13
+ fr,
14
+ it,
15
+ es,
16
+ pt,
17
+ ru,
18
+ ar,
19
+ zh,
20
+ };
21
+ /** Get translations for a language. Returns English if the language isn't supported. */
22
+ export function t(lang) {
23
+ return translations[lang] ?? translations.en;
24
+ }
25
+ export { translations };
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/translations/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAE5B,MAAM,YAAY,GAA+B;IAC/C,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;IACF,EAAE;CACH,CAAA;AAED,wFAAwF;AACxF,MAAM,UAAU,CAAC,CAAC,IAAmB;IACnC,OAAO,YAAY,CAAC,IAAY,CAAC,IAAI,YAAY,CAAC,EAAE,CAAA;AACtD,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { Translations } from '../types.js';
2
+ export declare const it: Translations;
@@ -0,0 +1,68 @@
1
+ export const it = {
2
+ prices: 'Prezzi',
3
+ later: 'Dopo',
4
+ earlier: 'Prima',
5
+ halfFare: 'Met\u00e0-prezzo',
6
+ gaTravelcard: 'AG',
7
+ noCard: 'Nessuno',
8
+ dep: 'Part',
9
+ arr: 'Arr',
10
+ dur: 'Durata',
11
+ changes: 'Cambi',
12
+ pl: 'Bin',
13
+ price: 'Prezzo',
14
+ direct: 'Diretto',
15
+ oneChange: '1 cambio',
16
+ nChanges: (n) => `${n} cambi`,
17
+ platform: 'Binario',
18
+ onboardingCard: 'Quale abbonamento hai?',
19
+ cardSaved: (label) => `\u2705 Salvato: ${label}. Usato per tutte le ricerche prezzi.`,
20
+ searchExpired: 'La tua ricerca precedente \u00e8 scaduta. Dimmi dove vuoi andare!',
21
+ errorGeneric: 'Scusa, qualcosa \u00e8 andato storto. Riprova.',
22
+ stationNotFound: (station) => `Non ho trovato "${station}". Sono in modalit\u00e0 demo con stazioni limitate.\n\n` +
23
+ 'Prova: Zurigo, Berna, Interlaken, Lucerna, Ginevra, Zermatt\n\n' +
24
+ 'Tutta la rete svizzera in arrivo!',
25
+ noConnections: 'Nessun collegamento trovato.',
26
+ buyTicket: 'Acquista il biglietto su FFS',
27
+ opensInApp: 'Apre l\'app FFS sul cellulare!',
28
+ pricesHeader: (cardLabel) => `Prezzi (2a classe, ${cardLabel})`,
29
+ couldNotLoadPrices: 'Impossibile caricare i prezzi. Riprova.',
30
+ couldNotLoadTrains: (direction) => `Impossibile caricare i treni ${direction}. Avvia una nuova ricerca.`,
31
+ welcome: '\u{1F44B} Benvenuto! Ti aiuto a trovare treni in Svizzera. Dimmi dove vuoi andare!',
32
+ welcomeBack: '\u{1F44B} Bentornato! Dove vuoi viaggiare oggi?',
33
+ helpIntro: 'Ti aiuto a trovare treni in Svizzera!',
34
+ helpExamples: [
35
+ 'Berna a Zurigo',
36
+ 'Zurigo domani alle 9',
37
+ 'Bergstrasse 10, Liebefeld a Ginevra',
38
+ ],
39
+ helpCommands: '/train <da> a <a> — Cerca treni\n/card — Cambia abbonamento\n/help — Mostra aiuto',
40
+ nearestStation: 'Stazione pi\u00f9 vicina',
41
+ whereToGo: 'Dove vuoi andare?',
42
+ noStationNearby: 'Non ho trovato una stazione vicino alla tua posizione.',
43
+ weatherUnavailable: (location) => `I dati meteo per ${location} non sono al momento disponibili.`,
44
+ weeklyLimitReached: (d) => `Hai raggiunto il limite gratuito. Rinnovo tra ${d} giorn${d === 1 ? 'o' : 'i'}!`,
45
+ weeklyLimitSearch: (n) => `${n} ricerch${n === 1 ? 'a' : 'e'} gratuit${n === 1 ? 'a' : 'e'} rimanent${n === 1 ? 'e' : 'i'}.`,
46
+ offTopicRedirect: 'Sono specializzato nel cercare treni! Prova: Berna a Zurigo',
47
+ offTopicHardStop: 'Sono un assistente ferroviario svizzero. Dimmi dove vuoi andare! \u{1F686}',
48
+ upgradePremium: '\u2B50 Passa a Premium',
49
+ upgradeTrainPass: '\u{1F686} Pass Treno \u00b7 CHF 5',
50
+ upgradeFullPremium: '\u{1F4AC} Premium \u00b7 CHF 10',
51
+ upgradePrompt: 'Vuoi parlare di tutto sulla Svizzera? Passa a Premium per conversazioni illimitate!',
52
+ premiumActivated: (tier, days) => `\u2705 ${tier} attivato! Illimitato per ${days} giorni.`,
53
+ imageNotSupported: '\u{1F4F7} L\'elaborazione immagini \u00e8 una funzione Premium. Passa a Premium per analizzare orari, biglietti e altro!',
54
+ welcomeFreemium: 'Gratis: 30 ricerche treni + 10 richieste meteo a settimana. Passa a Premium quando vuoi!',
55
+ details: 'Dettagli',
56
+ share: 'Condividi',
57
+ shareIntro: 'Cerca i tuoi treni:',
58
+ detailsHint: 'Scrivi "dettagli" per vedere i dettagli del viaggio',
59
+ shareHint: 'Scrivi "condividi" per condividere i risultati',
60
+ transfer: 'Cambio',
61
+ connectionDetail: (n) => `Dettagli collegamento ${n}:`,
62
+ cardLabels: {
63
+ HALF_FARE: 'Met\u00e0-prezzo',
64
+ GA: 'AG',
65
+ NONE: 'Nessun abo',
66
+ },
67
+ };
68
+ //# sourceMappingURL=it.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"it.js","sourceRoot":"","sources":["../../src/translations/it.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Translations } from '../types.js';
2
+ export declare const pt: Translations;
@@ -0,0 +1,68 @@
1
+ export const pt = {
2
+ prices: 'Pre\u00e7os',
3
+ later: 'Mais tarde',
4
+ earlier: 'Mais cedo',
5
+ halfFare: 'Half-Fare',
6
+ gaTravelcard: 'GA Travelcard',
7
+ noCard: 'Nenhum',
8
+ dep: 'Part',
9
+ arr: 'Cheg',
10
+ dur: 'Dur',
11
+ changes: 'Bald.',
12
+ pl: 'Plat',
13
+ price: 'Pre\u00e7o',
14
+ direct: 'Direto',
15
+ oneChange: '1 baldeação',
16
+ nChanges: (n) => `${n} bald.`,
17
+ platform: 'Plataforma',
18
+ onboardingCard: 'Qual cart\u00e3o de redu\u00e7\u00e3o voc\u00ea tem?',
19
+ cardSaved: (label) => `\u2705 Salvo: ${label}. Vou usar para todas as consultas de pre\u00e7o.`,
20
+ searchExpired: 'Sua busca anterior expirou. Me diga para onde quer ir!',
21
+ errorGeneric: 'Desculpe, algo deu errado. Tente novamente.',
22
+ stationNotFound: (station) => `N\u00e3o encontrei "${station}". Estou em modo demo com esta\u00e7\u00f5es limitadas.\n\n` +
23
+ 'Tente: Zurique, Berna, Interlaken, Lucerna, Genebra, Zermatt\n\n' +
24
+ 'Toda a rede su\u00ed\u00e7a dispon\u00edvel em breve!',
25
+ noConnections: 'Nenhuma conex\u00e3o encontrada.',
26
+ buyTicket: 'Compre seu bilhete na SBB',
27
+ opensInApp: 'Abre o app SBB no celular!',
28
+ pricesHeader: (cardLabel) => `Pre\u00e7os (2a classe, ${cardLabel})`,
29
+ couldNotLoadPrices: 'N\u00e3o foi poss\u00edvel carregar os pre\u00e7os. Tente novamente.',
30
+ couldNotLoadTrains: (direction) => `N\u00e3o foi poss\u00edvel carregar os trens ${direction}. Inicie uma nova busca.`,
31
+ welcome: '\u{1F44B} Bem-vindo! Eu ajudo voc\u00ea a encontrar trens na Su\u00ed\u00e7a. Me diga para onde quer ir!',
32
+ welcomeBack: '\u{1F44B} Bem-vindo de volta! Para onde quer viajar hoje?',
33
+ helpIntro: 'Eu ajudo voc\u00ea a encontrar trens na Su\u00ed\u00e7a!',
34
+ helpExamples: [
35
+ 'Berna para Zurique',
36
+ 'Zurique amanh\u00e3 \u00e0s 9',
37
+ 'Bergstrasse 10, Liebefeld para Genebra',
38
+ ],
39
+ helpCommands: '/train <de> para <at\u00e9> — Buscar trens\n/card — Mudar cart\u00e3o\n/help — Mostrar ajuda',
40
+ nearestStation: 'Esta\u00e7\u00e3o mais pr\u00f3xima',
41
+ whereToGo: 'Para onde voc\u00ea quer ir?',
42
+ noStationNearby: 'N\u00e3o encontrei uma esta\u00e7\u00e3o perto da sua localiza\u00e7\u00e3o.',
43
+ weatherUnavailable: (location) => `Os dados meteorol\u00f3gicos de ${location} n\u00e3o est\u00e3o dispon\u00edveis no momento.`,
44
+ weeklyLimitReached: (d) => `Voc\u00ea atingiu o limite gratuito. Renova em ${d} dia${d === 1 ? '' : 's'}!`,
45
+ weeklyLimitSearch: (n) => `${n} pesquisa${n === 1 ? '' : 's'} gratuita${n === 1 ? '' : 's'} restante${n === 1 ? '' : 's'}.`,
46
+ offTopicRedirect: 'Eu sou melhor em encontrar trens! Tente: Berna para Zurique',
47
+ offTopicHardStop: 'Sou um assistente de trens su\u00ed\u00e7os. Diga-me para onde quer ir! \u{1F686}',
48
+ upgradePremium: '\u2B50 Atualizar para Premium',
49
+ upgradeTrainPass: '\u{1F686} Passe de Trem \u00b7 CHF 5',
50
+ upgradeFullPremium: '\u{1F4AC} Premium \u00b7 CHF 10',
51
+ upgradePrompt: 'Quer conversar sobre tudo na Su\u00ed\u00e7a? Atualize para Premium para conversas ilimitadas!',
52
+ premiumActivated: (tier, days) => `\u2705 ${tier} ativado! Ilimitado por ${days} dias.`,
53
+ imageNotSupported: '\u{1F4F7} O processamento de imagens \u00e9 Premium. Atualize para analisar hor\u00e1rios, bilhetes e mais!',
54
+ welcomeFreemium: 'Gr\u00e1tis: 30 pesquisas de trens + 10 consultas meteorol\u00f3gicas por semana. Atualize quando quiser!',
55
+ details: 'Detalhes',
56
+ share: 'Compartilhar',
57
+ shareIntro: 'Encontre seus pr\u00f3prios trens:',
58
+ detailsHint: 'Digite "detalhes" para ver os detalhes da viagem',
59
+ shareHint: 'Digite "compartilhar" para compartilhar estes resultados',
60
+ transfer: 'Baldea\u00e7\u00e3o',
61
+ connectionDetail: (n) => `Detalhes da conex\u00e3o ${n}:`,
62
+ cardLabels: {
63
+ HALF_FARE: 'Half-Fare',
64
+ GA: 'GA',
65
+ NONE: 'Sem cart\u00e3o',
66
+ },
67
+ };
68
+ //# sourceMappingURL=pt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pt.js","sourceRoot":"","sources":["../../src/translations/pt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Translations } from '../types.js';
2
+ export declare const ru: Translations;
@@ -0,0 +1,68 @@
1
+ export const ru = {
2
+ prices: '\u0426\u0435\u043d\u044b',
3
+ later: '\u041f\u043e\u0437\u0436\u0435',
4
+ earlier: '\u0420\u0430\u043d\u044c\u0448\u0435',
5
+ halfFare: 'Halbtax',
6
+ gaTravelcard: 'GA',
7
+ noCard: '\u041d\u0435\u0442',
8
+ dep: '\u041e\u0442\u043f\u0440',
9
+ arr: '\u041f\u0440\u0438\u0431',
10
+ dur: '\u0412\u0440\u0435\u043c\u044f',
11
+ changes: '\u041f\u0435\u0440\u0435\u0441.',
12
+ pl: '\u041f\u0443\u0442\u044c',
13
+ price: '\u0426\u0435\u043d\u0430',
14
+ direct: '\u041f\u0440\u044f\u043c\u043e\u0439',
15
+ oneChange: '1 \u043f\u0435\u0440\u0435\u0441.',
16
+ nChanges: (n) => `${n} \u043f\u0435\u0440\u0435\u0441.`,
17
+ platform: '\u041f\u0443\u0442\u044c',
18
+ onboardingCard: '\u041a\u0430\u043a\u043e\u0439 \u0443 \u0432\u0430\u0441 \u0430\u0431\u043e\u043d\u0435\u043c\u0435\u043d\u0442?',
19
+ cardSaved: (label) => `\u2705 \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e: ${label}. \u0411\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0446\u0435\u043d.`,
20
+ searchExpired: '\u0412\u0430\u0448 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u043e\u0438\u0441\u043a \u0438\u0441\u0442\u0451\u043a. \u0421\u043a\u0430\u0436\u0438\u0442\u0435, \u043a\u0443\u0434\u0430 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0435\u0445\u0430\u0442\u044c!',
21
+ errorGeneric: '\u0418\u0437\u0432\u0438\u043d\u0438\u0442\u0435, \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437.',
22
+ stationNotFound: (station) => `\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 "${station}". \u0421\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0435\u043c\u043e-\u0440\u0435\u0436\u0438\u043c \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0430\u043d\u0446\u0438\u044f\u043c\u0438.\n\n` +
23
+ '\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435: \u0426\u044e\u0440\u0438\u0445, \u0411\u0435\u0440\u043d, \u0418\u043d\u0442\u0435\u0440\u043b\u0430\u043a\u0435\u043d, \u041b\u044e\u0446\u0435\u0440\u043d, \u0416\u0435\u043d\u0435\u0432\u0430, \u0426\u0435\u0440\u043c\u0430\u0442\u0442\n\n' +
24
+ '\u0412\u0441\u044f \u0441\u0435\u0442\u044c \u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0438\u0438 \u0441\u043a\u043e\u0440\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430!',
25
+ noConnections: '\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b.',
26
+ buyTicket: '\u041a\u0443\u043f\u0438\u0442\u044c \u0431\u0438\u043b\u0435\u0442 \u043d\u0430 SBB',
27
+ opensInApp: '\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 SBB \u043d\u0430 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435!',
28
+ pricesHeader: (cardLabel) => `\u0426\u0435\u043d\u044b (2-\u0439 \u043a\u043b\u0430\u0441\u0441, ${cardLabel})`,
29
+ couldNotLoadPrices: '\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0446\u0435\u043d\u044b. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0451 \u0440\u0430\u0437.',
30
+ couldNotLoadTrains: (direction) => `\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c ${direction} \u043f\u043e\u0435\u0437\u0434\u0430. \u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0438\u0441\u043a.`,
31
+ welcome: '\u{1F44B} \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c! \u042f \u043f\u043e\u043c\u043e\u0433\u0443 \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0435\u0437\u0434\u0430 \u0432 \u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0438\u0438. \u0421\u043a\u0430\u0436\u0438\u0442\u0435, \u043a\u0443\u0434\u0430 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0435\u0445\u0430\u0442\u044c!',
32
+ welcomeBack: '\u{1F44B} \u0421 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\u043c! \u041a\u0443\u0434\u0430 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0435\u0445\u0430\u0442\u044c \u0441\u0435\u0433\u043e\u0434\u043d\u044f?',
33
+ helpIntro: '\u042f \u043f\u043e\u043c\u043e\u0433\u0443 \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0435\u0437\u0434\u0430 \u0432 \u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0438\u0438!',
34
+ helpExamples: [
35
+ '\u0411\u0435\u0440\u043d \u0434\u043e \u0426\u044e\u0440\u0438\u0445\u0430',
36
+ '\u0426\u044e\u0440\u0438\u0445 \u0437\u0430\u0432\u0442\u0440\u0430 \u0432 9',
37
+ 'Bergstrasse 10, Liebefeld \u0434\u043e \u0416\u0435\u043d\u0435\u0432\u044b',
38
+ ],
39
+ helpCommands: '/train <\u043e\u0442\u043a\u0443\u0434\u0430> \u0434\u043e <\u043a\u0443\u0434\u0430> — \u0418\u0441\u043a\u0430\u0442\u044c \u043f\u043e\u0435\u0437\u0434\u0430\n/card — \u0421\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u0431\u043e\u043d\u0435\u043c\u0435\u043d\u0442\n/help — \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043c\u043e\u0449\u044c',
40
+ nearestStation: '\u0411\u043b\u0438\u0436\u0430\u0439\u0448\u0430\u044f \u0441\u0442\u0430\u043d\u0446\u0438\u044f',
41
+ whereToGo: '\u041a\u0443\u0434\u0430 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0435\u0445\u0430\u0442\u044c?',
42
+ noStationNearby: '\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0441\u0442\u0430\u043d\u0446\u0438\u044e \u0440\u044f\u0434\u043e\u043c \u0441 \u0432\u0430\u043c\u0438.',
43
+ weatherUnavailable: (location) => `\u0414\u0430\u043d\u043d\u044b\u0435 \u043e \u043f\u043e\u0433\u043e\u0434\u0435 \u0434\u043b\u044f ${location} \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b.`,
44
+ weeklyLimitReached: (d) => `\u0412\u044b \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043b\u0438 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0439 \u043b\u0438\u043c\u0438\u0442. \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 ${d} \u0434\u043d${d === 1 ? '\u044c' : d < 5 ? '\u044f' : '\u0435\u0439'}!`,
45
+ weeklyLimitSearch: (n) => `\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c ${n} \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432.`,
46
+ offTopicRedirect: '\u041d\u043e \u044f \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u0449\u0443 \u043f\u043e\u0435\u0437\u0434\u0430! \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435: \u0411\u0435\u0440\u043d \u0432 \u0426\u044e\u0440\u0438\u0445',
47
+ offTopicHardStop: '\u042f \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442 \u0448\u0432\u0435\u0439\u0446\u0430\u0440\u0441\u043a\u0438\u0445 \u043f\u043e\u0435\u0437\u0434\u043e\u0432. \u0421\u043a\u0430\u0436\u0438\u0442\u0435 \u043a\u0443\u0434\u0430 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0435\u0445\u0430\u0442\u044c! \u{1F686}',
48
+ upgradePremium: '\u2B50 \u041f\u0440\u0435\u043c\u0438\u0443\u043c',
49
+ upgradeTrainPass: '\u{1F686} \u041f\u043e\u0435\u0437\u0434-\u043f\u0430\u0441\u0441 \u00b7 CHF 5',
50
+ upgradeFullPremium: '\u{1F4AC} \u041f\u0440\u0435\u043c\u0438\u0443\u043c \u00b7 CHF 10',
51
+ upgradePrompt: '\u0425\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u0432\u0441\u0451 \u043e \u0428\u0432\u0435\u0439\u0446\u0430\u0440\u0438\u0438? \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043d\u0430 \u041f\u0440\u0435\u043c\u0438\u0443\u043c \u0434\u043b\u044f \u0431\u0435\u0437\u043b\u0438\u043c\u0438\u0442\u043d\u044b\u0445 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432!',
52
+ premiumActivated: (tier, days) => `\u2705 ${tier} \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d! \u0411\u0435\u0437\u043b\u0438\u043c\u0438\u0442 \u043d\u0430 ${days} \u0434\u043d\u0435\u0439.`,
53
+ imageNotSupported: '\u{1F4F7} \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u2014 \u041f\u0440\u0435\u043c\u0438\u0443\u043c-\u0444\u0443\u043d\u043a\u0446\u0438\u044f. \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0435\u0441\u044c \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0438 \u0431\u0438\u043b\u0435\u0442\u043e\u0432!',
54
+ welcomeFreemium: '\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e: 30 \u043f\u043e\u0438\u0441\u043a\u043e\u0432 + 10 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u0433\u043e\u0434\u044b \u0432 \u043d\u0435\u0434\u0435\u043b\u044e. \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0435\u0441\u044c \u0432 \u043b\u044e\u0431\u043e\u0435 \u0432\u0440\u0435\u043c\u044f!',
55
+ details: '\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438',
56
+ share: '\u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f',
57
+ shareIntro: '\u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u0441\u0432\u043e\u0438 \u043f\u043e\u0435\u0437\u0434\u0430:',
58
+ detailsHint: '\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 "\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438" \u0434\u043b\u044f \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u043f\u043e\u0435\u0437\u0434\u043a\u0438',
59
+ shareHint: '\u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 "\u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f" \u0434\u043b\u044f \u043e\u0431\u043c\u0435\u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438',
60
+ transfer: '\u041f\u0435\u0440\u0435\u0441\u0430\u0434\u043a\u0430',
61
+ connectionDetail: (n) => `\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f ${n}:`,
62
+ cardLabels: {
63
+ HALF_FARE: 'Halbtax',
64
+ GA: 'GA',
65
+ NONE: '\u0411\u0435\u0437 \u0430\u0431\u043e\u043d\u0435\u043c\u0435\u043d\u0442\u0430',
66
+ },
67
+ };
68
+ //# sourceMappingURL=ru.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ru.js","sourceRoot":"","sources":["../../src/translations/ru.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAiB;IAC9B,MAAM,EAAE,0BAA0B;IAClC,KAAK,EAAE,gCAAgC;IACvC,OAAO,EAAE,sCAAsC;IAC/C,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,oBAAoB;IAE5B,GAAG,EAAE,0BAA0B;IAC/B,GAAG,EAAE,0BAA0B;IAC/B,GAAG,EAAE,gCAAgC;IACrC,OAAO,EAAE,iCAAiC;IAC1C,EAAE,EAAE,0BAA0B;IAC9B,KAAK,EAAE,0BAA0B;IAEjC,MAAM,EAAE,sCAAsC;IAC9C,SAAS,EAAE,mCAAmC;IAC9C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,kCAAkC;IACvD,QAAQ,EAAE,0BAA0B;IAEpC,cAAc,EAAE,kHAAkH;IAClI,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,kEAAkE,KAAK,wOAAwO;IACrU,aAAa,EAAE,sSAAsS;IACrT,YAAY,EAAE,oPAAoP;IAClQ,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,CAC3B,2FAA2F,OAAO,oSAAoS;QACtY,kTAAkT;QAClT,oNAAoN;IACtN,aAAa,EAAE,uHAAuH;IACtI,SAAS,EAAE,sFAAsF;IACjG,UAAU,EAAE,2MAA2M;IACvN,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,sEAAsE,SAAS,GAAG;IAC/G,kBAAkB,EAAE,8OAA8O;IAClQ,kBAAkB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,kHAAkH,SAAS,kJAAkJ;IAEhT,OAAO,EAAE,6aAA6a;IACtb,WAAW,EAAE,iPAAiP;IAE9P,SAAS,EAAE,gLAAgL;IAC3L,YAAY,EAAE;QACZ,4EAA4E;QAC5E,8EAA8E;QAC9E,6EAA6E;KAC9E;IACD,YAAY,EAAE,6WAA6W;IAE3X,cAAc,EAAE,mGAAmG;IACnH,SAAS,EAAE,wHAAwH;IACnI,eAAe,EAAE,mMAAmM;IAEpN,kBAAkB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,uGAAuG,QAAQ,qGAAqG;IAEtP,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gQAAgQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,cAAc,GAAG;IACrW,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,oDAAoD,CAAC,2GAA2G;IAC1L,gBAAgB,EAAE,yQAAyQ;IAC3R,gBAAgB,EAAE,0VAA0V;IAC5W,cAAc,EAAE,mDAAmD;IACnE,gBAAgB,EAAE,gFAAgF;IAClG,kBAAkB,EAAE,oEAAoE;IACxF,aAAa,EAAE,4aAA4a;IAC3b,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,sIAAsI,IAAI,4BAA4B;IACtN,iBAAiB,EAAE,8cAA8c;IACje,eAAe,EAAE,kXAAkX;IAEnY,OAAO,EAAE,oEAAoE;IAC7E,KAAK,EAAE,8DAA8D;IACrE,UAAU,EAAE,2GAA2G;IACvH,WAAW,EAAE,gOAAgO;IAC7O,SAAS,EAAE,kPAAkP;IAC7P,QAAQ,EAAE,wDAAwD;IAClE,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,mIAAmI,CAAC,GAAG;IAEhK,UAAU,EAAE;QACV,SAAS,EAAE,SAAS;QACpB,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,iFAAiF;KACxF;CACF,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { Translations } from '../types.js';
2
+ export declare const zh: Translations;
@@ -0,0 +1,68 @@
1
+ export const zh = {
2
+ prices: '票价',
3
+ later: '更晚',
4
+ earlier: '更早',
5
+ halfFare: 'Half-Fare',
6
+ gaTravelcard: 'GA通票',
7
+ noCard: '无',
8
+ dep: '出发',
9
+ arr: '到达',
10
+ dur: '时长',
11
+ changes: '换乘',
12
+ pl: '站台',
13
+ price: '票价',
14
+ direct: '直达',
15
+ oneChange: '1次换乘',
16
+ nChanges: (n) => `${n}次换乘`,
17
+ platform: '站台',
18
+ onboardingCard: '您有什么优惠卡?',
19
+ cardSaved: (label) => `✅ 已保存:${label}。将用于所有票价查询。`,
20
+ searchExpired: '您之前的搜索已过期。告诉我您想去哪里!',
21
+ errorGeneric: '抱歉,出了点问题。请重试。',
22
+ stationNotFound: (station) => `找不到"${station}"。目前处于演示模式,车站有限。\n\n` +
23
+ '试试:苏黎世、伯尔尼、因特拉肯、卢塞恩、日内瓦、采尔马特\n\n' +
24
+ '瑞士全网即将上线!',
25
+ noConnections: '未找到列车连接。',
26
+ buyTicket: '在SBB购买车票',
27
+ opensInApp: '在手机上打开SBB应用!',
28
+ pricesHeader: (cardLabel) => `票价(二等座,${cardLabel})`,
29
+ couldNotLoadPrices: '无法加载票价。请重试。',
30
+ couldNotLoadTrains: (direction) => `无法加载${direction}的列车。请重新搜索。`,
31
+ welcome: '\u{1F44B} 欢迎!我帮您查找瑞士火车。告诉我您想去哪里!',
32
+ welcomeBack: '\u{1F44B} 欢迎回来!今天想去哪里?',
33
+ helpIntro: '我帮您查找瑞士火车!',
34
+ helpExamples: [
35
+ '伯尔尼到苏黎世',
36
+ '苏黎世明天9点',
37
+ 'Bergstrasse 10, Liebefeld到日内瓦',
38
+ ],
39
+ helpCommands: '/train <出发地> 到 <目的地> — 搜索列车\n/card — 更改优惠卡\n/help — 显示帮助',
40
+ nearestStation: '最近的车站',
41
+ whereToGo: '您想去哪里?',
42
+ noStationNearby: '未能找到您附近的车站。',
43
+ weatherUnavailable: (location) => `${location}的天气数据暂时不可用。`,
44
+ weeklyLimitReached: (d) => `您已达到免费限额。${d}天后重置!`,
45
+ weeklyLimitSearch: (n) => `还剩 ${n} 次免费搜索。`,
46
+ offTopicRedirect: '不过我最擅长查找火车!试试:伯尔尼到苏黎世',
47
+ offTopicHardStop: '我是瑞士火车助手。告诉我您想去哪里!\u{1F686}',
48
+ upgradePremium: '\u2B50 升级到高级版',
49
+ upgradeTrainPass: '\u{1F686} 火车通行证 \u00b7 CHF 5',
50
+ upgradeFullPremium: '\u{1F4AC} 高级版 \u00b7 CHF 10',
51
+ upgradePrompt: '想聊关于瑞士的一切?升级到高级版享受无限对话!',
52
+ premiumActivated: (tier, days) => `\u2705 ${tier}已激活!${days}天内无限使用。`,
53
+ imageNotSupported: '\u{1F4F7} 图片处理是高级功能。升级后可分析时刻表、车票等!',
54
+ welcomeFreemium: '免费:每周30次火车搜索 + 10次天气查询。随时升级获取无限访问!',
55
+ details: '详情',
56
+ share: '分享',
57
+ shareIntro: '搜索您自己的列车:',
58
+ detailsHint: '输入"详情"查看行程详情',
59
+ shareHint: '输入"分享"分享这些结果',
60
+ transfer: '换乘',
61
+ connectionDetail: (n) => `连接 ${n} 详情:`,
62
+ cardLabels: {
63
+ HALF_FARE: 'Half-Fare',
64
+ GA: 'GA',
65
+ NONE: '无优惠卡',
66
+ },
67
+ };
68
+ //# sourceMappingURL=zh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zh.js","sourceRoot":"","sources":["../../src/translations/zh.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAiB;IAC9B,MAAM,EAAE,IAAI;IACZ,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,WAAW;IACrB,YAAY,EAAE,MAAM;IACpB,MAAM,EAAE,GAAG;IAEX,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,OAAO,EAAE,IAAI;IACb,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,IAAI;IAEX,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,MAAM;IACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK;IAC1B,QAAQ,EAAE,IAAI;IAEd,cAAc,EAAE,UAAU;IAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,KAAK,aAAa;IACjD,aAAa,EAAE,qBAAqB;IACpC,YAAY,EAAE,eAAe;IAC7B,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,CAC3B,OAAO,OAAO,sBAAsB;QACpC,kCAAkC;QAClC,WAAW;IACb,aAAa,EAAE,UAAU;IACzB,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,cAAc;IAC1B,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,SAAS,GAAG;IACnD,kBAAkB,EAAE,aAAa;IACjC,kBAAkB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,SAAS,YAAY;IAE/D,OAAO,EAAE,kCAAkC;IAC3C,WAAW,EAAE,wBAAwB;IAErC,SAAS,EAAE,YAAY;IACvB,YAAY,EAAE;QACZ,SAAS;QACT,SAAS;QACT,+BAA+B;KAChC;IACD,YAAY,EAAE,0DAA0D;IAExE,cAAc,EAAE,OAAO;IACvB,SAAS,EAAE,QAAQ;IACnB,eAAe,EAAE,aAAa;IAE9B,kBAAkB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,QAAQ,aAAa;IAE1D,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO;IAC/C,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS;IAC1C,gBAAgB,EAAE,uBAAuB;IACzC,gBAAgB,EAAE,6BAA6B;IAC/C,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,8BAA8B;IAChD,kBAAkB,EAAE,6BAA6B;IACjD,aAAa,EAAE,yBAAyB;IACxC,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,OAAO,IAAI,SAAS;IACpE,iBAAiB,EAAE,oCAAoC;IACvD,eAAe,EAAE,oCAAoC;IAErD,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,WAAW;IACvB,WAAW,EAAE,cAAc;IAC3B,SAAS,EAAE,cAAc;IACzB,QAAQ,EAAE,IAAI;IACd,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM;IAEtC,UAAU,EAAE;QACV,SAAS,EAAE,WAAW;QACtB,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,MAAM;KACb;CACF,CAAA"}
@@ -0,0 +1,64 @@
1
+ export type Lang = 'de' | 'fr' | 'it' | 'en' | 'es' | 'pt' | 'ru' | 'ar' | 'zh';
2
+ export declare const SUPPORTED_LANGS: readonly Lang[];
3
+ export declare function isLang(value: unknown): value is Lang;
4
+ export interface Translations {
5
+ prices: string;
6
+ later: string;
7
+ earlier: string;
8
+ halfFare: string;
9
+ gaTravelcard: string;
10
+ noCard: string;
11
+ dep: string;
12
+ arr: string;
13
+ dur: string;
14
+ changes: string;
15
+ pl: string;
16
+ price: string;
17
+ direct: string;
18
+ oneChange: string;
19
+ nChanges: (n: number) => string;
20
+ platform: string;
21
+ onboardingCard: string;
22
+ cardSaved: (label: string) => string;
23
+ searchExpired: string;
24
+ errorGeneric: string;
25
+ stationNotFound: (station: string) => string;
26
+ noConnections: string;
27
+ buyTicket: string;
28
+ opensInApp: string;
29
+ pricesHeader: (cardLabel: string) => string;
30
+ couldNotLoadPrices: string;
31
+ couldNotLoadTrains: (direction: string) => string;
32
+ welcome: string;
33
+ welcomeBack: string;
34
+ helpIntro: string;
35
+ helpExamples: string[];
36
+ helpCommands: string;
37
+ nearestStation: string;
38
+ whereToGo: string;
39
+ noStationNearby: string;
40
+ weatherUnavailable: (location: string) => string;
41
+ weeklyLimitReached: (resetDays: number) => string;
42
+ weeklyLimitSearch: (remaining: number) => string;
43
+ offTopicRedirect: string;
44
+ offTopicHardStop: string;
45
+ upgradePremium: string;
46
+ upgradeTrainPass: string;
47
+ upgradeFullPremium: string;
48
+ upgradePrompt: string;
49
+ premiumActivated: (tier: string, days: number) => string;
50
+ imageNotSupported: string;
51
+ welcomeFreemium: string;
52
+ details: string;
53
+ share: string;
54
+ shareIntro: string;
55
+ detailsHint: string;
56
+ shareHint: string;
57
+ transfer: string;
58
+ connectionDetail: (n: number) => string;
59
+ cardLabels: {
60
+ HALF_FARE: string;
61
+ GA: string;
62
+ NONE: string;
63
+ };
64
+ }
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ export const SUPPORTED_LANGS = [
2
+ 'de', 'fr', 'it', 'en', 'es', 'pt', 'ru', 'ar', 'zh',
3
+ ];
4
+ export function isLang(value) {
5
+ return typeof value === 'string' && SUPPORTED_LANGS.includes(value);
6
+ }
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAoB;IAC9C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC5C,CAAA;AAEV,MAAM,UAAU,MAAM,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC5F,CAAC"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "sbb-i18n",
3
+ "version": "0.1.0",
4
+ "description": "Shared translations for sbb-mcp and sbb-bot-core (9 languages: de, fr, it, en, es, pt, ru, ar, zh)",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md",
17
+ "LICENSE"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsc -w",
22
+ "test": "vitest run",
23
+ "prepublishOnly": "npm run build"
24
+ },
25
+ "keywords": [
26
+ "i18n",
27
+ "swiss",
28
+ "sbb",
29
+ "translations",
30
+ "multilingual"
31
+ ],
32
+ "author": "SwissTrip <fabsforward2@gmail.com>",
33
+ "license": "FSL-1.1-MIT",
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/Fabsbags/swisstrip-web",
37
+ "directory": "packages/sbb-i18n"
38
+ },
39
+ "engines": {
40
+ "node": ">=18"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^22.15.3",
44
+ "typescript": "^5.8.3",
45
+ "vitest": "^4.1.0"
46
+ }
47
+ }