@hagicode/hagilight 0.1.0 → 0.1.2-dev.10.1.aebe89d

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/site-links.ts ADDED
@@ -0,0 +1,406 @@
1
+ import docsRelatedSites from './related-sites.json' with { type: 'json' };
2
+
3
+ export type SiteLinkKey =
4
+ | 'home'
5
+ | 'blog'
6
+ | 'support'
7
+ | 'downloadClient'
8
+ | 'about'
9
+ | 'dockerCompose'
10
+ | 'productDocs'
11
+ | 'blogPosts'
12
+ | 'rss'
13
+ | 'costCalculator'
14
+ | 'github'
15
+ | 'discord'
16
+ | 'issueFeedback'
17
+ | 'contactEmail'
18
+ | 'qqGroup'
19
+ | 'microsoftStore'
20
+ | 'icpFiling'
21
+ | 'publicSecurityFiling';
22
+
23
+ export type LinkGroup = 'header' | 'quick' | 'community' | 'filings';
24
+ type LocalizedText = string | Readonly<Record<string, string>>;
25
+
26
+ export interface SiteLink {
27
+ id: SiteLinkKey | string;
28
+ label: string;
29
+ href: string;
30
+ ariaLabel?: string;
31
+ target?: '_blank';
32
+ rel?: 'noopener noreferrer';
33
+ }
34
+
35
+ export interface SiteLinkOverride {
36
+ href?: LocalizedText;
37
+ label?: LocalizedText;
38
+ external?: boolean;
39
+ }
40
+
41
+ export interface ExtraSiteLink extends SiteLinkOverride {
42
+ href: LocalizedText;
43
+ label: LocalizedText;
44
+ }
45
+
46
+ export interface RelatedSite {
47
+ id: string;
48
+ name: LocalizedText;
49
+ url: string;
50
+ description?: LocalizedText;
51
+ supportsLocalePath?: boolean;
52
+ }
53
+
54
+ export interface SiteLinksOptions {
55
+ overrides?: Partial<Record<SiteLinkKey, SiteLinkOverride>>;
56
+ extraLinks?: Partial<Record<LinkGroup, readonly ExtraSiteLink[]>>;
57
+ relatedSites?: readonly RelatedSite[];
58
+ siteId?: string;
59
+ siteUrl?: string;
60
+ }
61
+
62
+ interface LinkDefinition {
63
+ label: LocalizedText;
64
+ href: string | ((locale: string) => string);
65
+ external?: boolean;
66
+ ariaLabel?: LocalizedText;
67
+ }
68
+
69
+ const translations = {
70
+ home: {
71
+ 'zh-CN': '首页', 'zh-Hant': '首頁', 'en-US': 'Home', 'ja-JP': 'ホーム',
72
+ 'ko-KR': '홈', 'de-DE': 'Startseite', 'fr-FR': 'Accueil', 'es-ES': 'Inicio',
73
+ 'pt-BR': 'Início', 'ru-RU': 'Главная',
74
+ },
75
+ blog: {
76
+ 'zh-CN': '博客', 'zh-Hant': '部落格', 'en-US': 'Blog', 'ja-JP': 'ブログ',
77
+ 'ko-KR': '블로그', 'de-DE': 'Blog', 'fr-FR': 'Blog', 'es-ES': 'Blog',
78
+ 'pt-BR': 'Blog', 'ru-RU': 'Блог',
79
+ },
80
+ support: {
81
+ 'zh-CN': '获取技术支持', 'zh-Hant': '獲取技術支援', 'en-US': 'Get Support',
82
+ 'ja-JP': 'サポート', 'ko-KR': '기술 지원', 'de-DE': 'Support',
83
+ 'fr-FR': 'Assistance', 'es-ES': 'Soporte', 'pt-BR': 'Suporte', 'ru-RU': 'Поддержка',
84
+ },
85
+ downloadClient: {
86
+ 'zh-CN': '下载客户端', 'zh-Hant': '下載客戶端', 'en-US': 'Download Client',
87
+ 'ja-JP': 'クライアントをダウンロード', 'ko-KR': '클라이언트 다운로드',
88
+ 'de-DE': 'Client herunterladen', 'fr-FR': 'Télécharger le client',
89
+ 'es-ES': 'Descargar cliente', 'pt-BR': 'Baixar cliente', 'ru-RU': 'Скачать клиент',
90
+ },
91
+ about: {
92
+ 'zh-CN': '关于 HagiCode', 'zh-Hant': '關於 HagiCode', 'en-US': 'About HagiCode',
93
+ 'ja-JP': 'HagiCode について', 'ko-KR': 'HagiCode 소개', 'de-DE': 'Über HagiCode',
94
+ 'fr-FR': 'À propos de HagiCode', 'es-ES': 'Acerca de HagiCode',
95
+ 'pt-BR': 'Sobre a HagiCode', 'ru-RU': 'О HagiCode',
96
+ },
97
+ dockerCompose: {
98
+ 'zh-CN': 'Docker Compose 安装', 'zh-Hant': 'Docker Compose 安裝',
99
+ 'en-US': 'Docker Compose Installation', 'ja-JP': 'Docker Compose インストール',
100
+ 'ko-KR': 'Docker Compose 설치', 'de-DE': 'Docker-Compose-Installation',
101
+ 'fr-FR': 'Installation de Docker Compose', 'es-ES': 'Instalación de Docker Compose',
102
+ 'pt-BR': 'Instalação do Docker Compose', 'ru-RU': 'Установка Docker Compose',
103
+ },
104
+ productDocs: {
105
+ 'zh-CN': '产品文档', 'zh-Hant': '產品文件', 'en-US': 'Product Docs',
106
+ 'ja-JP': '製品ドキュメント', 'ko-KR': '제품 문서', 'de-DE': 'Produktdokumentation',
107
+ 'fr-FR': 'Documentation produit', 'es-ES': 'Documentación del producto',
108
+ 'pt-BR': 'Documentação do produto', 'ru-RU': 'Документация продукта',
109
+ },
110
+ blogPosts: {
111
+ 'zh-CN': '博客文章', 'zh-Hant': '部落格文章', 'en-US': 'Blog Posts',
112
+ 'ja-JP': 'ブログ記事', 'ko-KR': '블로그 글', 'de-DE': 'Blogbeiträge',
113
+ 'fr-FR': 'Articles du blog', 'es-ES': 'Artículos del blog',
114
+ 'pt-BR': 'Posts do blog', 'ru-RU': 'Статьи блога',
115
+ },
116
+ rss: {
117
+ 'zh-CN': 'RSS 订阅', 'zh-Hant': 'RSS 訂閱', 'en-US': 'RSS Feed',
118
+ 'ja-JP': 'RSS 配信', 'ko-KR': 'RSS 구독', 'de-DE': 'RSS-Feed',
119
+ 'fr-FR': 'Flux RSS', 'es-ES': 'RSS', 'pt-BR': 'Feed RSS', 'ru-RU': 'RSS-лента',
120
+ },
121
+ costCalculator: {
122
+ 'zh-CN': '算一算,AI会不会淘汰我', 'zh-Hant': '算一算,AI 會不會淘汰我',
123
+ 'en-US': 'Will AI Replace Me?', 'ja-JP': 'AI に置き換えられるか診断',
124
+ 'ko-KR': 'AI가 나를 대체할까?', 'de-DE': 'Wird KI mich ersetzen?',
125
+ 'fr-FR': "L'IA va-t-elle me remplacer ?", 'es-ES': 'Me reemplazará la IA?',
126
+ 'pt-BR': 'A IA vai me substituir?', 'ru-RU': 'Заменит ли меня ИИ?',
127
+ },
128
+ github: {
129
+ 'zh-CN': 'GitHub', 'zh-Hant': 'GitHub', 'en-US': 'GitHub', 'ja-JP': 'GitHub',
130
+ 'ko-KR': 'GitHub', 'de-DE': 'GitHub', 'fr-FR': 'GitHub', 'es-ES': 'GitHub',
131
+ 'pt-BR': 'GitHub', 'ru-RU': 'GitHub',
132
+ },
133
+ discord: {
134
+ 'zh-CN': 'Discord', 'zh-Hant': 'Discord', 'en-US': 'Discord', 'ja-JP': 'Discord',
135
+ 'ko-KR': 'Discord', 'de-DE': 'Discord', 'fr-FR': 'Discord', 'es-ES': 'Discord',
136
+ 'pt-BR': 'Discord', 'ru-RU': 'Discord',
137
+ },
138
+ issueFeedback: {
139
+ 'zh-CN': '问题反馈', 'zh-Hant': '問題回饋', 'en-US': 'Issue Feedback',
140
+ 'ja-JP': '問題の報告', 'ko-KR': '문제 신고', 'de-DE': 'Probleme melden',
141
+ 'fr-FR': 'Signaler un problème', 'es-ES': 'Reportar un problema',
142
+ 'pt-BR': 'Relatar problema', 'ru-RU': 'Сообщить о проблеме',
143
+ },
144
+ contactEmail: {
145
+ 'zh-CN': '联系邮箱', 'zh-Hant': '聯絡信箱', 'en-US': 'Contact Email',
146
+ 'ja-JP': '連絡先メール', 'ko-KR': '문의 이메일', 'de-DE': 'Kontakt-E-Mail',
147
+ 'fr-FR': 'E-mail de contact', 'es-ES': 'Correo de contacto',
148
+ 'pt-BR': 'E-mail de contato', 'ru-RU': 'Контактный email',
149
+ },
150
+ qqGroup: {
151
+ 'zh-CN': 'QQ 群 610394020', 'zh-Hant': 'QQ 群 610394020',
152
+ 'en-US': 'QQ Group 610394020', 'ja-JP': 'QQ グループ 610394020',
153
+ 'ko-KR': 'QQ 그룹 610394020', 'de-DE': 'QQ-Gruppe 610394020',
154
+ 'fr-FR': 'Groupe QQ 610394020', 'es-ES': 'Grupo QQ 610394020',
155
+ 'pt-BR': 'Grupo QQ 610394020', 'ru-RU': 'Группа QQ 610394020',
156
+ },
157
+ microsoftStore: {
158
+ 'zh-CN': 'Microsoft Store', 'zh-Hant': 'Microsoft Store', 'en-US': 'Microsoft Store',
159
+ 'ja-JP': 'Microsoft Store', 'ko-KR': 'Microsoft Store', 'de-DE': 'Microsoft Store',
160
+ 'fr-FR': 'Microsoft Store', 'es-ES': 'Microsoft Store', 'pt-BR': 'Microsoft Store',
161
+ 'ru-RU': 'Microsoft Store',
162
+ },
163
+ icpFiling: '闽ICP备2026004153号-1',
164
+ publicSecurityFiling: '闽公网安备35011102351148号',
165
+ } satisfies Record<SiteLinkKey, LocalizedText>;
166
+
167
+ const defaultLinks: Record<SiteLinkKey, LinkDefinition> = {
168
+ home: { label: translations.home, href: (locale) => marketingPath(locale, '/') },
169
+ blog: { label: translations.blog, href: (locale) => docsPath(locale, '/blog/') },
170
+ support: { label: translations.support, href: (locale) => marketingPath(locale, '/about/') },
171
+ downloadClient: { label: translations.downloadClient, href: (locale) => marketingPath(locale, '/desktop/') },
172
+ about: { label: translations.about, href: (locale) => marketingPath(locale, '/about/') },
173
+ dockerCompose: { label: translations.dockerCompose, href: (locale) => docsPath(locale, '/installation/docker-compose/') },
174
+ productDocs: { label: translations.productDocs, href: (locale) => docsPath(locale, '/product-overview/') },
175
+ blogPosts: { label: translations.blogPosts, href: (locale) => docsPath(locale, '/blog/') },
176
+ rss: { label: translations.rss, href: (locale) => `https://docs.hagicode.com/blog/rss.${locale}.xml` },
177
+ costCalculator: { label: translations.costCalculator, href: 'https://cost.hagicode.com', external: true },
178
+ github: { label: translations.github, href: 'https://github.com/HagiCode-org/site', external: true },
179
+ discord: { label: translations.discord, href: 'https://discord.gg/qY662sJK', external: true },
180
+ issueFeedback: { label: translations.issueFeedback, href: 'https://github.com/HagiCode-org/site/issues', external: true },
181
+ contactEmail: { label: translations.contactEmail, href: 'mailto:support@hagicode.com' },
182
+ qqGroup: { label: translations.qqGroup, href: 'https://qm.qq.com/q/Fwb0o094kw', external: true },
183
+ microsoftStore: {
184
+ label: translations.microsoftStore,
185
+ href: 'https://apps.microsoft.com/detail/9N3PM0N3SVDW',
186
+ external: true,
187
+ },
188
+ icpFiling: {
189
+ label: translations.icpFiling,
190
+ href: 'https://beian.miit.gov.cn/',
191
+ external: true,
192
+ ariaLabel: {
193
+ 'zh-CN': '查看 ICP 备案信息', 'zh-Hant': '查看 ICP 備案資訊',
194
+ 'en-US': 'View ICP filing information', 'ja-JP': 'ICP 登録情報を表示',
195
+ 'ko-KR': 'ICP 등록 정보 보기', 'de-DE': 'ICP-Registrierungsinformationen anzeigen',
196
+ 'fr-FR': 'Voir les informations de dépôt ICP', 'es-ES': 'Ver la información de registro ICP',
197
+ 'pt-BR': 'Ver informações de registro ICP', 'ru-RU': 'Показать информацию о регистрации ICP',
198
+ },
199
+ },
200
+ publicSecurityFiling: {
201
+ label: translations.publicSecurityFiling,
202
+ href: 'http://www.beian.gov.cn/portal/registerSystemInfo',
203
+ external: true,
204
+ ariaLabel: {
205
+ 'zh-CN': '查看公安备案信息', 'zh-Hant': '查看公安備案資訊',
206
+ 'en-US': 'View public security filing information', 'ja-JP': '公安登録情報を表示',
207
+ 'ko-KR': '공안 등록 정보 보기', 'de-DE': 'Informationen zur Sicherheitsregistrierung anzeigen',
208
+ 'fr-FR': 'Voir les informations de dépôt de sécurité publique',
209
+ 'es-ES': 'Ver la información de registro de seguridad pública',
210
+ 'pt-BR': 'Ver informações de registro de segurança pública',
211
+ 'ru-RU': 'Показать информацию о регистрации в органах общественной безопасности',
212
+ },
213
+ },
214
+ };
215
+
216
+ const groups: Record<LinkGroup, readonly SiteLinkKey[]> = {
217
+ header: ['home', 'blog', 'support'],
218
+ quick: ['downloadClient', 'microsoftStore', 'about', 'dockerCompose', 'productDocs', 'blogPosts', 'rss'],
219
+ community: ['github', 'discord', 'issueFeedback', 'contactEmail', 'qqGroup', 'costCalculator'],
220
+ filings: ['icpFiling', 'publicSecurityFiling'],
221
+ };
222
+
223
+ function normalizeLocale(locale?: string | null): string {
224
+ const normalized = locale?.trim().replaceAll('_', '-').toLowerCase();
225
+ if (normalized === 'zh' || normalized === 'zh-cn' || normalized === 'zh-hans' || normalized === 'root') {
226
+ return 'zh-CN';
227
+ }
228
+ if (normalized === 'zh-hant' || normalized === 'zh-tw' || normalized === 'zh-hk') {
229
+ return 'zh-Hant';
230
+ }
231
+ if (normalized === 'en' || normalized === 'en-us' || !normalized) {
232
+ return 'en-US';
233
+ }
234
+ const canonical = ['ja-JP', 'ko-KR', 'de-DE', 'fr-FR', 'es-ES', 'pt-BR', 'ru-RU']
235
+ .find((candidate) => candidate.toLowerCase() === normalized);
236
+ if (canonical) return canonical;
237
+ return 'en-US';
238
+ }
239
+
240
+ function docsPath(locale: string, pathname: string): string {
241
+ const routePrefix = locale === 'zh-CN' ? '' : `/${locale}`;
242
+ return `https://docs.hagicode.com${routePrefix}${pathname}`;
243
+ }
244
+
245
+ function marketingPath(locale: string, pathname: string): string {
246
+ return `https://www.hagicode.com/${locale}${pathname}`;
247
+ }
248
+
249
+ function resolveLocalized(value: LocalizedText, locale: string, fallback: string): string {
250
+ if (typeof value === 'string') return value;
251
+ for (const candidate of [locale, ...(locale === 'zh-Hant' ? ['zh-CN', 'en-US'] : ['en-US'])]) {
252
+ const text = value[candidate];
253
+ if (typeof text === 'string' && text.trim()) return text;
254
+ }
255
+ const firstValue = Object.values(value).find((text) => typeof text === 'string' && text.trim());
256
+ return firstValue ?? fallback;
257
+ }
258
+
259
+ function normalizeUrl(value: string): string {
260
+ const input = value.trim();
261
+ if (!input) throw new TypeError('Link destinations must not be empty.');
262
+ const url = new URL(input, 'https://hagilight.invalid');
263
+ if (!['http:', 'https:', 'mailto:', 'tel:'].includes(url.protocol)) {
264
+ throw new TypeError(`Unsupported link protocol: ${url.protocol}`);
265
+ }
266
+ url.hash = '';
267
+ url.search = '';
268
+ url.pathname = url.pathname.replace(/\/+$/u, '') || '/';
269
+ return url.origin === 'https://hagilight.invalid' ? url.pathname : url.toString();
270
+ }
271
+
272
+ function resolveLink(
273
+ key: SiteLinkKey | string,
274
+ locale: string,
275
+ definition: LinkDefinition,
276
+ override?: SiteLinkOverride,
277
+ ): SiteLink {
278
+ const defaultHref = typeof definition.href === 'function' ? definition.href(locale) : definition.href;
279
+ const href = override?.href === undefined ? defaultHref : resolveLocalized(override.href, locale, defaultHref);
280
+ const label = override?.label === undefined
281
+ ? resolveLocalized(definition.label, locale, key)
282
+ : resolveLocalized(override.label, locale, resolveLocalized(definition.label, locale, key));
283
+ normalizeUrl(href);
284
+ const external = override?.external ?? definition.external ?? false;
285
+ return {
286
+ id: key,
287
+ label,
288
+ href,
289
+ ...(definition.ariaLabel
290
+ ? { ariaLabel: resolveLocalized(definition.ariaLabel, locale, label) }
291
+ : {}),
292
+ ...(external ? { target: '_blank', rel: 'noopener noreferrer' } : {}),
293
+ };
294
+ }
295
+
296
+ export function resolveSiteLinks(localeInput?: string | null, options: SiteLinksOptions = {}) {
297
+ const locale = normalizeLocale(localeInput);
298
+ const resolvedGroups = Object.fromEntries(
299
+ (Object.keys(groups) as LinkGroup[]).map((group) => {
300
+ const catalogLinks = groups[group].map((key) => {
301
+ const override = options.overrides?.[key]
302
+ ?? (key === 'blogPosts' ? options.overrides?.blog : undefined);
303
+ return resolveLink(key, locale, defaultLinks[key], override);
304
+ });
305
+ const extraLinks = (options.extraLinks?.[group] ?? []).map((entry, index) => {
306
+ const definition: LinkDefinition = {
307
+ label: entry.label,
308
+ href: resolveLocalized(entry.href, locale, ''),
309
+ external: entry.external,
310
+ };
311
+ return resolveLink(`${group}-custom-${index + 1}`, locale, definition);
312
+ });
313
+ return [group, [...catalogLinks, ...extraLinks]];
314
+ }),
315
+ ) as Record<LinkGroup, SiteLink[]>;
316
+
317
+ const renderedUrls = new Set(
318
+ [...resolvedGroups.quick, ...resolvedGroups.community, ...resolvedGroups.filings]
319
+ .map((link) => normalizeUrl(link.href)),
320
+ );
321
+ if (options.siteUrl) renderedUrls.add(normalizeUrl(options.siteUrl));
322
+
323
+ const relatedIds = new Set<string>();
324
+ const relatedUrls = new Set<string>();
325
+ const relatedSites = (options.relatedSites ?? docsRelatedSites).flatMap((site) => {
326
+ const href = site.supportsLocalePath
327
+ ? new URL(`${locale}/`, site.url.endsWith('/') ? site.url : `${site.url}/`).toString()
328
+ : site.url;
329
+ const normalizedUrl = normalizeUrl(href);
330
+ if (site.id === options.siteId || renderedUrls.has(normalizedUrl)
331
+ || relatedIds.has(site.id) || relatedUrls.has(normalizedUrl)) {
332
+ return [];
333
+ }
334
+ relatedIds.add(site.id);
335
+ relatedUrls.add(normalizedUrl);
336
+ return [{
337
+ id: site.id,
338
+ name: resolveLocalized(site.name, locale, site.id),
339
+ description: site.description
340
+ ? resolveLocalized(site.description, locale, '')
341
+ : undefined,
342
+ href,
343
+ target: '_blank' as const,
344
+ rel: 'noopener noreferrer' as const,
345
+ }];
346
+ });
347
+
348
+ return {
349
+ locale,
350
+ labels: {
351
+ relatedSites: resolveLocalized({
352
+ 'zh-CN': '生态站点', 'zh-Hant': '生態站點', 'en-US': 'Ecosystem Sites',
353
+ 'ja-JP': 'エコシステムサイト', 'ko-KR': '에코시스템 사이트',
354
+ 'de-DE': 'Ökosystem-Seiten', 'fr-FR': "Sites de l'écosystème",
355
+ 'es-ES': 'Sitios del ecosistema', 'pt-BR': 'Sites do ecossistema',
356
+ 'ru-RU': 'Сайты экосистемы',
357
+ }, locale, 'Ecosystem Sites'),
358
+ quickLinks: resolveLocalized({
359
+ 'zh-CN': '快速链接', 'zh-Hant': '快速連結', 'en-US': 'Quick Links',
360
+ 'ja-JP': 'クイックリンク', 'ko-KR': '빠른 링크', 'de-DE': 'Schnellzugriffe',
361
+ 'fr-FR': 'Liens rapides', 'es-ES': 'Enlaces rápidos',
362
+ 'pt-BR': 'Links rápidos', 'ru-RU': 'Быстрые ссылки',
363
+ }, locale, 'Quick Links'),
364
+ community: resolveLocalized({
365
+ 'zh-CN': '社区', 'zh-Hant': '社群', 'en-US': 'Community',
366
+ 'ja-JP': 'コミュニティ', 'ko-KR': '커뮤니티', 'de-DE': 'Community',
367
+ 'fr-FR': 'Communauté', 'es-ES': 'Comunidad',
368
+ 'pt-BR': 'Comunidade', 'ru-RU': 'Сообщество',
369
+ }, locale, 'Community'),
370
+ navigation: {
371
+ relatedSites: resolveLocalized({
372
+ 'zh-CN': '生态站点链接', 'zh-Hant': '生態站點連結', 'en-US': 'Ecosystem site links',
373
+ 'ja-JP': 'エコシステムサイトへのリンク', 'ko-KR': '에코시스템 사이트 링크',
374
+ 'de-DE': 'Links zu Ökosystem-Seiten', 'fr-FR': "Liens vers les sites de l'écosystème",
375
+ 'es-ES': 'Enlaces de sitios del ecosistema', 'pt-BR': 'Links dos sites do ecossistema',
376
+ 'ru-RU': 'Ссылки на сайты экосистемы',
377
+ }, locale, 'Ecosystem site links'),
378
+ quickLinks: resolveLocalized({
379
+ 'zh-CN': '快速链接', 'zh-Hant': '快速連結', 'en-US': 'Quick links',
380
+ 'ja-JP': 'クイックリンク', 'ko-KR': '빠른 링크', 'de-DE': 'Schnellzugriffe',
381
+ 'fr-FR': 'Liens rapides', 'es-ES': 'Enlaces rápidos',
382
+ 'pt-BR': 'Links rápidos', 'ru-RU': 'Быстрые ссылки',
383
+ }, locale, 'Quick links'),
384
+ community: resolveLocalized({
385
+ 'zh-CN': '社区链接', 'zh-Hant': '社群連結', 'en-US': 'Community links',
386
+ 'ja-JP': 'コミュニティリンク', 'ko-KR': '커뮤니티 링크',
387
+ 'de-DE': 'Community-Links', 'fr-FR': 'Liens communautaires',
388
+ 'es-ES': 'Enlaces de la comunidad', 'pt-BR': 'Links da comunidade',
389
+ 'ru-RU': 'Ссылки сообщества',
390
+ }, locale, 'Community links'),
391
+ filings: resolveLocalized({
392
+ 'zh-CN': '查看备案信息', 'zh-Hant': '查看備案資訊',
393
+ 'en-US': 'View filing information', 'ja-JP': '登録情報を表示',
394
+ 'ko-KR': '등록 정보 보기', 'de-DE': 'Registrierungsinformationen anzeigen',
395
+ 'fr-FR': 'Voir les informations de dépôt', 'es-ES': 'Ver información de registro',
396
+ 'pt-BR': 'Ver informações de registro', 'ru-RU': 'Показать информацию о регистрации',
397
+ }, locale, 'View filing information'),
398
+ },
399
+ },
400
+ header: resolvedGroups.header,
401
+ quick: resolvedGroups.quick,
402
+ community: resolvedGroups.community,
403
+ filings: resolvedGroups.filings,
404
+ relatedSites,
405
+ };
406
+ }