|
5 | 5 |
|
6 | 6 | var DOCS_LANGUAGE_STORAGE_KEY = 'starlight-route'; |
7 | 7 | var DEFAULT_DOCS_ENTRY_LOCALE = 'en'; |
| 8 | + |
| 9 | + var LOCALE_ROUTES = ['root', 'en', 'zh-Hant', 'ja-JP', 'ko-KR', 'de-DE', 'fr-FR', 'es-ES', 'pt-BR', 'ru-RU']; |
| 10 | + var LOCALE_ALIASES = { |
| 11 | + 'en': 'en', 'en-us': 'en', 'en-gb': 'en', 'en-au': 'en', 'en-ca': 'en', |
| 12 | + 'root': 'root', 'zh': 'root', 'zh-cn': 'root', 'zh-hans': 'root', 'zh-hans-cn': 'root', |
| 13 | + 'zh-hant': 'zh-Hant', 'zh-tw': 'zh-Hant', 'zh-hk': 'zh-Hant', 'zh-hant-tw': 'zh-Hant', 'zh-hant-hk': 'zh-Hant', |
| 14 | + 'ja': 'ja-JP', 'ja-jp': 'ja-JP', |
| 15 | + 'ko': 'ko-KR', 'ko-kr': 'ko-KR', |
| 16 | + 'de': 'de-DE', 'de-de': 'de-DE', 'de-at': 'de-DE', 'de-ch': 'de-DE', |
| 17 | + 'fr': 'fr-FR', 'fr-fr': 'fr-FR', 'fr-ca': 'fr-FR', 'fr-be': 'fr-FR', |
| 18 | + 'es': 'es-ES', 'es-es': 'es-ES', 'es-mx': 'es-ES', 'es-ar': 'es-ES', |
| 19 | + 'pt': 'pt-BR', 'pt-br': 'pt-BR', 'pt-pt': 'pt-BR', |
| 20 | + 'ru': 'ru-RU', 'ru-ru': 'ru-RU', |
| 21 | + }; |
| 22 | + |
8 | 23 | function parseDocsLocale(value) { |
9 | 24 | if (!value) { |
10 | 25 | return null; |
11 | 26 | } |
12 | 27 |
|
13 | | - var normalized = String(value).trim().toLowerCase(); |
| 28 | + var normalized = String(value).trim().toLowerCase().replace(/_/g, '-'); |
14 | 29 | if (!normalized) { |
15 | 30 | return null; |
16 | 31 | } |
17 | 32 |
|
18 | | - if (normalized === 'en' || normalized.indexOf('en-') === 0) { |
19 | | - return 'en'; |
| 33 | + var mapped = LOCALE_ALIASES[normalized]; |
| 34 | + if (mapped) { |
| 35 | + return mapped; |
20 | 36 | } |
21 | 37 |
|
22 | | - if ( |
23 | | - normalized === 'root' || |
24 | | - normalized === 'zh' || |
25 | | - normalized === 'zh-cn' || |
26 | | - normalized.indexOf('zh-') === 0 |
27 | | - ) { |
28 | | - return 'root'; |
| 38 | + for (var i = 0; i < LOCALE_ROUTES.length; i++) { |
| 39 | + if (normalized === LOCALE_ROUTES[i].toLowerCase()) { |
| 40 | + return LOCALE_ROUTES[i]; |
| 41 | + } |
29 | 42 | } |
30 | 43 |
|
31 | 44 | return null; |
|
36 | 49 | } |
37 | 50 |
|
38 | 51 | function stripDocsLocalePrefix(pathname) { |
39 | | - if (!pathname || pathname === '/en') { |
| 52 | + if (!pathname) { |
40 | 53 | return '/'; |
41 | 54 | } |
42 | 55 |
|
43 | | - if (pathname.indexOf('/en/') === 0) { |
44 | | - return pathname.slice(3) || '/'; |
| 56 | + var normalized = pathname.charAt(0) === '/' ? pathname : '/' + pathname; |
| 57 | + |
| 58 | + for (var i = 0; i < LOCALE_ROUTES.length; i++) { |
| 59 | + var routeLocale = LOCALE_ROUTES[i]; |
| 60 | + if (routeLocale === 'root') { |
| 61 | + continue; |
| 62 | + } |
| 63 | + |
| 64 | + if (normalized === '/' + routeLocale) { |
| 65 | + return '/'; |
| 66 | + } |
| 67 | + |
| 68 | + if (normalized.indexOf('/' + routeLocale + '/') === 0) { |
| 69 | + return normalized.slice(routeLocale.length + 1) || '/'; |
| 70 | + } |
45 | 71 | } |
46 | 72 |
|
47 | | - return pathname; |
| 73 | + return normalized; |
48 | 74 | } |
49 | 75 |
|
50 | 76 | function isLandingRoutePath(pathname) { |
|
58 | 84 | return normalizedPath === '/' ? '/en/' : '/en' + normalizedPath; |
59 | 85 | } |
60 | 86 |
|
61 | | - return normalizedPath || '/'; |
| 87 | + if (locale === 'root') { |
| 88 | + return normalizedPath || '/'; |
| 89 | + } |
| 90 | + |
| 91 | + return normalizedPath === '/' ? '/' + locale + '/' : '/' + locale + normalizedPath; |
62 | 92 | } |
63 | 93 |
|
64 | 94 | function getStoredDocsLocale(storageValue) { |
|
203 | 233 | storedLocale: storedLocale, |
204 | 234 | isLandingPath: landingPath, |
205 | 235 | shouldPersist: shouldPersist, |
206 | | - shouldRedirect: targetUrl.toString() !== currentUrl.toString(), |
| 236 | + shouldRedirect: targetUrl.toString() !== currentUrl.toString() && (landingPath || requestedLang !== null), |
207 | 237 | }; |
208 | 238 | } |
209 | 239 |
|
|
268 | 298 | }, |
269 | 299 | }; |
270 | 300 |
|
271 | | - window.__HAGICODE_DOCS_ENTRY__ = api; |
272 | | - api.applyEntryRouting(window); |
| 301 | + api.applyEntryRouting(); |
| 302 | + |
| 303 | + if (typeof module === 'object' && module && typeof module.exports === 'object') { |
| 304 | + module.exports = api; |
| 305 | + } |
273 | 306 | })(); |
0 commit comments