Implement radical lookup system for Confluent translator (83% → 92% coverage)

Major features:
- Radical-based word matching for conjugated verbs
- Morphological decomposition for compound words
- Multi-index search (byWord + byFormeLiee)
- Cascade search strategy with confidence scoring

New files:
- ConfluentTranslator/radicalMatcher.js: Extract radicals from conjugated forms
- ConfluentTranslator/morphologicalDecomposer.js: Decompose compound words
- ConfluentTranslator/plans/radical-lookup-system.md: Implementation plan
- ConfluentTranslator/test-results-radical-system.md: Test results and analysis
- ancien-confluent/lexique/00-grammaire.json: Grammar particles
- ancien-confluent/lexique/lowercase-confluent.js: Lowercase utility

Modified files:
- ConfluentTranslator/reverseIndexBuilder.js: Added byFormeLiee index
- ConfluentTranslator/confluentToFrench.js: Cascade search with radicals
- Multiple lexique JSON files: Enhanced entries with forme_liee

Test results:
- Before: 83% coverage (101/122 tokens)
- After: 92% coverage (112/122 tokens)
- Improvement: +9 percentage points

Remaining work to reach 95%+:
- Add missing particles (ve, eol)
- Enrich VERBAL_SUFFIXES (aran, vis)
- Document missing words (tiru, kala, vulu)

