@next-library/theme 1.0.2 → 1.0.4

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/README.md CHANGED
@@ -2,7 +2,9 @@
2
2
 
3
3
  Complete UI theme package for Next.js documentation framework. This package provides ready-made React components built on top of [`@next-library/core`](../core/README.md).
4
4
 
5
- > **Looking for core utilities only?** Check out [`@next-library/core`](../core/README.md) which provides content management, i18n, and SEO utilities without UI components.
5
+ > **Looking for core utilities only?** See [`@next-library/core`](../core/README.md).
6
+
7
+ > **Content tree:** Layout and nav expect the same **`PageData`** from **`extractPageData(contentTree, locale, slug)`**. Import **`contentTree`** from your generated **`lib/tree.ts`** and pass **`contentTree`** into **`NavigationBar`** (and derive **`getSupportedLocales(contentTree)`** for **`LanguageSwitcher`**). The canonical wiring is **[`example/app/`](../../example/app/)** and **[`docs/getting-started.md`](../../docs/getting-started.md)**.
6
8
 
7
9
  ## Features
8
10
 
@@ -115,10 +117,18 @@ Import server components from `@next-library/theme/server`:
115
117
  ```typescript
116
118
  // app/[locale]/layout.tsx
117
119
  import { DocumentationLayout } from '@next-library/theme/server';
120
+ import { isValidLocale, type Locale } from '@next-library/core';
121
+
122
+ export default async function LocaleLayout({
123
+ children,
124
+ params,
125
+ }: {
126
+ children: React.ReactNode;
127
+ params: Promise<{ locale: string }>;
128
+ }) {
129
+ const { locale: raw } = await params;
130
+ const locale = (isValidLocale(raw) ? raw : 'en') as Locale;
118
131
 
119
- export default function LocaleLayout({ children, params }) {
120
- const { locale } = await params;
121
-
122
132
  return (
123
133
  <DocumentationLayout language={locale}>
124
134
  {children}
@@ -131,22 +141,38 @@ export default function LocaleLayout({ children, params }) {
131
141
 
132
142
  Import client components from `@next-library/theme/client`:
133
143
 
144
+ Server parent (derive locales from the generated tree):
145
+
146
+ ```typescript
147
+ import { getSupportedLocales } from '@next-library/core';
148
+ import contentTree from '@/lib/tree';
149
+ import { LocaleTools } from './locale-tools';
150
+
151
+ const availableLocales = getSupportedLocales(contentTree);
152
+ // …
153
+ <LocaleTools availableLocales={availableLocales} />;
154
+ ```
155
+
156
+ Client component:
157
+
134
158
  ```typescript
135
- // components/my-component.tsx
159
+ // app/locale-tools.tsx
136
160
  'use client';
137
161
 
138
162
  import { LanguageSwitcher, ThemeSwitcher } from '@next-library/theme/client';
139
163
 
