Skip to content

Commit 9bee09b

Browse files
committed
fix: pass language tag in config
1 parent 5961387 commit 9bee09b

File tree

4 files changed

+39
-10
lines changed

4 files changed

+39
-10
lines changed

apps/docs/contents/index.mdx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---
22
title: Overview
33
createdAt: 2025-07-20T22:35:03+08:00
4-
lastModified: 2025-11-21T21:25:29+08:00
4+
lastModified: 2025-11-21T21:41:13+08:00
55
---
66

77
# Overview
@@ -135,6 +135,7 @@ This will automatically pull resources from the remote repository, avoiding rebu
135135
- `mapboxToken`: Mapbox access token (required when using Mapbox provider)
136136
- `nominatimBaseUrl`: Custom Nominatim base URL (optional, defaults to OpenStreetMap's public instance)
137137
- `cachePrecision`: Coordinate cache precision (decimals, default: `4`)
138+
- `language`: Preferred language(s) for results (BCP47, comma-separated or array). Omit to use provider default.
138139

139140
#### System Observability (`system.observability`)
140141

@@ -161,6 +162,7 @@ export default defineBuilderConfig(() => ({
161162
geocodingPlugin({
162163
enable: true,
163164
provider: 'nominatim',
165+
// language: 'en,zh',
164166
// Optional: use custom Nominatim instance
165167
// nominatimBaseUrl: 'https://your-nominatim-instance.com'
166168
}),
@@ -180,6 +182,7 @@ export default defineBuilderConfig(() => ({
180182
enable: true,
181183
provider: 'mapbox',
182184
mapboxToken: process.env.MAPBOX_TOKEN,
185+
// language: 'en-US',
183186
}),
184187
],
185188
}))

packages/builder/src/photo/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ export default defineBuilderConfig(() => ({
107107
enable: true,
108108
provider: 'auto',
109109
mapboxToken: process.env.MAPBOX_TOKEN,
110+
// language: 'en,zh', // 可选,按需设置语言
110111
// nominatimBaseUrl: 'https://your-nominatim-instance.com',
111112
}),
112113
],

packages/builder/src/photo/geocoding.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,15 +163,17 @@ export interface GeocodingProvider {
163163
*/
164164
export class MapboxGeocodingProvider implements GeocodingProvider {
165165
private readonly accessToken: string
166+
private readonly language: string | null
166167
private readonly baseUrl = 'https://api.mapbox.com'
167168
private readonly rateLimitMs = 100 // Mapbox 速率限制:1000次/分钟
168169
private readonly rateLimiter: SequentialRateLimiter
169170
private readonly interprocessKey: string
170171
private readonly maxRetries = 3
171172
private readonly retryBaseDelayMs = 500
172173

173-
constructor(accessToken: string) {
174+
constructor(accessToken: string, language?: string | null) {
174175
this.accessToken = accessToken
176+
this.language = language ?? null
175177
this.rateLimiter = getGlobalRateLimiter(`mapbox:${accessToken}`, this.rateLimitMs)
176178
this.interprocessKey = `mapbox:${accessToken}`
177179
}
@@ -187,8 +189,9 @@ export class MapboxGeocodingProvider implements GeocodingProvider {
187189
url.searchParams.set('access_token', this.accessToken)
188190
url.searchParams.set('longitude', lon.toString())
189191
url.searchParams.set('latitude', lat.toString())
190-
url.searchParams.set('types', 'address,place,district,region,country')
191-
url.searchParams.set('language', 'zh-Hants')
192+
if (this.language) {
193+
url.searchParams.set('language', this.language)
194+
}
192195

193196
log.info(`调用 Mapbox API: ${lat}, ${lon}`)
194197

@@ -266,15 +269,17 @@ export class MapboxGeocodingProvider implements GeocodingProvider {
266269
*/
267270
export class NominatimGeocodingProvider implements GeocodingProvider {
268271
private readonly baseUrl: string
272+
private readonly language: string | null
269273
private readonly userAgent = 'afilmory/1.0'
270274
private readonly rateLimitMs = 1000 // Nominatim 要求至少1秒间隔
271275
private readonly rateLimiter: SequentialRateLimiter
272276
private readonly interprocessKey: string
273277
private readonly maxRetries = 3
274278
private readonly retryBaseDelayMs = 1000
275279

276-
constructor(baseUrl?: string) {
280+
constructor(baseUrl?: string, language?: string | null) {
277281
this.baseUrl = baseUrl || 'https://nominatim.openstreetmap.org'
282+
this.language = language ?? null
278283
this.rateLimiter = getGlobalRateLimiter(`nominatim:${this.baseUrl}`, this.rateLimitMs)
279284
this.interprocessKey = `nominatim:${this.baseUrl}`
280285
}
@@ -291,13 +296,16 @@ export class NominatimGeocodingProvider implements GeocodingProvider {
291296
url.searchParams.set('lon', lon.toString())
292297
url.searchParams.set('format', 'json')
293298
url.searchParams.set('addressdetails', '1')
294-
url.searchParams.set('accept-language', 'zh-CN,zh,en')
299+
if (this.language) {
300+
url.searchParams.set('accept-language', this.language)
301+
}
295302

296303
log.info(`调用 Nominatim API: ${lat}, ${lon}`)
297304

298305
const response = await fetch(url.toString(), {
299306
headers: {
300307
'User-Agent': this.userAgent,
308+
...(this.language ? { 'Accept-Language': this.language } : {}),
301309
},
302310
})
303311

@@ -372,20 +380,22 @@ export class NominatimGeocodingProvider implements GeocodingProvider {
372380
* @param provider 提供者类型
373381
* @param mapboxToken Mapbox access token(可选)
374382
* @param nominatimBaseUrl Nominatim 基础 URL(可选)
383+
* @param language 首选语言(可选,逗号分隔的 BCP47 列表)
375384
*/
376385
export function createGeocodingProvider(
377386
provider: 'mapbox' | 'nominatim' | 'auto',
378387
mapboxToken?: string,
379388
nominatimBaseUrl?: string,
389+
language?: string | null,
380390
): GeocodingProvider | null {
381391
// 如果指定了 Mapbox 或自动模式且有 token,使用 Mapbox
382392
if ((provider === 'mapbox' || provider === 'auto') && mapboxToken) {
383-
return new MapboxGeocodingProvider(mapboxToken)
393+
return new MapboxGeocodingProvider(mapboxToken, language)
384394
}
385395

386396
// 使用 Nominatim
387397
if (provider === 'nominatim' || provider === 'auto') {
388-
return new NominatimGeocodingProvider(nominatimBaseUrl)
398+
return new NominatimGeocodingProvider(nominatimBaseUrl, language)
389399
}
390400

391401
return null

packages/builder/src/plugins/geocoding.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ interface GeocodingPluginOptions {
2121
mapboxToken?: string
2222
nominatimBaseUrl?: string
2323
cachePrecision?: number
24+
/**
25+
* Preferred languages for geocoding results (BCP47). Accepts comma-separated string or array.
26+
*/
27+
language?: string | string[]
2428
}
2529
type GeocodingPluginOptionsResolved = Required<Pick<GeocodingPluginOptions, 'enable' | 'provider'>> &
2630
Pick<GeocodingPluginOptions, 'mapboxToken' | 'nominatimBaseUrl' | 'cachePrecision'> & {
@@ -32,6 +36,7 @@ interface ResolvedGeocodingSettings {
3236
mapboxToken?: string
3337
nominatimBaseUrl?: string
3438
cachePrecision: number
39+
language: string | null
3540
}
3641

3742
interface GeocodingState {
@@ -70,6 +75,7 @@ function resolveSettings(options: GeocodingPluginOptions): GeocodingPluginOption
7075
mapboxToken: options.mapboxToken,
7176
nominatimBaseUrl: options.nominatimBaseUrl,
7277
cachePrecision: normalizeCachePrecision(options.cachePrecision ?? DEFAULT_CACHE_PRECISION),
78+
language: normalizeLanguage(options.language),
7379
}
7480
}
7581

@@ -89,7 +95,7 @@ function getOrCreateState(runShared: Map<string, unknown>): GeocodingState {
8995
}
9096

9197
function buildProviderKey(settings: ResolvedGeocodingSettings): string {
92-
return `${settings.provider}:${settings.mapboxToken ?? ''}:${settings.nominatimBaseUrl ?? ''}`
98+
return `${settings.provider}:${settings.mapboxToken ?? ''}:${settings.nominatimBaseUrl ?? ''}:${settings.language ?? ''}`
9399
}
94100

95101
function ensureProvider(
@@ -102,7 +108,16 @@ function ensureProvider(
102108
return state.provider
103109
}
104110

105-
const provider = createGeocodingProvider(settings.provider, settings.mapboxToken, settings.nominatimBaseUrl)
111+
if (state.providerKey && state.providerKey !== providerKey) {
112+
state.cache.clear()
113+
}
114+
115+
const provider = createGeocodingProvider(
116+
settings.provider,
117+
settings.mapboxToken,
118+
settings.nominatimBaseUrl,
119+
settings.language ?? undefined,
120+
)
106121

107122
if (!provider) {
108123
logger.warn('无法创建地理编码提供者,请检查 geocoding 配置和 Token')

0 commit comments

Comments
 (0)