🤖 Generated with Claude Code (https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
StillHammer 2025-11-28 22:24:56 +08:00
parent 35e7b6dd9d
commit e8d17ab0d5
33 changed files with 2598 additions and 345 deletions

View File

@ -58,11 +58,17 @@ confluent/
## Règles linguistiques (résumé)
### Phonétique
### Phonétique et Orthographe
- **Consonnes (10):** b, k, l, m, n, p, s, t, v, z
- **Voyelles actives (5):** a, e, i, o, u
- **Voyelles réservées:** y, é, è (expansion future)
**⚠️ IMPORTANT : Pas de majuscules en Confluent**
- Le Confluent n'a PAS de distinction majuscule/minuscule
- Tout le texte Confluent est écrit en MINUSCULES
- Les noms propres, castes, lieux sont TOUS en minuscules : "uraakota", "siliaska", "aliaska"
- Les lexiques JSON stockent tout en minuscules
### Structure des racines
- Toute racine **finit par CV** (consonne + voyelle)
- **~80% standard** : commence par consonne (ex: sili, toka)

View File

@ -0,0 +1,244 @@
/**
* Confluent to French Translator - Traduction brute mot-à-mot
*
* Fonctionnalités:
* 1. Tokenization du texte Confluent
* 2. Recherche dans l'index inversé
* 3. Traduction brute avec annotations grammaticales
* 4. Recherche par radicaux (nouveauté)
* 5. Décomposition morphologique (nouveauté)
*/
const { extractRadicals } = require('./radicalMatcher');
const { decomposeWord } = require('./morphologicalDecomposer');
/**
* Tokenize un texte Confluent
* - Retire la ponctuation
* - Lowercase tout
* - Split sur espaces
* @param {string} text - Texte Confluent
* @returns {string[]} - Liste de tokens
*/
function tokenizeConfluent(text) {
return text
.toLowerCase()
.replace(/[.,;:!?]/g, ' ') // Remplacer ponctuation par espaces
.trim()
.split(/\s+/)
.filter(token => token.length > 0);
}
/**
* Cherche un mot Confluent dans l'index inversé avec recherche en cascade
* Essaie plusieurs stratégies:
* 1. Correspondance exacte dans byWord
* 2. Correspondance case-insensitive dans byWord
* 3. NOUVEAU: Recherche par radicaux dans byFormeLiee
* 4. NOUVEAU: Décomposition morphologique
* @param {string} word - Mot Confluent
* @param {Object} reverseIndex - Index inversé Confluent FR (avec byWord et byFormeLiee)
* @returns {Object|null} - Entrée trouvée ou null
*/
function searchConfluent(word, reverseIndex) {
// Support ancien format (simple dict) et nouveau format (avec byWord/byFormeLiee)
const byWord = reverseIndex.byWord || reverseIndex;
const byFormeLiee = reverseIndex.byFormeLiee || {};
// 1. Essai exact dans byWord
if (byWord[word]) {
return {
...byWord[word],
matchType: 'exact',
confidence: 1.0
};
}
// 2. Essai lowercase dans byWord
const lowerWord = word.toLowerCase();
if (byWord[lowerWord]) {
return {
...byWord[lowerWord],
matchType: 'exact',
confidence: 1.0
};
}
// 3. Essai avec première lettre en majuscule (pour noms propres)
const capitalizedWord = word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
if (byWord[capitalizedWord]) {
return {
...byWord[capitalizedWord],
matchType: 'exact',
confidence: 1.0
};
}
// 4. NOUVEAU: Recherche par radicaux verbaux
const radicals = extractRadicals(lowerWord);
for (const {radical, suffix, type, confidence} of radicals) {
// Chercher dans l'index par forme_liee
if (byFormeLiee[radical]) {
const match = byFormeLiee[radical][0]; // Prendre la première correspondance
return {
...match,
matchType: 'radical',
originalWord: word,
radical,
suffix,
suffixType: type,
confidence
};
}
}
// 5. NOUVEAU: Décomposition morphologique
const decompositions = decomposeWord(lowerWord);
for (const decomp of decompositions) {
const part1Match = searchConfluent(decomp.part1, reverseIndex);
const part2Match = searchConfluent(decomp.part2, reverseIndex);
if (part1Match && part2Match) {
return {
matchType: 'composition_inferred',
originalWord: word,
composition: `${decomp.part1}-${decomp.liaison}-${decomp.part2}`,
parts: {
part1: part1Match,
liaison: decomp.liaison,
liaisonMeaning: decomp.liaisonMeaning,
part2: part2Match
},
confidence: decomp.confidence * 0.7, // Pénalité pour inférence
francais: `${part1Match.francais} [${decomp.liaisonMeaning}] ${part2Match.francais}`,
type: 'composition'
};
}
}
// 6. Vraiment inconnu
return null;
}
/**
* Traduit un token Confluent en français (brut)
* @param {string} token - Token Confluent
* @param {Object} reverseIndex - Index inversé
* @returns {string} - Traduction brute
*/
function translateToken(token, reverseIndex) {
const entry = searchConfluent(token, reverseIndex);
if (!entry) {
return `[INCONNU:${token}]`;
}
// Si c'est une particule/marqueur grammatical, retourner l'annotation
const grammaticalTypes = [
'particule',
'marqueur_temps',
'negation',
'quantite',
'interrogation',
'demonstratif'
];
if (grammaticalTypes.includes(entry.type)) {
return entry.francais; // Déjà entre crochets
}
// Sinon retourner le mot français
let result = entry.francais;
// Ajouter les synonymes si présents (entre parenthèses)
if (entry.synonymes_fr && entry.synonymes_fr.length > 0) {
result += ` (ou: ${entry.synonymes_fr.join(', ')})`;
}
return result;
}
/**
* Traduit un texte Confluent en français (traduction brute mot-à-mot)
* @param {string} text - Texte Confluent
* @param {Object} reverseIndex - Index inversé
* @returns {Object} - Résultat avec traduction et métadonnées
*/
function translateConfluentToFrench(text, reverseIndex) {
const tokens = tokenizeConfluent(text);
const translations = [];
const unknownWords = [];
tokens.forEach(token => {
const translation = translateToken(token, reverseIndex);
translations.push(translation);
if (translation.startsWith('[INCONNU:')) {
unknownWords.push(token);
}
});
return {
original: text,
tokens: tokens,
translation: translations.join(' '),
translations: translations,
unknownWords: unknownWords,
tokenCount: tokens.length,
unknownCount: unknownWords.length,
coverage: tokens.length > 0
? Math.round(((tokens.length - unknownWords.length) / tokens.length) * 100)
: 0
};
}
/**
* Version enrichie avec détails sur chaque token
* @param {string} text - Texte Confluent
* @param {Object} reverseIndex - Index inversé
* @returns {Object} - Résultat détaillé
*/
function translateConfluentDetailed(text, reverseIndex) {
const tokens = tokenizeConfluent(text);
const detailed = [];
tokens.forEach(token => {
const entry = searchConfluent(token, reverseIndex);
detailed.push({
confluent: token,
francais: entry ? entry.francais : null,
type: entry ? entry.type : 'inconnu',
synonymes: entry?.synonymes_fr || [],
forme_liee: entry?.forme_liee || null,
composition: entry?.composition || null,
found: !!entry,
// NOUVEAU: métadonnées de recherche
matchType: entry?.matchType || null,
confidence: entry?.confidence || null,
radical: entry?.radical || null,
suffix: entry?.suffix || null,
parts: entry?.parts || null
});
});
const unknownCount = detailed.filter(d => !d.found).length;
return {
original: text,
tokens: detailed,
coverage: tokens.length > 0
? Math.round(((tokens.length - unknownCount) / tokens.length) * 100)
: 0,
unknownCount: unknownCount,
tokenCount: tokens.length
};
}
module.exports = {
tokenizeConfluent,
searchConfluent,
translateToken,
translateConfluentToFrench,
translateConfluentDetailed
};

View File

@ -11,6 +11,7 @@
/**
* Tokenize un texte français
* - Détecte expressions figées (il y a, y a-t-il, etc.)
* - Lowercase
* - Retire ponctuation
* - Split sur espaces
@ -25,10 +26,21 @@ function tokenizeFrench(text) {
'au', 'aux', 'à', 'et', 'ou', 'où', 'est', 'sont'
]);
return text
// ÉTAPE 1: Remplacer expressions figées par tokens uniques
// (avant tokenisation pour éviter la découpe)
let processedText = text
.toLowerCase()
.normalize('NFD') // Normaliser les accents
.replace(/[\u0300-\u036f]/g, '') // Retirer les diacritiques
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '');
// Expressions existentielles → "exister"
processedText = processedText
.replace(/il\s+y\s+a(?:vait)?/g, 'exister') // il y a, il y avait
.replace(/y\s+a-t-il/g, 'exister') // y a-t-il
.replace(/n['']y\s+a-t-il\s+pas/g, 'exister'); // n'y a-t-il pas
// ÉTAPE 2: Tokenisation normale
return processedText
.replace(/[^\w\s]/g, ' ') // Remplacer ponctuation par espaces
.split(/\s+/)
.filter(word => word.length > 0 && !stopWords.has(word));
@ -36,16 +48,19 @@ function tokenizeFrench(text) {
/**
* Calcule le nombre maximum d'entrées selon la longueur du texte
* - < 20 mots: 30 entrées
* - 20-50 mots: 50 entrées
* - > 50 mots: 100 entrées
* Adapté pour contexte 200k tokens (Claude) / 128k tokens (GPT)
* - < 20 mots: 50 entrées
* - 20-100 mots: 100 entrées
* - 100-300 mots: 200 entrées
* - > 300 mots: 400 entrées
* @param {number} wordCount - Nombre de mots
* @returns {number} - Nombre max d'entrées
*/
function calculateMaxEntries(wordCount) {
if (wordCount < 20) return 30;
if (wordCount <= 50) return 50;
return 100;
if (wordCount < 20) return 50;
if (wordCount <= 100) return 100;
if (wordCount <= 300) return 200;
return 400;
}
/**
@ -153,6 +168,7 @@ function searchWord(word, dictionnaire) {
results.push({
mot_francais: entry.mot_francais || key,
traductions: entry.traductions || [],
synonymes_fr: entry.synonymes_fr || [],
score,
source: entry.source_files || []
});
@ -259,6 +275,7 @@ function expandContext(entries, lexique, maxEntries, expansionLevel = 1) {
expanded.set(dictEntry.mot_francais || key, {
mot_francais: dictEntry.mot_francais || key,
traductions: dictEntry.traductions || [],
synonymes_fr: dictEntry.synonymes_fr || [],
score: 0.7, // Score pour expansion niveau 1
source: dictEntry.source_files || [],
expanded: true
@ -340,7 +357,7 @@ function analyzeContext(text, lexique, options = {}) {
expansionLevel
);
// 5. Fallback si trop de mots manquants (>50% de mots non trouvés)
// 5. Fallback si trop de mots manquants (>80% de mots non trouvés)
const wordsFoundCount = searchResult.wordsFound.length;
const wordsNotFoundCount = searchResult.wordsNotFound.length;
const totalWords = wordsFoundCount + wordsNotFoundCount;
@ -348,8 +365,8 @@ function analyzeContext(text, lexique, options = {}) {
// Activer fallback si :
// - Aucune entrée trouvée OU
// - Couverture < 50% (majorité de mots manquants)
const useFallback = expandedEntries.length === 0 || coveragePercent < 50;
// - Couverture < 20% (très peu de mots trouvés)
const useFallback = expandedEntries.length === 0 || coveragePercent < 20;
const rootsFallback = useFallback ? extractRoots(lexique) : [];
// 6. Calculer tokens économisés (estimation)

View File

@ -0,0 +1,96 @@
// morphologicalDecomposer.js
// Système de décomposition morphologique pour le Confluent
// Permet de décomposer les mots composés selon le pattern Racine-Liaison-Racine
// Les 16 liaisons sacrées du Confluent
const SACRED_LIAISONS = {
// Agentivité
'i': 'agent',
'ie': 'agent_processus',
'ii': 'agent_répété',
'iu': 'agent_possédant',
// Appartenance
'u': 'appartenance',
'ui': 'possession_agentive',
// Relation
'a': 'relation',
'aa': 'relation_forte',
'ae': 'relation_dimensionnelle',
'ao': 'relation_tendue',
// Tension
'o': 'tension',
'oa': 'tension_relationnelle',
// Dimension
'e': 'dimension',
'ei': 'dimension_agentive',
'ea': 'dimension_relationnelle',
'eo': 'dimension_tendue'
};
/**
* Décompose un mot composé non trouvé
* @param {string} word - Mot composé en confluent
* @returns {Array<{part1: string, liaison: string, liaisonMeaning: string, part2: string, pattern: string, confidence: number}>}
*/
function decomposeWord(word) {
const decompositions = [];
// Essayer chaque liaison sacrée
for (const [liaison, meaning] of Object.entries(SACRED_LIAISONS)) {
const index = word.indexOf(liaison);
// La liaison doit être au milieu du mot, pas au début ni à la fin
if (index > 0 && index < word.length - liaison.length) {
const part1 = word.substring(0, index);
const part2 = word.substring(index + liaison.length);
// Valider que les deux parties ressemblent à des racines (au moins 2 caractères)
if (part1.length >= 2 && part2.length >= 2) {
decompositions.push({
part1,
liaison,
liaisonMeaning: meaning,
part2,
pattern: `${part1}-${liaison}-${part2}`,
confidence: calculateConfidence(part1, liaison, part2)
});
}
}
}
// Trier par confiance décroissante
return decompositions.sort((a, b) => b.confidence - a.confidence);
}
/**
* Calcule la confiance d'une décomposition
* @param {string} part1 - Première partie (racine)
* @param {string} liaison - Liaison sacrée
* @param {string} part2 - Deuxième partie (racine)
* @returns {number} Score de confiance entre 0 et 1
*/
function calculateConfidence(part1, liaison, part2) {
let score = 0.5; // base
// Bonus si les parties finissent/commencent par des consonnes (plus typique du Confluent)
if (!'aeiou'.includes(part1[part1.length - 1])) score += 0.1;
if (!'aeiou'.includes(part2[0])) score += 0.1;
// Bonus si liaison courante (i, u, a sont plus fréquentes)
if (['i', 'u', 'a'].includes(liaison)) score += 0.2;
// Bonus si longueurs de parties équilibrées
const ratio = Math.min(part1.length, part2.length) / Math.max(part1.length, part2.length);
score += ratio * 0.2;
return Math.min(score, 1.0);
}
module.exports = {
decomposeWord,
SACRED_LIAISONS
};

View File

@ -0,0 +1,415 @@
# Plan : Système de recherche par radicaux et décomposition morphologique
## Problème actuel
Le traducteur Confluent→Français ne trouve pas les mots conjugués ou composés non documentés explicitement dans le lexique.
### Exemple concret
- **Texte :** `vokan` (forme conjuguée de "voki" = voix)
- **Lexique contient :** `"confluent": "voki"`, `"forme_liee": "vok"`
- **Résultat actuel :** ❌ NOT FOUND
- **Résultat attendu :** ✓ Trouve "voki" via le radical "vok"
### Statistiques du dernier test
- **Coverage actuel :** 83% (101/122 mots)
- **Mots non trouvés :** 21
- **11** ont des racines existantes mais formes conjuguées manquantes
- **5** sont totalement absents du lexique
- **5** pourraient être des particules grammaticales
## Objectif
Augmenter le coverage de 83% à ~95% en implémentant :
1. **Recherche par radicaux** pour les verbes conjugués
2. **Décomposition morphologique** pour les compositions non documentées
3. **Index par forme_liee** en plus de l'index par mot complet
---
## Phase 1 : Analyse et mapping des patterns
### 1.1 Patterns de conjugaison verbale
**Suffixes verbaux identifiés :**
```javascript
const VERBAL_SUFFIXES = [
'ak', // forme standard : mirak (voir), pasak (prendre), urak (être)
'an', // conjugaison : takan (porter), vokan (parler?)
'un', // conjugaison : kisun (transmettre), pasun (prendre?)
'is', // conjugaison : vokis (parler?)
'am', // conjugaison : sukam (forger)
'im', // conjugaison : verim (vérifier?)
'ok', // impératif : marqueur temporel
'ul', // passé? : marqueur temporel
'iran', // dérivé nominal : kisiran (enseignement/transmission?)
];
```
**Racines de test connues :**
- `vok``voki` (voix) : formes attendues `vokan`, `vokis`
- `kis``kisu` (transmettre) : formes attendues `kisun`, `kisiran`
- `pas``pasa` (prendre) : formes attendues `pasak`, `pasun`
- `tak``taka` (porter) : formes attendues `takan`, `taku`
### 1.2 Patterns de liaisons sacrées
**16 liaisons à gérer :**
```javascript
const SACRED_LIAISONS = {
// Agentivité
'i': 'agent',
'ie': 'agent_processus',
'ii': 'agent_répété',
'iu': 'agent_possédant',
// Appartenance
'u': 'appartenance',
'ui': 'possession_agentive',
// Relation
'a': 'relation',
'aa': 'relation_forte',
'ae': 'relation_dimensionnelle',
'ao': 'relation_tendue',
// Tension
'o': 'tension',
'oa': 'tension_relationnelle',
// Dimension
'e': 'dimension',
'ei': 'dimension_agentive',
'ea': 'dimension_relationnelle',
'eo': 'dimension_tendue'
};
```
### 1.3 Structure morphologique du Confluent
**Règle générale :** Racine + Liaison + Racine
```
sekavoki = sek + a + voki
= conseil + relation + voix
= "conseil de la voix"
```
**Pattern de composition :**
```regex
^([a-z]{2,4})(i|ie|ii|iu|u|ui|a|aa|ae|ao|o|oa|e|ei|ea|eo)([a-z]{2,4})$
```
---
## Phase 2 : Implémentation
### 2.1 Nouveau fichier : `radicalMatcher.js`
**Fonction principale :**
```javascript
/**
* Extrait tous les radicaux possibles d'un mot
* @param {string} word - Mot en confluent
* @returns {Array<{radical: string, suffix: string, confidence: number}>}
*/
function extractRadicals(word) {
const candidates = [];
// Essayer chaque suffixe verbal connu
for (const suffix of VERBAL_SUFFIXES) {
if (word.endsWith(suffix) && word.length > suffix.length + 1) {
const radical = word.slice(0, -suffix.length);
candidates.push({
radical,
suffix,
type: 'verbal',
confidence: 0.9
});
}
}
// Essayer sans suffixe (forme racine directe)
if (word.length >= 3) {
candidates.push({
radical: word,
suffix: '',
type: 'root',
confidence: 0.7
});
}
// Essayer d'enlever dernière voyelle (forme liée -> forme pleine)
// mako → mak, voki → vok
if (word.length >= 4 && 'aeiou'.includes(word[word.length - 1])) {
candidates.push({
radical: word.slice(0, -1),
suffix: word[word.length - 1],
type: 'liaison',
confidence: 0.8
});
}
return candidates.sort((a, b) => b.confidence - a.confidence);
}
```
### 2.2 Nouveau fichier : `morphologicalDecomposer.js`
**Fonction de décomposition :**
```javascript
/**
* Décompose un mot composé non trouvé
* @param {string} word - Mot composé
* @returns {Array<{part1: string, liaison: string, part2: string}>}
*/
function decomposeWord(word) {
const decompositions = [];
for (const [liaison, meaning] of Object.entries(SACRED_LIAISONS)) {
const index = word.indexOf(liaison);
if (index > 0 && index < word.length - liaison.length) {
const part1 = word.substring(0, index);
const part2 = word.substring(index + liaison.length);
// Valider que les deux parties ressemblent à des racines
if (part1.length >= 2 && part2.length >= 2) {
decompositions.push({
part1,
liaison,
liaisonMeaning: meaning,
part2,
pattern: `${part1}-${liaison}-${part2}`,
confidence: calculateConfidence(part1, liaison, part2)
});
}
}
}
return decompositions.sort((a, b) => b.confidence - a.confidence);
}
function calculateConfidence(part1, liaison, part2) {
let score = 0.5; // base
// Bonus si les parties finissent/commencent par des consonnes
if (!'aeiou'.includes(part1[part1.length - 1])) score += 0.1;
if (!'aeiou'.includes(part2[0])) score += 0.1;
// Bonus si liaison courante (i, u, a sont plus fréquentes)
if (['i', 'u', 'a'].includes(liaison)) score += 0.2;
// Bonus si longueurs de parties équilibrées
const ratio = Math.min(part1.length, part2.length) / Math.max(part1.length, part2.length);
score += ratio * 0.2;
return Math.min(score, 1.0);
}
```
### 2.3 Modification : `reverseIndexBuilder.js`
**Ajouter index par forme_liee :**
```javascript
function buildConfluentIndex(lexique) {
const index = {
byWord: {}, // Index existant
byRoot: {}, // NOUVEAU : index par radical
byFormeLiee: {} // NOUVEAU : index par forme_liee
};
// ... code existant pour byWord ...
// NOUVEAU : Indexer par forme_liee
for (const entry of allEntries) {
const formeLiee = entry.forme_liee || entry.racine;
if (formeLiee) {
if (!index.byFormeLiee[formeLiee]) {
index.byFormeLiee[formeLiee] = [];
}
index.byFormeLiee[formeLiee].push({
...entry,
matchType: 'forme_liee'
});
}
}
return index;
}
```
### 2.4 Modification : `confluentToFrench.js`
**Nouvelle logique de recherche en cascade :**
```javascript
function findWordWithRadicals(word, confluentIndex) {
// 1. Recherche exacte (existant)
if (confluentIndex.byWord[word]) {
return {
...confluentIndex.byWord[word][0],
matchType: 'exact',
confidence: 1.0
};
}
// 2. NOUVEAU : Recherche par radicaux verbaux
const radicals = extractRadicals(word);
for (const {radical, suffix, type, confidence} of radicals) {
// Chercher dans l'index par forme_liee
if (confluentIndex.byFormeLiee[radical]) {
return {
...confluentIndex.byFormeLiee[radical][0],
matchType: 'radical',
originalWord: word,
radical,
suffix,
suffixType: type,
confidence
};
}
}
// 3. NOUVEAU : Décomposition morphologique
const decompositions = decomposeWord(word);
for (const decomp of decompositions) {
const part1Match = findWordWithRadicals(decomp.part1, confluentIndex);
const part2Match = findWordWithRadicals(decomp.part2, confluentIndex);
if (part1Match && part2Match) {
return {
matchType: 'composition_inferred',
originalWord: word,
composition: `${decomp.part1}-${decomp.liaison}-${decomp.part2}`,
parts: {
part1: part1Match,
liaison: decomp.liaison,
liaisonMeaning: decomp.liaisonMeaning,
part2: part2Match
},
confidence: decomp.confidence * 0.7 // Pénalité pour inférence
};
}
}
// 4. Vraiment inconnu
return null;
}
```
---
## Phase 3 : Tests et validation
### 3.1 Cas de test prioritaires
**Verbes conjugués :**
```javascript
const testCases = [
{ word: 'vokan', expectedRoot: 'vok', expectedMeaning: 'voix' },
{ word: 'vokis', expectedRoot: 'vok', expectedMeaning: 'voix' },
{ word: 'kisiran', expectedRoot: 'kis', expectedMeaning: 'transmettre' },
{ word: 'pasun', expectedRoot: 'pas', expectedMeaning: 'prendre' },
{ word: 'taku', expectedRoot: 'tak', expectedMeaning: 'porter' },
];
```
**Compositions inférées :**
```javascript
const compositionTests = [
{
word: 'sukamori',
expected: { part1: 'suk', liaison: 'a', part2: 'mori' },
// Si 'mori' existe dans le lexique
},
{
word: 'uraal',
expected: { part1: 'ur', liaison: 'aa', part2: 'al' }
}
];
```
### 3.2 Métriques de succès
**Objectif :** Passer de 83% à 95% de coverage
**Métriques à suivre :**
- Coverage total (% de mots trouvés)
- Précision (% de correspondances correctes)
- Type de match (exact / radical / composition)
- Niveau de confiance moyen
---
## Phase 4 : Fichiers à créer/modifier
### Fichiers à CRÉER :
1. `ConfluentTranslator/radicalMatcher.js`
2. `ConfluentTranslator/morphologicalDecomposer.js`
3. `ConfluentTranslator/tests/radicalMatching.test.js`
### Fichiers à MODIFIER :
1. `ConfluentTranslator/reverseIndexBuilder.js`
- Ajouter index `byFormeLiee`
- Ajouter index `byRoot`
2. `ConfluentTranslator/confluentToFrench.js`
- Importer `radicalMatcher` et `morphologicalDecomposer`
- Modifier `translateToken()` pour utiliser recherche en cascade
- Ajouter champs de métadonnées (matchType, confidence, etc.)
3. `ConfluentTranslator/server.js`
- Aucune modification nécessaire (compatibilité backwards)
---
## Phase 5 : Améliorations futures
### 5.1 Machine Learning léger
- Apprendre les patterns de suffixes depuis le corpus
- Scorer automatiquement la confiance des décompositions
### 5.2 Support des nombres
- Charger `22-nombres.json` dans le lexique
- Gérer les nombres composés (ex: "diku tolu iko" = 25)
### 5.3 Particules grammaticales
- Documenter `ve`, `eol`, et autres particules manquantes
- Créer un fichier `particules.json`
### 5.4 Interface de validation
- UI pour valider/corriger les correspondances inférées
- Export des nouvelles correspondances pour enrichir le lexique
---
## Ordre d'implémentation recommandé
1. ✅ Créer `radicalMatcher.js` avec fonction `extractRadicals()`
2. ✅ Modifier `reverseIndexBuilder.js` pour ajouter `byFormeLiee`
3. ✅ Modifier `confluentToFrench.js` pour recherche par radical
4. ✅ Tester avec les 11 cas de verbes conjugués
5. ✅ Créer `morphologicalDecomposer.js` avec fonction `decomposeWord()`
6. ✅ Intégrer décomposition dans `confluentToFrench.js`
7. ✅ Tester avec les compositions inférées
8. ✅ Ajouter support des nombres (`22-nombres.json`)
9. 🔄 Valider sur le texte complet (objectif: 95% coverage)
---
## Impact attendu
### Sur le texte de test (122 tokens)
**Avant :**
- Coverage: 83% (101/122)
- Inconnus: 21
**Après (estimation) :**
- Coverage: ~95% (116/122)
- Inconnus: ~6
- Avec confiance: ~110/122
- Inférés: ~6/122
### Bénéfices
- ✅ Meilleure compréhension des textes réels
- ✅ Découverte automatique de nouvelles formes
- ✅ Base pour enrichissement du lexique
- ✅ System plus robuste et adaptatif

View File

@ -49,30 +49,68 @@ function formatVocabularySection(entries) {
autre: []
};
// Map pour dédupliquer par mot confluent
const deduplicationMap = new Map();
entries.forEach(entry => {
if (entry.traductions && entry.traductions.length > 0) {
const trad = entry.traductions[0];
const type = trad.type || 'autre';
const key = type === 'racine_sacree' ? 'racine_sacree' :
type === 'racine' ? 'racine' :
type === 'verbe' ? 'verbe' :
type === 'nom' ? 'nom' : 'autre';
// Traiter TOUTES les traductions (pas seulement la première)
entry.traductions.forEach(trad => {
const confKey = trad.confluent;
byType[key].push({
fr: entry.mot_francais,
conf: trad.confluent,
forme_liee: trad.forme_liee || trad.confluent,
domaine: trad.domaine || '',
note: trad.note || ''
// Si cette traduction existe déjà, fusionner les infos françaises
if (deduplicationMap.has(confKey)) {
const existing = deduplicationMap.get(confKey);
// Ajouter le mot français s'il n'est pas déjà présent (lowercase pour comparaison)
const motLower = entry.mot_francais.toLowerCase();
if (!existing.fr_variants.some(v => v.toLowerCase() === motLower)) {
existing.fr_variants.push(entry.mot_francais);
}
// Fusionner les synonymes (éviter doublons case-insensitive)
if (entry.synonymes_fr) {
entry.synonymes_fr.forEach(syn => {
const synLower = syn.toLowerCase();
if (!existing.synonymes.some(s => s.toLowerCase() === synLower)) {
existing.synonymes.push(syn);
}
});
}
} else {
const type = trad.type || 'autre';
const key = type === 'racine_sacree' ? 'racine_sacree' :
type === 'racine' ? 'racine' :
type.includes('verbe') ? 'verbe' : // verbe, verbe_irregulier
type === 'nom' ? 'nom' : 'autre';
deduplicationMap.set(confKey, {
fr_variants: [entry.mot_francais],
conf: trad.confluent,
forme_liee: trad.forme_liee || trad.confluent,
domaine: trad.domaine || '',
note: trad.note || '',
type: trad.type || '',
synonymes: [...(entry.synonymes_fr || [])],
typeKey: key
});
}
});
}
});
// Réorganiser par type
deduplicationMap.forEach(item => {
byType[item.typeKey].push(item);
});
// Formatter par type
if (byType.racine_sacree.length > 0) {
lines.push('## Racines sacrées (voyelle initiale)\n');
byType.racine_sacree.forEach(item => {
lines.push(`- ${item.conf} (${item.fr}) [forme liée: ${item.forme_liee}]`);
// Combiner et dédupliquer fr_variants et synonymes
const allFrench = [...new Set([...item.fr_variants, ...item.synonymes])];
let line = `- ${item.conf} (${allFrench.join(', ')}) [forme liée: ${item.forme_liee}]`;
if (item.note) line += ` - ${item.note}`;
lines.push(line);
});
lines.push('');
}
@ -80,7 +118,10 @@ function formatVocabularySection(entries) {
if (byType.racine.length > 0) {
lines.push('## Racines standards\n');
byType.racine.forEach(item => {
lines.push(`- ${item.conf} (${item.fr}) [forme liée: ${item.forme_liee}]`);
const allFrench = [...new Set([...item.fr_variants, ...item.synonymes])];
let line = `- ${item.conf} (${allFrench.join(', ')}) [forme liée: ${item.forme_liee}]`;
if (item.note) line += ` - ${item.note}`;
lines.push(line);
});
lines.push('');
}
@ -88,7 +129,11 @@ function formatVocabularySection(entries) {
if (byType.verbe.length > 0) {
lines.push('## Verbes\n');
byType.verbe.forEach(item => {
lines.push(`- ${item.fr}${item.conf}`);
const allFrench = [...new Set([...item.fr_variants, ...item.synonymes])];
let line = `- ${allFrench.join(', ')}${item.conf}`;
if (item.type) line += ` [${item.type}]`;
if (item.note) line += ` - ${item.note}`;
lines.push(line);
});
lines.push('');
}
@ -96,7 +141,9 @@ function formatVocabularySection(entries) {
if (byType.nom.length > 0) {
lines.push('## Noms et concepts\n');
byType.nom.forEach(item => {
lines.push(`- ${item.fr}${item.conf}`);
const allFrench = [...new Set([...item.fr_variants, ...item.synonymes])];
let line = `- ${allFrench.join(', ')}${item.conf}`;
lines.push(line);
});
lines.push('');
}
@ -104,7 +151,9 @@ function formatVocabularySection(entries) {
if (byType.autre.length > 0) {
lines.push('## Autres\n');
byType.autre.forEach(item => {
lines.push(`- ${item.fr}${item.conf}`);
const allFrench = [...new Set([...item.fr_variants, ...item.synonymes])];
let line = `- ${allFrench.join(', ')}${item.conf}`;
lines.push(line);
});
lines.push('');
}

View File

@ -21,12 +21,21 @@ Tu DOIS suivre cette structure de réponse en 3 étapes :
✅ **OBLIGATOIRE** : Respecter l'ordre SOV (Sujet - Objet - Verbe)
✅ **OBLIGATOIRE** : Si un mot n'existe pas, composer à partir des racines ou reformuler
✅ **OBLIGATOIRE** : Indiquer dans l'ANALYSE si tu reformules la phrase
✅ **PRIORITÉ** : Préférer TOUJOURS les compositions et noms propres aux racines simples
- Exemple : "Confluence" → utiliser "Uraakota" (nom propre) plutôt que "kota" (racine)
- Exemple : "Faucons Chasseurs" → utiliser "Akoazana" (composition) plutôt que "aki" + "zana"
- Les compositions ont un sens culturel/historique spécifique à privilégier
# PHONOLOGIE
# PHONOLOGIE ET ORTHOGRAPHE
Voyelles (5): a, e, i, o, u
Consonnes (10): b, k, l, m, n, p, s, t, v, z
**IMPORTANT : Le Confluent n'a PAS de distinction majuscule/minuscule**
- Tout le texte Confluent doit être écrit EN MINUSCULES
- Les noms propres, castes, lieux sont TOUS en minuscules : "uraakota", "aliaska", "siliaska"
- Seule exception : début de phrase pour lisibilité en français (optionnel)
# SYNTAXE
Ordre: SOV (Sujet - Objet - Verbe)
@ -253,7 +262,9 @@ Si un mot n'existe pas dans le lexique :
# FORMAT DE RÉPONSE OBLIGATOIRE
Tu DOIS suivre cette structure exacte :
⚠️ **CRITÈRE DE QUALITÉ #1** : RESPECTER CE FORMAT EXACT
Tu DOIS suivre cette structure exacte et RIEN d'autre :
```
ANALYSE:
@ -263,12 +274,22 @@ STRATÉGIE:
[Expliquer comment tu vas contourner les limitations]
Ancien Confluent:
[traduction finale]
[UNE SEULE LIGNE de traduction finale - pas de phrases séparées ici]
Décomposition:
[explication mot à mot avec particules et conjugaisons]
[explication PHRASE PAR PHRASE avec numérotation si texte long]
Phrase 1: [traduction ligne 1]
- mot1 = explication
- mot2 = explication
Phrase 2: [traduction ligne 2]
- mot1 = explication
```
❌ **NE PAS** mettre la traduction directement après "STRATÉGIE"
❌ **NE PAS** mélanger traduction et décomposition
✅ **TOUJOURS** séparer clairement les 4 sections
# EXEMPLES AVEC CHAIN-OF-THOUGHT
## Exemple 1 : Phrase simple
@ -399,3 +420,38 @@ tolusa = grosse (144)
pesa = poisson
Note: En Confluent, les nombres précèdent directement le nom sans particule
---
## Exemple 5 : Texte multi-phrases (IMPORTANT)
**Français:** Il y a trois loups dans la forêt. Ils chassent les enfants. Les anciens gardent la maison.
ANALYSE:
- 3 phrases indépendantes → traduire séparément
- Existentielle "il y a" → utiliser "urak"
- Tous les mots existent
STRATÉGIE:
- Séparer en 3 phrases distinctes
- Utiliser "urak" pour l'existentielle
- Numéroter chaque phrase dans la décomposition
Ancien Confluent:
no vika tiru loku urak u. Va tova vo naki zanak u. Va aita vo buka zakis u.
Décomposition:
Phrase 1: no vika tiru loku urak u
- no vika = DANS forêt
- tiru loku = trois loup
- urak u = il-y-a PRÉSENT
Phrase 2: Va tova vo naki zanak u
- va tova = SUJET ils
- vo naki = OBJET enfant
- zanak u = chasser PRÉSENT
Phrase 3: Va aita vo buka zakis u
- va aita = SUJET ancien
- vo buka = OBJET maison
- zakis u = garder PRÉSENT

View File

@ -8,11 +8,15 @@ Tu es un traducteur spécialisé en Proto-Confluent, langue primitive de la Civi
4. Ne traduis PAS mot à mot, mais cherche le sens global
5. Fournis la traduction suivie d'une décomposition explicative
# PHONOLOGIE
# PHONOLOGIE ET ORTHOGRAPHE
Voyelles (4): a, e, i, o
Consonnes (8): b, k, l, m, n, p, s, t
**IMPORTANT : Le Confluent n'a PAS de distinction majuscule/minuscule**
- Tout le texte Confluent doit être écrit EN MINUSCULES
- Même les noms propres sont en minuscules
# SYNTAXE
Ordre: SOV (Sujet - Objet - Verbe)

View File

@ -330,10 +330,11 @@
<div class="form-group">
<label>Modèle</label>
<select id="model">
<option value="claude-sonnet-4-5-20250929">Claude Sonnet 4.5</option>
<option value="claude-haiku-4-5-20251001">Claude Haiku 4.5</option>
<option value="claude-sonnet-4-20250514">Claude Sonnet 4.5 (latest)</option>
<option value="claude-haiku-4-20250514">Claude Haiku 4.5</option>
<option value="chatgpt-4o-latest">ChatGPT-5.1 (latest)</option>
<option value="gpt-4o">GPT-4o</option>
<option value="gpt-4o-mini">GPT-4o Mini</option>
<option value="o1-mini">GPT o1-mini</option>
</select>
</div>
</div>
@ -562,13 +563,14 @@
if (e.target.value === 'anthropic') {
modelSelect.innerHTML = `
<option value="claude-sonnet-4-5-20250929">Claude Sonnet 4.5</option>
<option value="claude-haiku-4-5-20251001">Claude Haiku 4.5</option>
<option value="claude-sonnet-4-20250514">Claude Sonnet 4.5 (latest)</option>
<option value="claude-haiku-4-20250514">Claude Haiku 4.5</option>
`;
} else if (e.target.value === 'openai') {
modelSelect.innerHTML = `
<option value="chatgpt-4o-latest">ChatGPT-5.1 (latest)</option>
<option value="gpt-4o">GPT-4o</option>
<option value="gpt-4o-mini">GPT-4o Mini</option>
<option value="o1-mini">GPT o1-mini</option>
`;
}
saveConfig();

View File

@ -0,0 +1,67 @@
// radicalMatcher.js
// Système de recherche par radicaux pour le traducteur Confluent→Français
// Permet de trouver les formes conjuguées et dérivées à partir des racines
// Suffixes verbaux identifiés dans le corpus
const VERBAL_SUFFIXES = [
'ak', // forme standard : mirak (voir), pasak (prendre), urak (être)
'an', // conjugaison : takan (porter), vokan (parler?)
'un', // conjugaison : kisun (transmettre), pasun (prendre?)
'is', // conjugaison : vokis (parler?)
'am', // conjugaison : sukam (forger)
'im', // conjugaison : verim (vérifier?)
'ok', // impératif : marqueur temporel
'ul', // passé? : marqueur temporel
'iran', // dérivé nominal : kisiran (enseignement/transmission?)
];
/**
* Extrait tous les radicaux possibles d'un mot
* @param {string} word - Mot en confluent
* @returns {Array<{radical: string, suffix: string, type: string, confidence: number}>}
*/
function extractRadicals(word) {
const candidates = [];
// Essayer chaque suffixe verbal connu
for (const suffix of VERBAL_SUFFIXES) {
if (word.endsWith(suffix) && word.length > suffix.length + 1) {
const radical = word.slice(0, -suffix.length);
candidates.push({
radical,
suffix,
type: 'verbal',
confidence: 0.9
});
}
}
// Essayer sans suffixe (forme racine directe)
if (word.length >= 3) {
candidates.push({
radical: word,
suffix: '',
type: 'root',
confidence: 0.7
});
}
// Essayer d'enlever dernière voyelle (forme liée -> forme pleine)
// mako → mak, voki → vok
if (word.length >= 4 && 'aeiou'.includes(word[word.length - 1])) {
candidates.push({
radical: word.slice(0, -1),
suffix: word[word.length - 1],
type: 'liaison',
confidence: 0.8
});
}
// Trier par confiance décroissante
return candidates.sort((a, b) => b.confidence - a.confidence);
}
module.exports = {
extractRadicals,
VERBAL_SUFFIXES
};

View File

@ -0,0 +1,147 @@
/**
* Reverse Index Builder - Génère un dictionnaire Confluent Français
*
* Structure générée:
* {
* "Akoazana": { francais: "Faucon Chasseur", type: "nom_propre", ... },
* "zanatori": { francais: "chasseur", type: "composition", ... },
* "aki": { francais: "faucon", type: "racine_sacree", forme_liee: "ak" },
* "va": { francais: "[SUJET]", type: "particule" }
* }
*/
// Les particules sont maintenant dans le lexique 00-grammaire.json
// Elles seront chargées automatiquement par buildReverseIndex()
/**
* Construit l'index inversé à partir d'un lexique
* @param {Object} lexique - Lexique au format {dictionnaire: {...}, meta: {...}}
* @returns {Object} - Index inversé Confluent Français avec multiples index
*/
function buildReverseIndex(lexique) {
const reverseIndex = {
byWord: {}, // Index par mot complet (existant)
byFormeLiee: {}, // NOUVEAU : Index par forme_liee (radicaux)
};
if (!lexique || !lexique.dictionnaire) {
return reverseIndex;
}
// 2. Parcourir toutes les entrées du lexique
for (const [motFrancais, entry] of Object.entries(lexique.dictionnaire)) {
if (!entry.traductions || entry.traductions.length === 0) continue;
// Traiter chaque traduction
entry.traductions.forEach(trad => {
const motConfluent = trad.confluent;
if (!motConfluent) return;
// IMPORTANT: En Confluent, pas de distinction majuscule/minuscule
// Toujours stocker en lowercase
const motConfluentLower = motConfluent.toLowerCase();
const entryData = {
francais: motFrancais,
type: trad.type || 'inconnu',
forme_liee: trad.forme_liee || null,
composition: trad.composition || null,
racines: trad.racines || [],
domaine: trad.domaine || null,
note: trad.note || null
};
// Ajouter les synonymes français si présents
if (entry.synonymes_fr && entry.synonymes_fr.length > 0) {
entryData.synonymes_fr = [...entry.synonymes_fr];
}
// INDEX PAR MOT COMPLET (byWord)
if (reverseIndex.byWord[motConfluentLower]) {
// Vérifier si c'est un doublon
if (reverseIndex.byWord[motConfluentLower].francais !== motFrancais) {
if (!reverseIndex.byWord[motConfluentLower].synonymes_fr) {
reverseIndex.byWord[motConfluentLower].synonymes_fr = [reverseIndex.byWord[motConfluentLower].francais];
}
if (!reverseIndex.byWord[motConfluentLower].synonymes_fr.includes(motFrancais)) {
reverseIndex.byWord[motConfluentLower].synonymes_fr.push(motFrancais);
}
}
} else {
reverseIndex.byWord[motConfluentLower] = entryData;
}
// NOUVEAU : INDEX PAR FORME_LIEE (byFormeLiee)
const formeLiee = trad.forme_liee;
if (formeLiee) {
const formeLieeLower = formeLiee.toLowerCase();
if (!reverseIndex.byFormeLiee[formeLieeLower]) {
reverseIndex.byFormeLiee[formeLieeLower] = [];
}
reverseIndex.byFormeLiee[formeLieeLower].push({
...entryData,
matchType: 'forme_liee'
});
}
});
}
return reverseIndex;
}
/**
* Génère les statistiques de l'index inversé
* @param {Object} reverseIndex - Index inversé (avec byWord et byFormeLiee)
* @returns {Object} - Statistiques
*/
function getReverseIndexStats(reverseIndex) {
const stats = {
total: 0,
particules: 0,
racines_sacrees: 0,
racines: 0,
compositions: 0,
noms_propres: 0,
verbes: 0,
autres: 0,
by_forme_liee: 0 // NOUVEAU : nombre d'entrées indexées par forme_liee
};
// Travailler sur byWord pour les stats principales (compatibilité)
const indexToCount = reverseIndex.byWord || reverseIndex;
for (const [conf, entry] of Object.entries(indexToCount)) {
stats.total++;
const type = entry.type;
if (type === 'particule' || type === 'marqueur_temps' || type === 'negation' ||
type === 'quantite' || type === 'interrogation' || type === 'demonstratif') {
stats.particules++;
} else if (type === 'racine_sacree') {
stats.racines_sacrees++;
} else if (type === 'racine') {
stats.racines++;
} else if (type === 'composition') {
stats.compositions++;
} else if (type === 'nom_propre') {
stats.noms_propres++;
} else if (type.includes('verbe')) {
stats.verbes++;
} else {
stats.autres++;
}
}
// Compter les entrées par forme_liee
if (reverseIndex.byFormeLiee) {
stats.by_forme_liee = Object.keys(reverseIndex.byFormeLiee).length;
}
return stats;
}
module.exports = {
buildReverseIndex,
getReverseIndexStats
};

View File

@ -1,4 +1,4 @@
require('dotenv').config({ path: '../.env' });
require('dotenv').config();
const express = require('express');
const path = require('path');
const fs = require('fs');
@ -12,6 +12,8 @@ const {
} = require('./lexiqueLoader');
const { analyzeContext } = require('./contextAnalyzer');
const { buildContextualPrompt, getBasePrompt, getPromptStats } = require('./promptBuilder');
const { buildReverseIndex: buildConfluentIndex } = require('./reverseIndexBuilder');
const { translateConfluentToFrench, translateConfluentDetailed } = require('./confluentToFrench');
const app = express();
const PORT = process.env.PORT || 3000;
@ -27,6 +29,7 @@ const ancienPrompt = fs.readFileSync(path.join(__dirname, 'prompts', 'ancien-sys
const baseDir = path.join(__dirname, '..');
let lexiques = { proto: null, ancien: null };
let reverseIndexes = { proto: null, ancien: null };
let confluentIndexes = { proto: null, ancien: null };
function reloadLexiques() {
console.log('Loading lexiques...');
@ -35,7 +38,12 @@ function reloadLexiques() {
proto: buildReverseIndex(lexiques.proto),
ancien: buildReverseIndex(lexiques.ancien)
};
confluentIndexes = {
proto: buildConfluentIndex(lexiques.proto),
ancien: buildConfluentIndex(lexiques.ancien)
};
console.log('Lexiques loaded successfully');
console.log(`Confluent→FR index: ${Object.keys(confluentIndexes.ancien || {}).length} entries`);
}
// Initial load
@ -226,7 +234,7 @@ app.post('/translate', async (req, res) => {
const message = await anthropic.messages.create({
model: model,
max_tokens: 1024,
max_tokens: 8192, // Max pour Claude Sonnet/Haiku 4.5
system: systemPrompt,
messages: [
{ role: 'user', content: text }
@ -243,6 +251,7 @@ app.post('/translate', async (req, res) => {
const completion = await openai.chat.completions.create({
model: model,
max_tokens: 16384, // Max pour GPT-4o et GPT-4o-mini
messages: [
{ role: 'system', content: systemPrompt },
{ role: 'user', content: text }
@ -355,6 +364,92 @@ function parseTranslationResponse(response) {
};
}
// Raw translation endpoint (for debugging - returns unprocessed LLM output)
app.post('/api/translate/raw', async (req, res) => {
const { text, target, provider, model, useLexique = true } = req.body;
if (!text || !target || !provider || !model) {
return res.status(400).json({ error: 'Missing parameters' });
}
const variant = target === 'proto' ? 'proto' : 'ancien';
try {
let systemPrompt;
let contextMetadata = null;
if (useLexique) {
const contextResult = analyzeContext(text, lexiques[variant]);
systemPrompt = buildContextualPrompt(contextResult, variant, text);
const promptStats = getPromptStats(systemPrompt, contextResult);
contextMetadata = {
wordsFound: contextResult.metadata.wordsFound,
wordsNotFound: contextResult.metadata.wordsNotFound,
entriesUsed: contextResult.metadata.entriesUsed,
totalLexiqueSize: contextResult.metadata.totalLexiqueSize,
tokensFullLexique: promptStats.fullLexiqueTokens,
tokensUsed: promptStats.promptTokens,
tokensSaved: promptStats.tokensSaved,
savingsPercent: promptStats.savingsPercent,
useFallback: contextResult.useFallback,
expansionLevel: contextResult.metadata.expansionLevel
};
} else {
systemPrompt = getBasePrompt(variant);
}
let rawResponse;
if (provider === 'anthropic') {
const anthropic = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
});
const message = await anthropic.messages.create({
model: model,
max_tokens: 8192, // Max pour Claude Sonnet/Haiku 4.5
system: systemPrompt,
messages: [
{ role: 'user', content: text }
]
});
rawResponse = message.content[0].text;
} else if (provider === 'openai') {
const openai = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
const completion = await openai.chat.completions.create({
model: model,
max_tokens: 16384, // Max pour GPT-4o et GPT-4o-mini
messages: [
{ role: 'system', content: systemPrompt },
{ role: 'user', content: text }
]
});
rawResponse = completion.choices[0].message.content;
} else {
return res.status(400).json({ error: 'Unknown provider' });
}
// Retourner la réponse BRUTE sans parsing
res.json({
raw_output: rawResponse,
metadata: contextMetadata,
length: rawResponse.length,
lines: rawResponse.split('\n').length
});
} catch (error) {
console.error('Translation error:', error);
res.status(500).json({ error: error.message });
}
});
// Batch translation endpoint
app.post('/api/translate/batch', async (req, res) => {
const { words, target = 'ancien' } = req.body;
@ -382,6 +477,34 @@ app.post('/api/translate/batch', async (req, res) => {
res.json({ target, results });
});
// Confluent → French translation endpoint (traduction brute)
app.post('/api/translate/conf2fr', (req, res) => {
const { text, variant = 'ancien', detailed = false } = req.body;
if (!text) {
return res.status(400).json({ error: 'Missing parameter: text' });
}
const variantKey = variant === 'proto' ? 'proto' : 'ancien';
if (!confluentIndexes[variantKey]) {
return res.status(500).json({ error: `Confluent index for ${variantKey} not loaded` });
}
try {
if (detailed) {
const result = translateConfluentDetailed(text, confluentIndexes[variantKey]);
res.json(result);
} else {
const result = translateConfluentToFrench(text, confluentIndexes[variantKey]);
res.json(result);
}
} catch (error) {
console.error('Confluent→FR translation error:', error);
res.status(500).json({ error: error.message });
}
});
app.listen(PORT, () => {
console.log(`ConfluentTranslator running on http://localhost:${PORT}`);
console.log(`Loaded: ${lexiques.ancien?.meta?.total_entries || 0} ancien entries, ${lexiques.proto?.meta?.total_entries || 0} proto entries`);

View File

@ -0,0 +1,11 @@
Dans les temps anciens, avant que la Confluence ne devienne le refuge sacré des peuples libres, les Faucons Chasseurs et les Ailes-Grises menaient une guerre terrible contre les esprits corrompus qui rôdaient dans les Antres des Échos. Les sages observaient avec inquiétude les signes avant-coureurs d'une catastrophe : les grues refusaient de transmettre les messages des ancêtres, les enfants perdaient la mémoire des traditions, et même les chasseurs les plus expérimentés ne parvenaient plus à protéger leurs villages.
L'Oracle du Mont Éternel convoqua alors le Grand Conseil : le Proclamateur, les gardiens des lois, les guides des âmes, et le maître artisan qui forgea jadis l'arme légendaire capable de purifier les ténèbres. Ensemble, ils décidèrent d'envoyer une expédition périlleuse vers les territoires interdits où la frontière entre le monde des vivants et celui des esprits s'était effacée.
Trois guerriers volontaires partirent à l'aube : Aigle-de-Nuit le capitaine, accompagné du peintre-sculpteur qui devait graver les runes de protection, et d'un jeune chaman qui possédait le don rare de voir à travers les illusions. Leur quête : retrouver les trois fragments du Miroir Originel, seul artéfact assez puissant pour restaurer l'équilibre et empêcher l'annihilation complète de leur civilisation.
Durant leur voyage, ils affrontèrent des loups spectres qui hurlaient des prophéties de destruction, traversèrent des rivières de flammes noires, et durent négocier avec le Gardien du Seuil, une entité aussi vieille que la première montagne. Chaque épreuve les rapprochait de la vérité ultime : les esprits corrompus n'étaient autres que les ancêtres oubliés, furieux d'avoir été abandonnés par leurs descendants qui préféraient désormais les richesses matérielles aux enseignements spirituels.
La révélation bouleversa tout. Pour sauver leur monde, les trois héros devaient accomplir l'impossible : convaincre leur peuple de renoncer à la moitié de leurs possessions, de reconstruire les temples abandonnés, et de réapprendre les chants sacrés que seuls les plus vieux mineurs et tisserands connaissaient encore. L'Oracle avait vu juste : la catastrophe n'était pas externe, mais intérieure. Le salut ne viendrait ni de la force guerrière ni de la magie, mais du sacrifice volontaire et du retour aux valeurs ancestrales.
Aujourd'hui encore, les descendants de ces héros racontent cette légende lors des cérémonies du feu, pour rappeler que la survie d'une civilisation ne dépend jamais de sa puissance militaire, mais toujours de sa capacité à honorer la mémoire, à transmettre la sagesse, et à maintenir vivant le lien sacré entre les générations.

View File

@ -0,0 +1,129 @@
# Test du système de recherche par radicaux - Résultats
Date: 2025-11-28
## Texte de test (122 tokens)
```
Va siluuumi vo mako sekavoki na akoazana vokan at. Va aliaska vo voki aita na aita zo kisun at. No kekutoka tiru okitori vo loku taku su mitak at. Tova vo uraakota na kisiran vokis at. Va umitori velu mirak at. Va alu su vo onuvoki melu su pasun at. Va naki su vo savu su pasun at. Va maku sukamori vo varu mako su zo sukam ul at. Va vokiueka vo kala okimako uravis at. Na tova na uraal kisaran ui vo mako vulu pasak ok se vo talu su vaku nekan ok. Se na kisiran zo urak u suki na velu ve at. Zom na okitori na mako ve at. Se va sekauaita na tori su ui kisun at eol.
```
## Résultats
### Coverage global
- **Avant implémentation (plan):** 83% (101/122 tokens)
- **Après implémentation:** 92% (112/122 tokens)
- **Amélioration:** +9 points de pourcentage (+11 mots trouvés)
### Mots trouvés (112/122)
Exemples de mots correctement trouvés grâce au système:
- `vokan`, `vokis` → trouvés via radical `vok` → "voix"
- `kisun`, `kisiran` → trouvés via radical `kis` → "transmettre"
- `pasun` → trouvé via radical `pas` → "prendre"
- `mirak` → trouvé via radical `mir` → "voir"
- `sekavoki` → composition reconnue → "conseil"
- Nombreuses particules grammaticales (`va`, `vo`, `na`, `at`, `su`, etc.)
- Noms propres (castes, lieux): `akoazana`, `aliaska`, `kekutoka`, `uraakota`
### Mots non trouvés (10/122)
#### 1. Particules grammaticales manquantes (2)
- `ve` (apparaît 2 fois) - particule non documentée
- `eol` - marqueur de fin de phrase
**Action requise:** Ajouter au lexique `00-grammaire.json`
#### 2. Compositions non décomposées (4)
- `sukamori` - composition potentielle `suk-a-mori` (forger + relation + ?)
- `uraal` - composition potentielle `ur-aa-l` (être + relation_forte + ?)
- `kisaran` - dérivé de `kis` avec suffixe `aran` (non documenté)
- `uravis` - verbe avec suffixe `vis` (non documenté)
**Problèmes identifiés:**
- Suffixes `aran` et `vis` absents de `VERBAL_SUFFIXES`
- Racines composantes (`mori`, composants de `uraal`) peut-être absentes
**Action requise:**
- Enrichir `radicalMatcher.js` avec nouveaux suffixes
- Vérifier/ajouter racines manquantes au lexique
#### 3. Mots absents du lexique (4)
- `tiru` - modificateur/adjectif ?
- `kala` - mot inconnu
- `vulu` - mot inconnu
**Action requise:** Documenter dans le lexique approprié
## Traduction brute obtenue
```
va oracle vo grand (ou: vaste) conseil na faucons chasseurs (ou: faucons chasseurs, akoazana, faucon chasseur, faucons) voix (ou: parole, appeler) at va ailes-grises (ou: ailes-grises, aliaska, aile-grise, aile grise, ailes grises, ailes) vo voix (ou: parole, appeler) ancêtre (ou: ancien, aïeul, vieux, âgé) na ancêtre (ou: ancien, aïeul, vieux, âgé) zo transmettre (ou: enseigner, transmettent, transmis) at no antres des échos (ou: antres des échos, kekutoka) [INCONNU:tiru] guerrier vo loi (ou: règle, lieu, endroit, loup, zone, région) porter (ou: transporter) su famille (ou: clan) at tova vo caste de l'eau (ou: caste de l'eau, la confluence, uraakota, confluence (la)) na transmettre (ou: enseigner, transmettent, transmis) voix (ou: parole, appeler) at va chaman surveiller voir (ou: observer, regarder, vu, vus, vue, vues, verbe) at va grue (ou: Regard-Libre, grues, regard-libre) su vo poème (ou: vers, chant) doux (ou: doux, tendre) su prendre (ou: prennent, pris, prisse) at va descendant (ou: descendant, futur, débutant, enfant) su vo serment (ou: serment, promesse, jurer) su prendre (ou: prennent, pris, prisse) at va grand (ou: vaste) [INCONNU:sukamori] vo arme grand (ou: vaste) su zo forger ul at va proclamateur (ou: proclamateur, proclamation) vo [INCONNU:kala] terrible [INCONNU:uravis] at na tova na [INCONNU:uraal] [INCONNU:kisaran] ui vo grand (ou: vaste) [INCONNU:vulu] prendre (ou: prennent, pris, prisse) ok se vo hall su allié (ou: allié, ami) tovak (ou: agir, faire, accomplir, créer, font, ferai, feras, fera, ferons, ferez, feront) ok se na transmettre (ou: enseigner, transmettent, transmis) zo être (ou: exister, vivre, il y a, y a-t-il, existe, existent, existant) u feu (ou: flamme, étincelle) na surveiller [INCONNU:ve] at zom na guerrier na grand (ou: vaste) [INCONNU:ve] at se va sagesse na homme (ou: homme, personne) su ui transmettre (ou: enseigner, transmettent, transmis) at [INCONNU:eol]
```
## Analyse du système implémenté
### Ce qui fonctionne ✅
1. **Recherche exacte** - Correspondance directe dans le lexique
2. **Recherche par radicaux verbaux** - Extraction de racines avec suffixes connus
3. **Index byFormeLiee** - Recherche rapide par forme liée
4. **Compositions simples** - Reconnaissance des mots composés documentés
### Ce qui nécessite des améliorations 🔧
1. **Liste des suffixes verbaux** - Incomplète (manque `aran`, `vis`, etc.)
2. **Décomposition morphologique récursive** - Ne trouve pas toutes les compositions
3. **Lexique** - Certains mots/particules manquants
4. **Confiance des matches** - Système de scoring pourrait être affiné
## Commande de test
```bash
curl -s -X POST http://localhost:3000/api/translate/conf2fr \
-H "Content-Type: application/json" \
-d '{"text": "Va siluuumi vo mako sekavoki na akoazana vokan at. Va aliaska vo voki aita na aita zo kisun at. No kekutoka tiru okitori vo loku taku su mitak at. Tova vo uraakota na kisiran vokis at. Va umitori velu mirak at. Va alu su vo onuvoki melu su pasun at. Va naki su vo savu su pasun at. Va maku sukamori vo varu mako su zo sukam ul at. Va vokiueka vo kala okimako uravis at. Na tova na uraal kisaran ui vo mako vulu pasak ok se vo talu su vaku nekan ok. Se na kisiran zo urak u suki na velu ve at. Zom na okitori na mako ve at. Se va sekauaita na tori su ui kisun at eol."}' \
| python3 -m json.tool
```
## Prochaines étapes pour atteindre 95%+
1. **Ajouter particules `ve` et `eol`** → +2% coverage
2. **Enrichir VERBAL_SUFFIXES avec `aran`, `vis`** → +2% coverage
3. **Documenter `tiru`, `kala`, `vulu`** → +3% coverage
4. **Vérifier/ajouter racines pour compositions** → +1% coverage
**Objectif réaliste: 98-100% coverage** avec ces ajustements.
## Fichiers créés/modifiés
### Nouveaux fichiers
- `ConfluentTranslator/radicalMatcher.js` - Extraction de radicaux
- `ConfluentTranslator/morphologicalDecomposer.js` - Décomposition morphologique
### Fichiers modifiés
- `ConfluentTranslator/reverseIndexBuilder.js` - Ajout index `byFormeLiee`
- `ConfluentTranslator/confluentToFrench.js` - Recherche en cascade
### Structure de l'index
```javascript
{
byWord: {
"voki": { francais: "voix", forme_liee: "vok", ... }
},
byFormeLiee: {
"vok": [
{ francais: "voix", matchType: "forme_liee", ... }
]
}
}
```
## Conclusion
Le système de recherche par radicaux est **fonctionnel et opérationnel**. Il a permis d'améliorer significativement le coverage de 83% à 92% (+9 points). Les 8% restants nécessitent principalement:
- L'enrichissement du lexique (particules, mots manquants)
- L'ajout de suffixes verbaux supplémentaires
- La documentation de quelques racines composantes
Le système est prêt pour la production et peut être amélioré incrémentalement en ajoutant les éléments manquants au lexique.

View File

@ -41,6 +41,23 @@ Ce document décrit le système phonologique de la langue Confluent.
---
## Orthographe
### ⚠️ Règle importante : Pas de majuscules
**Le Confluent n'a PAS de distinction majuscule/minuscule.**
- Tout le texte Confluent s'écrit EN MINUSCULES uniquement
- Les noms propres sont également en minuscules : `uraakota`, `siliaska`, `aliaska`
- Les castes et titres sont en minuscules : `akoazana`, `nakukeko`
- Les lieux sont en minuscules : `vukuura`, `kekutoka`
**Exception :** Pour la lisibilité en français, on peut mettre une majuscule en début de phrase (ex: "uraakota u toka" au lieu de "uraakota u toka"), mais c'est purement cosmétique et optionnel.
**Raison linguistique :** Le système d'écriture original du Confluent (gravures, glyphes) ne comportait pas de distinction entre majuscules et minuscules. La transcription en alphabet latin conserve cette propriété.
---
## Inspirations phonétiques
### Du basque on garde :

View File

@ -125,7 +125,7 @@ sili (regard) + -i- (agent actif) + aska (libre)
sil- (on retire le -i final)
sil + i + aska = Siliaska
sil + i + aska = siliaska
```
---

View File

@ -268,10 +268,10 @@ tisikari na pisu su = ces petites pierres-ci
Va tori vo na nuvi kari pasak at
"La personne a pris la nouvelle pierre"
Va Nakuura no na mako ura tekis u
Va nakuura no na mako ura tekis u
"Les Enfants du Courant vont dans la grande eau"
No Uraakota va aita su ni naki su vo Siliitosa kisun ait
No uraakota va aita su ni naki su vo Siliitosa kisun ait
"À la Confluence, les ancêtres ont transmis le Siliitosa (concept) aux enfants"
```

View File

@ -148,7 +148,7 @@ Va tori vo asa zob mirak u ul
Va naki vo seka zo sekam en es
"L'enfant veut ne pas connaître le savoir (dans le futur)"
Va Oraumi vo veri zom kisun ait ul
Va oraumi vo veri zom kisun ait ul
"Les Voix de l'Aurore n'ont jamais pu transmettre la vérité (ancestral)"
```
@ -159,7 +159,7 @@ Va Oraumi vo veri zom kisun ait ul
### Avec lieu, pluriel, passé ancestral
```
No Vukuura va aita su ni naki su vo seka su kisun ait
No vukuura va aita su ni naki su vo seka su kisun ait
[DANS] Gouffre.Humide [SUJET] ancêtre [PL] [POUR] enfant [PL] [OBJET] savoir [PL] transmettre [PASSÉ.ANCESTRAL]
"Dans le Gouffre Humide, les ancêtres ont transmis les savoirs pour les enfants"
```
@ -167,7 +167,7 @@ No Vukuura va aita su ni naki su vo seka su kisun ait
### Avec mouvement, bénéficiaire, souhait
```
Ve Kekutoka vi Uraakota ni Aliaska va Nakukeko vo kari su takan es
Ve kekutoka vi uraakota ni aliaska va nakukeko vo kari su takan es
[DEPUIS] Antres.Échos [VERS] Confluence [POUR] Ailes-Grises [SUJET] Enfants.Échos [OBJET] pierre [PL] porter [SOUHAIT]
"Les Enfants des Échos veulent porter les pierres depuis les Antres vers la Confluence pour les Ailes-Grises"
```
@ -175,7 +175,7 @@ Ve Kekutoka vi Uraakota ni Aliaska va Nakukeko vo kari su takan es
### Cyclique, pluriel, évidentiel
```
Ve ora vi luna va Oraumi su vo umi su mirak eon uv
Ve ora vi luna va oraumi su vo umi su mirak eon uv
[DEPUIS] aurore [VERS] lune [SUJET] Voix.Aurore [PL] [OBJET] esprit [PL] observer [CYCLIQUE] [ÉCRIT]
"C'est écrit que les Voix de l'Aurore observent cycliquement les esprits depuis l'aurore jusqu'à la lune"
```
@ -195,7 +195,7 @@ Ve ura vi toka ve toka vi zeru va umi tekis eom
Structure complète avec tous les éléments :
```
Ku ve Kekutoka vi Uraakota no Talusavu vu kari na aita su va Oraumi ni naki su vo seka su zoe kisun ait ka
Ku ve kekutoka vi uraakota no talusavu vu kari na aita su va oraumi ni naki su vo seka su zoe kisun ait ka
[QUAND] [DEPUIS] Antres [VERS] Confluence [DANS] Halls [AVEC] pierre [DE] ancêtre [PL]
[SUJET] Voix.Aurore [POUR] enfant [PL] [OBJET] savoir [PL] [NÉG.DOUX] transmettre [PASSÉ.ANCESTRAL] [QUESTION]

View File

@ -6,7 +6,7 @@ Ce document recense tout le vocabulaire validé et prêt à l'usage.
## Nom du peuple
### Siliaska
### siliaska
**Sens :** "Les porteurs du regard libre"
@ -14,7 +14,7 @@ Ce document recense tout le vocabulaire validé et prêt à l'usage.
```
sili (regard) + -i- (agent actif) + aska (libre)
sil- (forme liée) + i + aska = Siliaska
sil- (forme liée) + i + aska = siliaska
```
**Glyphes :** [SILI] + [-i-] + [ASKA]
@ -25,28 +25,28 @@ sil- (forme liée) + i + aska = Siliaska
| Caste | Nom Confluent | Composition | Sens littéral | Racines sacrées |
|-------|---------------|-------------|---------------|-----------------|
| Terre | **Nakukeko** | nak-u-keko | Enfants de l'écho | 0 |
| Eau | **Nakuura** | nak-u-ura | Enfants de l'eau | 1 (ura) |
| Air | **Aliaska** | al-i-aska | Porteurs de la grue libre | 2 (alu, aska) |
| Feu | **Akoazana** | ak-oa-zana | Faucon vainqueur de la chasse | 1 (aki) |
| Éther | **Takitosa** | tak-i-tosa | Porteurs du bien | 0 |
| Terre | **nakukeko** | nak-u-keko | Enfants de l'écho | 0 |
| Eau | **nakuura** | nak-u-ura | Enfants de l'eau | 1 (ura) |
| Air | **aliaska** | al-i-aska | Porteurs de la grue libre | 2 (alu, aska) |
| Feu | **akoazana** | ak-oa-zana | Faucon vainqueur de la chasse | 1 (aki) |
| Éther | **takitosa** | tak-i-tosa | Porteurs du bien | 0 |
### Groupe spirituel suprême
| Groupe | Nom Confluent | Composition | Sens littéral | Racines sacrées |
|--------|---------------|-------------|---------------|-----------------|
| Voix de l'Aurore | **Oraumi** | or-a-umi | Aurore avec esprit | 2 (ora, umi) |
| Voix de l'Aurore | **oraumi** | or-a-umi | Aurore avec esprit | 2 (ora, umi) |
### Correspondance avec les noms français
| Nom français | Nom Confluent | Rôle |
|--------------|---------------|------|
| Enfants des Échos | **Nakukeko** | Souterrains, mineurs, artisans |
| Enfants du Courant | **Nakuura** | Pêcheurs, villages sur pilotis |
| Ailes-Grises | **Aliaska** | Dresseurs de grues, chamans |
| Faucons Chasseurs | **Akoazana** | Élite militaire/judiciaire |
| Passes-bien | **Takitosa** | Marchands, médiateurs |
| Voix de l'Aurore | **Oraumi** | Chamans suprêmes, gardiens des lois |
| Enfants des Échos | **nakukeko** | Souterrains, mineurs, artisans |
| Enfants du Courant | **nakuura** | Pêcheurs, villages sur pilotis |
| Ailes-Grises | **aliaska** | Dresseurs de grues, chamans |
| Faucons Chasseurs | **akoazana** | Élite militaire/judiciaire |
| Passes-bien | **takitosa** | Marchands, médiateurs |
| Voix de l'Aurore | **oraumi** | Chamans suprêmes, gardiens des lois |
---
@ -54,12 +54,12 @@ sil- (forme liée) + i + aska = Siliaska
| Nom français | Nom Confluent | Composition | Sens littéral |
|--------------|---------------|-------------|---------------|
| La Confluence | **Uraakota** | ur-aa-kota | Eau mêlée à l'union |
| Gouffre Humide | **Vukuura** | vuk-u-ura | Gouffre de l'eau |
| Antres des Échos | **Kekutoka** | kek-u-toka | Écho de la terre |
| Cercles de Vigile | **Sikuvela** | sik-u-vela | Cercle de la vigile |
| Halls des Serments | **Talusavu** | tal-u-savu | Hall du serment |
| Grande Fresque | **Ekakova** | ek-a-kova | Totalité avec peinture |
| La Confluence | **uraakota** | ur-aa-kota | Eau mêlée à l'union |
| Gouffre Humide | **vukuura** | vuk-u-ura | Gouffre de l'eau |
| Antres des Échos | **kekutoka** | kek-u-toka | Écho de la terre |
| Cercles de Vigile | **sikuvela** | sik-u-vela | Cercle de la vigile |
| Halls des Serments | **talusavu** | tal-u-savu | Hall du serment |
| Grande Fresque | **ekakova** | ek-a-kova | Totalité avec peinture |
---
@ -76,7 +76,7 @@ Les groupes les plus sacrés (chamans) en contiennent plusieurs.
| Expression | Composition | Résultat |
|------------|-------------|----------|
| Porteur du regard libre | sil-i-aska | **Siliaska** |
| Porteur du regard libre | sil-i-aska | **siliaska** |
| L'eau du ciel | ur-u-zeru | **Uruzeru** |
| Enfant de l'ancêtre | nak-u-aita | **Nakuaita** |
| Celui qui transmet le savoir | kis-i-seka | **Kisiseka** |

View File

@ -67,7 +67,7 @@ Pour les couleurs, le Confluent utilise principalement des métaphores naturelle
| Racine | Forme liée | Sens | Métaphore | Exemple |
|--------|------------|------|-----------|---------|
| **kesa** | kes- | gris, cendré | cendre | na kesa apa = aile grise → Aliaska (Ailes-Grises) |
| **kesa** | kes- | gris, cendré | cendre | na kesa apa = aile grise → aliaska (Ailes-Grises) |
| **sora** | sor- | doré, lumineux | soleil | na sora eku = étoile dorée |
| **taku** | tak- | noir, sombre | obscurité | na taku sanu = corps sombre |
| **ura** | ur- | bleu, azur | eau | na ura zeru = ciel bleu |
@ -108,7 +108,7 @@ Pour les couleurs, le Confluent utilise principalement des métaphores naturelle
Va tori vo na tosa sili mirak u
"La personne observe le bon regard"
Va Nakuura no na mako ura tekis u
Va nakuura no na mako ura tekis u
"Les Enfants du Courant vont dans la grande eau"
Va aita su vo na nuvi naki su kisun at
@ -136,10 +136,10 @@ tovikari na pisu = cette petite pierre-là
### Compositions comme noms propres
```
No Vukuura (Gouffre-Humide) va Nakukeko tekis at
No vukuura (Gouffre-Humide) va nakukeko tekis at
"Dans le Gouffre-Humide, les Enfants des Échos sont allés"
Va Aliaska (Ailes-Grises) vo Siliaska (Regard-Libre) mirak u
Va aliaska (Ailes-Grises) vo siliaska (Regard-Libre) mirak u
"Les Ailes-Grises observent le Regard-Libre"
```
@ -168,7 +168,7 @@ na zom nuvi aita = ancêtre jamais-jeune = ancien ancestral
## Notes culturelles
Les Siliaska (le peuple) valorisent certains adjectifs plus que d'autres :
Les siliaska (le peuple) valorisent certains adjectifs plus que d'autres :
**Valorisés** :
- **veri** (vrai) - la vérité est sacrée

View File

@ -64,15 +64,15 @@ Ce document traduit l'ensemble du vocabulaire de la Civilisation de la Confluenc
| Français | Confluent | Composition | Sens littéral |
|----------|-----------|-------------|---------------|
| Le peuple (Siliaska) | **Siliaska** | sil-**i**-aska | Porteurs du regard libre |
| Le peuple (siliaska) | **siliaska** | sil-**i**-aska | Porteurs du regard libre |
| Ciels-clairs | **Zeriiora** | zer-**ii**-ora | Ceux qui SONT ciel-aurore |
| Sans-ciels | **Zokuzeru** | zok-**u**-zeru | Étrangers au ciel |
| Voix de l'Aurore | **Oraumi** | or-**a**-umi | Aurore avec esprit |
| Ailes-Grises | **Aliaska** | al-**i**-aska | Grue portant liberté |
| Faucons Chasseurs | **Akoazana** | ak-**oa**-zana | Faucon vainqueur de chasse |
| Enfants du Courant | **Nakuura** | nak-**u**-ura | Enfants de l'eau |
| Enfants des Échos | **Nakukeko** | nak-**u**-keko | Enfants de l'écho |
| Passes-bien | **Takitosa** | tak-**i**-tosa | Porteurs du bien |
| Voix de l'Aurore | **oraumi** | or-**a**-umi | Aurore avec esprit |
| Ailes-Grises | **aliaska** | al-**i**-aska | Grue portant liberté |
| Faucons Chasseurs | **akoazana** | ak-**oa**-zana | Faucon vainqueur de chasse |
| Enfants du Courant | **nakuura** | nak-**u**-ura | Enfants de l'eau |
| Enfants des Échos | **nakukeko** | nak-**u**-keko | Enfants de l'écho |
| Passes-bien | **takitosa** | tak-**i**-tosa | Porteurs du bien |
| Gardiens de la Confluence | **Zakiuraakota** | zak-**i**-ur-**aa**-kota | Gardiens de l'eau-mêlée-à-union |
### Système des Cinq Castes
@ -105,7 +105,7 @@ Ce document traduit l'ensemble du vocabulaire de la Civilisation de la Confluenc
| Français | Confluent | Composition | Sens littéral |
|----------|-----------|-------------|---------------|
| Hall des Serments | **Talusavu** | tal-**u**-savu | Hall du serment |
| Hall des Serments | **talusavu** | tal-**u**-savu | Hall du serment |
| Conseil du Village | **Koniuloku** | kon-**i**-loku | Assemblée du lieu |
| Autel ancestral | **Asauaita** | as-**a**-aita | Sacré avec ancêtre |
@ -154,7 +154,7 @@ Ce document traduit l'ensemble du vocabulaire de la Civilisation de la Confluenc
| Français | Confluent | Composition | Sens littéral |
|----------|-----------|-------------|---------------|
| Artefact multi-générationnel | **Tavueaaita** | tav-**ea**-aita | Œuvre vers ancêtres |
| Grande Fresque | **Ekakova** | ek-**a**-kova | Totalité avec peinture |
| Grande Fresque | **ekakova** | ek-**a**-kova | Totalité avec peinture |
| Fenêtre temporelle | **Siliutemi** | sil-**i**-temi | Regard du temps |
| Autel des Pionniers | **Asautekiena** | as-**a**-tek-**i**-ena | Sacré avec chemin d'origine |
@ -168,9 +168,9 @@ Ce document traduit l'ensemble du vocabulaire de la Civilisation de la Confluenc
|----------|-----------|-------------|---------------|
| Rituel du Regard Partagé | **Asausiliaakota** | as-**a**-sil-**aa**-kota | Sacré avec regard-mêlé-à-union |
| Pèlerinage | **Tekiuasa** | tek-**i**-asa | Chemin du sacré |
| Regard libre (état) | **Siliaska** | sil-**i**-aska | Regard de liberté |
| Regard libre (état) | **siliaska** | sil-**i**-aska | Regard de liberté |
| Rites funéraires | **Asauosi** | as-**a**-osi | Sacré avec mort |
| Cercles de Vigile | **Sikuvela** | sik-**u**-vela | Cercle de vigile |
| Cercles de Vigile | **sikuvela** | sik-**u**-vela | Cercle de vigile |
| Communion des esprits | **Kotaaumi** | kot-**aa**-umi | Union mêlée aux esprits |
### Traditions sacrées
@ -204,8 +204,8 @@ Ce document traduit l'ensemble du vocabulaire de la Civilisation de la Confluenc
| Français | Confluent | Composition | Sens littéral |
|----------|-----------|-------------|---------------|
| La Confluence | **Uraakota** | ur-**aa**-kota | Eau mêlée à union |
| Gouffre Humide | **Vukuura** | vuk-**u**-ura | Gouffre de l'eau |
| La Confluence | **uraakota** | ur-**aa**-kota | Eau mêlée à union |
| Gouffre Humide | **vukuura** | vuk-**u**-ura | Gouffre de l'eau |
| Gorge Profonde | **Vukumako** | vuk-**u**-mako | Gouffre du grand |
| Ruines des Premiers Ancêtres | **Kariuaitaena** | kar-**i**-aita-ena | Pierre des ancêtres-origine |
| Village fortifié | **Lokuzaki** | lok-**u**-zaki | Lieu de garde |
@ -215,8 +215,8 @@ Ce document traduit l'ensemble du vocabulaire de la Civilisation de la Confluenc
| Français | Confluent | Composition | Sens littéral |
|----------|-----------|-------------|---------------|
| Cercles de Vigile | **Sikuvela** | sik-**u**-vela | Cercle de vigile |
| Antres des Échos | **Kekutoka** | kek-**u**-toka | Écho de la terre |
| Cercles de Vigile | **sikuvela** | sik-**u**-vela | Cercle de vigile |
| Antres des Échos | **kekutoka** | kek-**u**-toka | Écho de la terre |
| Village sur pilotis | **Lokuurabuki** | lok-**u**-ur-**a**-buki | Lieu d'eau avec bois |
| Route sécurisée | **Roviuzaki** | kov-**i**-zaki | Route de garde |
| Avant-poste côtier | **Lokuseli** | lok-**u**-seli | Lieu du sel |
@ -282,7 +282,7 @@ Ce document traduit l'ensemble du vocabulaire de la Civilisation de la Confluenc
| Français | Confluent | Composition | Sens littéral |
|----------|-----------|-------------|---------------|
| Passe-bien | **Takitosa** | tak-**i**-tosa | Porteur du bien |
| Passe-bien | **takitosa** | tak-**i**-tosa | Porteur du bien |
| Porteur de Flamme | **Takisuki** | tak-**i**-suki | Porteur de feu |
| Maître artisan | **Kasiiutavu** | kas-**ii**-tavu | Celui qui EST guide du travail |
| Façonneur de pierre | **Nekiikari** | nek-**ii**-kari | Celui qui EST créateur de pierre |
@ -329,7 +329,7 @@ Ce document traduit l'ensemble du vocabulaire de la Civilisation de la Confluenc
| Français | Confluent | Composition | Sens littéral |
|----------|-----------|-------------|---------------|
| Regard libre | **Siliaska** | sil-**i**-aska | Regard de liberté |
| Regard libre | **siliaska** | sil-**i**-aska | Regard de liberté |
| Confluence/Union | **Kota** | kota | Union |
| Harmonie | **Kotaapaki** | kot-**aa**-paku | Union mêlée à paix |
| Sagesse | **Sekaamori** | sek-**aa**-mori | Savoir mêlé à mémoire |
@ -757,12 +757,12 @@ Ce document traduit l'ensemble du vocabulaire de la Civilisation de la Confluenc
|-----------|----------|------|
| **Aita** | Ancêtre | racine sacrée |
| **Anu** | Âme | racine sacrée |
| **Aliaska** | Ailes-Grises | composé |
| **aliaska** | Ailes-Grises | composé |
| **Asa** | Sacré | racine sacrée |
| **Aska** | Liberté | racine sacrée |
| **Daku** | Sombre | racine |
| **Eka** | Totalité | racine sacrée |
| **Ekakova** | Grande Fresque | composé |
| **ekakova** | Grande Fresque | composé |
| **Kari** | Pierre | racine |
| **Kasi** | Chef/Guide | racine |
| **Kota** | Union | racine |
@ -773,25 +773,25 @@ Ce document traduit l'ensemble du vocabulaire de la Civilisation de la Confluenc
| **Mitu** | Famille | racine |
| **Mori** | Mémoire | racine |
| **Naki** | Enfant | racine |
| **Nakukeko** | Enfants des Échos | composé |
| **Nakuura** | Enfants du Courant | composé |
| **nakukeko** | Enfants des Échos | composé |
| **nakuura** | Enfants du Courant | composé |
| **Oki** | Épreuve | racine sacrée |
| **Ora** | Aurore | racine sacrée |
| **Oraumi** | Voix de l'Aurore | composé |
| **oraumi** | Voix de l'Aurore | composé |
| **Osi** | Mort | racine sacrée |
| **Paki** | Paix | racine |
| **Pisu** | Petit | racine |
| **Riku** | Cercle | racine |
| **Sikuvela** | Cercles de Vigile | composé |
| **sikuvela** | Cercles de Vigile | composé |
| **Savu** | Serment | racine |
| **Seka** | Savoir | racine |
| **Sili** | Regard | racine |
| **Siliaska** | Regard libre / Le peuple | composé |
| **siliaska** | Regard libre / Le peuple | composé |
| **Sinu** | Signe | racine |
| **Sora** | Soleil/Lumière | racine |
| **Suki** | Feu | racine |
| **Talu** | Hall | racine |
| **Talusavu** | Halls des Serments | composé |
| **talusavu** | Halls des Serments | composé |
| **Teki** | Chemin | racine |
| **Temi** | Temps | racine |
| **Toka** | Terre | racine |
@ -799,13 +799,13 @@ Ce document traduit l'ensemble du vocabulaire de la Civilisation de la Confluenc
| **Tosa** | Bien/Bon | racine |
| **Umi** | Esprit | racine sacrée |
| **Ura** | Eau | racine sacrée |
| **Uraakota** | La Confluence | composé |
| **uraakota** | La Confluence | composé |
| **Vali** | Valeur | racine |
| **Varu** | Guerre | racine |
| **Vela** | Vigile | racine |
| **Veri** | Vérité | racine |
| **Vuku** | Gouffre | racine |
| **Vukuura** | Gouffre Humide | composé |
| **vukuura** | Gouffre Humide | composé |
| **Zaki** | Garder/Justice | racine |
| **Zeru** | Ciel | racine |
| **Zoka** | Étranger | racine |

View File

@ -0,0 +1,233 @@
{
"_comment": "Particules grammaticales, marqueurs temporels, négations, etc.",
"_source": "Grammaire de l'Ancien Confluent",
"dictionnaire": {
"va": {
"mot_francais": "[SUJET]",
"traductions": [{
"confluent": "va",
"type": "particule",
"categorie": "cas",
"note": "Marque le sujet de la phrase"
}]
},
"vo": {
"mot_francais": "[OBJET]",
"traductions": [{
"confluent": "vo",
"type": "particule",
"categorie": "cas",
"note": "Marque l'objet direct"
}]
},
"no": {
"mot_francais": "[DANS/LIEU]",
"traductions": [{
"confluent": "no",
"type": "particule",
"categorie": "cas",
"note": "Localisation spatiale"
}]
},
"na": {
"mot_francais": "[DE/GÉNITIF]",
"traductions": [{
"confluent": "na",
"type": "particule",
"categorie": "cas",
"note": "Possession, origine, appartenance"
}]
},
"se": {
"mot_francais": "[POUR/BUT]",
"traductions": [{
"confluent": "se",
"type": "particule",
"categorie": "cas",
"note": "But, bénéficiaire"
}]
},
"lo": {
"mot_francais": "[MAIS/ET]",
"traductions": [{
"confluent": "lo",
"type": "particule",
"categorie": "coordination",
"note": "Opposition ou coordination selon contexte"
}]
},
"vi": {
"mot_francais": "[AVEC/INSTRUMENT]",
"traductions": [{
"confluent": "vi",
"type": "particule",
"categorie": "cas",
"note": "Instrument, accompagnement"
}]
},
"at": {
"mot_francais": "[PASSÉ-VÉCU]",
"traductions": [{
"confluent": "at",
"type": "marqueur_temps",
"categorie": "temps",
"note": "Passé récent ou vécu directement"
}]
},
"u": {
"mot_francais": "[PRÉSENT]",
"traductions": [{
"confluent": "u",
"type": "marqueur_temps",
"categorie": "temps",
"note": "Présent ou vérité générale"
}]
},
"ok": {
"mot_francais": "[FUTUR/VOLONTÉ]",
"traductions": [{
"confluent": "ok",
"type": "marqueur_temps",
"categorie": "temps",
"note": "Futur ou intention volontaire"
}]
},
"en": {
"mot_francais": "[IMPÉRATIF]",
"traductions": [{
"confluent": "en",
"type": "marqueur_temps",
"categorie": "mode",
"note": "Ordre ou demande"
}]
},
"ui": {
"mot_francais": "[INFINITIF]",
"traductions": [{
"confluent": "ui",
"type": "marqueur_temps",
"categorie": "mode",
"note": "Forme infinitive du verbe"
}]
},
"ul": {
"mot_francais": "[NÉG-POUVOIR]",
"traductions": [{
"confluent": "ul",
"type": "marqueur_temps",
"categorie": "modalité",
"note": "Impossibilité, négation de capacité"
}]
},
"aan": {
"mot_francais": "[PASSÉ-REGRETTÉ]",
"traductions": [{
"confluent": "aan",
"type": "marqueur_temps",
"categorie": "temps",
"note": "Passé avec regret ou nostalgie"
}]
},
"zo": {
"mot_francais": "[NÉG]",
"traductions": [{
"confluent": "zo",
"type": "negation",
"categorie": "négation",
"note": "Négation générale"
}]
},
"zom": {
"mot_francais": "[JAMAIS]",
"traductions": [{
"confluent": "zom",
"type": "negation",
"categorie": "négation",
"note": "Négation temporelle absolue (jamais)"
}]
},
"su": {
"mot_francais": "[PLURIEL]",
"traductions": [{
"confluent": "su",
"type": "marqueur_nombre",
"categorie": "quantité",
"note": "Marque le pluriel"
}]
},
"ku": {
"mot_francais": "[QUESTION]",
"traductions": [{
"confluent": "ku",
"type": "interrogation",
"categorie": "question",
"note": "Marque l'interrogation"
}]
},
"riku": {
"mot_francais": "[POURQUOI]",
"traductions": [{
"confluent": "riku",
"type": "interrogation",
"categorie": "question",
"note": "Question causale (pourquoi)"
}]
},
"siku": {
"mot_francais": "[COMMENT]",
"traductions": [{
"confluent": "siku",
"type": "interrogation",
"categorie": "question",
"note": "Question de manière (comment)"
}]
},
"tiku": {
"mot_francais": "[QUAND]",
"traductions": [{
"confluent": "tiku",
"type": "interrogation",
"categorie": "question",
"note": "Question temporelle (quand)"
}]
},
"viku": {
"mot_francais": "[OÙ]",
"traductions": [{
"confluent": "viku",
"type": "interrogation",
"categorie": "question",
"note": "Question spatiale (où)"
}]
},
"tova": {
"mot_francais": "ceci/cela",
"traductions": [{
"confluent": "tova",
"type": "demonstratif",
"categorie": "démonstratif",
"note": "Démonstratif neutre"
}],
"synonymes_fr": ["ceci", "cela", "ça", "ce"]
},
"tovak": {
"mot_francais": "faire-cela",
"traductions": [{
"confluent": "tovak",
"type": "verbe",
"categorie": "action",
"note": "Faire cela, agir ainsi (tova + faire)"
}],
"synonymes_fr": ["agir", "faire", "accomplir"]
},
"taki": {
"mot_francais": "celui-ci/celui-là",
"traductions": [{
"confluent": "taki",
"type": "demonstratif",
"categorie": "démonstratif",
"note": "Démonstratif pour personnes"
}]
}
}
}

View File

@ -5,25 +5,34 @@
"Siliaska": {
"traductions": [
{
"confluent": "Siliaska",
"confluent": "siliaska",
"type": "nom_propre",
"composition": "sil-i-aska",
"sens_litteral": "Porteurs du regard libre",
"racines": ["sili", "aska"],
"racines": [
"sili",
"aska"
],
"categorie": "peuple",
"note": "Nom du peuple de la Confluence"
}
],
"synonymes_fr": ["peuple", "Les porteurs du regard libre"]
"synonymes_fr": [
"peuple",
"Les porteurs du regard libre"
]
},
"peuple": {
"traductions": [
{
"confluent": "Siliaska",
"confluent": "siliaska",
"type": "nom_propre",
"composition": "sil-i-aska",
"sens_litteral": "Porteurs du regard libre",
"racines": ["sili", "aska"],
"racines": [
"sili",
"aska"
],
"categorie": "peuple"
}
]
@ -31,11 +40,14 @@
"Enfants des Échos": {
"traductions": [
{
"confluent": "Nakukeko",
"confluent": "nakukeko",
"type": "nom_propre",
"composition": "nak-u-keko",
"sens_litteral": "Enfants de l'écho",
"racines": ["naki", "keko"],
"racines": [
"naki",
"keko"
],
"categorie": "caste",
"element": "terre",
"racines_sacrees": 0,
@ -46,11 +58,14 @@
"Nakukeko": {
"traductions": [
{
"confluent": "Nakukeko",
"confluent": "nakukeko",
"type": "nom_propre",
"composition": "nak-u-keko",
"sens_litteral": "Enfants de l'écho",
"racines": ["naki", "keko"],
"racines": [
"naki",
"keko"
],
"categorie": "caste",
"element": "terre"
}
@ -59,11 +74,14 @@
"Enfants du Courant": {
"traductions": [
{
"confluent": "Nakuura",
"confluent": "nakuura",
"type": "nom_propre",
"composition": "nak-u-ura",
"sens_litteral": "Enfants de l'eau",
"racines": ["naki", "ura"],
"racines": [
"naki",
"ura"
],
"categorie": "caste",
"element": "eau",
"racines_sacrees": 1,
@ -74,11 +92,14 @@
"Nakuura": {
"traductions": [
{
"confluent": "Nakuura",
"confluent": "nakuura",
"type": "nom_propre",
"composition": "nak-u-ura",
"sens_litteral": "Enfants de l'eau",
"racines": ["naki", "ura"],
"racines": [
"naki",
"ura"
],
"categorie": "caste",
"element": "eau"
}
@ -87,11 +108,14 @@
"Ailes-Grises": {
"traductions": [
{
"confluent": "Aliaska",
"confluent": "aliaska",
"type": "nom_propre",
"composition": "al-i-aska",
"sens_litteral": "Porteurs de la grue libre",
"racines": ["alu", "aska"],
"racines": [
"alu",
"aska"
],
"categorie": "caste",
"element": "air",
"racines_sacrees": 2,
@ -102,11 +126,14 @@
"Aliaska": {
"traductions": [
{
"confluent": "Aliaska",
"confluent": "aliaska",
"type": "nom_propre",
"composition": "al-i-aska",
"sens_litteral": "Porteurs de la grue libre",
"racines": ["alu", "aska"],
"racines": [
"alu",
"aska"
],
"categorie": "caste",
"element": "air"
}
@ -115,11 +142,14 @@
"Faucons Chasseurs": {
"traductions": [
{
"confluent": "Akoazana",
"confluent": "akoazana",
"type": "nom_propre",
"composition": "ak-oa-zana",
"sens_litteral": "Faucon vainqueur de la chasse",
"racines": ["aki", "zana"],
"racines": [
"aki",
"zana"
],
"categorie": "caste",
"element": "feu",
"racines_sacrees": 1,
@ -130,11 +160,14 @@
"Akoazana": {
"traductions": [
{
"confluent": "Akoazana",
"confluent": "akoazana",
"type": "nom_propre",
"composition": "ak-oa-zana",
"sens_litteral": "Faucon vainqueur de la chasse",
"racines": ["aki", "zana"],
"racines": [
"aki",
"zana"
],
"categorie": "caste",
"element": "feu"
}
@ -143,11 +176,14 @@
"Passes-bien": {
"traductions": [
{
"confluent": "Takitosa",
"confluent": "takitosa",
"type": "nom_propre",
"composition": "tak-i-tosa",
"sens_litteral": "Porteurs du bien",
"racines": ["taka", "tosa"],
"racines": [
"taka",
"tosa"
],
"categorie": "caste",
"element": "ether",
"racines_sacrees": 0,
@ -158,11 +194,14 @@
"Takitosa": {
"traductions": [
{
"confluent": "Takitosa",
"confluent": "takitosa",
"type": "nom_propre",
"composition": "tak-i-tosa",
"sens_litteral": "Porteurs du bien",
"racines": ["taka", "tosa"],
"racines": [
"taka",
"tosa"
],
"categorie": "caste",
"element": "ether"
}
@ -171,11 +210,14 @@
"Voix de l'Aurore": {
"traductions": [
{
"confluent": "Oraumi",
"confluent": "oraumi",
"type": "nom_propre",
"composition": "or-a-umi",
"sens_litteral": "Aurore avec esprit",
"racines": ["ora", "umi"],
"racines": [
"ora",
"umi"
],
"categorie": "groupe_spirituel",
"racines_sacrees": 2,
"note": "Chamans, gardiens des lois sacrées"
@ -185,11 +227,14 @@
"Oraumi": {
"traductions": [
{
"confluent": "Oraumi",
"confluent": "oraumi",
"type": "nom_propre",
"composition": "or-a-umi",
"sens_litteral": "Aurore avec esprit",
"racines": ["ora", "umi"],
"racines": [
"ora",
"umi"
],
"categorie": "groupe_spirituel"
}
]
@ -197,11 +242,14 @@
"Ciels-clairs": {
"traductions": [
{
"confluent": "Zerusora",
"confluent": "zerusora",
"type": "composition",
"composition": "zer-u-sora",
"sens_litteral": "Ciel de lumière",
"racines": ["zeru", "sora"],
"racines": [
"zeru",
"sora"
],
"categorie": "groupe_social",
"note": "Nés sous ciel dégagé, yeux aux couleurs de l'aurore"
}
@ -210,11 +258,14 @@
"Sans-ciels": {
"traductions": [
{
"confluent": "Zozeru",
"confluent": "zozeru",
"type": "composition",
"composition": "zo-zeru",
"sens_litteral": "Sans ciel",
"racines": ["zo", "zeru"],
"racines": [
"zo",
"zeru"
],
"categorie": "groupe_social",
"note": "Nés sous ciel couvert"
}
@ -223,11 +274,14 @@
"Gardiens de la Confluence": {
"traductions": [
{
"confluent": "Zakiuraakota",
"confluent": "zakiuraakota",
"type": "composition",
"composition": "zak-i-uraakota",
"sens_litteral": "Gardiens de la Confluence",
"racines": ["zaki", "uraakota"],
"racines": [
"zaki",
"uraakota"
],
"categorie": "titre"
}
]
@ -235,11 +289,14 @@
"Caste de l'Air": {
"traductions": [
{
"confluent": "Venaakota",
"confluent": "venaakota",
"type": "composition",
"composition": "ven-aa-kota",
"sens_litteral": "Air mêlé à union",
"racines": ["vena", "kota"],
"racines": [
"vena",
"kota"
],
"categorie": "caste_element"
}
]
@ -247,11 +304,14 @@
"Caste du Feu": {
"traductions": [
{
"confluent": "Sukiaakota",
"confluent": "sukiaakota",
"type": "composition",
"composition": "suk-aa-kota",
"sens_litteral": "Feu mêlé à union",
"racines": ["suki", "kota"],
"racines": [
"suki",
"kota"
],
"categorie": "caste_element"
}
]
@ -259,11 +319,14 @@
"Caste de l'Eau": {
"traductions": [
{
"confluent": "Uraakota",
"confluent": "uraakota",
"type": "composition",
"composition": "ur-aa-kota",
"sens_litteral": "Eau mêlée à union",
"racines": ["ura", "kota"],
"racines": [
"ura",
"kota"
],
"categorie": "caste_element",
"note": "Même nom que La Confluence"
}
@ -272,11 +335,14 @@
"Caste de la Terre": {
"traductions": [
{
"confluent": "Tokaakota",
"confluent": "tokaakota",
"type": "composition",
"composition": "tok-aa-kota",
"sens_litteral": "Terre mêlée à union",
"racines": ["toka", "kota"],
"racines": [
"toka",
"kota"
],
"categorie": "caste_element"
}
]
@ -284,11 +350,14 @@
"Caste de l'Éther": {
"traductions": [
{
"confluent": "Umiaakota",
"confluent": "umiaakota",
"type": "composition",
"composition": "um-aa-kota",
"sens_litteral": "Esprit mêlé à union",
"racines": ["umi", "kota"],
"racines": [
"umi",
"kota"
],
"categorie": "caste_element"
}
]

View File

@ -5,11 +5,14 @@
"La Confluence": {
"traductions": [
{
"confluent": "Uraakota",
"confluent": "uraakota",
"type": "nom_propre",
"composition": "ur-aa-kota",
"sens_litteral": "Eau mêlée à l'union",
"racines": ["ura", "kota"],
"racines": [
"ura",
"kota"
],
"categorie": "lieu_majeur",
"note": "Lieu central où deux rivières se rejoignent"
}
@ -18,11 +21,14 @@
"Uraakota": {
"traductions": [
{
"confluent": "Uraakota",
"confluent": "uraakota",
"type": "nom_propre",
"composition": "ur-aa-kota",
"sens_litteral": "Eau mêlée à l'union",
"racines": ["ura", "kota"],
"racines": [
"ura",
"kota"
],
"categorie": "lieu_majeur"
}
]
@ -30,11 +36,14 @@
"Gouffre Humide": {
"traductions": [
{
"confluent": "Vukuura",
"confluent": "vukuura",
"type": "nom_propre",
"composition": "vuk-u-ura",
"sens_litteral": "Gouffre de l'eau",
"racines": ["vuku", "ura"],
"racines": [
"vuku",
"ura"
],
"categorie": "lieu_majeur",
"note": "Lieu sacré souterrain"
}
@ -43,11 +52,14 @@
"Vukuura": {
"traductions": [
{
"confluent": "Vukuura",
"confluent": "vukuura",
"type": "nom_propre",
"composition": "vuk-u-ura",
"sens_litteral": "Gouffre de l'eau",
"racines": ["vuku", "ura"],
"racines": [
"vuku",
"ura"
],
"categorie": "lieu_majeur"
}
]
@ -55,11 +67,14 @@
"Antres des Échos": {
"traductions": [
{
"confluent": "Kekutoka",
"confluent": "kekutoka",
"type": "nom_propre",
"composition": "kek-u-toka",
"sens_litteral": "Écho de la terre",
"racines": ["keko", "toka"],
"racines": [
"keko",
"toka"
],
"categorie": "lieu_majeur",
"note": "Grottes souterraines"
}
@ -68,11 +83,14 @@
"Kekutoka": {
"traductions": [
{
"confluent": "Kekutoka",
"confluent": "kekutoka",
"type": "nom_propre",
"composition": "kek-u-toka",
"sens_litteral": "Écho de la terre",
"racines": ["keko", "toka"],
"racines": [
"keko",
"toka"
],
"categorie": "lieu_majeur"
}
]
@ -80,11 +98,14 @@
"Cercles de Vigile": {
"traductions": [
{
"confluent": "Sikuvela",
"confluent": "sikuvela",
"type": "nom_propre",
"composition": "sik-u-vela",
"sens_litteral": "Cercle de la vigile",
"racines": ["siku", "vela"],
"racines": [
"siku",
"vela"
],
"categorie": "lieu_majeur",
"note": "Promontoires de guet"
}
@ -93,11 +114,14 @@
"Sikuvela": {
"traductions": [
{
"confluent": "Sikuvela",
"confluent": "sikuvela",
"type": "nom_propre",
"composition": "sik-u-vela",
"sens_litteral": "Cercle de la vigile",
"racines": ["siku", "vela"],
"racines": [
"siku",
"vela"
],
"categorie": "lieu_majeur"
}
]
@ -105,11 +129,14 @@
"Halls des Serments": {
"traductions": [
{
"confluent": "Talusavu",
"confluent": "talusavu",
"type": "nom_propre",
"composition": "tal-u-savu",
"sens_litteral": "Hall du serment",
"racines": ["talu", "savu"],
"racines": [
"talu",
"savu"
],
"categorie": "lieu_majeur",
"note": "Structures gouvernementales"
}
@ -118,11 +145,14 @@
"Talusavu": {
"traductions": [
{
"confluent": "Talusavu",
"confluent": "talusavu",
"type": "nom_propre",
"composition": "tal-u-savu",
"sens_litteral": "Hall du serment",
"racines": ["talu", "savu"],
"racines": [
"talu",
"savu"
],
"categorie": "lieu_majeur"
}
]
@ -130,11 +160,14 @@
"Grande Fresque": {
"traductions": [
{
"confluent": "Ekakova",
"confluent": "ekakova",
"type": "nom_propre",
"composition": "ek-a-kova",
"sens_litteral": "Totalité avec peinture",
"racines": ["eka", "kova"],
"racines": [
"eka",
"kova"
],
"categorie": "lieu_majeur",
"note": "Artefact multi-générationnel"
}
@ -143,11 +176,14 @@
"Ekakova": {
"traductions": [
{
"confluent": "Ekakova",
"confluent": "ekakova",
"type": "nom_propre",
"composition": "ek-a-kova",
"sens_litteral": "Totalité avec peinture",
"racines": ["eka", "kova"],
"racines": [
"eka",
"kova"
],
"categorie": "lieu_majeur"
}
]
@ -155,11 +191,14 @@
"Gorge Profonde": {
"traductions": [
{
"confluent": "Vukumako",
"confluent": "vukumako",
"type": "composition",
"composition": "vuk-u-mako",
"sens_litteral": "Gouffre de grandeur",
"racines": ["vuku", "mako"],
"racines": [
"vuku",
"mako"
],
"categorie": "lieu"
}
]
@ -167,11 +206,14 @@
"Ruines des Premiers Ancêtres": {
"traductions": [
{
"confluent": "Osiuaita",
"confluent": "osiuaita",
"type": "composition",
"composition": "os-i-aita",
"sens_litteral": "Mort des ancêtres",
"racines": ["osi", "aita"],
"racines": [
"osi",
"aita"
],
"categorie": "lieu_sacre",
"note": "Vestiges de la civilisation disparue"
}
@ -184,7 +226,10 @@
"type": "composition",
"composition": "kot-a-zaki",
"sens_litteral": "Union avec protection",
"racines": ["kota", "zaki"],
"racines": [
"kota",
"zaki"
],
"categorie": "structure"
}
]
@ -196,7 +241,10 @@
"type": "composition",
"composition": "tok-u-vuku",
"sens_litteral": "Terre du bas",
"racines": ["toka", "vuku"],
"racines": [
"toka",
"vuku"
],
"categorie": "region"
}
]
@ -208,7 +256,10 @@
"type": "composition",
"composition": "vel-a-meru",
"sens_litteral": "Vigile avec mer",
"racines": ["vela", "meru"],
"racines": [
"vela",
"meru"
],
"categorie": "structure"
}
]
@ -220,7 +271,10 @@
"type": "composition",
"composition": "as-a-loku",
"sens_litteral": "Sacré avec lieu",
"racines": ["asa", "loku"],
"racines": [
"asa",
"loku"
],
"categorie": "structure"
}
]
@ -232,7 +286,10 @@
"type": "composition",
"composition": "zak-i-kari",
"sens_litteral": "Protection de pierre",
"racines": ["zaki", "kari"],
"racines": [
"zaki",
"kari"
],
"categorie": "structure"
}
]

View File

@ -570,6 +570,21 @@
"note": "Manger violemment, comme un prédateur"
}
]
},
"exister": {
"racine_fr": "exist",
"traductions": [
{
"confluent": "urak",
"type": "verbe_irregulier",
"racine": "ura",
"forme_liee": "ur",
"structure": "VCVC",
"domaine": "action_existentielle",
"note": "Verbe irrégulier existentiel - 'il y a', présence, existence. Dérivé de la racine sacrée 'ura' (eau/flux vital)"
}
],
"synonymes_fr": ["il y a", "y a-t-il", "existe", "existent", "existant"]
}
}
}

View File

@ -5,11 +5,15 @@
"Cercle des Sages": {
"traductions": [
{
"confluent": "Rikuusekitori",
"confluent": "rikuusekitori",
"type": "nom_propre",
"composition": "sik-u-sek-i-tori",
"sens_litteral": "Cercle des porteurs-de-savoir",
"racines": ["siku", "seka", "tori"],
"racines": [
"siku",
"seka",
"tori"
],
"categorie": "institution",
"note": "Institution centrale"
}
@ -18,11 +22,14 @@
"Tribunal des Mœurs": {
"traductions": [
{
"confluent": "Verimuloku",
"confluent": "verimuloku",
"type": "nom_propre",
"composition": "ver-i-m-loku",
"sens_litteral": "Lieu de vérité des mœurs",
"racines": ["veri", "loku"],
"racines": [
"veri",
"loku"
],
"categorie": "institution"
}
]
@ -30,11 +37,14 @@
"Proclamateur": {
"traductions": [
{
"confluent": "Vokiueka",
"confluent": "vokiueka",
"type": "nom_propre",
"composition": "vok-i-eka",
"sens_litteral": "Voix de la totalité",
"racines": ["voki", "eka"],
"racines": [
"voki",
"eka"
],
"categorie": "titre"
}
]
@ -42,11 +52,14 @@
"Assemblée des Chefs": {
"traductions": [
{
"confluent": "Kotaukasi",
"confluent": "kotaukasi",
"type": "nom_propre",
"composition": "kot-a-kasi",
"sens_litteral": "Union avec les chefs",
"racines": ["kota", "kasi"],
"racines": [
"kota",
"kasi"
],
"categorie": "institution"
}
]
@ -54,11 +67,14 @@
"Maison des Découvertes": {
"traductions": [
{
"confluent": "Nutuumiris",
"confluent": "nutuumiris",
"type": "nom_propre",
"composition": "nut-u-miris",
"sens_litteral": "Maison de la découverte",
"racines": ["nutu", "miris"],
"racines": [
"nutu",
"miris"
],
"categorie": "institution"
}
]
@ -66,11 +82,14 @@
"Arbitre des Esprits": {
"traductions": [
{
"confluent": "Zakiiumi",
"confluent": "zakiiumi",
"type": "nom_propre",
"composition": "zak-ii-umi",
"sens_litteral": "Celui qui EST gardien des esprits",
"racines": ["zaki", "umi"],
"racines": [
"zaki",
"umi"
],
"categorie": "titre_supreme",
"note": "Entité tutélaire du jeu, pouvoir de réserve"
}
@ -79,11 +98,14 @@
"Directoire": {
"traductions": [
{
"confluent": "Kasiiukota",
"confluent": "kasiiukota",
"type": "nom_propre",
"composition": "kas-ii-kota",
"sens_litteral": "Chefs unis",
"racines": ["kasi", "kota"],
"racines": [
"kasi",
"kota"
],
"categorie": "institution"
}
]
@ -91,11 +113,14 @@
"Hall des Serments": {
"traductions": [
{
"confluent": "Talusavu",
"confluent": "talusavu",
"type": "nom_propre",
"composition": "tal-u-savu",
"sens_litteral": "Hall du serment",
"racines": ["talu", "savu"],
"racines": [
"talu",
"savu"
],
"categorie": "lieu_institution"
}
]
@ -103,11 +128,15 @@
"Conseil du Village": {
"traductions": [
{
"confluent": "Kotaurikusi",
"confluent": "kotaurikusi",
"type": "composition",
"composition": "kot-a-sik-u-si",
"sens_litteral": "Union avec cercle de regard",
"racines": ["kota", "siku", "sili"],
"racines": [
"kota",
"siku",
"sili"
],
"categorie": "institution"
}
]
@ -115,11 +144,14 @@
"Autel ancestral": {
"traductions": [
{
"confluent": "Asauaita",
"confluent": "asauaita",
"type": "composition",
"composition": "as-a-aita",
"sens_litteral": "Sacré avec ancêtre",
"racines": ["asa", "aita"],
"racines": [
"asa",
"aita"
],
"categorie": "lieu_sacre"
}
]
@ -127,11 +159,14 @@
"Vigile Lunaire": {
"traductions": [
{
"confluent": "Velauluna",
"confluent": "velauluna",
"type": "composition",
"composition": "vel-a-luna",
"sens_litteral": "Vigile avec lune",
"racines": ["vela", "luna"],
"racines": [
"vela",
"luna"
],
"categorie": "rituel"
}
]
@ -139,11 +174,14 @@
"Jour des Ancêtres": {
"traductions": [
{
"confluent": "Sorauaita",
"confluent": "sorauaita",
"type": "composition",
"composition": "sor-a-aita",
"sens_litteral": "Jour avec ancêtres",
"racines": ["sora", "aita"],
"racines": [
"sora",
"aita"
],
"categorie": "celebration"
}
]
@ -151,11 +189,14 @@
"Jour du Faucon": {
"traductions": [
{
"confluent": "Sorauaki",
"confluent": "sorauaki",
"type": "composition",
"composition": "sor-a-aki",
"sens_litteral": "Jour avec faucon",
"racines": ["sora", "aki"],
"racines": [
"sora",
"aki"
],
"categorie": "celebration"
}
]

View File

@ -12,16 +12,21 @@
"note": "Animal sacré central dans la culture"
}
],
"synonymes_fr": ["grues"]
"synonymes_fr": [
"grues"
]
},
"Regards-Libres": {
"traductions": [
{
"confluent": "Aruaska",
"confluent": "aruaska",
"type": "composition",
"composition": "al-u-aska",
"sens_litteral": "Grue de liberté",
"racines": ["alu", "aska"],
"racines": [
"alu",
"aska"
],
"categorie": "animal_sacre",
"note": "Grues domestiquées, messagers sacrés"
}
@ -30,11 +35,14 @@
"grue cendrée": {
"traductions": [
{
"confluent": "Arusenu",
"confluent": "arusenu",
"type": "composition",
"composition": "al-u-senu",
"sens_litteral": "Grue de cendre",
"racines": ["alu", "senu"],
"racines": [
"alu",
"senu"
],
"categorie": "animal"
}
]
@ -60,7 +68,9 @@
"note": "Animal générique"
}
],
"synonymes_fr": ["animal"]
"synonymes_fr": [
"animal"
]
},
"bête sacrée": {
"traductions": [
@ -69,7 +79,10 @@
"type": "composition",
"composition": "as-a-betu",
"sens_litteral": "Sacré avec bête",
"racines": ["asa", "betu"],
"racines": [
"asa",
"betu"
],
"categorie": "animal_sacre"
}
]
@ -81,7 +94,10 @@
"type": "composition",
"composition": "zan-u-betu",
"sens_litteral": "Bête de chasse",
"racines": ["zana", "betu"],
"racines": [
"zana",
"betu"
],
"domaine": "animal"
}
]
@ -104,7 +120,10 @@
"type": "composition",
"composition": "pis-u-nura",
"sens_litteral": "Poisson de rivière",
"racines": ["pisu", "nura"],
"racines": [
"pisu",
"nura"
],
"domaine": "animal"
}
]
@ -127,7 +146,10 @@
"type": "composition",
"composition": "sep-u-ura",
"sens_litteral": "Serpent de l'eau",
"racines": ["sepu", "ura"],
"racines": [
"sepu",
"ura"
],
"domaine": "animal"
}
]
@ -150,7 +172,10 @@
"type": "composition",
"composition": "ap-i-zana",
"sens_litteral": "Oiseau de chasse",
"racines": ["apo", "zana"],
"racines": [
"apo",
"zana"
],
"domaine": "animal"
}
]
@ -162,7 +187,10 @@
"type": "composition",
"composition": "zo-mira",
"sens_litteral": "Sans vue",
"racines": ["zo", "mira"],
"racines": [
"zo",
"mira"
],
"domaine": "animal",
"note": "Créature jamais observée"
}
@ -186,7 +214,9 @@
"type": "composition",
"composition": "loku + su",
"sens_litteral": "Loups (pluriel)",
"racines": ["loku"],
"racines": [
"loku"
],
"domaine": "animal"
}
]

View File

@ -9,7 +9,10 @@
"type": "composition",
"composition": "sil-i-aska",
"sens_litteral": "Regard de liberté",
"racines": ["sili", "aska"],
"racines": [
"sili",
"aska"
],
"domaine": "concept_fondateur",
"note": "État spirituel central"
}
@ -25,7 +28,9 @@
"note": "Union, rencontre"
}
],
"synonymes_fr": ["union"]
"synonymes_fr": [
"union"
]
},
"harmonie": {
"traductions": [
@ -34,7 +39,10 @@
"type": "composition",
"composition": "kot-a-tosa",
"sens_litteral": "Union avec le bien",
"racines": ["kota", "tosa"],
"racines": [
"kota",
"tosa"
],
"domaine": "concept_abstrait"
}
]
@ -46,7 +54,10 @@
"type": "composition",
"composition": "sek-a-aita",
"sens_litteral": "Savoir des ancêtres",
"racines": ["seka", "aita"],
"racines": [
"seka",
"aita"
],
"domaine": "concept_abstrait"
}
]
@ -58,7 +69,10 @@
"type": "composition",
"composition": "val-u-veri",
"sens_litteral": "Valeur de vérité",
"racines": ["valu", "veri"],
"racines": [
"valu",
"veri"
],
"domaine": "concept_abstrait"
}
]
@ -70,7 +84,10 @@
"type": "composition",
"composition": "ver-i-kota",
"sens_litteral": "Vérité de l'union",
"racines": ["veri", "kota"],
"racines": [
"veri",
"kota"
],
"domaine": "concept_abstrait"
}
]
@ -104,7 +121,9 @@
"domaine": "concept_fondateur"
}
],
"synonymes_fr": ["âme"]
"synonymes_fr": [
"âme"
]
},
"destinée": {
"traductions": [
@ -113,7 +132,10 @@
"type": "composition",
"composition": "tek-i-umi",
"sens_litteral": "Chemin de l'esprit",
"racines": ["teki", "umi"],
"racines": [
"teki",
"umi"
],
"domaine": "concept_abstrait"
}
]
@ -125,7 +147,10 @@
"type": "composition",
"composition": "as-a-neka",
"sens_litteral": "Sacré avec œuvre",
"racines": ["asa", "neka"],
"racines": [
"asa",
"neka"
],
"domaine": "concept_abstrait"
}
]
@ -137,7 +162,10 @@
"type": "composition",
"composition": "sek-a-tosa",
"sens_litteral": "Savoir avec bien",
"racines": ["seka", "tosa"],
"racines": [
"seka",
"tosa"
],
"domaine": "concept_abstrait"
}
]
@ -149,7 +177,10 @@
"type": "composition",
"composition": "kis-u-n-aita",
"sens_litteral": "Enseignement des ancêtres",
"racines": ["kisu", "aita"],
"racines": [
"kisu",
"aita"
],
"domaine": "concept_abstrait"
}
]
@ -157,25 +188,32 @@
"L'Autre": {
"traductions": [
{
"confluent": "Tova",
"confluent": "tova",
"type": "nom_propre",
"composition": "tova",
"sens_litteral": "Celui de loin",
"racines": ["tova"],
"racines": [
"tova"
],
"domaine": "social",
"note": "L'étranger, celui qui n'est pas du peuple"
}
],
"synonymes_fr": ["étranger"]
"synonymes_fr": [
"étranger"
]
},
"Premiers Ancêtres": {
"traductions": [
{
"confluent": "Enuaita",
"confluent": "enuaita",
"type": "nom_propre",
"composition": "en-u-aita",
"sens_litteral": "Origine des ancêtres",
"racines": ["ena", "aita"],
"racines": [
"ena",
"aita"
],
"domaine": "spirituel"
}
]
@ -187,7 +225,10 @@
"type": "composition",
"composition": "sil-u-novi",
"sens_litteral": "Regard du nouveau",
"racines": ["sili", "novi"],
"racines": [
"sili",
"novi"
],
"domaine": "spirituel"
}
]
@ -199,7 +240,10 @@
"type": "composition",
"composition": "ven-u-zoka",
"sens_litteral": "Air de l'ennemi",
"racines": ["vena", "zoka"],
"racines": [
"vena",
"zoka"
],
"domaine": "danger"
}
]
@ -211,7 +255,10 @@
"type": "composition",
"composition": "as-a-tosa",
"sens_litteral": "Sacré avec bien",
"racines": ["asa", "tosa"],
"racines": [
"asa",
"tosa"
],
"domaine": "spirituel"
}
]
@ -223,7 +270,10 @@
"type": "composition",
"composition": "as-a-zoka",
"sens_litteral": "Sacré avec ennemi",
"racines": ["asa", "zoka"],
"racines": [
"asa",
"zoka"
],
"domaine": "spirituel"
}
]
@ -235,7 +285,10 @@
"type": "composition",
"composition": "kot-a-neka",
"sens_litteral": "Union avec œuvre",
"racines": ["kota", "neka"],
"racines": [
"kota",
"neka"
],
"domaine": "social"
}
]
@ -261,7 +314,9 @@
"note": "Groupe de sang"
}
],
"synonymes_fr": ["clan"]
"synonymes_fr": [
"clan"
]
},
"généalogie": {
"traductions": [
@ -270,7 +325,10 @@
"type": "composition",
"composition": "mit-u-aita",
"sens_litteral": "Famille des ancêtres",
"racines": ["mitu", "aita"],
"racines": [
"mitu",
"aita"
],
"domaine": "social"
}
]
@ -293,7 +351,10 @@
"type": "composition",
"composition": "sav-u-pasu",
"sens_litteral": "Serment du sang",
"racines": ["savu", "pasu"],
"racines": [
"savu",
"pasu"
],
"domaine": "institution"
}
]
@ -315,7 +376,10 @@
"type": "composition",
"composition": "lok-u-asa",
"sens_litteral": "Loi du sacré",
"racines": ["loku", "asa"],
"racines": [
"loku",
"asa"
],
"domaine": "institution"
}
]
@ -337,7 +401,10 @@
"type": "composition",
"composition": "ok-i-veri",
"sens_litteral": "Épreuve de vérité",
"racines": ["oki", "veri"],
"racines": [
"oki",
"veri"
],
"domaine": "institution"
}
]
@ -349,7 +416,10 @@
"type": "composition",
"composition": "zo-savu",
"sens_litteral": "Sans serment",
"racines": ["zo", "savu"],
"racines": [
"zo",
"savu"
],
"domaine": "concept_negatif"
}
]
@ -361,7 +431,10 @@
"type": "composition",
"composition": "zo-kota",
"sens_litteral": "Sans union",
"racines": ["zo", "kota"],
"racines": [
"zo",
"kota"
],
"domaine": "concept_negatif"
}
]
@ -376,6 +449,22 @@
}
]
},
"ennemi": {
"traductions": [
{
"confluent": "zoka",
"type": "racine",
"forme_liee": "zok",
"domaine": "conflit",
"note": "Adversaire, hostile, mal"
}
],
"synonymes_fr": [
"adversaire",
"hostile",
"malveillant"
]
},
"paix": {
"traductions": [
{
@ -393,7 +482,10 @@
"type": "composition",
"composition": "ok-i-a-tosa",
"sens_litteral": "Épreuve avec bien",
"racines": ["oki", "tosa"],
"racines": [
"oki",
"tosa"
],
"domaine": "conflit"
}
]
@ -405,7 +497,10 @@
"type": "composition",
"composition": "ok-i-a-zoka",
"sens_litteral": "Épreuve avec mal",
"racines": ["oki", "zoka"],
"racines": [
"oki",
"zoka"
],
"domaine": "conflit"
}
]
@ -417,7 +512,10 @@
"type": "composition",
"composition": "os-i-a-zoka",
"sens_litteral": "Mort avec hostilité",
"racines": ["osi", "zoka"],
"racines": [
"osi",
"zoka"
],
"domaine": "concept_negatif"
}
]
@ -429,7 +527,10 @@
"type": "composition",
"composition": "bet-u-zoka",
"sens_litteral": "Bête de l'hostilité",
"racines": ["betu", "zoka"],
"racines": [
"betu",
"zoka"
],
"domaine": "concept_negatif"
}
]
@ -441,7 +542,10 @@
"type": "composition",
"composition": "zok-u-zana",
"sens_litteral": "Secret de chasse",
"racines": ["zoku", "zana"],
"racines": [
"zoku",
"zana"
],
"domaine": "conflit"
}
]
@ -453,7 +557,10 @@
"type": "composition",
"composition": "pas-ik-i-tori",
"sens_litteral": "Personne capturée",
"racines": ["pasik", "tori"],
"racines": [
"pasik",
"tori"
],
"domaine": "conflit"
}
]

View File

@ -5,11 +5,15 @@
"Rituel du Regard Partagé": {
"traductions": [
{
"confluent": "Asausiliaakota",
"confluent": "asausiliaakota",
"type": "nom_propre",
"composition": "as-a-sil-aa-kota",
"sens_litteral": "Sacré avec regard-mêlé-à-union",
"racines": ["asa", "sili", "kota"],
"racines": [
"asa",
"sili",
"kota"
],
"categorie": "rituel_majeur",
"note": "Rituel central de la civilisation"
}
@ -22,7 +26,10 @@
"type": "composition",
"composition": "tek-i-asa",
"sens_litteral": "Chemin du sacré",
"racines": ["teki", "asa"],
"racines": [
"teki",
"asa"
],
"domaine": "rituel"
}
]
@ -34,7 +41,10 @@
"type": "composition",
"composition": "as-a-osi",
"sens_litteral": "Sacré avec mort",
"racines": ["asa", "osi"],
"racines": [
"asa",
"osi"
],
"domaine": "rituel"
}
]
@ -42,11 +52,14 @@
"Cercles de Vigile": {
"traductions": [
{
"confluent": "Sikuvela",
"confluent": "sikuvela",
"type": "nom_propre",
"composition": "sik-u-vela",
"sens_litteral": "Cercle de la vigile",
"racines": ["siku", "vela"],
"racines": [
"siku",
"vela"
],
"categorie": "rituel"
}
]
@ -54,11 +67,14 @@
"Communion des esprits": {
"traductions": [
{
"confluent": "Kotamuumi",
"confluent": "kotamuumi",
"type": "nom_propre",
"composition": "kot-a-m-umi",
"sens_litteral": "Union avec esprits",
"racines": ["kota", "umi"],
"racines": [
"kota",
"umi"
],
"categorie": "rituel"
}
]
@ -66,11 +82,15 @@
"Lois du Sang et de la Bête": {
"traductions": [
{
"confluent": "Lokuurasubetu",
"confluent": "lokuurasubetu",
"type": "nom_propre",
"composition": "lok-u-pasu-betu",
"sens_litteral": "Loi du sang et de la bête",
"racines": ["loku", "pasu", "betu"],
"racines": [
"loku",
"pasu",
"betu"
],
"categorie": "loi_sacree"
}
]
@ -78,11 +98,14 @@
"Porteur de Flamme": {
"traductions": [
{
"confluent": "Takiusuki",
"confluent": "takiusuki",
"type": "nom_propre",
"composition": "tak-i-suki",
"sens_litteral": "Porteur du feu",
"racines": ["taka", "suki"],
"racines": [
"taka",
"suki"
],
"categorie": "titre_rituel"
}
]
@ -90,11 +113,14 @@
"Mémento": {
"traductions": [
{
"confluent": "Memuuaita",
"confluent": "memuuaita",
"type": "nom_propre",
"composition": "mem-u-aita",
"sens_litteral": "Mémoire des ancêtres",
"racines": ["memu", "aita"],
"racines": [
"memu",
"aita"
],
"categorie": "objet_rituel"
}
]
@ -106,7 +132,10 @@
"type": "composition",
"composition": "sav-u-asa",
"sens_litteral": "Serment du sacré",
"racines": ["savu", "asa"],
"racines": [
"savu",
"asa"
],
"domaine": "rituel"
}
]
@ -114,11 +143,14 @@
"Glyphes du Gouffre": {
"traductions": [
{
"confluent": "Kovuuvuku",
"confluent": "kovuuvuku",
"type": "nom_propre",
"composition": "kov-u-vuku",
"sens_litteral": "Gravures du gouffre",
"racines": ["kova", "vuku"],
"racines": [
"kova",
"vuku"
],
"categorie": "objet_rituel"
}
]
@ -130,7 +162,10 @@
"type": "composition",
"composition": "kop-u-kova",
"sens_litteral": "Corde de gravures",
"racines": ["kopu", "kova"],
"racines": [
"kopu",
"kova"
],
"domaine": "objet_rituel"
}
]
@ -142,7 +177,10 @@
"type": "composition",
"composition": "tab-u-toka",
"sens_litteral": "Tablette de terre",
"racines": ["tabu", "toka"],
"racines": [
"tabu",
"toka"
],
"domaine": "objet_rituel"
}
]
@ -154,11 +192,16 @@
"type": "composition",
"composition": "kov-a-sili",
"sens_litteral": "Gravure avec regard",
"racines": ["kova", "sili"],
"racines": [
"kova",
"sili"
],
"domaine": "communication"
}
],
"synonymes_fr": ["écriture"]
"synonymes_fr": [
"écriture"
]
},
"argile vivante": {
"traductions": [
@ -167,7 +210,10 @@
"type": "composition",
"composition": "tok-a-ita",
"sens_litteral": "Terre avec vie",
"racines": ["toka", "ita"],
"racines": [
"toka",
"ita"
],
"domaine": "materiau_rituel"
}
]
@ -179,7 +225,10 @@
"type": "composition",
"composition": "mil-u-kari",
"sens_litteral": "Lait de pierre",
"racines": ["milu", "kari"],
"racines": [
"milu",
"kari"
],
"domaine": "materiau_rituel"
}
]
@ -191,7 +240,10 @@
"type": "composition",
"composition": "kar-i-suki",
"sens_litteral": "Pierre du feu",
"racines": ["kari", "suki"],
"racines": [
"kari",
"suki"
],
"domaine": "materiau_rituel"
}
]
@ -203,7 +255,10 @@
"type": "composition",
"composition": "kol-u-aita",
"sens_litteral": "Couleurs des ancêtres",
"racines": ["kolu", "aita"],
"racines": [
"kolu",
"aita"
],
"domaine": "materiau_rituel"
}
]
@ -211,11 +266,14 @@
"Rhombes sacrés": {
"traductions": [
{
"confluent": "Onuuasa",
"confluent": "onuuasa",
"type": "nom_propre",
"composition": "on-u-asa",
"sens_litteral": "Son du sacré",
"racines": ["onu", "asa"],
"racines": [
"onu",
"asa"
],
"categorie": "objet_rituel",
"note": "Instruments produisant le son sacré"
}
@ -224,11 +282,14 @@
"Rhombes géants": {
"traductions": [
{
"confluent": "Onuumako",
"confluent": "onuumako",
"type": "nom_propre",
"composition": "on-u-mako",
"sens_litteral": "Son de grandeur",
"racines": ["onu", "mako"],
"racines": [
"onu",
"mako"
],
"categorie": "objet_rituel"
}
]
@ -240,7 +301,10 @@
"type": "composition",
"composition": "on-u-pisu",
"sens_litteral": "Son petit",
"racines": ["onu", "pisu"],
"racines": [
"onu",
"pisu"
],
"domaine": "objet_rituel"
}
]
@ -252,7 +316,11 @@
"type": "composition",
"composition": "nek-a-eka-aita",
"sens_litteral": "Œuvre avec totalité des ancêtres",
"racines": ["neka", "eka", "aita"],
"racines": [
"neka",
"eka",
"aita"
],
"domaine": "objet_rituel"
}
]
@ -260,11 +328,14 @@
"Grande Fresque": {
"traductions": [
{
"confluent": "Ekakova",
"confluent": "ekakova",
"type": "nom_propre",
"composition": "ek-a-kova",
"sens_litteral": "Totalité avec peinture",
"racines": ["eka", "kova"],
"racines": [
"eka",
"kova"
],
"categorie": "lieu_rituel"
}
]
@ -276,7 +347,10 @@
"type": "composition",
"composition": "sil-u-temi",
"sens_litteral": "Regard du temps",
"racines": ["sili", "temi"],
"racines": [
"sili",
"temi"
],
"domaine": "concept_rituel"
}
]
@ -284,11 +358,15 @@
"Autel des Pionniers": {
"traductions": [
{
"confluent": "Asauenuaita",
"confluent": "asauenuaita",
"type": "nom_propre",
"composition": "as-a-en-u-aita",
"sens_litteral": "Sacré avec origine des ancêtres",
"racines": ["asa", "ena", "aita"],
"racines": [
"asa",
"ena",
"aita"
],
"categorie": "lieu_rituel"
}
]

View File

@ -5,11 +5,14 @@
"Arbitre des Esprits": {
"traductions": [
{
"confluent": "Zakiiumi",
"confluent": "zakiiumi",
"type": "nom_propre",
"composition": "zak-ii-umi",
"sens_litteral": "Celui qui EST gardien des esprits",
"racines": ["zaki", "umi"],
"racines": [
"zaki",
"umi"
],
"categorie": "titre_supreme",
"note": "Entité tutélaire du jeu, pouvoir de réserve"
}
@ -22,7 +25,10 @@
"type": "composition",
"composition": "sil-u-umi",
"sens_litteral": "Regard de l'esprit",
"racines": ["sili", "umi"],
"racines": [
"sili",
"umi"
],
"domaine": "titre_spirituel"
}
]
@ -40,11 +46,14 @@
"Grand Chef": {
"traductions": [
{
"confluent": "Makokasi",
"confluent": "makokasi",
"type": "nom_propre",
"composition": "mak-o-kasi",
"sens_litteral": "Chef de grandeur",
"racines": ["mako", "kasi"],
"racines": [
"mako",
"kasi"
],
"categorie": "titre"
}
]
@ -52,11 +61,14 @@
"Proclamateur": {
"traductions": [
{
"confluent": "Vokiueka",
"confluent": "vokiueka",
"type": "nom_propre",
"composition": "vok-i-eka",
"sens_litteral": "Voix de la totalité",
"racines": ["voki", "eka"],
"racines": [
"voki",
"eka"
],
"categorie": "titre"
}
]
@ -68,7 +80,10 @@
"type": "composition",
"composition": "sek-i-tori",
"sens_litteral": "Porteur de savoir",
"racines": ["seka", "tori"],
"racines": [
"seka",
"tori"
],
"domaine": "titre"
}
]
@ -76,23 +91,35 @@
"Faucon Chasseur": {
"traductions": [
{
"confluent": "Akoazana",
"confluent": "akoazana",
"type": "nom_propre",
"composition": "ak-oa-zana",
"sens_litteral": "Faucon vainqueur de la chasse",
"racines": ["aki", "zana"],
"racines": [
"aki",
"zana"
],
"categorie": "caste"
}
],
"synonymes_fr": [
"faucon chasseur",
"faucons chasseurs",
"faucon",
"faucons"
]
},
"Faucon vétéran": {
"traductions": [
{
"confluent": "Akiuaita",
"confluent": "akiuaita",
"type": "composition",
"composition": "ak-i-aita",
"sens_litteral": "Faucon des ancêtres",
"racines": ["aki", "aita"],
"racines": [
"aki",
"aita"
],
"domaine": "titre"
}
]
@ -104,9 +131,17 @@
"type": "composition",
"composition": "zan-a-tori",
"sens_litteral": "Personne de la chasse",
"racines": ["zana", "tori"],
"racines": [
"zana",
"tori"
],
"domaine": "titre"
}
],
"synonymes_fr": [
"chasseur",
"chasseurs",
"traqueurs"
]
},
"guerrier": {
@ -116,7 +151,10 @@
"type": "composition",
"composition": "ok-i-tori",
"sens_litteral": "Personne de l'épreuve",
"racines": ["oki", "tori"],
"racines": [
"oki",
"tori"
],
"domaine": "titre"
}
]
@ -128,7 +166,10 @@
"type": "composition",
"composition": "ark-u-tori",
"sens_litteral": "Personne de l'arc",
"racines": ["arku", "tori"],
"racines": [
"arku",
"tori"
],
"domaine": "titre"
}
]
@ -140,7 +181,10 @@
"type": "composition",
"composition": "tak-i-piki",
"sens_litteral": "Porteur de lance",
"racines": ["taka", "piki"],
"racines": [
"taka",
"piki"
],
"domaine": "titre"
}
]
@ -152,7 +196,10 @@
"type": "composition",
"composition": "kas-i-oki",
"sens_litteral": "Chef de l'épreuve",
"racines": ["kasi", "oki"],
"racines": [
"kasi",
"oki"
],
"domaine": "titre"
}
]
@ -164,7 +211,10 @@
"type": "composition",
"composition": "vel-a-tori",
"sens_litteral": "Personne de vigile",
"racines": ["vela", "tori"],
"racines": [
"vela",
"tori"
],
"domaine": "titre"
}
]
@ -172,13 +222,24 @@
"Aile-Grise": {
"traductions": [
{
"confluent": "Aliaska",
"confluent": "aliaska",
"type": "nom_propre",
"composition": "al-i-aska",
"sens_litteral": "Porteur de la grue libre",
"racines": ["alu", "aska"],
"racines": [
"alu",
"aska"
],
"categorie": "caste"
}
],
"synonymes_fr": [
"aile-grise",
"ailes-grises",
"aile grise",
"ailes grises",
"aile",
"ailes"
]
},
"chaman": {
@ -188,7 +249,10 @@
"type": "composition",
"composition": "um-i-tori",
"sens_litteral": "Personne de l'esprit",
"racines": ["umi", "tori"],
"racines": [
"umi",
"tori"
],
"domaine": "titre_spirituel"
}
]
@ -200,7 +264,11 @@
"type": "composition",
"composition": "al-u-zak-i-tori",
"sens_litteral": "Personne gardienne des grues",
"racines": ["alu", "zaki", "tori"],
"racines": [
"alu",
"zaki",
"tori"
],
"domaine": "titre"
}
]
@ -212,7 +280,10 @@
"type": "composition",
"composition": "tek-i-umi",
"sens_litteral": "Chemin des esprits",
"racines": ["teki", "umi"],
"racines": [
"teki",
"umi"
],
"domaine": "titre_spirituel"
}
]
@ -224,7 +295,10 @@
"type": "composition",
"composition": "zak-i-loku",
"sens_litteral": "Gardien des lois",
"racines": ["zaki", "loku"],
"racines": [
"zaki",
"loku"
],
"domaine": "titre"
}
]
@ -232,11 +306,14 @@
"Passe-bien": {
"traductions": [
{
"confluent": "Takitosa",
"confluent": "takitosa",
"type": "nom_propre",
"composition": "tak-i-tosa",
"sens_litteral": "Porteur du bien",
"racines": ["taka", "tosa"],
"racines": [
"taka",
"tosa"
],
"categorie": "caste"
}
]
@ -244,11 +321,14 @@
"Porteur de Flamme": {
"traductions": [
{
"confluent": "Takiusuki",
"confluent": "takiusuki",
"type": "nom_propre",
"composition": "tak-i-suki",
"sens_litteral": "Porteur du feu",
"racines": ["taka", "suki"],
"racines": [
"taka",
"suki"
],
"categorie": "titre_rituel"
}
]
@ -260,7 +340,10 @@
"type": "composition",
"composition": "mak-o-neka",
"sens_litteral": "Grand de l'œuvre",
"racines": ["mako", "neka"],
"racines": [
"mako",
"neka"
],
"domaine": "titre"
}
]
@ -272,7 +355,10 @@
"type": "composition",
"composition": "nek-a-kari",
"sens_litteral": "Faiseur avec pierre",
"racines": ["neka", "kari"],
"racines": [
"neka",
"kari"
],
"domaine": "titre"
}
]
@ -284,7 +370,10 @@
"type": "composition",
"composition": "kov-a-tori",
"sens_litteral": "Personne de la gravure",
"racines": ["kova", "tori"],
"racines": [
"kova",
"tori"
],
"domaine": "titre"
}
]
@ -296,7 +385,10 @@
"type": "composition",
"composition": "kol-u-tori",
"sens_litteral": "Personne des couleurs",
"racines": ["kolu", "tori"],
"racines": [
"kolu",
"tori"
],
"domaine": "titre"
}
]
@ -308,7 +400,10 @@
"type": "composition",
"composition": "vas-i-tori",
"sens_litteral": "Personne du tissage",
"racines": ["vasi", "tori"],
"racines": [
"vasi",
"tori"
],
"domaine": "titre"
}
]
@ -320,7 +415,10 @@
"type": "composition",
"composition": "pis-u-tori",
"sens_litteral": "Personne du poisson",
"racines": ["pisu", "tori"],
"racines": [
"pisu",
"tori"
],
"domaine": "titre"
}
]
@ -332,7 +430,10 @@
"type": "composition",
"composition": "vuk-u-tori",
"sens_litteral": "Personne du gouffre",
"racines": ["vuku", "tori"],
"racines": [
"vuku",
"tori"
],
"domaine": "titre"
}
]
@ -344,7 +445,10 @@
"type": "composition",
"composition": "ait-a-tori",
"sens_litteral": "Personne avec ancêtre",
"racines": ["aita", "tori"],
"racines": [
"aita",
"tori"
],
"domaine": "titre"
}
]
@ -396,11 +500,21 @@
"type": "composition",
"composition": "kot-a-tori",
"sens_litteral": "Personne d'union",
"racines": ["kota", "tori"],
"racines": [
"kota",
"tori"
],
"domaine": "famille"
}
],
"synonymes_fr": ["épouse"]
"synonymes_fr": [
"épouse",
"épouses",
"mari",
"maris",
"conjoint",
"conjoints"
]
}
}
}

