sbb-mcp 0.3.0 → 0.4.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.
- package/LICENSE +57 -216
- package/README.md +314 -153
- package/dist/formatters.d.ts +8 -8
- package/dist/formatters.js +54 -46
- package/dist/formatters.js.map +1 -1
- package/dist/i18n.d.ts +22 -0
- package/dist/i18n.js +36 -0
- package/dist/i18n.js.map +1 -0
- package/dist/profile.d.ts +3 -1
- package/dist/profile.js +10 -3
- package/dist/profile.js.map +1 -1
- package/dist/tools.js +63 -31
- package/dist/tools.js.map +1 -1
- package/dist/transport/smapi-client.js +1 -0
- package/dist/transport/smapi-client.js.map +1 -1
- package/dist/transport/smapi-journey.d.ts +9 -4
- package/dist/transport/smapi-journey.js +7 -6
- package/dist/transport/smapi-journey.js.map +1 -1
- package/dist/transport/smapi-mock.d.ts +6 -2
- package/dist/transport/smapi-mock.js +9 -2
- package/dist/transport/smapi-mock.js.map +1 -1
- package/dist/transport/smapi-prices.d.ts +3 -2
- package/dist/transport/smapi-prices.js +5 -3
- package/dist/transport/smapi-prices.js.map +1 -1
- package/package.json +7 -2
package/dist/formatters.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { getWeatherSummary } from 'swiss-weather-mcp';
|
|
2
|
-
|
|
2
|
+
import { toLocale, toSbbLinkLang, t } from './i18n.js';
|
|
3
|
+
function formatTime(iso, lang) {
|
|
3
4
|
const d = new Date(iso);
|
|
4
|
-
return d.toLocaleTimeString(
|
|
5
|
+
return d.toLocaleTimeString(toLocale(lang), {
|
|
5
6
|
hour: '2-digit',
|
|
6
7
|
minute: '2-digit',
|
|
7
8
|
timeZone: 'Europe/Zurich',
|
|
8
9
|
});
|
|
9
10
|
}
|
|
10
|
-
function formatDate(iso) {
|
|
11
|
+
function formatDate(iso, lang) {
|
|
11
12
|
const d = new Date(iso);
|
|
12
|
-
return d.toLocaleDateString(
|
|
13
|
+
return d.toLocaleDateString(toLocale(lang), {
|
|
13
14
|
weekday: 'short',
|
|
14
15
|
day: '2-digit',
|
|
15
16
|
month: '2-digit',
|
|
@@ -25,13 +26,15 @@ function parseDuration(iso) {
|
|
|
25
26
|
const m = match[2] ? `${match[2]}m` : '';
|
|
26
27
|
return `${h}${h && m ? ' ' : ''}${m}` || '0m';
|
|
27
28
|
}
|
|
28
|
-
function
|
|
29
|
-
const
|
|
30
|
-
if (
|
|
31
|
-
return
|
|
32
|
-
|
|
29
|
+
function transfersLabel(n, lang) {
|
|
30
|
+
const tr = t(lang);
|
|
31
|
+
if (n === 0)
|
|
32
|
+
return tr.direct;
|
|
33
|
+
if (n === 1)
|
|
34
|
+
return tr.oneChange;
|
|
35
|
+
return tr.nChanges(n);
|
|
33
36
|
}
|
|
34
|
-
export function formatStations(stations) {
|
|
37
|
+
export function formatStations(stations, lang = 'en') {
|
|
35
38
|
if (stations.length === 0) {
|
|
36
39
|
return 'No stations found.';
|
|
37
40
|
}
|
|
@@ -46,48 +49,50 @@ export function formatStations(stations) {
|
|
|
46
49
|
}
|
|
47
50
|
return lines.join('\n');
|
|
48
51
|
}
|
|
49
|
-
function formatLegSummary(leg) {
|
|
52
|
+
function formatLegSummary(leg, lang) {
|
|
50
53
|
if (leg.type === 'timed') {
|
|
51
54
|
const tl = leg;
|
|
52
55
|
const line = tl.service.publishedLineName || 'Train';
|
|
53
|
-
const platform = tl.board.platform ? `
|
|
56
|
+
const platform = tl.board.platform ? ` ${t(lang).pl}.${tl.board.platform}` : '';
|
|
54
57
|
return `${line}${platform}`;
|
|
55
58
|
}
|
|
56
59
|
if (leg.type === 'transfer') {
|
|
57
60
|
const tr = leg;
|
|
58
61
|
return `Walk ${parseDuration(tr.duration)}`;
|
|
59
62
|
}
|
|
60
|
-
return
|
|
63
|
+
return t(lang).transfer;
|
|
61
64
|
}
|
|
62
|
-
export function formatConnections(collection) {
|
|
65
|
+
export function formatConnections(collection, lang = 'en') {
|
|
63
66
|
const trips = collection.trips;
|
|
67
|
+
const tr = t(lang);
|
|
64
68
|
if (trips.length === 0) {
|
|
65
|
-
return
|
|
69
|
+
return tr.noConnections;
|
|
66
70
|
}
|
|
67
71
|
const first = trips[0];
|
|
68
|
-
const date = formatDate(first.startTime);
|
|
72
|
+
const date = formatDate(first.startTime, lang);
|
|
69
73
|
const lines = [
|
|
70
74
|
`**${first.origin.name} -> ${first.destination.name}** | ${date}`,
|
|
71
75
|
`Collection ID: \`${collection.id}\` (use with get_more_connections)`,
|
|
72
76
|
'',
|
|
73
|
-
|
|
77
|
+
`| ${tr.dep} | ${tr.arr} | ${tr.dur} | ${tr.changes} | Route | Trip ID |`,
|
|
74
78
|
'|-----|-----|----------|-----------|-------|---------|',
|
|
75
79
|
];
|
|
76
80
|
for (const trip of trips) {
|
|
77
|
-
const dep = formatTime(trip.startTime);
|
|
78
|
-
const arr = formatTime(trip.endTime);
|
|
81
|
+
const dep = formatTime(trip.startTime, lang);
|
|
82
|
+
const arr = formatTime(trip.endTime, lang);
|
|
79
83
|
const dur = parseDuration(trip.duration);
|
|
80
|
-
const route = trip.legs.map(formatLegSummary).join(' > ');
|
|
81
|
-
lines.push(`| ${dep} | ${arr} | ${dur} | ${trip.transfers} | ${route} | \`${trip.id}\` |`);
|
|
84
|
+
const route = trip.legs.map(l => formatLegSummary(l, lang)).join(' > ');
|
|
85
|
+
lines.push(`| ${dep} | ${arr} | ${dur} | ${transfersLabel(trip.transfers, lang)} | ${route} | \`${trip.id}\` |`);
|
|
82
86
|
}
|
|
83
87
|
lines.push('');
|
|
84
88
|
lines.push(`*Use \`get_prices\` with trip IDs to see ticket prices. Use \`get_more_connections\` to see earlier/later trains.*`);
|
|
85
89
|
return lines.join('\n');
|
|
86
90
|
}
|
|
87
|
-
export function formatTripDetails(trip) {
|
|
91
|
+
export function formatTripDetails(trip, lang = 'en') {
|
|
92
|
+
const tr = t(lang);
|
|
88
93
|
const lines = [
|
|
89
|
-
`**Trip Details** | ${formatDate(trip.startTime)}`,
|
|
90
|
-
`${trip.origin.name} -> ${trip.destination.name} | ${parseDuration(trip.duration)} | ${trip.transfers
|
|
94
|
+
`**Trip Details** | ${formatDate(trip.startTime, lang)}`,
|
|
95
|
+
`${trip.origin.name} -> ${trip.destination.name} | ${parseDuration(trip.duration)} | ${transfersLabel(trip.transfers, lang)}`,
|
|
91
96
|
`Status: ${trip.tripStatus}`,
|
|
92
97
|
'',
|
|
93
98
|
];
|
|
@@ -97,17 +102,17 @@ export function formatTripDetails(trip) {
|
|
|
97
102
|
const tl = leg;
|
|
98
103
|
const line = tl.service.publishedLineName || 'Train';
|
|
99
104
|
const operator = tl.service.operatorName || '';
|
|
100
|
-
const boardPlatform = tl.board.platform ? ` |
|
|
101
|
-
const alightPlatform = tl.alight.platform ? ` |
|
|
105
|
+
const boardPlatform = tl.board.platform ? ` | ${tr.platform} ${tl.board.platform}` : '';
|
|
106
|
+
const alightPlatform = tl.alight.platform ? ` | ${tr.platform} ${tl.alight.platform}` : '';
|
|
102
107
|
lines.push(`### Leg ${i + 1}: ${line} ${operator}`.trim());
|
|
103
|
-
lines.push(`- **${formatTime(tl.board.departureTime)}** ${tl.board.stopPlace.name}${boardPlatform}`);
|
|
108
|
+
lines.push(`- **${formatTime(tl.board.departureTime, lang)}** ${tl.board.stopPlace.name}${boardPlatform}`);
|
|
104
109
|
if (tl.intermediateStops?.length) {
|
|
105
110
|
for (const stop of tl.intermediateStops) {
|
|
106
|
-
const time = stop.arrivalTime ? formatTime(stop.arrivalTime) : '';
|
|
111
|
+
const time = stop.arrivalTime ? formatTime(stop.arrivalTime, lang) : '';
|
|
107
112
|
lines.push(` - ${time} ${stop.stopPlace.name}`);
|
|
108
113
|
}
|
|
109
114
|
}
|
|
110
|
-
lines.push(`- **${formatTime(tl.alight.arrivalTime)}** ${tl.alight.stopPlace.name}${alightPlatform}`);
|
|
115
|
+
lines.push(`- **${formatTime(tl.alight.arrivalTime, lang)}** ${tl.alight.stopPlace.name}${alightPlatform}`);
|
|
111
116
|
if (tl.occupancy) {
|
|
112
117
|
const occ = [];
|
|
113
118
|
if (tl.occupancy.firstClass)
|
|
@@ -117,23 +122,24 @@ export function formatTripDetails(trip) {
|
|
|
117
122
|
if (occ.length)
|
|
118
123
|
lines.push(` Occupancy: ${occ.join(', ')}`);
|
|
119
124
|
}
|
|
120
|
-
lines.push(`
|
|
125
|
+
lines.push(` ${tr.dur}: ${parseDuration(tl.duration)}`);
|
|
121
126
|
}
|
|
122
127
|
else if (leg.type === 'transfer') {
|
|
123
|
-
const
|
|
124
|
-
lines.push(`###
|
|
128
|
+
const tfer = leg;
|
|
129
|
+
lines.push(`### ${tr.transfer}: Walk ${parseDuration(tfer.duration)}`);
|
|
125
130
|
}
|
|
126
131
|
lines.push('');
|
|
127
132
|
}
|
|
128
133
|
lines.push(`*Use \`get_prices\` with trip ID \`${trip.id}\` to see ticket prices.*`);
|
|
129
134
|
return lines.join('\n');
|
|
130
135
|
}
|
|
131
|
-
export function formatPrices(results) {
|
|
136
|
+
export function formatPrices(results, lang = 'en') {
|
|
132
137
|
if (results.length === 0) {
|
|
133
138
|
return 'No price information available.';
|
|
134
139
|
}
|
|
135
|
-
const
|
|
136
|
-
lines
|
|
140
|
+
const tr = t(lang);
|
|
141
|
+
const lines = [`**${tr.prices}**`, ''];
|
|
142
|
+
lines.push(`| Trip ID | 2nd Class | 1st Class |`);
|
|
137
143
|
lines.push('|---------|-----------|-----------|');
|
|
138
144
|
for (const r of results) {
|
|
139
145
|
const second = r.prices.find(p => p.class === '2');
|
|
@@ -148,28 +154,28 @@ export function formatPrices(results) {
|
|
|
148
154
|
}
|
|
149
155
|
/**
|
|
150
156
|
* Build an SBB.ch deep link URL with connection pre-filled.
|
|
151
|
-
*
|
|
152
|
-
* On mobile with SBB app installed, opens directly in the app (user already logged in).
|
|
157
|
+
* SBB.ch URLs support de/fr/it/en; other languages fall back to `en`.
|
|
153
158
|
*/
|
|
154
159
|
export function buildSbbDeepLink(params) {
|
|
155
|
-
const { fromName, fromId, toName, toId, date, time
|
|
156
|
-
|
|
160
|
+
const { fromName, fromId, toName, toId, date, time } = params;
|
|
161
|
+
const linkLang = params.lang ? toSbbLinkLang(params.lang) : 'en';
|
|
157
162
|
const stops = JSON.stringify([
|
|
158
163
|
{ value: fromId, type: 'ID', label: fromName },
|
|
159
164
|
{ value: toId, type: 'ID', label: toName },
|
|
160
165
|
]);
|
|
161
|
-
const url = new URL(`https://www.sbb.ch/${
|
|
166
|
+
const url = new URL(`https://www.sbb.ch/${linkLang}`);
|
|
162
167
|
url.searchParams.set('stops', stops);
|
|
163
168
|
url.searchParams.set('date', `"${date}"`);
|
|
164
169
|
url.searchParams.set('time', `"${time}"`);
|
|
165
170
|
url.searchParams.set('moment', '"DEPARTURE"');
|
|
166
|
-
url.searchParams.set('selected_trip', '0');
|
|
171
|
+
url.searchParams.set('selected_trip', '0');
|
|
167
172
|
return url.toString();
|
|
168
173
|
}
|
|
169
|
-
export function formatTicketLink(tripId, deepLink, sbbLink) {
|
|
174
|
+
export function formatTicketLink(tripId, deepLink, sbbLink, lang = 'en') {
|
|
175
|
+
const tr = t(lang);
|
|
170
176
|
const links = [];
|
|
171
177
|
if (sbbLink) {
|
|
172
|
-
links.push(`[
|
|
178
|
+
links.push(`[${tr.buyTicket}](${sbbLink})`);
|
|
173
179
|
}
|
|
174
180
|
if (deepLink && deepLink !== sbbLink) {
|
|
175
181
|
links.push(`[Buy via affiliate](${deepLink})`);
|
|
@@ -178,17 +184,19 @@ export function formatTicketLink(tripId, deepLink, sbbLink) {
|
|
|
178
184
|
return `No ticket link available for trip \`${tripId}\`. The trip may have expired or is not bookable online.`;
|
|
179
185
|
}
|
|
180
186
|
return [
|
|
181
|
-
|
|
187
|
+
`**${tr.buyTicket}**`,
|
|
182
188
|
'',
|
|
183
189
|
`Trip: \`${tripId}\``,
|
|
184
190
|
'',
|
|
185
191
|
...links,
|
|
186
192
|
'',
|
|
187
|
-
|
|
193
|
+
`*${tr.opensInApp}*`,
|
|
188
194
|
].join('\n');
|
|
189
195
|
}
|
|
190
196
|
/** Append destination weather to formatted connections */
|
|
191
197
|
export async function appendWeatherToConnections(formatted, destinationLat, destinationLon, date, destinationName) {
|
|
198
|
+
// Weather stays English for now — swiss-weather-mcp getWeatherSummary() doesn't accept a language yet.
|
|
199
|
+
// TODO(v0.5.0): thread lang through once swiss-weather-mcp exposes it.
|
|
192
200
|
try {
|
|
193
201
|
const summary = await getWeatherSummary(destinationLat, destinationLon, date);
|
|
194
202
|
if (!summary)
|
|
@@ -196,7 +204,7 @@ export async function appendWeatherToConnections(formatted, destinationLat, dest
|
|
|
196
204
|
return formatted + `\n\n**${destinationName} weather:** ${summary}`;
|
|
197
205
|
}
|
|
198
206
|
catch {
|
|
199
|
-
return formatted;
|
|
207
|
+
return formatted;
|
|
200
208
|
}
|
|
201
209
|
}
|
|
202
210
|
//# sourceMappingURL=formatters.js.map
|
package/dist/formatters.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,SAAS,UAAU,CAAC,GAAW;
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"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"}
|
package/dist/i18n.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language helpers for sbb-mcp.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the shared `sbb-i18n` primitives and adds MCP-specific helpers:
|
|
5
|
+
*
|
|
6
|
+
* - `toLocale(lang)` — maps our 9 language codes to BCP-47 locale tags for
|
|
7
|
+
* `Intl.DateTimeFormat`. Swiss languages get `-CH` (so e.g. dates render as
|
|
8
|
+
* DD.MM.YYYY for de-CH, not DD/MM/YYYY); non-Swiss use their primary region.
|
|
9
|
+
* - `SBB_LINK_LANGS` — languages SBB.ch actually supports in URL paths. The
|
|
10
|
+
* rest fall back to English for deep links.
|
|
11
|
+
*/
|
|
12
|
+
import type { Lang } from 'sbb-i18n';
|
|
13
|
+
export type { Lang, Translations } from 'sbb-i18n';
|
|
14
|
+
export { resolveLang, t, SUPPORTED_LANGS, isLang } from 'sbb-i18n';
|
|
15
|
+
/** BCP-47 locale tag for `Intl.DateTimeFormat`. Swiss languages use -CH variants. */
|
|
16
|
+
export declare function toLocale(lang: Lang): string;
|
|
17
|
+
/**
|
|
18
|
+
* Languages SBB.ch supports in its public URLs (/de, /fr, /it, /en).
|
|
19
|
+
* Other input languages fall back to English when building deep links.
|
|
20
|
+
*/
|
|
21
|
+
export declare const SBB_LINK_LANGS: readonly Lang[];
|
|
22
|
+
export declare function toSbbLinkLang(lang: Lang): 'de' | 'fr' | 'it' | 'en';
|
package/dist/i18n.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language helpers for sbb-mcp.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the shared `sbb-i18n` primitives and adds MCP-specific helpers:
|
|
5
|
+
*
|
|
6
|
+
* - `toLocale(lang)` — maps our 9 language codes to BCP-47 locale tags for
|
|
7
|
+
* `Intl.DateTimeFormat`. Swiss languages get `-CH` (so e.g. dates render as
|
|
8
|
+
* DD.MM.YYYY for de-CH, not DD/MM/YYYY); non-Swiss use their primary region.
|
|
9
|
+
* - `SBB_LINK_LANGS` — languages SBB.ch actually supports in URL paths. The
|
|
10
|
+
* rest fall back to English for deep links.
|
|
11
|
+
*/
|
|
12
|
+
export { resolveLang, t, SUPPORTED_LANGS, isLang } from 'sbb-i18n';
|
|
13
|
+
const LOCALE_MAP = {
|
|
14
|
+
de: 'de-CH',
|
|
15
|
+
fr: 'fr-CH',
|
|
16
|
+
it: 'it-CH',
|
|
17
|
+
en: 'en-CH',
|
|
18
|
+
es: 'es-ES',
|
|
19
|
+
pt: 'pt-PT',
|
|
20
|
+
ru: 'ru-RU',
|
|
21
|
+
ar: 'ar',
|
|
22
|
+
zh: 'zh-CN',
|
|
23
|
+
};
|
|
24
|
+
/** BCP-47 locale tag for `Intl.DateTimeFormat`. Swiss languages use -CH variants. */
|
|
25
|
+
export function toLocale(lang) {
|
|
26
|
+
return LOCALE_MAP[lang];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Languages SBB.ch supports in its public URLs (/de, /fr, /it, /en).
|
|
30
|
+
* Other input languages fall back to English when building deep links.
|
|
31
|
+
*/
|
|
32
|
+
export const SBB_LINK_LANGS = ['de', 'fr', 'it', 'en'];
|
|
33
|
+
export function toSbbLinkLang(lang) {
|
|
34
|
+
return SBB_LINK_LANGS.includes(lang) ? lang : 'en';
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=i18n.js.map
|
package/dist/i18n.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAElE,MAAM,UAAU,GAAyB;IACvC,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,OAAO;CACZ,CAAA;AAED,qFAAqF;AACrF,MAAM,UAAU,QAAQ,CAAC,IAAU;IACjC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAA;AAEhF,MAAM,UAAU,aAAa,CAAC,IAAU;IACtC,OAAQ,cAAoC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAkC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1G,CAAC"}
|
package/dist/profile.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import type { Lang } from './i18n.js';
|
|
1
2
|
export type UserProfile = {
|
|
2
3
|
first_name?: string;
|
|
3
4
|
last_name?: string;
|
|
4
5
|
date_of_birth?: string;
|
|
5
6
|
reduction_card?: 'HALF_FARE' | 'GA' | 'NONE';
|
|
6
7
|
reduction_card_valid_until?: string;
|
|
8
|
+
language?: Lang;
|
|
7
9
|
created_at?: string;
|
|
8
10
|
updated_at?: string;
|
|
9
11
|
};
|
|
@@ -11,4 +13,4 @@ export declare function getProfilePath(): string;
|
|
|
11
13
|
export declare function loadProfile(): UserProfile | null;
|
|
12
14
|
export declare function saveProfile(profile: UserProfile): void;
|
|
13
15
|
export declare function isReductionCardExpired(profile: UserProfile): boolean;
|
|
14
|
-
export declare function formatProfileSummary(profile: UserProfile): string;
|
|
16
|
+
export declare function formatProfileSummary(profile: UserProfile, lang?: Lang): string;
|
package/dist/profile.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { homedir } from 'os';
|
|
4
|
+
import { toLocale, t } from './i18n.js';
|
|
4
5
|
const PROFILE_DIR = join(homedir(), '.sbb-mcp');
|
|
5
6
|
const PROFILE_PATH = join(PROFILE_DIR, 'profile.json');
|
|
6
|
-
// No longer using time-based expiry — we store the actual validity date
|
|
7
7
|
export function getProfilePath() {
|
|
8
8
|
return PROFILE_PATH;
|
|
9
9
|
}
|
|
@@ -37,7 +37,9 @@ export function isReductionCardExpired(profile) {
|
|
|
37
37
|
const validUntil = new Date(profile.reduction_card_valid_until).getTime();
|
|
38
38
|
return Date.now() > validUntil;
|
|
39
39
|
}
|
|
40
|
-
export function formatProfileSummary(profile) {
|
|
40
|
+
export function formatProfileSummary(profile, lang = 'en') {
|
|
41
|
+
const tr = t(lang);
|
|
42
|
+
const locale = toLocale(lang);
|
|
41
43
|
const lines = ['**Your Travel Profile**', ''];
|
|
42
44
|
if (profile.first_name || profile.last_name) {
|
|
43
45
|
lines.push(`Name: ${[profile.first_name, profile.last_name].filter(Boolean).join(' ')}`);
|
|
@@ -60,9 +62,14 @@ export function formatProfileSummary(profile) {
|
|
|
60
62
|
else {
|
|
61
63
|
lines.push('Reduction card: None');
|
|
62
64
|
}
|
|
65
|
+
if (profile.language) {
|
|
66
|
+
lines.push(`Language: ${profile.language}`);
|
|
67
|
+
}
|
|
63
68
|
if (profile.updated_at) {
|
|
64
|
-
lines.push(`Last updated: ${new Date(profile.updated_at).toLocaleDateString(
|
|
69
|
+
lines.push(`Last updated: ${new Date(profile.updated_at).toLocaleDateString(locale)}`);
|
|
65
70
|
}
|
|
71
|
+
// Suppress unused-var warning for tr until we translate the labels above
|
|
72
|
+
void tr;
|
|
66
73
|
lines.push('');
|
|
67
74
|
lines.push(`*Profile stored at \`${PROFILE_PATH}\`. Edit or delete anytime.*`);
|
|
68
75
|
return lines.join('\n');
|
package/dist/profile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
|