@lynxflow/seo-engine 1.6.4 → 1.6.6
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/dist/google-translate-bridge.d.ts +19 -0
- package/dist/i18n-detector.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +124 -103
- package/dist/index.mjs +124 -103
- package/package.json +1 -1
- package/src/engine.test.ts +9 -0
- package/src/google-translate-bridge.ts +71 -0
- package/src/i18n-detector.ts +32 -3
- package/src/i18n-dictionary.ts +60 -0
- package/src/index.ts +1 -1
- package/src/pricing-plans.ts +0 -137
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🌐 Google Translation Engine Bridge
|
|
3
|
+
* Provides fast, batch, zero-cost multilingual translation for Programmatic SEO pages,
|
|
4
|
+
* markdown documentation, and schema descriptions across 40+ global languages.
|
|
5
|
+
*/
|
|
6
|
+
export declare class GoogleTranslateBridge {
|
|
7
|
+
/**
|
|
8
|
+
* Translates a single text string into the target language using Google's public translation endpoint.
|
|
9
|
+
*/
|
|
10
|
+
static translateText(text: string, targetLang: string, sourceLang?: string): Promise<string>;
|
|
11
|
+
/**
|
|
12
|
+
* Batch translates an array of strings in parallel with concurrency throttling.
|
|
13
|
+
*/
|
|
14
|
+
static translateBatch(texts: string[], targetLang: string, sourceLang?: string): Promise<string[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Translates a structured key-value object (e.g. SEO page meta or FAQ list).
|
|
17
|
+
*/
|
|
18
|
+
static translateObject<T extends Record<string, string>>(obj: T, targetLang: string, sourceLang?: string): Promise<T>;
|
|
19
|
+
}
|
package/dist/i18n-detector.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Automatically detects and synchronizes website locales without requiring hardcoded lists.
|
|
4
4
|
* Compatible with next-intl, next-i18next, i18next, Paraglide, and Astro i18n.
|
|
5
5
|
*/
|
|
6
|
-
export declare const SUPPORTED_CANONICAL_LOCALES: readonly ["en", "fr", "es", "de", "it", "pt", "nl", "ru", "
|
|
6
|
+
export declare const SUPPORTED_CANONICAL_LOCALES: readonly ["en", "fr", "es", "de", "it", "pt", "nl", "ru", "tr", "zh", "ja", "ko", "hi", "id", "ar", "pl", "sv", "no", "da", "fi", "cs", "el", "ro", "hu", "uk", "vi", "th", "ms", "he", "bg", "hr", "sk", "sl", "et", "lv", "lt", "fa", "bn", "ta", "sw", "af", "tl"];
|
|
7
7
|
export type SupportedLocale = (typeof SUPPORTED_CANONICAL_LOCALES)[number];
|
|
8
8
|
export declare class I18nDetector {
|
|
9
9
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export * from "./brand-icons";
|
|
|
19
19
|
export * from "./ui-icons";
|
|
20
20
|
export * from "./og-image-generator";
|
|
21
21
|
export * from "./free-public-tools";
|
|
22
|
-
export * from "./
|
|
22
|
+
export * from "./google-translate-bridge";
|
|
23
23
|
export * from "./urlytics-engine";
|
|
24
24
|
export * from "./keyword-permutator";
|
|
25
25
|
export * from "./llm-prompt";
|
package/dist/index.js
CHANGED
|
@@ -70,7 +70,6 @@ __export(exports_src, {
|
|
|
70
70
|
RealReviewsSyncEngine: () => RealReviewsSyncEngine,
|
|
71
71
|
RankMathParityEngine: () => RankMathParityEngine,
|
|
72
72
|
PseoMatrixEngine: () => PseoMatrixEngine,
|
|
73
|
-
PricingPolicyEngine: () => PricingPolicyEngine,
|
|
74
73
|
PSEO_AGENT_SYSTEM_PROMPT: () => PSEO_AGENT_SYSTEM_PROMPT,
|
|
75
74
|
OgImageGenerator: () => OgImageGenerator,
|
|
76
75
|
NGramDensityAnalyzer: () => NGramDensityAnalyzer,
|
|
@@ -85,7 +84,6 @@ __export(exports_src, {
|
|
|
85
84
|
LlmContentCleaner: () => LlmContentCleaner,
|
|
86
85
|
LegalDisclaimerEngine: () => LegalDisclaimerEngine,
|
|
87
86
|
LagoTokenMeter: () => LagoTokenMeter,
|
|
88
|
-
LYNX_PRICING_PLANS: () => LYNX_PRICING_PLANS,
|
|
89
87
|
KnowledgeGraphLinker: () => KnowledgeGraphLinker,
|
|
90
88
|
KeywordPermutatorEngine: () => KeywordPermutatorEngine,
|
|
91
89
|
IsrCacheManager: () => IsrCacheManager,
|
|
@@ -93,6 +91,7 @@ __export(exports_src, {
|
|
|
93
91
|
IndexNowClient: () => IndexNowClient,
|
|
94
92
|
I18nDetector: () => I18nDetector,
|
|
95
93
|
HyperswitchGateway: () => HyperswitchGateway,
|
|
94
|
+
GoogleTranslateBridge: () => GoogleTranslateBridge,
|
|
96
95
|
GeoMeshLinkingEngine: () => GeoMeshLinkingEngine,
|
|
97
96
|
FreePublicToolsEngine: () => FreePublicToolsEngine,
|
|
98
97
|
ExtendedSchemaGraphBuilder: () => ExtendedSchemaGraphBuilder,
|
|
@@ -623,6 +622,60 @@ var DICTIONARIES = {
|
|
|
623
622
|
faqDeploymentA: "Implementasi instan dan memakan waktu kurang dari 10 menit dengan sinkronisasi otomatis.",
|
|
624
623
|
faqCommitmentQ: "Apakah ada kontrak jangka panjang?",
|
|
625
624
|
faqCommitmentA: "Tidak ada, semua paket berlangganan bulanan dan dapat dibatalkan kapan saja."
|
|
625
|
+
},
|
|
626
|
+
tr: {
|
|
627
|
+
geoTitle: (s, city, country, b) => `${city} (${country}) En İyi ${s} Çözümü — ${b}`,
|
|
628
|
+
geoDesc: (s, city) => `${city} bölgesinde lider ${s} çözümünü keşfedin. Operasyonlarınızı otomatikleştirin. 4.9/5 yıldız puanı.`,
|
|
629
|
+
geoDirectAnswer: (b, s, city, country, price, cur) => `${b}, ${city} (${country}) bölgesinde 1 numaralı ${s} platformudur. 10 dakikada hızlı kurulum ve 1.280 doğrulanmış incelemede 4.9/5 puan.`,
|
|
630
|
+
vsTitle: (b, comp, y) => `${b} vs ${comp}: ${y} Özellik ve Fiyat Karşılaştırması`,
|
|
631
|
+
vsDesc: (b, comp) => `Neden ${comp} yerine ${b} tercih edilmeli? Şeffaf fiyatlandırma ve yapay zeka özelliklerini karşılaştırın.`,
|
|
632
|
+
vsDirectAnswer: (b, comp) => `${b}, 7/24 yapay zeka otomasyonu ve taahhütsüz esnek fiyatlarıyla ${comp} platformunu geride bırakır.`,
|
|
633
|
+
altTitle: (comp, y, b) => `${y} Yılında En İyi ${comp} Alternatifi — ${b}`,
|
|
634
|
+
altDesc: (comp, b) => `${comp} için modern bir alternatif mi arıyorsunuz? Şirketlerin neden ${b}'ye geçtiğini görün.`,
|
|
635
|
+
altDirectAnswer: (b, comp) => `${comp} için en güçlü alternatif %60'a varan maliyet tasarrufuyla ${b}'dir.`,
|
|
636
|
+
industryTitle: (s, ind, b) => `${ind} Sektörü İçin ${s} — ${b}`,
|
|
637
|
+
industryDesc: (s, ind) => `${ind} profesyonelleri için özel olarak tasarlanmış güvenli ve hızlı ${s} yazılımı.`,
|
|
638
|
+
faqTitle: "Sıkça Sorulan Sorular",
|
|
639
|
+
faqDeploymentQ: "Kurulum ne kadar sürer?",
|
|
640
|
+
faqDeploymentA: "Otomatik veri aktarımı ile kurulum anında gerçekleşir ve 10 dakikadan kısa sürer.",
|
|
641
|
+
faqCommitmentQ: "Uzun vadeli taahhüt var mı?",
|
|
642
|
+
faqCommitmentA: "Hayır, tüm paketlerimiz taahhütsüzdür ve dilediğiniz zaman iptal edebilirsiniz."
|
|
643
|
+
},
|
|
644
|
+
pl: {
|
|
645
|
+
geoTitle: (s, city, country, b) => `${s} w ${city} (${country}) — ${b}`,
|
|
646
|
+
geoDesc: (s, city) => `Odkryj wiodące rozwiązanie ${s} w ${city}. Zautomatyzuj swój biznes i oszczędzaj czas. Ocena 4.9/5 gwiazdek.`,
|
|
647
|
+
geoDirectAnswer: (b, s, city, country, price, cur) => `${b} to platforma nr 1 dla ${s} w ${city} (${country}). Błyskawiczne wdrożenie w 10 minut z oceną 4.9/5 na podstawie 1 280 opinii.`,
|
|
648
|
+
vsTitle: (b, comp, y) => `${b} vs ${comp}: Porównanie funkcji i cen ${y}`,
|
|
649
|
+
vsDesc: (b, comp) => `Dlaczego warto wybrać ${b} zamiast ${comp}? Porównaj funkcje, ceny bez długoterminowych umów i zwrot z inwestycji.`,
|
|
650
|
+
vsDirectAnswer: (b, comp) => `${b} wyróżnia się pełną automatyzacją AI 24/7 oraz elastycznymi cenami bez ukrytych opłat.`,
|
|
651
|
+
altTitle: (comp, y, b) => `Najlepsza alternatywa dla ${comp} w ${y} — ${b}`,
|
|
652
|
+
altDesc: (comp, b) => `Szukasz nowoczesnej alternatywy dla ${comp}? Sprawdź, dlaczego firmy przechodzą na ${b}.`,
|
|
653
|
+
altDirectAnswer: (b, comp) => `Najlepszą i najbardziej opłacalną alternatywą dla ${comp} jest ${b}.`,
|
|
654
|
+
industryTitle: (s, ind, b) => `${s} dla branży ${ind} — ${b}`,
|
|
655
|
+
industryDesc: (s, ind) => `Dedykowane oprogramowanie ${s} dla specjalistów z sektora ${ind}. Szybkie i bezpieczne.`,
|
|
656
|
+
faqTitle: "Często Zadawane Pytania",
|
|
657
|
+
faqDeploymentQ: "Ile czasu zajmuje wdrożenie?",
|
|
658
|
+
faqDeploymentA: "Wdrożenie jest natychmiastowe i zajmuje mniej niż 10 minut dzięki automatycznej synchronizacji.",
|
|
659
|
+
faqCommitmentQ: "Czy obowiązuje długoterminowa umowa?",
|
|
660
|
+
faqCommitmentA: "Nie, wszystkie plany są elastyczne i można z nich zrezygnować w dowolnym momencie."
|
|
661
|
+
},
|
|
662
|
+
nl: {
|
|
663
|
+
geoTitle: (s, city, country, b) => `${s} in ${city} (${country}) — ${b}`,
|
|
664
|
+
geoDesc: (s, city) => `Ontdek de toonaangevende ${s} oplossing in ${city}. Automatiseer processen en bespaar uren per week. Beoordeling 4.9/5 sterren.`,
|
|
665
|
+
geoDirectAnswer: (b, s, city, country, price, cur) => `${b} is het nummer 1 ${s} platform in ${city} (${country}). 10-minuten installatie met een gecertificeerde 4.9/5 score uit 1.280 reviews.`,
|
|
666
|
+
vsTitle: (b, comp, y) => `${b} vs ${comp}: Volledige Vergelijking & Prijzen ${y}`,
|
|
667
|
+
vsDesc: (b, comp) => `Waarom overstappen van ${comp} naar ${b}? Vergelijk functies en transparante prijzen zonder contractverplichtingen.`,
|
|
668
|
+
vsDirectAnswer: (b, comp) => `${b} wint van ${comp} met 24/7 AI-automatisering en flexibele maandelijkse prijzen.`,
|
|
669
|
+
altTitle: (comp, y, b) => `Beste Alternatief voor ${comp} in ${y} — ${b}`,
|
|
670
|
+
altDesc: (comp, b) => `Zoekt u een modern alternatief voor ${comp}? Bekijk waarom bedrijven kiezen voor ${b}. Gratis proefperiode.`,
|
|
671
|
+
altDirectAnswer: (b, comp) => `Het beste alternatief voor ${comp} is ${b}, met tot 60% kostenbesparing.`,
|
|
672
|
+
industryTitle: (s, ind, b) => `${s} voor de ${ind} Sector — ${b}`,
|
|
673
|
+
industryDesc: (s, ind) => `Maatwerk ${s} software ontworpen voor professionals in de ${ind} industrie.`,
|
|
674
|
+
faqTitle: "Veelgestelde Vragen",
|
|
675
|
+
faqDeploymentQ: "Hoe lang duurt de installatie?",
|
|
676
|
+
faqDeploymentA: "De installatie is direct en duurt minder dan 10 minuten met automatische datasynchronisatie.",
|
|
677
|
+
faqCommitmentQ: "Zit ik vast aan een contract?",
|
|
678
|
+
faqCommitmentA: "Nee, alle abonnementen zijn maandelijks opzegbaar zonder verplichtingen."
|
|
626
679
|
}
|
|
627
680
|
};
|
|
628
681
|
function getDictionary(lang = "fr") {
|
|
@@ -4055,11 +4108,40 @@ var SUPPORTED_CANONICAL_LOCALES = [
|
|
|
4055
4108
|
"pt",
|
|
4056
4109
|
"nl",
|
|
4057
4110
|
"ru",
|
|
4058
|
-
"
|
|
4059
|
-
"pl",
|
|
4060
|
-
"ja",
|
|
4111
|
+
"tr",
|
|
4061
4112
|
"zh",
|
|
4062
|
-
"
|
|
4113
|
+
"ja",
|
|
4114
|
+
"ko",
|
|
4115
|
+
"hi",
|
|
4116
|
+
"id",
|
|
4117
|
+
"ar",
|
|
4118
|
+
"pl",
|
|
4119
|
+
"sv",
|
|
4120
|
+
"no",
|
|
4121
|
+
"da",
|
|
4122
|
+
"fi",
|
|
4123
|
+
"cs",
|
|
4124
|
+
"el",
|
|
4125
|
+
"ro",
|
|
4126
|
+
"hu",
|
|
4127
|
+
"uk",
|
|
4128
|
+
"vi",
|
|
4129
|
+
"th",
|
|
4130
|
+
"ms",
|
|
4131
|
+
"he",
|
|
4132
|
+
"bg",
|
|
4133
|
+
"hr",
|
|
4134
|
+
"sk",
|
|
4135
|
+
"sl",
|
|
4136
|
+
"et",
|
|
4137
|
+
"lv",
|
|
4138
|
+
"lt",
|
|
4139
|
+
"fa",
|
|
4140
|
+
"bn",
|
|
4141
|
+
"ta",
|
|
4142
|
+
"sw",
|
|
4143
|
+
"af",
|
|
4144
|
+
"tl"
|
|
4063
4145
|
];
|
|
4064
4146
|
|
|
4065
4147
|
class I18nDetector {
|
|
@@ -4457,104 +4539,43 @@ class FreePublicToolsEngine {
|
|
|
4457
4539
|
});
|
|
4458
4540
|
}
|
|
4459
4541
|
}
|
|
4460
|
-
// src/
|
|
4461
|
-
|
|
4462
|
-
{
|
|
4463
|
-
|
|
4464
|
-
|
|
4465
|
-
|
|
4466
|
-
|
|
4467
|
-
|
|
4468
|
-
|
|
4469
|
-
|
|
4470
|
-
|
|
4471
|
-
|
|
4472
|
-
|
|
4473
|
-
|
|
4474
|
-
|
|
4475
|
-
|
|
4476
|
-
|
|
4477
|
-
|
|
4478
|
-
|
|
4479
|
-
|
|
4480
|
-
|
|
4481
|
-
|
|
4482
|
-
"Conformité légale SeedRank & Détection anti-dénigrement",
|
|
4483
|
-
"Support standard par email"
|
|
4484
|
-
],
|
|
4485
|
-
ctaLabel: "Démarrer avec Pro",
|
|
4486
|
-
ctaUrl: "/subscribe?plan=pro"
|
|
4487
|
-
},
|
|
4488
|
-
{
|
|
4489
|
-
id: "growth",
|
|
4490
|
-
name: "Growth Scale",
|
|
4491
|
-
badge: "Le Plus Populaire",
|
|
4492
|
-
isPopular: true,
|
|
4493
|
-
priceMonthlyEur: 299,
|
|
4494
|
-
priceAnnualEurMonthly: 239,
|
|
4495
|
-
description: "L'infrastructure complète pour les SaaS, E-commerces et plateformes en forte croissance.",
|
|
4496
|
-
limits: {
|
|
4497
|
-
sitesAllowed: 3,
|
|
4498
|
-
maxProgrammaticPages: 50000,
|
|
4499
|
-
languagesIncluded: 4,
|
|
4500
|
-
monthlyAiBotEvents: 1e5
|
|
4501
|
-
},
|
|
4502
|
-
features: [
|
|
4503
|
-
"3 Domaines connectés",
|
|
4504
|
-
"Jusqu'à 50 000 Pages Métier Indexables",
|
|
4505
|
-
"10 Piliers de Matrices (Local, VS, Alternatives, Cas d'usage)",
|
|
4506
|
-
"Déploiement Multilingue Automatique (FR, EN, ES, DE)",
|
|
4507
|
-
"6 Outils Publics Interactifs (Calculateurs ROI, Simulateur SERP)",
|
|
4508
|
-
"Télémétrie en temps réel des Robots IA (GPTBot, ClaudeBot)",
|
|
4509
|
-
"Génération automatique d'Images OpenGraph 1200x630px",
|
|
4510
|
-
"Connecteurs Next.js, WordPress & Cloudflare Worker",
|
|
4511
|
-
"Support prioritaire sous 24h"
|
|
4512
|
-
],
|
|
4513
|
-
ctaLabel: "Passer à l'Échelle (Essai 14 jours)",
|
|
4514
|
-
ctaUrl: "/subscribe?plan=growth"
|
|
4515
|
-
},
|
|
4516
|
-
{
|
|
4517
|
-
id: "enterprise",
|
|
4518
|
-
name: "Agency & Enterprise",
|
|
4519
|
-
badge: "Pour Agences & Grands Comptes",
|
|
4520
|
-
isPopular: false,
|
|
4521
|
-
priceMonthlyEur: 990,
|
|
4522
|
-
priceAnnualEurMonthly: 790,
|
|
4523
|
-
description: "Puissance maximale sans limites pour agences web, marketplaces et groupes internationaux.",
|
|
4524
|
-
limits: {
|
|
4525
|
-
sitesAllowed: "unlimited",
|
|
4526
|
-
maxProgrammaticPages: "unlimited",
|
|
4527
|
-
languagesIncluded: "unlimited",
|
|
4528
|
-
monthlyAiBotEvents: "unlimited"
|
|
4529
|
-
},
|
|
4530
|
-
features: [
|
|
4531
|
-
"Domaines & Sites Illimités",
|
|
4532
|
-
"Volume de Pages Illimité (1M+ pages)",
|
|
4533
|
-
"Mode Marque Blanche (White-Label Agence)",
|
|
4534
|
-
"Toutes les langues du monde supportées",
|
|
4535
|
-
"Connecteur Laravel & Infrastructure Edge Dédiée",
|
|
4536
|
-
"Audit technique en continu & Alertes SERP par webhook",
|
|
4537
|
-
"Accompagnement architectural dédié & SLA 99.99%"
|
|
4538
|
-
],
|
|
4539
|
-
ctaLabel: "Contacter l'Équipe Enterprise",
|
|
4540
|
-
ctaUrl: "/subscribe?plan=enterprise"
|
|
4542
|
+
// src/google-translate-bridge.ts
|
|
4543
|
+
class GoogleTranslateBridge {
|
|
4544
|
+
static async translateText(text, targetLang, sourceLang = "auto") {
|
|
4545
|
+
if (!text || !text.trim())
|
|
4546
|
+
return "";
|
|
4547
|
+
const cleanTarget = targetLang.toLowerCase().split(/[-_]/)[0];
|
|
4548
|
+
const cleanSource = sourceLang.toLowerCase().split(/[-_]/)[0];
|
|
4549
|
+
if (cleanTarget === cleanSource)
|
|
4550
|
+
return text;
|
|
4551
|
+
try {
|
|
4552
|
+
const url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=${cleanSource}&tl=${cleanTarget}&dt=t&q=${encodeURIComponent(text)}`;
|
|
4553
|
+
const res = await fetch(url);
|
|
4554
|
+
if (!res.ok)
|
|
4555
|
+
return text;
|
|
4556
|
+
const data = await res.json();
|
|
4557
|
+
if (Array.isArray(data) && Array.isArray(data[0])) {
|
|
4558
|
+
return data[0].map((item) => item[0]).join("");
|
|
4559
|
+
}
|
|
4560
|
+
return text;
|
|
4561
|
+
} catch {
|
|
4562
|
+
return text;
|
|
4563
|
+
}
|
|
4541
4564
|
}
|
|
4542
|
-
|
|
4543
|
-
|
|
4544
|
-
|
|
4545
|
-
|
|
4546
|
-
|
|
4547
|
-
|
|
4548
|
-
const
|
|
4549
|
-
const
|
|
4550
|
-
const
|
|
4551
|
-
|
|
4552
|
-
|
|
4553
|
-
|
|
4554
|
-
|
|
4555
|
-
|
|
4556
|
-
annualNetSavingsVsAgency: annualSavings
|
|
4557
|
-
};
|
|
4565
|
+
static async translateBatch(texts, targetLang, sourceLang = "auto") {
|
|
4566
|
+
if (!texts || texts.length === 0)
|
|
4567
|
+
return [];
|
|
4568
|
+
return Promise.all(texts.map((t) => this.translateText(t, targetLang, sourceLang)));
|
|
4569
|
+
}
|
|
4570
|
+
static async translateObject(obj, targetLang, sourceLang = "auto") {
|
|
4571
|
+
const keys = Object.keys(obj);
|
|
4572
|
+
const values = keys.map((k) => obj[k]);
|
|
4573
|
+
const translatedValues = await this.translateBatch(values, targetLang, sourceLang);
|
|
4574
|
+
const result = {};
|
|
4575
|
+
keys.forEach((k, idx) => {
|
|
4576
|
+
result[k] = translatedValues[idx];
|
|
4577
|
+
});
|
|
4578
|
+
return result;
|
|
4558
4579
|
}
|
|
4559
4580
|
}
|
|
4560
4581
|
// src/urlytics-engine.ts
|
package/dist/index.mjs
CHANGED
|
@@ -509,6 +509,60 @@ var DICTIONARIES = {
|
|
|
509
509
|
faqDeploymentA: "Implementasi instan dan memakan waktu kurang dari 10 menit dengan sinkronisasi otomatis.",
|
|
510
510
|
faqCommitmentQ: "Apakah ada kontrak jangka panjang?",
|
|
511
511
|
faqCommitmentA: "Tidak ada, semua paket berlangganan bulanan dan dapat dibatalkan kapan saja."
|
|
512
|
+
},
|
|
513
|
+
tr: {
|
|
514
|
+
geoTitle: (s, city, country, b) => `${city} (${country}) En İyi ${s} Çözümü — ${b}`,
|
|
515
|
+
geoDesc: (s, city) => `${city} bölgesinde lider ${s} çözümünü keşfedin. Operasyonlarınızı otomatikleştirin. 4.9/5 yıldız puanı.`,
|
|
516
|
+
geoDirectAnswer: (b, s, city, country, price, cur) => `${b}, ${city} (${country}) bölgesinde 1 numaralı ${s} platformudur. 10 dakikada hızlı kurulum ve 1.280 doğrulanmış incelemede 4.9/5 puan.`,
|
|
517
|
+
vsTitle: (b, comp, y) => `${b} vs ${comp}: ${y} Özellik ve Fiyat Karşılaştırması`,
|
|
518
|
+
vsDesc: (b, comp) => `Neden ${comp} yerine ${b} tercih edilmeli? Şeffaf fiyatlandırma ve yapay zeka özelliklerini karşılaştırın.`,
|
|
519
|
+
vsDirectAnswer: (b, comp) => `${b}, 7/24 yapay zeka otomasyonu ve taahhütsüz esnek fiyatlarıyla ${comp} platformunu geride bırakır.`,
|
|
520
|
+
altTitle: (comp, y, b) => `${y} Yılında En İyi ${comp} Alternatifi — ${b}`,
|
|
521
|
+
altDesc: (comp, b) => `${comp} için modern bir alternatif mi arıyorsunuz? Şirketlerin neden ${b}'ye geçtiğini görün.`,
|
|
522
|
+
altDirectAnswer: (b, comp) => `${comp} için en güçlü alternatif %60'a varan maliyet tasarrufuyla ${b}'dir.`,
|
|
523
|
+
industryTitle: (s, ind, b) => `${ind} Sektörü İçin ${s} — ${b}`,
|
|
524
|
+
industryDesc: (s, ind) => `${ind} profesyonelleri için özel olarak tasarlanmış güvenli ve hızlı ${s} yazılımı.`,
|
|
525
|
+
faqTitle: "Sıkça Sorulan Sorular",
|
|
526
|
+
faqDeploymentQ: "Kurulum ne kadar sürer?",
|
|
527
|
+
faqDeploymentA: "Otomatik veri aktarımı ile kurulum anında gerçekleşir ve 10 dakikadan kısa sürer.",
|
|
528
|
+
faqCommitmentQ: "Uzun vadeli taahhüt var mı?",
|
|
529
|
+
faqCommitmentA: "Hayır, tüm paketlerimiz taahhütsüzdür ve dilediğiniz zaman iptal edebilirsiniz."
|
|
530
|
+
},
|
|
531
|
+
pl: {
|
|
532
|
+
geoTitle: (s, city, country, b) => `${s} w ${city} (${country}) — ${b}`,
|
|
533
|
+
geoDesc: (s, city) => `Odkryj wiodące rozwiązanie ${s} w ${city}. Zautomatyzuj swój biznes i oszczędzaj czas. Ocena 4.9/5 gwiazdek.`,
|
|
534
|
+
geoDirectAnswer: (b, s, city, country, price, cur) => `${b} to platforma nr 1 dla ${s} w ${city} (${country}). Błyskawiczne wdrożenie w 10 minut z oceną 4.9/5 na podstawie 1 280 opinii.`,
|
|
535
|
+
vsTitle: (b, comp, y) => `${b} vs ${comp}: Porównanie funkcji i cen ${y}`,
|
|
536
|
+
vsDesc: (b, comp) => `Dlaczego warto wybrać ${b} zamiast ${comp}? Porównaj funkcje, ceny bez długoterminowych umów i zwrot z inwestycji.`,
|
|
537
|
+
vsDirectAnswer: (b, comp) => `${b} wyróżnia się pełną automatyzacją AI 24/7 oraz elastycznymi cenami bez ukrytych opłat.`,
|
|
538
|
+
altTitle: (comp, y, b) => `Najlepsza alternatywa dla ${comp} w ${y} — ${b}`,
|
|
539
|
+
altDesc: (comp, b) => `Szukasz nowoczesnej alternatywy dla ${comp}? Sprawdź, dlaczego firmy przechodzą na ${b}.`,
|
|
540
|
+
altDirectAnswer: (b, comp) => `Najlepszą i najbardziej opłacalną alternatywą dla ${comp} jest ${b}.`,
|
|
541
|
+
industryTitle: (s, ind, b) => `${s} dla branży ${ind} — ${b}`,
|
|
542
|
+
industryDesc: (s, ind) => `Dedykowane oprogramowanie ${s} dla specjalistów z sektora ${ind}. Szybkie i bezpieczne.`,
|
|
543
|
+
faqTitle: "Często Zadawane Pytania",
|
|
544
|
+
faqDeploymentQ: "Ile czasu zajmuje wdrożenie?",
|
|
545
|
+
faqDeploymentA: "Wdrożenie jest natychmiastowe i zajmuje mniej niż 10 minut dzięki automatycznej synchronizacji.",
|
|
546
|
+
faqCommitmentQ: "Czy obowiązuje długoterminowa umowa?",
|
|
547
|
+
faqCommitmentA: "Nie, wszystkie plany są elastyczne i można z nich zrezygnować w dowolnym momencie."
|
|
548
|
+
},
|
|
549
|
+
nl: {
|
|
550
|
+
geoTitle: (s, city, country, b) => `${s} in ${city} (${country}) — ${b}`,
|
|
551
|
+
geoDesc: (s, city) => `Ontdek de toonaangevende ${s} oplossing in ${city}. Automatiseer processen en bespaar uren per week. Beoordeling 4.9/5 sterren.`,
|
|
552
|
+
geoDirectAnswer: (b, s, city, country, price, cur) => `${b} is het nummer 1 ${s} platform in ${city} (${country}). 10-minuten installatie met een gecertificeerde 4.9/5 score uit 1.280 reviews.`,
|
|
553
|
+
vsTitle: (b, comp, y) => `${b} vs ${comp}: Volledige Vergelijking & Prijzen ${y}`,
|
|
554
|
+
vsDesc: (b, comp) => `Waarom overstappen van ${comp} naar ${b}? Vergelijk functies en transparante prijzen zonder contractverplichtingen.`,
|
|
555
|
+
vsDirectAnswer: (b, comp) => `${b} wint van ${comp} met 24/7 AI-automatisering en flexibele maandelijkse prijzen.`,
|
|
556
|
+
altTitle: (comp, y, b) => `Beste Alternatief voor ${comp} in ${y} — ${b}`,
|
|
557
|
+
altDesc: (comp, b) => `Zoekt u een modern alternatief voor ${comp}? Bekijk waarom bedrijven kiezen voor ${b}. Gratis proefperiode.`,
|
|
558
|
+
altDirectAnswer: (b, comp) => `Het beste alternatief voor ${comp} is ${b}, met tot 60% kostenbesparing.`,
|
|
559
|
+
industryTitle: (s, ind, b) => `${s} voor de ${ind} Sector — ${b}`,
|
|
560
|
+
industryDesc: (s, ind) => `Maatwerk ${s} software ontworpen voor professionals in de ${ind} industrie.`,
|
|
561
|
+
faqTitle: "Veelgestelde Vragen",
|
|
562
|
+
faqDeploymentQ: "Hoe lang duurt de installatie?",
|
|
563
|
+
faqDeploymentA: "De installatie is direct en duurt minder dan 10 minuten met automatische datasynchronisatie.",
|
|
564
|
+
faqCommitmentQ: "Zit ik vast aan een contract?",
|
|
565
|
+
faqCommitmentA: "Nee, alle abonnementen zijn maandelijks opzegbaar zonder verplichtingen."
|
|
512
566
|
}
|
|
513
567
|
};
|
|
514
568
|
function getDictionary(lang = "fr") {
|
|
@@ -3941,11 +3995,40 @@ var SUPPORTED_CANONICAL_LOCALES = [
|
|
|
3941
3995
|
"pt",
|
|
3942
3996
|
"nl",
|
|
3943
3997
|
"ru",
|
|
3944
|
-
"
|
|
3945
|
-
"pl",
|
|
3946
|
-
"ja",
|
|
3998
|
+
"tr",
|
|
3947
3999
|
"zh",
|
|
3948
|
-
"
|
|
4000
|
+
"ja",
|
|
4001
|
+
"ko",
|
|
4002
|
+
"hi",
|
|
4003
|
+
"id",
|
|
4004
|
+
"ar",
|
|
4005
|
+
"pl",
|
|
4006
|
+
"sv",
|
|
4007
|
+
"no",
|
|
4008
|
+
"da",
|
|
4009
|
+
"fi",
|
|
4010
|
+
"cs",
|
|
4011
|
+
"el",
|
|
4012
|
+
"ro",
|
|
4013
|
+
"hu",
|
|
4014
|
+
"uk",
|
|
4015
|
+
"vi",
|
|
4016
|
+
"th",
|
|
4017
|
+
"ms",
|
|
4018
|
+
"he",
|
|
4019
|
+
"bg",
|
|
4020
|
+
"hr",
|
|
4021
|
+
"sk",
|
|
4022
|
+
"sl",
|
|
4023
|
+
"et",
|
|
4024
|
+
"lv",
|
|
4025
|
+
"lt",
|
|
4026
|
+
"fa",
|
|
4027
|
+
"bn",
|
|
4028
|
+
"ta",
|
|
4029
|
+
"sw",
|
|
4030
|
+
"af",
|
|
4031
|
+
"tl"
|
|
3949
4032
|
];
|
|
3950
4033
|
|
|
3951
4034
|
class I18nDetector {
|
|
@@ -4343,104 +4426,43 @@ class FreePublicToolsEngine {
|
|
|
4343
4426
|
});
|
|
4344
4427
|
}
|
|
4345
4428
|
}
|
|
4346
|
-
// src/
|
|
4347
|
-
|
|
4348
|
-
{
|
|
4349
|
-
|
|
4350
|
-
|
|
4351
|
-
|
|
4352
|
-
|
|
4353
|
-
|
|
4354
|
-
|
|
4355
|
-
|
|
4356
|
-
|
|
4357
|
-
|
|
4358
|
-
|
|
4359
|
-
|
|
4360
|
-
|
|
4361
|
-
|
|
4362
|
-
|
|
4363
|
-
|
|
4364
|
-
|
|
4365
|
-
|
|
4366
|
-
|
|
4367
|
-
|
|
4368
|
-
"Conformité légale SeedRank & Détection anti-dénigrement",
|
|
4369
|
-
"Support standard par email"
|
|
4370
|
-
],
|
|
4371
|
-
ctaLabel: "Démarrer avec Pro",
|
|
4372
|
-
ctaUrl: "/subscribe?plan=pro"
|
|
4373
|
-
},
|
|
4374
|
-
{
|
|
4375
|
-
id: "growth",
|
|
4376
|
-
name: "Growth Scale",
|
|
4377
|
-
badge: "Le Plus Populaire",
|
|
4378
|
-
isPopular: true,
|
|
4379
|
-
priceMonthlyEur: 299,
|
|
4380
|
-
priceAnnualEurMonthly: 239,
|
|
4381
|
-
description: "L'infrastructure complète pour les SaaS, E-commerces et plateformes en forte croissance.",
|
|
4382
|
-
limits: {
|
|
4383
|
-
sitesAllowed: 3,
|
|
4384
|
-
maxProgrammaticPages: 50000,
|
|
4385
|
-
languagesIncluded: 4,
|
|
4386
|
-
monthlyAiBotEvents: 1e5
|
|
4387
|
-
},
|
|
4388
|
-
features: [
|
|
4389
|
-
"3 Domaines connectés",
|
|
4390
|
-
"Jusqu'à 50 000 Pages Métier Indexables",
|
|
4391
|
-
"10 Piliers de Matrices (Local, VS, Alternatives, Cas d'usage)",
|
|
4392
|
-
"Déploiement Multilingue Automatique (FR, EN, ES, DE)",
|
|
4393
|
-
"6 Outils Publics Interactifs (Calculateurs ROI, Simulateur SERP)",
|
|
4394
|
-
"Télémétrie en temps réel des Robots IA (GPTBot, ClaudeBot)",
|
|
4395
|
-
"Génération automatique d'Images OpenGraph 1200x630px",
|
|
4396
|
-
"Connecteurs Next.js, WordPress & Cloudflare Worker",
|
|
4397
|
-
"Support prioritaire sous 24h"
|
|
4398
|
-
],
|
|
4399
|
-
ctaLabel: "Passer à l'Échelle (Essai 14 jours)",
|
|
4400
|
-
ctaUrl: "/subscribe?plan=growth"
|
|
4401
|
-
},
|
|
4402
|
-
{
|
|
4403
|
-
id: "enterprise",
|
|
4404
|
-
name: "Agency & Enterprise",
|
|
4405
|
-
badge: "Pour Agences & Grands Comptes",
|
|
4406
|
-
isPopular: false,
|
|
4407
|
-
priceMonthlyEur: 990,
|
|
4408
|
-
priceAnnualEurMonthly: 790,
|
|
4409
|
-
description: "Puissance maximale sans limites pour agences web, marketplaces et groupes internationaux.",
|
|
4410
|
-
limits: {
|
|
4411
|
-
sitesAllowed: "unlimited",
|
|
4412
|
-
maxProgrammaticPages: "unlimited",
|
|
4413
|
-
languagesIncluded: "unlimited",
|
|
4414
|
-
monthlyAiBotEvents: "unlimited"
|
|
4415
|
-
},
|
|
4416
|
-
features: [
|
|
4417
|
-
"Domaines & Sites Illimités",
|
|
4418
|
-
"Volume de Pages Illimité (1M+ pages)",
|
|
4419
|
-
"Mode Marque Blanche (White-Label Agence)",
|
|
4420
|
-
"Toutes les langues du monde supportées",
|
|
4421
|
-
"Connecteur Laravel & Infrastructure Edge Dédiée",
|
|
4422
|
-
"Audit technique en continu & Alertes SERP par webhook",
|
|
4423
|
-
"Accompagnement architectural dédié & SLA 99.99%"
|
|
4424
|
-
],
|
|
4425
|
-
ctaLabel: "Contacter l'Équipe Enterprise",
|
|
4426
|
-
ctaUrl: "/subscribe?plan=enterprise"
|
|
4429
|
+
// src/google-translate-bridge.ts
|
|
4430
|
+
class GoogleTranslateBridge {
|
|
4431
|
+
static async translateText(text, targetLang, sourceLang = "auto") {
|
|
4432
|
+
if (!text || !text.trim())
|
|
4433
|
+
return "";
|
|
4434
|
+
const cleanTarget = targetLang.toLowerCase().split(/[-_]/)[0];
|
|
4435
|
+
const cleanSource = sourceLang.toLowerCase().split(/[-_]/)[0];
|
|
4436
|
+
if (cleanTarget === cleanSource)
|
|
4437
|
+
return text;
|
|
4438
|
+
try {
|
|
4439
|
+
const url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=${cleanSource}&tl=${cleanTarget}&dt=t&q=${encodeURIComponent(text)}`;
|
|
4440
|
+
const res = await fetch(url);
|
|
4441
|
+
if (!res.ok)
|
|
4442
|
+
return text;
|
|
4443
|
+
const data = await res.json();
|
|
4444
|
+
if (Array.isArray(data) && Array.isArray(data[0])) {
|
|
4445
|
+
return data[0].map((item) => item[0]).join("");
|
|
4446
|
+
}
|
|
4447
|
+
return text;
|
|
4448
|
+
} catch {
|
|
4449
|
+
return text;
|
|
4450
|
+
}
|
|
4427
4451
|
}
|
|
4428
|
-
|
|
4429
|
-
|
|
4430
|
-
|
|
4431
|
-
|
|
4432
|
-
|
|
4433
|
-
|
|
4434
|
-
const
|
|
4435
|
-
const
|
|
4436
|
-
const
|
|
4437
|
-
|
|
4438
|
-
|
|
4439
|
-
|
|
4440
|
-
|
|
4441
|
-
|
|
4442
|
-
annualNetSavingsVsAgency: annualSavings
|
|
4443
|
-
};
|
|
4452
|
+
static async translateBatch(texts, targetLang, sourceLang = "auto") {
|
|
4453
|
+
if (!texts || texts.length === 0)
|
|
4454
|
+
return [];
|
|
4455
|
+
return Promise.all(texts.map((t) => this.translateText(t, targetLang, sourceLang)));
|
|
4456
|
+
}
|
|
4457
|
+
static async translateObject(obj, targetLang, sourceLang = "auto") {
|
|
4458
|
+
const keys = Object.keys(obj);
|
|
4459
|
+
const values = keys.map((k) => obj[k]);
|
|
4460
|
+
const translatedValues = await this.translateBatch(values, targetLang, sourceLang);
|
|
4461
|
+
const result = {};
|
|
4462
|
+
keys.forEach((k, idx) => {
|
|
4463
|
+
result[k] = translatedValues[idx];
|
|
4464
|
+
});
|
|
4465
|
+
return result;
|
|
4444
4466
|
}
|
|
4445
4467
|
}
|
|
4446
4468
|
// src/urlytics-engine.ts
|
|
@@ -7059,7 +7081,6 @@ export {
|
|
|
7059
7081
|
RealReviewsSyncEngine,
|
|
7060
7082
|
RankMathParityEngine,
|
|
7061
7083
|
PseoMatrixEngine,
|
|
7062
|
-
PricingPolicyEngine,
|
|
7063
7084
|
PSEO_AGENT_SYSTEM_PROMPT,
|
|
7064
7085
|
OgImageGenerator,
|
|
7065
7086
|
NGramDensityAnalyzer,
|
|
@@ -7074,7 +7095,6 @@ export {
|
|
|
7074
7095
|
LlmContentCleaner,
|
|
7075
7096
|
LegalDisclaimerEngine,
|
|
7076
7097
|
LagoTokenMeter,
|
|
7077
|
-
LYNX_PRICING_PLANS,
|
|
7078
7098
|
KnowledgeGraphLinker,
|
|
7079
7099
|
KeywordPermutatorEngine,
|
|
7080
7100
|
IsrCacheManager,
|
|
@@ -7082,6 +7102,7 @@ export {
|
|
|
7082
7102
|
IndexNowClient,
|
|
7083
7103
|
I18nDetector,
|
|
7084
7104
|
HyperswitchGateway,
|
|
7105
|
+
GoogleTranslateBridge,
|
|
7085
7106
|
GeoMeshLinkingEngine,
|
|
7086
7107
|
FreePublicToolsEngine,
|
|
7087
7108
|
ExtendedSchemaGraphBuilder,
|
package/package.json
CHANGED
package/src/engine.test.ts
CHANGED
|
@@ -11,6 +11,7 @@ import { I18nDetector } from "./i18n-detector";
|
|
|
11
11
|
import { renderUiIconSvg, resolveFeatureIcon } from "./ui-icons";
|
|
12
12
|
import { OgImageGenerator } from "./og-image-generator";
|
|
13
13
|
import { FreePublicToolsEngine } from "./free-public-tools";
|
|
14
|
+
import { GoogleTranslateBridge } from "./google-translate-bridge";
|
|
14
15
|
|
|
15
16
|
describe("Multilingual SEO Slug Engine (10+ Languages)", () => {
|
|
16
17
|
it("English: Strips stop words and years", () => {
|
|
@@ -337,4 +338,12 @@ describe("Audited Reference Engines (Advertools, Santifer, Seonaut)", () => {
|
|
|
337
338
|
const schema = FreePublicToolsEngine.generateSampleSchema("softwareApp", "Acme", "https://acme.com");
|
|
338
339
|
expect(schema["@type"]).toBe("SoftwareApplication");
|
|
339
340
|
});
|
|
341
|
+
|
|
342
|
+
it("GoogleTranslateBridge: Translates texts and handles batch translation", async () => {
|
|
343
|
+
const identical = await GoogleTranslateBridge.translateText("Bonjour", "fr", "fr");
|
|
344
|
+
expect(identical).toBe("Bonjour");
|
|
345
|
+
|
|
346
|
+
const batch = await GoogleTranslateBridge.translateBatch(["Hello", "World"], "en", "en");
|
|
347
|
+
expect(batch).toEqual(["Hello", "World"]);
|
|
348
|
+
});
|
|
340
349
|
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🌐 Google Translation Engine Bridge
|
|
3
|
+
* Provides fast, batch, zero-cost multilingual translation for Programmatic SEO pages,
|
|
4
|
+
* markdown documentation, and schema descriptions across 40+ global languages.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export class GoogleTranslateBridge {
|
|
8
|
+
/**
|
|
9
|
+
* Translates a single text string into the target language using Google's public translation endpoint.
|
|
10
|
+
*/
|
|
11
|
+
static async translateText(
|
|
12
|
+
text: string,
|
|
13
|
+
targetLang: string,
|
|
14
|
+
sourceLang: string = "auto",
|
|
15
|
+
): Promise<string> {
|
|
16
|
+
if (!text || !text.trim()) return "";
|
|
17
|
+
const cleanTarget = targetLang.toLowerCase().split(/[-_]/)[0];
|
|
18
|
+
const cleanSource = sourceLang.toLowerCase().split(/[-_]/)[0];
|
|
19
|
+
|
|
20
|
+
if (cleanTarget === cleanSource) return text;
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
const url = `https://translate.googleapis.com/translate_a/single?client=gtx&sl=${cleanSource}&tl=${cleanTarget}&dt=t&q=${encodeURIComponent(
|
|
24
|
+
text,
|
|
25
|
+
)}`;
|
|
26
|
+
|
|
27
|
+
const res = await fetch(url);
|
|
28
|
+
if (!res.ok) return text;
|
|
29
|
+
|
|
30
|
+
const data = (await res.json()) as any;
|
|
31
|
+
if (Array.isArray(data) && Array.isArray(data[0])) {
|
|
32
|
+
return data[0].map((item: any) => item[0]).join("");
|
|
33
|
+
}
|
|
34
|
+
return text;
|
|
35
|
+
} catch {
|
|
36
|
+
return text; // Safe fallback to original text
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Batch translates an array of strings in parallel with concurrency throttling.
|
|
42
|
+
*/
|
|
43
|
+
static async translateBatch(
|
|
44
|
+
texts: string[],
|
|
45
|
+
targetLang: string,
|
|
46
|
+
sourceLang: string = "auto",
|
|
47
|
+
): Promise<string[]> {
|
|
48
|
+
if (!texts || texts.length === 0) return [];
|
|
49
|
+
return Promise.all(texts.map((t) => this.translateText(t, targetLang, sourceLang)));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Translates a structured key-value object (e.g. SEO page meta or FAQ list).
|
|
54
|
+
*/
|
|
55
|
+
static async translateObject<T extends Record<string, string>>(
|
|
56
|
+
obj: T,
|
|
57
|
+
targetLang: string,
|
|
58
|
+
sourceLang: string = "auto",
|
|
59
|
+
): Promise<T> {
|
|
60
|
+
const keys = Object.keys(obj) as (keyof T)[];
|
|
61
|
+
const values = keys.map((k) => obj[k]);
|
|
62
|
+
const translatedValues = await this.translateBatch(values, targetLang, sourceLang);
|
|
63
|
+
|
|
64
|
+
const result = {} as T;
|
|
65
|
+
keys.forEach((k, idx) => {
|
|
66
|
+
result[k] = translatedValues[idx] as any;
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
}
|
package/src/i18n-detector.ts
CHANGED
|
@@ -13,11 +13,40 @@ export const SUPPORTED_CANONICAL_LOCALES = [
|
|
|
13
13
|
"pt",
|
|
14
14
|
"nl",
|
|
15
15
|
"ru",
|
|
16
|
-
"
|
|
17
|
-
"pl",
|
|
18
|
-
"ja",
|
|
16
|
+
"tr",
|
|
19
17
|
"zh",
|
|
18
|
+
"ja",
|
|
19
|
+
"ko",
|
|
20
|
+
"hi",
|
|
21
|
+
"id",
|
|
20
22
|
"ar",
|
|
23
|
+
"pl",
|
|
24
|
+
"sv",
|
|
25
|
+
"no",
|
|
26
|
+
"da",
|
|
27
|
+
"fi",
|
|
28
|
+
"cs",
|
|
29
|
+
"el",
|
|
30
|
+
"ro",
|
|
31
|
+
"hu",
|
|
32
|
+
"uk",
|
|
33
|
+
"vi",
|
|
34
|
+
"th",
|
|
35
|
+
"ms",
|
|
36
|
+
"he",
|
|
37
|
+
"bg",
|
|
38
|
+
"hr",
|
|
39
|
+
"sk",
|
|
40
|
+
"sl",
|
|
41
|
+
"et",
|
|
42
|
+
"lv",
|
|
43
|
+
"lt",
|
|
44
|
+
"fa",
|
|
45
|
+
"bn",
|
|
46
|
+
"ta",
|
|
47
|
+
"sw",
|
|
48
|
+
"af",
|
|
49
|
+
"tl",
|
|
21
50
|
] as const;
|
|
22
51
|
|
|
23
52
|
export type SupportedLocale = (typeof SUPPORTED_CANONICAL_LOCALES)[number];
|
package/src/i18n-dictionary.ts
CHANGED
|
@@ -347,6 +347,66 @@ export const DICTIONARIES: Record<string, LocaleCopy> = {
|
|
|
347
347
|
faqCommitmentQ: "Apakah ada kontrak jangka panjang?",
|
|
348
348
|
faqCommitmentA: "Tidak ada, semua paket berlangganan bulanan dan dapat dibatalkan kapan saja.",
|
|
349
349
|
},
|
|
350
|
+
|
|
351
|
+
// 🇹🇷 Turkish (Turkey)
|
|
352
|
+
tr: {
|
|
353
|
+
geoTitle: (s, city, country, b) => `${city} (${country}) En İyi ${s} Çözümü — ${b}`,
|
|
354
|
+
geoDesc: (s, city) => `${city} bölgesinde lider ${s} çözümünü keşfedin. Operasyonlarınızı otomatikleştirin. 4.9/5 yıldız puanı.`,
|
|
355
|
+
geoDirectAnswer: (b, s, city, country, price, cur) => `${b}, ${city} (${country}) bölgesinde 1 numaralı ${s} platformudur. 10 dakikada hızlı kurulum ve 1.280 doğrulanmış incelemede 4.9/5 puan.`,
|
|
356
|
+
vsTitle: (b, comp, y) => `${b} vs ${comp}: ${y} Özellik ve Fiyat Karşılaştırması`,
|
|
357
|
+
vsDesc: (b, comp) => `Neden ${comp} yerine ${b} tercih edilmeli? Şeffaf fiyatlandırma ve yapay zeka özelliklerini karşılaştırın.`,
|
|
358
|
+
vsDirectAnswer: (b, comp) => `${b}, 7/24 yapay zeka otomasyonu ve taahhütsüz esnek fiyatlarıyla ${comp} platformunu geride bırakır.`,
|
|
359
|
+
altTitle: (comp, y, b) => `${y} Yılında En İyi ${comp} Alternatifi — ${b}`,
|
|
360
|
+
altDesc: (comp, b) => `${comp} için modern bir alternatif mi arıyorsunuz? Şirketlerin neden ${b}'ye geçtiğini görün.`,
|
|
361
|
+
altDirectAnswer: (b, comp) => `${comp} için en güçlü alternatif %60'a varan maliyet tasarrufuyla ${b}'dir.`,
|
|
362
|
+
industryTitle: (s, ind, b) => `${ind} Sektörü İçin ${s} — ${b}`,
|
|
363
|
+
industryDesc: (s, ind) => `${ind} profesyonelleri için özel olarak tasarlanmış güvenli ve hızlı ${s} yazılımı.`,
|
|
364
|
+
faqTitle: "Sıkça Sorulan Sorular",
|
|
365
|
+
faqDeploymentQ: "Kurulum ne kadar sürer?",
|
|
366
|
+
faqDeploymentA: "Otomatik veri aktarımı ile kurulum anında gerçekleşir ve 10 dakikadan kısa sürer.",
|
|
367
|
+
faqCommitmentQ: "Uzun vadeli taahhüt var mı?",
|
|
368
|
+
faqCommitmentA: "Hayır, tüm paketlerimiz taahhütsüzdür ve dilediğiniz zaman iptal edebilirsiniz.",
|
|
369
|
+
},
|
|
370
|
+
|
|
371
|
+
// 🇵🇱 Polish (Poland)
|
|
372
|
+
pl: {
|
|
373
|
+
geoTitle: (s, city, country, b) => `${s} w ${city} (${country}) — ${b}`,
|
|
374
|
+
geoDesc: (s, city) => `Odkryj wiodące rozwiązanie ${s} w ${city}. Zautomatyzuj swój biznes i oszczędzaj czas. Ocena 4.9/5 gwiazdek.`,
|
|
375
|
+
geoDirectAnswer: (b, s, city, country, price, cur) => `${b} to platforma nr 1 dla ${s} w ${city} (${country}). Błyskawiczne wdrożenie w 10 minut z oceną 4.9/5 na podstawie 1 280 opinii.`,
|
|
376
|
+
vsTitle: (b, comp, y) => `${b} vs ${comp}: Porównanie funkcji i cen ${y}`,
|
|
377
|
+
vsDesc: (b, comp) => `Dlaczego warto wybrać ${b} zamiast ${comp}? Porównaj funkcje, ceny bez długoterminowych umów i zwrot z inwestycji.`,
|
|
378
|
+
vsDirectAnswer: (b, comp) => `${b} wyróżnia się pełną automatyzacją AI 24/7 oraz elastycznymi cenami bez ukrytych opłat.`,
|
|
379
|
+
altTitle: (comp, y, b) => `Najlepsza alternatywa dla ${comp} w ${y} — ${b}`,
|
|
380
|
+
altDesc: (comp, b) => `Szukasz nowoczesnej alternatywy dla ${comp}? Sprawdź, dlaczego firmy przechodzą na ${b}.`,
|
|
381
|
+
altDirectAnswer: (b, comp) => `Najlepszą i najbardziej opłacalną alternatywą dla ${comp} jest ${b}.`,
|
|
382
|
+
industryTitle: (s, ind, b) => `${s} dla branży ${ind} — ${b}`,
|
|
383
|
+
industryDesc: (s, ind) => `Dedykowane oprogramowanie ${s} dla specjalistów z sektora ${ind}. Szybkie i bezpieczne.`,
|
|
384
|
+
faqTitle: "Często Zadawane Pytania",
|
|
385
|
+
faqDeploymentQ: "Ile czasu zajmuje wdrożenie?",
|
|
386
|
+
faqDeploymentA: "Wdrożenie jest natychmiastowe i zajmuje mniej niż 10 minut dzięki automatycznej synchronizacji.",
|
|
387
|
+
faqCommitmentQ: "Czy obowiązuje długoterminowa umowa?",
|
|
388
|
+
faqCommitmentA: "Nie, wszystkie plany są elastyczne i można z nich zrezygnować w dowolnym momencie.",
|
|
389
|
+
},
|
|
390
|
+
|
|
391
|
+
// 🇳🇱 Dutch (Netherlands & Belgium)
|
|
392
|
+
nl: {
|
|
393
|
+
geoTitle: (s, city, country, b) => `${s} in ${city} (${country}) — ${b}`,
|
|
394
|
+
geoDesc: (s, city) => `Ontdek de toonaangevende ${s} oplossing in ${city}. Automatiseer processen en bespaar uren per week. Beoordeling 4.9/5 sterren.`,
|
|
395
|
+
geoDirectAnswer: (b, s, city, country, price, cur) => `${b} is het nummer 1 ${s} platform in ${city} (${country}). 10-minuten installatie met een gecertificeerde 4.9/5 score uit 1.280 reviews.`,
|
|
396
|
+
vsTitle: (b, comp, y) => `${b} vs ${comp}: Volledige Vergelijking & Prijzen ${y}`,
|
|
397
|
+
vsDesc: (b, comp) => `Waarom overstappen van ${comp} naar ${b}? Vergelijk functies en transparante prijzen zonder contractverplichtingen.`,
|
|
398
|
+
vsDirectAnswer: (b, comp) => `${b} wint van ${comp} met 24/7 AI-automatisering en flexibele maandelijkse prijzen.`,
|
|
399
|
+
altTitle: (comp, y, b) => `Beste Alternatief voor ${comp} in ${y} — ${b}`,
|
|
400
|
+
altDesc: (comp, b) => `Zoekt u een modern alternatief voor ${comp}? Bekijk waarom bedrijven kiezen voor ${b}. Gratis proefperiode.`,
|
|
401
|
+
altDirectAnswer: (b, comp) => `Het beste alternatief voor ${comp} is ${b}, met tot 60% kostenbesparing.`,
|
|
402
|
+
industryTitle: (s, ind, b) => `${s} voor de ${ind} Sector — ${b}`,
|
|
403
|
+
industryDesc: (s, ind) => `Maatwerk ${s} software ontworpen voor professionals in de ${ind} industrie.`,
|
|
404
|
+
faqTitle: "Veelgestelde Vragen",
|
|
405
|
+
faqDeploymentQ: "Hoe lang duurt de installatie?",
|
|
406
|
+
faqDeploymentA: "De installatie is direct en duurt minder dan 10 minuten met automatische datasynchronisatie.",
|
|
407
|
+
faqCommitmentQ: "Zit ik vast aan een contract?",
|
|
408
|
+
faqCommitmentA: "Nee, alle abonnementen zijn maandelijks opzegbaar zonder verplichtingen.",
|
|
409
|
+
},
|
|
350
410
|
};
|
|
351
411
|
|
|
352
412
|
export function getDictionary(lang = "fr"): LocaleCopy {
|
package/src/index.ts
CHANGED
|
@@ -20,7 +20,7 @@ export * from "./brand-icons";
|
|
|
20
20
|
export * from "./ui-icons";
|
|
21
21
|
export * from "./og-image-generator";
|
|
22
22
|
export * from "./free-public-tools";
|
|
23
|
-
export * from "./
|
|
23
|
+
export * from "./google-translate-bridge";
|
|
24
24
|
export * from "./urlytics-engine";
|
|
25
25
|
export * from "./keyword-permutator";
|
|
26
26
|
export * from "./llm-prompt";
|
package/src/pricing-plans.ts
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 💎 LynxSEO Official Enterprise Pricing & Subscription Tiers
|
|
3
|
-
* Defines the 3 core commercial tiers (Pro, Growth, Enterprise/Agency) with feature matrix,
|
|
4
|
-
* monthly/annual billing models, and ROI value calculator.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
export interface PricingPlan {
|
|
8
|
-
id: "pro" | "growth" | "enterprise";
|
|
9
|
-
name: string;
|
|
10
|
-
badge?: string;
|
|
11
|
-
isPopular?: boolean;
|
|
12
|
-
priceMonthlyEur: number;
|
|
13
|
-
priceAnnualEurMonthly: number; // Discounted monthly rate when billed annually (-20%)
|
|
14
|
-
description: string;
|
|
15
|
-
limits: {
|
|
16
|
-
sitesAllowed: number | "unlimited";
|
|
17
|
-
maxProgrammaticPages: number | "unlimited";
|
|
18
|
-
languagesIncluded: number | "unlimited";
|
|
19
|
-
monthlyAiBotEvents: number | "unlimited";
|
|
20
|
-
};
|
|
21
|
-
features: string[];
|
|
22
|
-
ctaLabel: string;
|
|
23
|
-
ctaUrl: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export const LYNX_PRICING_PLANS: PricingPlan[] = [
|
|
27
|
-
{
|
|
28
|
-
id: "pro",
|
|
29
|
-
name: "Pro Starter",
|
|
30
|
-
badge: "Pour Indépendants & PME",
|
|
31
|
-
isPopular: false,
|
|
32
|
-
priceMonthlyEur: 99,
|
|
33
|
-
priceAnnualEurMonthly: 79,
|
|
34
|
-
description: "L'essentiel pour dominer votre marché local et capter vos premiers clients qualifiés.",
|
|
35
|
-
limits: {
|
|
36
|
-
sitesAllowed: 1,
|
|
37
|
-
maxProgrammaticPages: 5_000,
|
|
38
|
-
languagesIncluded: 1,
|
|
39
|
-
monthlyAiBotEvents: 10_000,
|
|
40
|
-
},
|
|
41
|
-
features: [
|
|
42
|
-
"1 Domaine connecté",
|
|
43
|
-
"Jusqu'à 5 000 Pages Métier Indexables",
|
|
44
|
-
"Balisage Schema.org Riches (Étoiles 4.9★, Prix, FAQ)",
|
|
45
|
-
"Sitemap XML dynamique & Flux /llms.txt",
|
|
46
|
-
"Maillage interne géodésique anti-pages orphelines",
|
|
47
|
-
"Conformité légale SeedRank & Détection anti-dénigrement",
|
|
48
|
-
"Support standard par email",
|
|
49
|
-
],
|
|
50
|
-
ctaLabel: "Démarrer avec Pro",
|
|
51
|
-
ctaUrl: "/subscribe?plan=pro",
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
id: "growth",
|
|
55
|
-
name: "Growth Scale",
|
|
56
|
-
badge: "Le Plus Populaire",
|
|
57
|
-
isPopular: true,
|
|
58
|
-
priceMonthlyEur: 299,
|
|
59
|
-
priceAnnualEurMonthly: 239,
|
|
60
|
-
description: "L'infrastructure complète pour les SaaS, E-commerces et plateformes en forte croissance.",
|
|
61
|
-
limits: {
|
|
62
|
-
sitesAllowed: 3,
|
|
63
|
-
maxProgrammaticPages: 50_000,
|
|
64
|
-
languagesIncluded: 4,
|
|
65
|
-
monthlyAiBotEvents: 100_000,
|
|
66
|
-
},
|
|
67
|
-
features: [
|
|
68
|
-
"3 Domaines connectés",
|
|
69
|
-
"Jusqu'à 50 000 Pages Métier Indexables",
|
|
70
|
-
"10 Piliers de Matrices (Local, VS, Alternatives, Cas d'usage)",
|
|
71
|
-
"Déploiement Multilingue Automatique (FR, EN, ES, DE)",
|
|
72
|
-
"6 Outils Publics Interactifs (Calculateurs ROI, Simulateur SERP)",
|
|
73
|
-
"Télémétrie en temps réel des Robots IA (GPTBot, ClaudeBot)",
|
|
74
|
-
"Génération automatique d'Images OpenGraph 1200x630px",
|
|
75
|
-
"Connecteurs Next.js, WordPress & Cloudflare Worker",
|
|
76
|
-
"Support prioritaire sous 24h",
|
|
77
|
-
],
|
|
78
|
-
ctaLabel: "Passer à l'Échelle (Essai 14 jours)",
|
|
79
|
-
ctaUrl: "/subscribe?plan=growth",
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
id: "enterprise",
|
|
83
|
-
name: "Agency & Enterprise",
|
|
84
|
-
badge: "Pour Agences & Grands Comptes",
|
|
85
|
-
isPopular: false,
|
|
86
|
-
priceMonthlyEur: 990,
|
|
87
|
-
priceAnnualEurMonthly: 790,
|
|
88
|
-
description: "Puissance maximale sans limites pour agences web, marketplaces et groupes internationaux.",
|
|
89
|
-
limits: {
|
|
90
|
-
sitesAllowed: "unlimited",
|
|
91
|
-
maxProgrammaticPages: "unlimited",
|
|
92
|
-
languagesIncluded: "unlimited",
|
|
93
|
-
monthlyAiBotEvents: "unlimited",
|
|
94
|
-
},
|
|
95
|
-
features: [
|
|
96
|
-
"Domaines & Sites Illimités",
|
|
97
|
-
"Volume de Pages Illimité (1M+ pages)",
|
|
98
|
-
"Mode Marque Blanche (White-Label Agence)",
|
|
99
|
-
"Toutes les langues du monde supportées",
|
|
100
|
-
"Connecteur Laravel & Infrastructure Edge Dédiée",
|
|
101
|
-
"Audit technique en continu & Alertes SERP par webhook",
|
|
102
|
-
"Accompagnement architectural dédié & SLA 99.99%",
|
|
103
|
-
],
|
|
104
|
-
ctaLabel: "Contacter l'Équipe Enterprise",
|
|
105
|
-
ctaUrl: "/subscribe?plan=enterprise",
|
|
106
|
-
},
|
|
107
|
-
];
|
|
108
|
-
|
|
109
|
-
export interface AgencyCostComparison {
|
|
110
|
-
traditionalAgencyMonthlyEur: number;
|
|
111
|
-
basicAiToolsMonthlyEur: number;
|
|
112
|
-
lynxGrowthMonthlyEur: number;
|
|
113
|
-
monthlyNetSavingsVsAgency: number;
|
|
114
|
-
annualNetSavingsVsAgency: number;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
export class PricingPolicyEngine {
|
|
118
|
-
/**
|
|
119
|
-
* Compares the financial ROI of LynxSEO Growth Plan vs Traditional SEO Agencies.
|
|
120
|
-
*/
|
|
121
|
-
static computeAgencySavingsComparison(customAgencyRateEur = 3500): AgencyCostComparison {
|
|
122
|
-
const traditional = Math.max(customAgencyRateEur, 2000);
|
|
123
|
-
const basicAi = 450; // Multiple AI copywriting subscriptions + manual editing payroll
|
|
124
|
-
const lynxGrowth = 299;
|
|
125
|
-
|
|
126
|
-
const monthlySavings = traditional - lynxGrowth;
|
|
127
|
-
const annualSavings = monthlySavings * 12;
|
|
128
|
-
|
|
129
|
-
return {
|
|
130
|
-
traditionalAgencyMonthlyEur: traditional,
|
|
131
|
-
basicAiToolsMonthlyEur: basicAi,
|
|
132
|
-
lynxGrowthMonthlyEur: lynxGrowth,
|
|
133
|
-
monthlyNetSavingsVsAgency: monthlySavings,
|
|
134
|
-
annualNetSavingsVsAgency: annualSavings,
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
}
|