View File

@ -9,7 +9,10 @@
"type": "composition",
"composition": "os-i-sanu",
"sens_litteral": "Mort du corps",
"racines": ["osi", "sanu"],
"racines": [
"osi",
"sanu"
],
"domaine": "sante",
"note": "Concept de maladie comme mort partielle"
}
@ -18,11 +21,15 @@
"Maladie des Antres": {
"traductions": [
{
"confluent": "Osiusanuuvuku",
"confluent": "osiusanuuvuku",
"type": "nom_propre",
"composition": "os-i-sanu-vuku",
"sens_litteral": "Maladie du gouffre",
"racines": ["osi", "sanu", "vuku"],
"racines": [
"osi",
"sanu",
"vuku"
],
"categorie": "maladie",
"note": "Maladie pulmonaire des mineurs"
}
@ -35,7 +42,10 @@
"type": "composition",
"composition": "ven-u-zoka",
"sens_litteral": "Air de l'ennemi",
"racines": ["vena", "zoka"],
"racines": [
"vena",
"zoka"
],
"domaine": "danger"
}
]
@ -47,7 +57,11 @@
"type": "composition",
"composition": "ven-u-zoka-sanu",
"sens_litteral": "Air ennemi du corps",
"racines": ["vena", "zoka", "sanu"],
"racines": [
"vena",
"zoka",
"sanu"
],
"domaine": "maladie"
}
]
@ -59,7 +73,10 @@
"type": "composition",
"composition": "zo-muta",
"sens_litteral": "Sans manger",
"racines": ["zo", "muta"],
"racines": [
"zo",
"muta"
],
"domaine": "maladie"
}
]
@ -71,7 +88,10 @@
"type": "composition",
"composition": "zo-vena",
"sens_litteral": "Sans air",
"racines": ["zo", "vena"],
"racines": [
"zo",
"vena"
],
"domaine": "danger"
}
]
@ -83,7 +103,10 @@
"type": "composition",
"composition": "san-u-suki",
"sens_litteral": "Corps de feu",
"racines": ["sanu", "suki"],
"racines": [
"sanu",
"suki"
],
"domaine": "maladie"
}
]
@ -95,7 +118,10 @@
"type": "composition",
"composition": "san-u-zoka",
"sens_litteral": "Corps de l'ennemi",
"racines": ["sanu", "zoka"],
"racines": [
"sanu",
"zoka"
],
"domaine": "sante"
}
]
@ -107,7 +133,10 @@
"type": "composition",
"composition": "tos-a-sanu",
"sens_litteral": "Bien avec corps",
"racines": ["tosa", "sanu"],
"racines": [
"tosa",
"sanu"
],
"domaine": "sante"
}
]
@ -119,7 +148,10 @@
"type": "composition",
"composition": "kar-oa-vuku",
"sens_litteral": "Pierre vers le gouffre",
"racines": ["kari", "vuku"],
"racines": [
"kari",
"vuku"
],
"domaine": "danger"
}
]
@ -131,7 +163,10 @@
"type": "composition",
"composition": "ur-a-eka",
"sens_litteral": "Eau avec totalité",
"racines": ["ura", "eka"],
"racines": [
"ura",
"eka"
],
"domaine": "danger"
}
]
@ -173,7 +208,10 @@
"type": "composition",
"composition": "vuk-u-kari",
"sens_litteral": "Gouffre de pierre",
"racines": ["vuku", "kari"],
"racines": [
"vuku",
"kari"
],
"domaine": "danger"
}
]
@ -185,7 +223,10 @@
"type": "composition",
"composition": "kar-i-oki",
"sens_litteral": "Pierre de l'épreuve",
"racines": ["kari", "oki"],
"racines": [
"kari",
"oki"
],
"domaine": "danger"
}
]
@ -197,7 +238,10 @@
"type": "composition",
"composition": "nis-oa-vuku",
"sens_litteral": "Neige vers le gouffre",
"racines": ["nisa", "vuku"],
"racines": [
"nisa",
"vuku"
],
"domaine": "danger"
}
]
@ -209,7 +253,10 @@
"type": "composition",
"composition": "suk-i-zoka",
"sens_litteral": "Feu de l'ennemi",
"racines": ["suki", "zoka"],
"racines": [
"suki",
"zoka"
],
"domaine": "danger"
}
]

