Skip to content

Commit fb35d96

Browse files
committed
Fix deployment and translation validation issues
- Update deploy.yml to only deploy from main branch (fixes environment protection rules) - Fix translations.ts: remove duplicate German content from French section - Improve validate-translations.js to properly parse TypeScript files - Translation validation now passes with all 249 keys validated across 4 languages
1 parent ffdc20d commit fb35d96

4 files changed

Lines changed: 80 additions & 114 deletions

File tree

.github/workflows/deploy.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ on:
44
push:
55
branches:
66
- main
7-
- next
87
workflow_dispatch:
98

109
permissions:

scripts/validate-translations.js

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,47 @@ import { fileURLToPath } from 'url';
1212
const __filename = fileURLToPath(import.meta.url);
1313
const __dirname = path.dirname(__filename);
1414

15-
// Load the translations file
16-
const translationsPath = path.join(__dirname, '../translations.ts');
17-
const translationsContent = fs.readFileSync(translationsPath, 'utf8');
18-
19-
// Extract the translations object by finding the content between the export and the closing brace
20-
const exportMatch = translationsContent.match(/export const translations: Translations = \{([\s\S]*)\};/);
21-
if (!exportMatch) {
22-
console.error('❌ Could not parse translations.ts file');
15+
// Load the translations file - try both locations
16+
let translationsPath = path.join(__dirname, '../src/data/translations.ts');
17+
if (!fs.existsSync(translationsPath)) {
18+
translationsPath = path.join(__dirname, '../translations.ts');
19+
}
20+
21+
if (!fs.existsSync(translationsPath)) {
22+
console.error('❌ Could not find translations.ts file');
2323
process.exit(1);
2424
}
2525

26-
// Parse the JSON content
26+
// Import and evaluate the TypeScript file using dynamic import
2727
let translations;
2828
try {
29-
const jsonContent = exportMatch[1];
30-
// Clean up the content to make it valid JSON
31-
const cleanedContent = jsonContent
32-
.replace(/(\w+):/g, '"$1":') // Add quotes around keys
33-
.replace(/'/g, '"') // Replace single quotes with double quotes
34-
.replace(/,(\s*[}\]])/g, '$1'); // Remove trailing commas
29+
// Create a temporary JS file by removing TypeScript types
30+
const translationsContent = fs.readFileSync(translationsPath, 'utf8');
31+
32+
// Extract just the translations object value
33+
const exportMatch = translationsContent.match(/export const translations(?:: Translations)? = (\{[\s\S]*?\n\});?\s*$/m);
34+
if (!exportMatch) {
35+
console.error('❌ Could not parse translations.ts file structure');
36+
process.exit(1);
37+
}
38+
39+
// Create a temporary file that exports the translations as a module
40+
const tempFile = path.join(__dirname, '../temp-translations.mjs');
41+
const jsContent = `export const translations = ${exportMatch[1]};`;
42+
fs.writeFileSync(tempFile, jsContent, 'utf8');
43+
44+
// Import the temporary file
45+
const module = await import(`file://${tempFile}`);
46+
translations = module.translations;
3547

36-
translations = JSON.parse(`{${cleanedContent}}`);
48+
// Clean up temp file
49+
fs.unlinkSync(tempFile);
3750
} catch (error) {
38-
console.error('❌ Error parsing translations:', error.message);
51+
console.error('❌ Error loading translations:', error.message);
52+
console.error('This might be due to:');
53+
console.error('1. Invalid JavaScript syntax in translations.ts');
54+
console.error('2. Unescaped special characters in strings');
55+
console.error('3. Malformed object structure');
3956
process.exit(1);
4057
}
4158