140
- export function MyComponent() {
164
+ export function LocaleTools({ availableLocales }: { availableLocales: string[] }) {
141
165
  return (
142
166
  <div>
143
- <LanguageSwitcher availableLocales={['en', 'fr', 'de']} />
167
+ <LanguageSwitcher availableLocales={availableLocales} />
144
168
  <ThemeSwitcher />
145
169
  </div>
146
170
  );
147
171
  }
148
172
  ```
149
173
 
174
+ `NavigationBar` computes locales from **`contentTree`** when you pass **`contentTree`** (see complete example below).
175
+
150
176
  ## Component Exports
151
177
 
152
178
  ### Server Components (`@next-library/theme/server`)
@@ -204,16 +230,18 @@ export function MyComponent() {
204
230
  ```typescript
205
231
  // app/[locale]/layout.tsx
206
232
  import { DocumentationLayout } from '@next-library/theme/server';
233
+ import { isValidLocale, type Locale } from '@next-library/core';
207
234
 
208
- export default async function LocaleLayout({
209
- children,
210
- params
211
- }: {
235
+ export default async function LocaleLayout({
236
+ children,
237
+ params,
238
+ }: {
212
239
  children: React.ReactNode;
213
240
  params: Promise<{ locale: string }>;
214
241
  }) {
215
- const { locale } = await params;
216
-
242
+ const { locale: rawLocale } = await params;
243
+ const locale = (isValidLocale(rawLocale) ? rawLocale : 'en') as Locale;
244
+
217
245
  return (
218
246
  <DocumentationLayout language={locale}>
219
247
  {children}
@@ -228,52 +256,50 @@ export default async function LocaleLayout({
228
256
  // app/[locale]/docs/[[...slug]]/layout.tsx
229
257
  import { NavigationBar, LeftSidebar, RightSidebar } from '@next-library/theme/server';
230
258
  import { Breadcrumbs, AnchorLinkHandler } from '@next-library/theme/client';
231
- import { extractPageData, getSupportedLocales, type Locale } from '@next-library/core';
232
-
233
- export default async function DocsLayout({
234
- children,
235
- params
236
- }: {
259
+ import { extractPageData, isValidLocale, createConfig, type Locale } from '@next-library/core';
260
+ import { libraryConfig } from '@/library.config';
261
+ import contentTree from '@/lib/tree';
262
+
263
+ export default async function DocsLayout({
264
+ children,
265
+ params,
266
+ }: {
237
267
  children: React.ReactNode;
238
268
  params: Promise<{ locale: string; slug?: string[] }>;
239
269
  }) {
240
270
  const { locale: rawLocale, slug } = await params;
241
- const supportedLocales = getSupportedLocales();
242
- const locale = (supportedLocales.includes(rawLocale) ? rawLocale : 'en') as Locale;
271
+ const locale = (isValidLocale(rawLocale) ? rawLocale : 'en') as Locale;
243
272
  const safeSlug = Array.isArray(slug) ? slug : [];
244
-
245
- const pageData = extractPageData(locale, safeSlug);
273
+ const fullConfig = createConfig(libraryConfig);
274
+ const pageData = extractPageData(contentTree, locale, safeSlug);
275
+ const repoUrl =
276
+ fullConfig.github?.user && fullConfig.github?.repo
277
+ ? `https://github.com/${fullConfig.github.user}/${fullConfig.github.repo}`
278
+ : undefined;
246
279
 
247
280
  return (
248
281
  <div>
249
- {/* Mobile Navigation */}
250
282
  <NavigationBar
251
283
  language={locale}
252
284
  className="block lg:hidden"
253
285
  pageData={pageData}
286
+ websiteTitle={fullConfig.website?.title || 'Documentation'}
287
+ contentTree={contentTree}
288
+ repoUrl={repoUrl}
254
289
  />
255
-
256
- {/* Main Content Layout */}
257
290
  <div className="flex flex-row gap-12 w-full lg:w-[95vw] mx-auto pt-10">
258
- {/* Left Sidebar */}
259
291
  <LeftSidebar
260
292
  data={pageData}
261
293
  className="sticky top-28 hidden lg:flex lg:flex-[2] max-w-xs"
262
294
  />
263
-
264
- {/* Main Content */}
265
295
  <main className="flex flex-col lg:gap-8 gap-4 flex-1 w-full lg:flex-[6] px-4 lg:px-0">
266
296
  <Breadcrumbs data={pageData} locale={locale} />
267
297
  {children}
268
298
  </main>
269
-
270
- {/* Right Sidebar */}
271
299
  <RightSidebar
272
300
  data={pageData}
273
301
  className="sticky top-28 hidden lg:flex lg:flex-[1.5] max-w-xs"
274
302
  />
275
-
276
- {/* Anchor Link Handler */}
277
303
  <AnchorLinkHandler locale={locale} />
278
304
  </div>
279
305
  </div>
@@ -284,73 +310,66 @@ export default async function DocsLayout({
284
310
  ### Documentation Page
285
311
 
286
312
  ```typescript
287
- // app/[locale]/docs/[[...slug]]/page.tsx
288
- import { PageHeader, MarkdownRenderer, FallbackLocaleWarning } from '@next-library/theme';
289
- import { extractPageData, generateArticleSchema, generateBreadcrumbSchema, generateCollectionPageSchema, getSupportedLocales, fetchRawFileContent } from '@next-library/core';
290
- import { StructuredData } from '@next-library/theme/server';
313
+ // app/[locale]/docs/[[...slug]]/page.tsx (leaf page — folder views need FolderCards; see example app)
314
+ import {
315
+ extractPageData,
316
+ isValidLocale,
317
+ fetchRawFileContent,
318
+ createConfig,
319
+ type Locale,
320
+ } from '@next-library/core';
321
+ import { PageHeader, FallbackLocaleWarning } from '@next-library/theme/server';
322
+ import { MarkdownRenderer } from '@next-library/theme/client';
323
+ import { libraryConfig } from '@/library.config';
324
+ import contentTree from '@/lib/tree';
291
325
  import { notFound } from 'next/navigation';
292
326
 
293
- export default async function DocPage({
294
- params
295
- }: {
327
+ export default async function DocPage({
328
+ params,
329
+ }: {
296
330
  params: Promise<{ locale: string; slug?: string[] }>;
297
331
  }) {
298
332
  const { locale: rawLocale, slug } = await params;
299
- const supportedLocales = getSupportedLocales();
300
- const locale = supportedLocales.includes(rawLocale) ? rawLocale : 'en';
333
+ const locale = (isValidLocale(rawLocale) ? rawLocale : 'en') as Locale;
301
334
  const safeSlug = Array.isArray(slug) ? slug : [];
302
-
303
- const pageData = extractPageData(locale, safeSlug);
335
+ const fullConfig = createConfig(libraryConfig);
336
+ const pageData = extractPageData(contentTree, locale, safeSlug);
304
337
  const { node } = pageData;
305
338
 
306
- if (!node) {
339
+ if (!node?.githubPath || !fullConfig.github?.user || !fullConfig.github?.repo) {
307
340
  notFound();
308
341
  }
309
342
 
310
- // Fetch markdown content from GitHub
311
- const rawMarkdown = await fetchRawFileContent(node.githubPath!);
312
-
313
- // Generate structured data
314
- const articleSchema = generateArticleSchema({ /* ... */ });
315
- const breadcrumbSchema = generateBreadcrumbSchema(pageData.navigation.breadcrumbs);
316
- const collectionPageSchema = generateCollectionPageSchema({ /* ... */ });
317
-
318
- const schemas = [articleSchema, breadcrumbSchema, collectionPageSchema]
319
- .filter(Boolean)
320
- .map(schema => JSON.stringify(schema, null, 0).replace(/</g, '\\u003c'))
321
- .join('\n');
343
+ const githubConfig = {
344
+ user: fullConfig.github.user,
345
+ repo: fullConfig.github.repo,
346
+ branch: fullConfig.github.branch || 'main',
347
+ token: fullConfig.github.token,
348
+ app: fullConfig.github.app,
349
+ };
350
+ const rawMarkdown = await fetchRawFileContent(node.githubPath, githubConfig);
351
+ const baseUrl = fullConfig.website?.siteUrl || 'http://localhost:3000';
352
+ const pageUrl = `${baseUrl.replace(/\/$/, '')}/${locale}/docs/${safeSlug.join('/')}`;
353
+ const websiteTitle = fullConfig.website?.title || fullConfig.website?.organizationName || 'Documentation';
322
354
 
323
355
  return (
324
356
  <div>
325
- {/* Structured Data */}
326
- {schemas && (
327
- <script
328
- type="application/ld+json"
329
- dangerouslySetInnerHTML={{ __html: schemas }}
330
- />
331
- )}
332
-
333
- {/* Page Header with Copy Button */}
334
357
  <PageHeader
335
358
  title={node.title}
336
359
  markdown={rawMarkdown}
337
- pageUrl={`https://example.com/${locale}/docs/${safeSlug.join('/')}`}
338
- websiteTitle="My Documentation"
360
+ pageUrl={pageUrl}
361
+ websiteTitle={websiteTitle}
339
362
  locale={locale}
340
363
  />
341
-
342
- {/* Fallback Warning */}
343
- {node.fallback && (
344
- <FallbackLocaleWarning locale={locale} />
345
- )}
346
-
347
- {/* Markdown Content */}
364
+ {node.fallback && <FallbackLocaleWarning locale={locale} />}
348
365
  <MarkdownRenderer markdown={rawMarkdown} />
349
366
  </div>
350
367
  );
351
368
  }
352
369
  ```
353
370
 
371
+ For **JSON-LD**, **`generateMetadata`**, **folder `index` views** (`FolderCards`), and error handling, copy from **`example/app/[locale]/docs/[[...slug]]/page.tsx`** in the monorepo.
372
+
354
373
  ## Internationalization
355
374
 
356
375
  The theme package includes translations for 20+ languages. Components automatically use translations based on the `locale` prop:
@@ -467,10 +486,12 @@ interface DocumentationLayoutProps {
467
486
 
468
487
  ```typescript
469
488
  interface NavigationBarProps {
470
- language: Locale;
489
+ language?: Locale;
471
490
  className?: string;
472
491
  pageData?: PageData;
473
492
  websiteTitle?: string;
493
+ contentTree?: ContentTree;
494
+ repoUrl?: string;
474
495
  }
475
496
  ```
476
497
 
package/dist/index.js CHANGED
@@ -1009,7 +1009,11 @@ var localeNamesEn = {
1009
1009
  pl: "Polish",
1010
1010
  tr: "Turkish",
1011
1011
  he: "Hebrew",
1012
- hi: "Hindi"
1012
+ hi: "Hindi",
1013
+ fa: "Persian",
1014
+ id: "Indonesian",
1015
+ th: "Thai",
1016
+ vi: "Vietnamese"
1013
1017
  };
1014
1018
  var localeNamesFr = {
1015
1019
  en: "Anglais",
@@ -1031,7 +1035,11 @@ var localeNamesFr = {
1031
1035
  pl: "Polonais",
1032
1036
  tr: "Turc",
1033
1037
  he: "H\xE9breu",
1034
- hi: "Hindi"
1038
+ hi: "Hindi",
1039
+ fa: "Persan",
1040
+ id: "Indon\xE9sien",
1041
+ th: "Tha\xEF",
1042
+ vi: "Vietnamien"
1035
1043
  };
1036
1044
  var localeNamesDe = {
1037
1045
  en: "Englisch",
@@ -1053,7 +1061,11 @@ var localeNamesDe = {
1053
1061
  pl: "Polnisch",
1054
1062
  tr: "T\xFCrkisch",
1055
1063
  he: "Hebr\xE4isch",
1056
- hi: "Hindi"
1064
+ hi: "Hindi",
1065
+ fa: "Persisch",
1066
+ id: "Indonesisch",
1067
+ th: "Thail\xE4ndisch",
1068
+ vi: "Vietnamesisch"
1057
1069
  };
1058
1070
  var localeNamesEs = {
1059
1071
  en: "Ingl\xE9s",
@@ -1075,7 +1087,11 @@ var localeNamesEs = {
1075
1087
  pl: "Polaco",
1076
1088
  tr: "Turco",
1077
1089
  he: "Hebreo",
1078
- hi: "Hindi"
1090
+ hi: "Hindi",
1091
+ fa: "Persa",
1092
+ id: "Indonesio",
1093
+ th: "Tailand\xE9s",
1094
+ vi: "Vietnamita"
1079
1095
  };
1080
1096
  var localeNamesAr = {
1081
1097
  en: "\u0627\u0644\u0625\u0646\u062C\u0644\u064A\u0632\u064A\u0629",
@@ -1097,7 +1113,11 @@ var localeNamesAr = {
1097
1113
  pl: "\u0627\u0644\u0628\u0648\u0644\u0646\u062F\u064A\u0629",
1098
1114
  tr: "\u0627\u0644\u062A\u0631\u0643\u064A\u0629",
1099
1115
  he: "\u0627\u0644\u0639\u0628\u0631\u064A\u0629",
1100
- hi: "\u0627\u0644\u0647\u0646\u062F\u064A\u0629"
1116
+ hi: "\u0627\u0644\u0647\u0646\u062F\u064A\u0629",
1117
+ fa: "\u0627\u0644\u0641\u0627\u0631\u0633\u064A\u0629",
1118
+ id: "\u0627\u0644\u0625\u0646\u062F\u0648\u0646\u064A\u0633\u064A\u0629",
1119
+ th: "\u0627\u0644\u062A\u0627\u064A\u0644\u0627\u0646\u062F\u064A\u0629",
1120
+ vi: "\u0627\u0644\u0641\u064A\u062A\u0646\u0627\u0645\u064A\u0629"
1101
1121
  };
1102
1122
  var localeNamesZh = {
1103
1123
  en: "\u82F1\u8BED",
@@ -1119,7 +1139,11 @@ var localeNamesZh = {
1119
1139
  pl: "\u6CE2\u5170\u8BED",
1120
1140
  tr: "\u571F\u8033\u5176\u8BED",
1121
1141
  he: "\u5E0C\u4F2F\u6765\u8BED",
1122
- hi: "\u5370\u5730\u8BED"
1142
+ hi: "\u5370\u5730\u8BED",
1143
+ fa: "\u6CE2\u65AF\u8BED",
1144
+ id: "\u5370\u5C3C\u8BED",
1145
+ th: "\u6CF0\u8BED",
1146
+ vi: "\u8D8A\u5357\u8BED"
1123
1147
  };
1124
1148
  var localeNamesJa = {
1125
1149
  en: "\u82F1\u8A9E",
@@ -1141,7 +1165,11 @@ var localeNamesJa = {
1141
1165
  pl: "\u30DD\u30FC\u30E9\u30F3\u30C9\u8A9E",
1142
1166
  tr: "\u30C8\u30EB\u30B3\u8A9E",
1143
1167
  he: "\u30D8\u30D6\u30E9\u30A4\u8A9E",
1144
- hi: "\u30D2\u30F3\u30C7\u30A3\u30FC\u8A9E"
1168
+ hi: "\u30D2\u30F3\u30C7\u30A3\u30FC\u8A9E",
1169
+ fa: "\u30DA\u30EB\u30B7\u30A2\u8A9E",
1170
+ id: "\u30A4\u30F3\u30C9\u30CD\u30B7\u30A2\u8A9E",
1171
+ th: "\u30BF\u30A4\u8A9E",
1172
+ vi: "\u30D9\u30C8\u30CA\u30E0\u8A9E"
1145
1173
  };
1146
1174
  var localeNamesKo = {
1147
1175
  en: "\uC601\uC5B4",
@@ -1163,7 +1191,11 @@ var localeNamesKo = {
1163
1191
  pl: "\uD3F4\uB780\uB4DC\uC5B4",
1164
1192
  tr: "\uD130\uD0A4\uC5B4",
1165
1193
  he: "\uD788\uBE0C\uB9AC\uC5B4",
1166
- hi: "\uD78C\uB514\uC5B4"
1194
+ hi: "\uD78C\uB514\uC5B4",
1195
+ fa: "\uD398\uB974\uC2DC\uC544\uC5B4",
1196
+ id: "\uC778\uB3C4\uB124\uC2DC\uC544\uC5B4",
1197
+ th: "\uD0DC\uAD6D\uC5B4",
1198
+ vi: "\uBCA0\uD2B8\uB0A8\uC5B4"
1167
1199
  };
1168
1200
  var localeNamesPt = {
1169
1201
  en: "Ingl\xEAs",
@@ -1185,7 +1217,11 @@ var localeNamesPt = {
1185
1217
  pl: "Polon\xEAs",
1186
1218
  tr: "Turco",
1187
1219
  he: "Hebraico",
1188
- hi: "Hindi"
1220
+ hi: "Hindi",
1221
+ fa: "Persa",
1222
+ id: "Indon\xE9sio",
1223
+ th: "Tailand\xEAs",
1224
+ vi: "Vietnamita"
1189
1225
  };
1190
1226
  var localeNamesIt = {
1191
1227
  en: "Inglese",
@@ -1207,7 +1243,11 @@ var localeNamesIt = {
1207
1243
  pl: "Polacco",
1208
1244
  tr: "Turco",
1209
1245
  he: "Ebraico",
1210
- hi: "Hindi"
1246
+ hi: "Hindi",
1247
+ fa: "Persiano",
1248
+ id: "Indonesiano",
1249
+ th: "Tailandese",
1250
+ vi: "Vietnamita"
1211
1251
  };
1212
1252
  var localeNamesRu = {
1213
1253
  en: "\u0410\u043D\u0433\u043B\u0438\u0439\u0441\u043A\u0438\u0439",
@@ -1229,7 +1269,11 @@ var localeNamesRu = {
1229
1269
  pl: "\u041F\u043E\u043B\u044C\u0441\u043A\u0438\u0439",
1230
1270
  tr: "\u0422\u0443\u0440\u0435\u0446\u043A\u0438\u0439",
1231
1271
  he: "\u0418\u0432\u0440\u0438\u0442",
1232
- hi: "\u0425\u0438\u043D\u0434\u0438"
1272
+ hi: "\u0425\u0438\u043D\u0434\u0438",
1273
+ fa: "\u041F\u0435\u0440\u0441\u0438\u0434\u0441\u043A\u0438\u0439",
1274
+ id: "\u0418\u043D\u0434\u043E\u043D\u0435\u0437\u0438\u0439\u0441\u043A\u0438\u0439",
1275
+ th: "\u0422\u0430\u0439\u0441\u043A\u0438\u0439",
1276
+ vi: "\u0412\u044C\u0435\u0442\u043D\u0430\u043C\u0441\u043A\u0438\u0439"
1233
1277
  };
1234
1278
  var localeNamesNl = {
1235
1279
  en: "Engels",
@@ -1251,7 +1295,11 @@ var localeNamesNl = {
1251
1295
  pl: "Pools",
1252
1296
  tr: "Turks",
1253
1297
  he: "Hebreeuws",
1254
- hi: "Hindi"
1298
+ hi: "Hindi",
1299
+ fa: "Perzisch",
1300
+ id: "Indonesisch",
1301
+ th: "Thai",
1302
+ vi: "Vietnamees"
1255
1303
  };
1256
1304
  var localeNamesSv = {
1257
1305
  en: "Engelska",
@@ -1273,7 +1321,11 @@ var localeNamesSv = {
1273
1321
  pl: "Polska",
1274
1322
  tr: "Turkiska",
1275
1323
  he: "Hebreiska",
1276
- hi: "Hindi"
1324
+ hi: "Hindi",
1325
+ fa: "Persiska",
1326
+ id: "Indonesiska",
1327
+ th: "Thail\xE4ndska",
1328
+ vi: "Vietnamesiska"
1277
1329
  };
1278
1330
  var localeNamesNo = {
1279
1331
  en: "Engelsk",
@@ -1295,7 +1347,11 @@ var localeNamesNo = {
1295
1347
  pl: "Polsk",
1296
1348
  tr: "Tyrkisk",
1297
1349
  he: "Hebraisk",
1298
- hi: "Hindi"
1350
+ hi: "Hindi",
1351
+ fa: "Persisk",
1352
+ id: "Indonesisk",
1353
+ th: "Thai",
1354
+ vi: "Vietnamesisk"
1299
1355
  };
1300
1356
  var localeNamesDa = {
1301
1357
  en: "Engelsk",
@@ -1317,7 +1373,11 @@ var localeNamesDa = {
1317
1373
  pl: "Polsk",
1318
1374
  tr: "Tyrkisk",
1319
1375
  he: "Hebraisk",
1320
- hi: "Hindi"
1376
+ hi: "Hindi",
1377
+ fa: "Persisk",
1378
+ id: "Indonesisk",
1379
+ th: "Thai",
1380
+ vi: "Vietnamesisk"
1321
1381
  };
1322
1382
  var localeNamesFi = {
1323
1383
  en: "Englanti",
@@ -1339,7 +1399,11 @@ var localeNamesFi = {
1339
1399
  pl: "Puola",
1340
1400
  tr: "Turkki",
1341
1401
  he: "Heprea",
1342
- hi: "Hindi"
1402
+ hi: "Hindi",
1403
+ fa: "Persia",
1404
+ id: "Indonesia",
1405
+ th: "Thai",
1406
+ vi: "Vietnam"
1343
1407
  };
1344
1408
  var localeNamesPl = {
1345
1409
  en: "Angielski",
@@ -1361,7 +1425,11 @@ var localeNamesPl = {
1361
1425
  pl: "Polski",
1362
1426
  tr: "Turecki",
1363
1427
  he: "Hebrajski",
1364
- hi: "Hindi"
1428
+ hi: "Hindi",
1429
+ fa: "Perski",
1430
+ id: "Indonezyjski",
1431
+ th: "Tajski",
1432
+ vi: "Wietnamski"
1365
1433
  };
1366
1434
  var localeNamesTr = {
1367
1435
  en: "\u0130ngilizce",
@@ -1383,7 +1451,11 @@ var localeNamesTr = {
1383
1451
  pl: "Leh\xE7e",
1384
1452
  tr: "T\xFCrk\xE7e",
1385
1453
  he: "\u0130branice",
1386
- hi: "Hint\xE7e"
1454
+ hi: "Hint\xE7e",
1455
+ fa: "Fars\xE7a",
1456
+ id: "Endonezce",
1457
+ th: "Tayca",
1458
+ vi: "Vietnamca"
1387
1459
  };
1388
1460
  var localeNamesHe = {
1389
1461
  en: "\u05D0\u05E0\u05D2\u05DC\u05D9\u05EA",
@@ -1405,7 +1477,11 @@ var localeNamesHe = {
1405
1477
  pl: "\u05E4\u05D5\u05DC\u05E0\u05D9\u05EA",
1406
1478
  tr: "\u05D8\u05D5\u05E8\u05E7\u05D9\u05EA",
1407
1479
  he: "\u05E2\u05D1\u05E8\u05D9\u05EA",
1408
- hi: "\u05D4\u05D9\u05E0\u05D3\u05D9"
1480
+ hi: "\u05D4\u05D9\u05E0\u05D3\u05D9",
1481
+ fa: "\u05E4\u05E8\u05E1\u05D9\u05EA",
1482
+ id: "\u05D0\u05D9\u05E0\u05D3\u05D5\u05E0\u05D6\u05D9\u05EA",
1483
+ th: "\u05EA\u05D0\u05D9\u05EA",
1484
+ vi: "\u05D5\u05D9\u05D9\u05D8\u05E0\u05D0\u05DE\u05D9\u05EA"
1409
1485
  };
1410
1486
  var localeNamesHi = {
1411
1487
  en: "\u0905\u0902\u0917\u094D\u0930\u0947\u091C\u0940",
@@ -1427,7 +1503,11 @@ var localeNamesHi = {
1427
1503
  pl: "\u092A\u094B\u0932\u093F\u0936",
1428
1504
  tr: "\u0924\u0941\u0930\u094D\u0915\u0940",
1429
1505
  he: "\u0939\u093F\u092C\u094D\u0930\u0942",
1430
- hi: "\u0939\u093F\u0928\u094D\u0926\u0940"
1506
+ hi: "\u0939\u093F\u0928\u094D\u0926\u0940",
1507
+ fa: "\u092B\u093C\u093E\u0930\u0938\u0940",
1508
+ id: "\u0907\u0902\u0921\u094B\u0928\u0947\u0936\u093F\u092F\u093E\u0908",
1509
+ th: "\u0925\u093E\u0908",
1510
+ vi: "\u0935\u093F\u092F\u0924\u0928\u093E\u092E\u0940"
1431
1511
  };
1432
1512
  var localeNamesByLanguage = {
1433
1513
  en: localeNamesEn,