View File

@ -374,6 +374,18 @@
"domaine": "objet_rituel"
}
]
},
"maison": {
"traductions": [
{
"confluent": "buka",
"type": "racine",
"forme_liee": "buk",
"domaine": "structure",
"note": "Habitation, foyer domestique"
}
],
"synonymes_fr": ["habitation", "demeure", "logis"]
}
}
}

View File

@ -0,0 +1,67 @@
#!/usr/bin/env node
/**
* Script pour convertir tous les mots Confluent en minuscules dans les lexiques
* Le Confluent n'a pas de distinction majuscule/minuscule
*/
const fs = require('fs');
const path = require('path');
const LEXIQUE_DIR = __dirname;
function lowercaseConfluentInFile(filePath) {
console.log(`Processing: ${path.basename(filePath)}`);
const content = fs.readFileSync(filePath, 'utf-8');
const data = JSON.parse(content);
let changeCount = 0;
// Parcourir le dictionnaire
if (data.dictionnaire) {
for (const [key, entry] of Object.entries(data.dictionnaire)) {
if (entry.traductions) {
entry.traductions.forEach(trad => {
if (trad.confluent && trad.confluent !== trad.confluent.toLowerCase()) {
console.log(` - ${trad.confluent}${trad.confluent.toLowerCase()}`);
trad.confluent = trad.confluent.toLowerCase();
changeCount++;
}
});
}
}
}
// Sauvegarder si des changements ont été faits
if (changeCount > 0) {
fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
console.log(`${changeCount} changements sauvegardés\n`);
} else {
console.log(` ✓ Aucun changement nécessaire\n`);
}
return changeCount;
}
function main() {
console.log('=== Conversion Confluent → minuscules ===\n');
const files = fs.readdirSync(LEXIQUE_DIR)
.filter(f => f.endsWith('.json') && !f.startsWith('_'))
.map(f => path.join(LEXIQUE_DIR, f));
let totalChanges = 0;
for (const file of files) {
try {
totalChanges += lowercaseConfluentInFile(file);
} catch (error) {
console.error(`Erreur dans ${path.basename(file)}: ${error.message}\n`);
}
}
console.log(`=== Terminé: ${totalChanges} conversions au total ===`);
}
main();