src/data/translations.ts

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,6 @@ export interface LanguageSpecificTranslations {
8181
devops: { name: string; items: string[] };
8282
tools: { name: string; items: string[] };
8383
};
84-
focusAreasLabel: string;
85-
focusAI: string;
86-
focusWebDev: string;
87-
focusDataScience: string;
8884
priorityProgramming: string;
8985
priorityFrameworks: string;
9086
priorityTools: string;
@@ -266,15 +262,19 @@ export interface LanguageSpecificTranslations {
266262
defaultIntro: string;
267263
viewMyWork: string;
268264
professionalSummary: string;
269-
expertInAI: string;
270265
fullStackProficiency: string;
271266
problemSolving: string;
272267
modernFrameworks: string;
273268
keyHighlights: {
274-
ml: string;
275269
fullstack: string;
270+
mobile: string;
271+
scalable: string;
272+
cicd: string;
273+
cleanCode: string;
276274
problemSolving: string;
277-
experience: string;
275+
teamwork: string;
276+
security: string;
277+
passion: string;
278278
};
279279
};
280280
dates: {
@@ -464,10 +464,6 @@ export const translations: Translations = {
464464
devops: { name: 'DevOps & CI/CD', items: ['Git', 'Docker', 'Jenkins', 'GitLab CI/CD', 'Bitrise', 'Puppet'] },
465465
tools: { name: 'Others & Tools', items: ['Drupal', 'Keycloak', 'Firebase', 'Mapbox GL', 'WSO2 CEP', 'JHipster', 'TestCafe', 'Cucumber', 'Grafana', 'Kibana'] },
466466
},
467-
focusAreasLabel: 'Focus areas:',
468-
focusAI: 'AI Focus',
469-
focusWebDev: 'Web Development Focus',
470-
focusDataScience: 'Data Science Focus',
471467
priorityProgramming: 'Programming Priority',
472468
priorityFrameworks: 'Frameworks Priority',
473469
priorityTools: 'Tools Priority',
@@ -777,15 +773,19 @@ export const translations: Translations = {
777773
defaultIntro: "I design and build exceptional digital products. As a Full-Stack Engineer, I specialize in creating intuitive, high-performance web and mobile applications that are both scalable and user-centric.",
778774
viewMyWork: 'Explore My Projects',
779775
professionalSummary: 'Full-stack engineer with extensive experience delivering scalable web and mobile applications. Skilled in front-end development with Vue.js and Angular, back-end with Laravel and Laminas, and mobile apps using Flutter and Ionic. Passionate about clean architecture, offline-first capabilities, and DevOps-driven deployment. Experienced in cross-functional teams across Tunisia and Germany.',
780-
expertInAI: 'Expert in machine learning and AI development',
781776
fullStackProficiency: 'Full-stack web development proficiency',
782777
problemSolving: 'Strong problem-solving and analytical skills',
783778
modernFrameworks: 'Experience with modern frameworks and technologies',
784779
keyHighlights: {
785-
ml: 'Machine Learning',
786-
fullstack: 'Full-Stack Development',
787-
problemSolving: 'Problem Solving',
788-
experience: 'Extensive Experience',
780+
fullstack: 'High proficiency in Full-Stack Web Development using Vue.js, Angular, Laravel, and Laminas',
781+
mobile: 'Distinguished expertise in Hybrid Mobile App Development using Flutter and Ionic',
782+
scalable: 'Strong ability to design and implement scalable offline-first systems',
783+
cicd: 'Mastery of CI/CD practices using GitLab, Bitrise, Jenkins, and Puppet',
784+
cleanCode: 'Commitment to Clean Architecture and writing maintainable, organized code',
785+
problemSolving: 'High-level problem-solving skills with focus on performance analysis and UX optimization',
786+
teamwork: 'Experience working with cross-functional teams across different cultures in Tunisia and Germany',
787+
security: 'Extensive knowledge of Digital Security and Identity Management using Keycloak and Firebase',
788+
passion: 'Continuous passion for modern technologies and ongoing learning in Web, Mobile, and DevOps',
789789
},
790790
},
791791
dates: {
@@ -969,10 +969,6 @@ export const translations: Translations = {
969969
devops: { name: 'DevOps & CI/CD', items: ['Git', 'Docker', 'Jenkins', 'GitLab CI/CD', 'Bitrise', 'Puppet'] },
970970
tools: { name: 'Sonstiges & Werkzeuge', items: ['Drupal', 'Keycloak', 'Firebase', 'Mapbox GL', 'WSO2 CEP', 'JHipster', 'TestCafe', 'Cucumber', 'Grafana', 'Kibana'] },
971971
},
972-
focusAreasLabel: 'Schwerpunkte:',
973-
focusAI: 'Schwerpunkt KI',
974-
focusWebDev: 'Schwerpunkt Webentwicklung',
975-
focusDataScience: 'Schwerpunkt Data Science',
976972
priorityProgramming: 'Programmierung Priorität',
977973
priorityFrameworks: 'Frameworks Priorität',
978974
priorityTools: 'Werkzeuge Priorität',
@@ -1282,15 +1278,19 @@ export const translations: Translations = {
12821278
defaultIntro: "Ich entwerfe und erstelle außergewöhnliche digitale Produkte. Als Full-Stack-Ingenieur bin ich auf die Erstellung intuitiver, leistungsstarker Web- und Mobilanwendungen spezialisiert, die sowohl skalierbar als auch benutzerorientiert sind.",
12831279
viewMyWork: 'Meine Projekte ansehen',
12841280
professionalSummary: 'Full-Stack-Ingenieur mit umfassender Erfahrung in der Bereitstellung skalierbarer Web- und Mobilanwendungen. Kompetent in der Frontend-Entwicklung mit Vue.js und Angular, Backend mit Laravel und Laminas sowie mobilen Apps mit Flutter und Ionic. Leidenschaft für saubere Architektur, Offline-First-Funktionen und DevOps-gesteuerte Bereitstellung. Erfahren in funktionsübergreifenden Teams in Tunesien und Deutschland.',
1285-
expertInAI: 'Experte für maschinelles Lernen und KI-Entwicklung',
12861281
fullStackProficiency: 'Kompetenz in der Full-Stack-Webentwicklung',
12871282
problemSolving: 'Starke Problemlösungs- und Analysefähigkeiten',
12881283
modernFrameworks: 'Erfahrung mit modernen Frameworks und Technologien',
12891284
keyHighlights: {
1290-
ml: 'Maschinelles Lernen',
1291-
fullstack: 'Full-Stack-Entwicklung',
1292-
problemSolving: 'Problemlösung',
1293-
experience: 'Umfangreiche Erfahrung',
1285+
fullstack: 'Hohe Kompetenz in Full-Stack-Webentwicklung mit Vue.js, Angular, Laravel und Laminas',
1286+
mobile: 'Hervorragende Expertise in hybrider Mobile-App-Entwicklung mit Flutter und Ionic',
1287+
scalable: 'Starke Fähigkeit zur Gestaltung und Implementierung skalierbarer Offline-First-Systeme',
1288+
cicd: 'Beherrschung von CI/CD-Praktiken mit GitLab, Bitrise, Jenkins und Puppet',
1289+
cleanCode: 'Engagement für Clean Architecture und das Schreiben von wartbarem, organisiertem Code',
1290+
problemSolving: 'Hochentwickelte Problemlösungsfähigkeiten mit Fokus auf Performance-Analyse und UX-Optimierung',
1291+
teamwork: 'Erfahrung in der Zusammenarbeit mit funktionsübergreifenden Teams verschiedener Kulturen in Tunesien und Deutschland',
1292+
security: 'Umfassendes Wissen über digitale Sicherheit und Identitätsmanagement mit Keycloak und Firebase',
1293+
passion: 'Kontinuierliche Leidenschaft für moderne Technologien und fortlaufendes Lernen in Web, Mobile und DevOps',
12941294
},
12951295
},
12961296
dates: {
@@ -1474,10 +1474,6 @@ export const translations: Translations = {
14741474
devops: { name: 'DevOps & CI/CD', items: ['Git', 'Docker', 'Jenkins', 'GitLab CI/CD', 'Bitrise', 'Puppet'] },
14751475
tools: { name: 'Autres & Outils', items: ['Drupal', 'Keycloak', 'Firebase', 'Mapbox GL', 'WSO2 CEP', 'JHipster', 'TestCafe', 'Cucumber', 'Grafana', 'Kibana'] },
14761476
},
1477-
focusAreasLabel: 'Domaines de spécialisation :',
1478-
focusAI: 'Spécialisation IA',
1479-
focusWebDev: 'Spécialisation Développement Web',
1480-
focusDataScience: 'Spécialisation Data Science',
14811477
priorityProgramming: 'Priorité Programmation',
14821478
priorityFrameworks: 'Priorité Frameworks',
14831479
priorityTools: 'Priorité Outils',
@@ -1787,15 +1783,19 @@ export const translations: Translations = {
17871783
defaultIntro: "Je conçois et construis des produits numériques exceptionnels. En tant qu'ingénieur Full-Stack, je me spécialise dans la création d'applications web et mobiles intuitives et performantes, à la fois évolutives et centrées sur l'utilisateur.",
17881784
viewMyWork: 'Explorer mes projets',
17891785
professionalSummary: 'Ingénieur full-stack avec une vaste expérience dans la livraison d\'applications web et mobiles évolutives. Compétent en front-end development avec Vue.js et Angular, back-end avec Laravel et Laminas, et mobile apps using Flutter and Ionic. Passionné par la conception d\'interfaces utilisateur intuitives et performantes, les capacités hors ligne et le déploiement axé sur DevOps. Expérimenté dans des équipes cross-functional en Tunisie et en Allemagne.',
1790-
expertInAI: 'Expert en apprentissage automatique et développement IA',
17911786
fullStackProficiency: 'Compétence en développement web full-stack',
17921787
problemSolving: 'Fortes compétences en résolution de problèmes et analyse',
17931788
modernFrameworks: 'Expérience avec des frameworks et technologies modernes',
17941789
keyHighlights: {
1795-
ml: 'Apprentissage automatique',
1796-
fullstack: 'Développement Full-Stack',
1797-
problemSolving: 'Résolution de problèmes',
1798-
experience: 'Expérience étendue',
1790+
fullstack: 'Haute compétence en Développement Web Full-Stack avec Vue.js, Angular, Laravel et Laminas',
1791+
mobile: 'Expertise distinguée en Développement d\'Applications Mobiles Hybrides avec Flutter et Ionic',
1792+
scalable: 'Forte capacité à concevoir et implémenter des systèmes évolutifs fonctionnant hors ligne (Offline-first)',
1793+
cicd: 'Maîtrise des pratiques CI/CD avec GitLab, Bitrise, Jenkins et Puppet',
1794+
cleanCode: 'Engagement envers l\'Architecture Propre et l\'écriture de code maintenable et organisé',
1795+
problemSolving: 'Compétences avancées en résolution de problèmes avec focus sur l\'analyse de performance et l\'optimisation UX',
1796+
teamwork: 'Expérience de travail avec des équipes pluridisciplinaires de cultures différentes en Tunisie et en Allemagne',
1797+
security: 'Connaissance approfondie de la Sécurité Numérique et de la Gestion des Identités avec Keycloak et Firebase',
1798+
passion: 'Passion continue pour les technologies modernes et l\'apprentissage continu dans le Web, Mobile et DevOps',
17991799
},
18001800
},
18011801
dates: {
@@ -1914,7 +1914,7 @@ export const translations: Translations = {
19141914
publications: 'المنشورات',
19151915
certificates: 'الشهادات',
19161916
contact: 'الاتصال',
1917-
logoAlt: 'KC',
1917+
logoAlt: 'خ ش',
19181918
toggleNav: 'تبديل التنقل',
19191919
},
19201920
general: {
@@ -1946,7 +1946,7 @@ export const translations: Translations = {
19461946
home: {
19471947
greeting: 'مرحباً، أنا',
19481948
name: 'خليل الشرفي.',
1949-
tagline: 'أصنع تجارب رقمية قوية.',
1949+
tagline: 'مهندس برمجيات متكامل يتمتع بخبرة واسعة في تطوير تطبيقات الويب والموبايل القابلة للتوسع. أُجيد العمل على واجهات المستخدم باستخدام Vue.js وAngular، وتطوير الأنظمة الخلفية باستخدام Laravel وLaminas، إلى جانب بناء تطبيقات هجينة (Hybrid) باستخدام Flutter وIonic. أؤمن بأهمية كتابة كود نظيف وقابل للصيانة، وأهتم بتطبيق أفضل ممارسات الـDevOps في التكامل المستمر (CI/CD) ونشر التطبيقات. لدي خبرة عملية مع فرق تطوير متعددة التخصصات في تونس وألمانيا، مما أكسبني قدرة عالية على التكيّف والعمل ضمن بيئات تطوير متنوعة.',
19501950
intro:
19511951
"أقوم بتصميم وبناء منتجات رقمية استثنائية. بصفتي مهندس برمجيات متكامل، أتخصص في إنشاء تطبيقات ويب وجوال بديهية وعالية الأداء، قابلة للتطوير ومتمحورة حول المستخدم.",
19521952
viewWorkBtn: 'اكتشف مشاريعي',
@@ -1979,10 +1979,6 @@ export const translations: Translations = {
19791979
devops: { name: 'DevOps و CI/CD', items: ['Git', 'Docker', 'Jenkins', 'GitLab CI/CD', 'Bitrise', 'Puppet'] },
19801980
tools: { name: 'أخرى وأدوات', items: ['Drupal', 'Keycloak', 'Firebase', 'Mapbox GL', 'WSO2 CEP', 'JHipster', 'TestCafe', 'Cucumber', 'Grafana', 'Kibana'] },
19811981
},
1982-
focusAreasLabel: 'مجالات التركيز:',
1983-
focusAI: 'التركيز على الذكاء الاصطناعي',
1984-
focusWebDev: 'التركيز على تطوير الويب',
1985-
focusDataScience: 'التركيز على علم البيانات',
19861982
priorityProgramming: 'أولوية البرمجة',
19871983
priorityFrameworks: 'أولوية الإطارات',
19881984
priorityTools: 'أولوية الأدوات',
@@ -2292,15 +2288,19 @@ export const translations: Translations = {
22922288
defaultIntro: "أقوم بتصميم وبناء منتجات رقمية استثنائية. بصفتي مهندس برمجيات متكامل، أتخصص في إنشاء تطبيقات ويب وجوال بديهية وعالية الأداء، قابلة للتطوير ومتمحورة حول المستخدم.",
22932289
viewMyWork: 'اكتشف مشاريعي',
22942290
professionalSummary: 'مهندس متكامل ذو خبرة واسعة في تقديم تطبيقات الويب والجوال القابلة للتطوير. ماهر في تطوير الواجهة الأمامية باستخدام Vue.js و Angular، والواجهة الخلفية باستخدام Laravel و Laminas، وتطبيقات الجوال باستخدام Flutter و Ionic. شغوف بالهندسة النظيفة، وقدرات العمل دون اتصال بالإنترنت، والنشر الموجه بـ DevOps. من ذوي الخبرة في فرق متعددة الوظائف في تونس وألمانيا.',
2295-
expertInAI: 'خبير في التعلم الآلي وتطوير الذكاء الاصطناعي',
22962291
fullStackProficiency: 'كفاءة في تطوير الويب الكامل',
22972292
problemSolving: 'مهارات قوية في حل المشكلات والتحليل',
22982293
modernFrameworks: 'خبرة مع الإطارات والتقنيات الحديثة',
22992294
keyHighlights: {
2300-
ml: 'التعلم الآلي',
2301-
fullstack: 'تطوير الواجهة الكاملة',
2302-
problemSolving: 'حل المشكلات',
2303-
experience: 'خبرة واسعة',
2295+
fullstack: 'كفاءة عالية في تطوير الويب الكامل (Full-Stack Development) باستخدام Vue.js وAngular وLaravel وLaminas',
2296+
mobile: 'خبرة متميزة في تطوير تطبيقات الموبايل الهجينة باستخدام Flutter وIonic',
2297+
scalable: 'قدرة قوية على تصميم وتنفيذ أنظمة قابلة للتوسع تدعم العمل دون اتصال بالإنترنت (Offline-first)',
2298+
cicd: 'إتقان ممارسات التكامل والنشر المستمر (CI/CD) باستخدام GitLab وBitrise وJenkins وPuppet',
2299+
cleanCode: 'التزام بالهندسة النظيفة وكتابة كود منظم وقابل للصيانة',
2300+
problemSolving: 'مهارة عالية في حل المشكلات وتحليل الأداء وتحسين تجربة المستخدم',
2301+
teamwork: 'خبرة في العمل ضمن فرق تطوير متعددة التخصصات وثقافات مختلفة في تونس وألمانيا',
2302+
security: 'إلمام واسع بالأمن الرقمي وإدارة الهويات باستخدام Keycloak وFirebase',
2303+
passion: 'شغف دائم بالتقنيات الحديثة والتعلم المستمر في مجالات الويب والموبايل وDevOps',
23042304
},
23052305
},
23062306
dates: {

0 commit comments

Comments
 (0)