Skip to content

Commit 6b7c5cc

Browse files
committed
Fix: Résolution des problèmes d'internationalisation et ajout des fichiers de traduction dans le dépôt
1 parent 5abad57 commit 6b7c5cc

File tree

7 files changed

+144
-19
lines changed

7 files changed

+144
-19
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ creds.js
2424
# Private Files
2525
*.json
2626
!tests/mocks/*.json
27+
!locales/*.json
28+
!temp_locales/*.json
29+
!locales/*/translation.json
2730
*.cfg
2831
*.csv
2932
*.csv.gz

Dockerfile.go

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,18 @@ LABEL org.opencontainers.image.source=https://github.com/JohanDevl/Export_Trakt_
55
LABEL org.opencontainers.image.description="Export your Trakt.tv history to Letterboxd format"
66
LABEL org.opencontainers.image.licenses=MIT
77

8-
# Create app directories
9-
RUN mkdir -p /app/config /app/logs /app/locales /app/exports
8+
# Create necessary directories
9+
RUN mkdir -p /app/config /app/logs /app/temp_locales /app/exports
1010

1111
# Set working directory
1212
WORKDIR /app
1313

14-
# Copy pre-built binary
14+
# Copy the executable and required files
1515
COPY build/export_trakt /app/
16+
COPY temp_locales/ /app/temp_locales/
17+
COPY config/config.example.toml /app/config/config.toml
1618

17-
# Copy translation files
18-
COPY locales/ /app/locales/
19-
20-
# Default config file
21-
COPY config/config.toml /app/config/
22-
23-
# Ensure the binary is executable
19+
# Make the binary executable
2420
RUN chmod +x /app/export_trakt
2521

2622
# Set environment variables
@@ -30,5 +26,5 @@ ENV GO_ENV=production
3026
# Volumes
3127
VOLUME ["/app/config", "/app/logs", "/app/exports"]
3228

33-
# Run the application
29+
# Set the entrypoint
3430
ENTRYPOINT ["/app/export_trakt", "--config", "/app/config/config.toml"]

config/config.example.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Trakt.tv API Configuration
22
[trakt]
33
# Obtenir ces identifiants sur https://trakt.tv/oauth/applications
4+
# NOTE: Vous devez configurer ces valeurs pour que l'application fonctionne
45
client_id = "YOUR_CLIENT_ID"
56
client_secret = "YOUR_CLIENT_SECRET"
67
access_token = "YOUR_ACCESS_TOKEN"
@@ -28,4 +29,4 @@ file = "logs/export.log"
2829
[i18n]
2930
default_language = "en"
3031
language = "en"
31-
locales_dir = "locales"
32+
locales_dir = "temp_locales"

pkg/i18n/i18n.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,19 @@ func NewTranslator(cfg *config.I18nConfig, log logger.Logger) (*Translator, erro
4141

4242
// loadTranslations loads all translation files from the locales directory
4343
func (t *Translator) loadTranslations() error {
44+
t.log.Debug("i18n.loading_translations", map[string]interface{}{
45+
"dir": t.config.LocalesDir,
46+
})
47+
4448
entries, err := os.ReadDir(t.config.LocalesDir)
4549
if err != nil {
4650
return fmt.Errorf("failed to read locales directory: %w", err)
4751
}
4852

53+
t.log.Debug("i18n.found_files", map[string]interface{}{
54+
"count": len(entries),
55+
})
56+
4957
for _, entry := range entries {
5058
if entry.IsDir() {
5159
continue
@@ -74,20 +82,31 @@ func (t *Translator) loadTranslations() error {
7482

7583
// Translate returns the translated message for the given message ID
7684
func (t *Translator) Translate(messageID string, templateData map[string]interface{}) string {
85+
// Simple protection against recursion
86+
if messageID == "" {
87+
return ""
88+
}
89+
90+
// Prevent recursion for error messages that might be logged during translation
91+
if messageID == "errors.translation_failed" ||
92+
messageID == "errors.translation_file_load_failed" {
93+
return messageID
94+
}
95+
96+
// Create a message to translate
7797
msg := i18n.Message{
7898
ID: messageID,
7999
}
80100

101+
// Attempt translation
81102
translation, err := t.localizer.Localize(&i18n.LocalizeConfig{
82103
DefaultMessage: &msg,
83104
TemplateData: templateData,
84105
})
85106

86107
if err != nil {
87-
t.log.Warn("errors.translation_failed", map[string]interface{}{
88-
"messageID": messageID,
89-
"error": err.Error(),
90-
})
108+
// If error, return the original ID without logging
109+
// This prevents recursive logging calls
91110
return messageID
92111
}
93112

pkg/logger/logger.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,22 @@ func (l *StandardLogger) SetTranslator(t Translator) {
5353

5454
// translate handles message translation if a translator is available
5555
func (l *StandardLogger) translate(messageID string, data map[string]interface{}) string {
56-
if l.translator != nil {
57-
return l.translator.Translate(messageID, data)
56+
// No translation if no translator
57+
if l.translator == nil {
58+
return messageID
5859
}
59-
return messageID
60+
61+
// Prevent recursion from specific error types
62+
if messageID == "" || messageID == "errors.translation_failed" {
63+
return messageID
64+
}
65+
66+
// Sanitize the data to avoid nil map issues
67+
if data == nil {
68+
data = make(map[string]interface{})
69+
}
70+
71+
return l.translator.Translate(messageID, data)
6072
}
6173

6274
// Info logs an info level message with translation

temp_locales/en.json

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{
2+
"app": {
3+
"name": "Export Trakt 4 Letterboxd",
4+
"description": "Export your Trakt.tv history to Letterboxd format"
5+
},
6+
"startup": {
7+
"loading_config": "Loading configuration from {{.path}}",
8+
"starting": "Starting Export Trakt 4 Letterboxd",
9+
"config_loaded": "Configuration loaded successfully"
10+
},
11+
"export": {
12+
"retrieving_movies": "Retrieving movies from Trakt.tv",
13+
"movies_retrieved": "Retrieved {{.count}} movies from Trakt.tv",
14+
"exporting_movies": "Exporting movies to Letterboxd format",
15+
"export_complete": "Successfully exported {{.count}} movies to {{.path}}",
16+
"export_failed": "Failed to export movies: {{.error}}",
17+
"retrieving_watched_movies": "Retrieving watched movies from Trakt.tv",
18+
"exporting_watched_movies": "Exporting watched movies to Letterboxd format",
19+
"retrieving_collection": "Retrieving collection movies from Trakt.tv",
20+
"collection_retrieved": "Retrieved {{.count}} movies from your Trakt.tv collection",
21+
"exporting_collection": "Exporting collection movies to Letterboxd format",
22+
"collection_export_complete": "Successfully exported {{.count}} collection movies to {{.path}}",
23+
"retrieving_watched_shows": "Retrieving watched shows from Trakt.tv",
24+
"shows_retrieved": "Retrieved {{.shows}} shows with {{.episodes}} episodes from Trakt.tv",
25+
"exporting_shows": "Exporting TV shows to CSV format",
26+
"shows_export_complete": "Successfully exported {{.shows}} shows with {{.episodes}} episodes to {{.path}}",
27+
"retrieving_ratings": "Retrieving movie ratings from Trakt.tv",
28+
"ratings_retrieved": "Retrieved {{.count}} movie ratings from Trakt.tv",
29+
"exporting_ratings": "Exporting movie ratings to Letterboxd format",
30+
"ratings_export_complete": "Successfully exported {{.count}} movie ratings to {{.path}}",
31+
"retrieving_watchlist": "Retrieving movie watchlist from Trakt.tv",
32+
"watchlist_retrieved": "Retrieved {{.count}} movies from your Trakt.tv watchlist",
33+
"exporting_watchlist": "Exporting movie watchlist to Letterboxd format",
34+
"watchlist_export_complete": "Successfully exported {{.count}} watchlist movies to {{.path}}"
35+
},
36+
"errors": {
37+
"config_load_failed": "Failed to load configuration: {{.error}}",
38+
"api_request_failed": "API request failed: {{.error}}",
39+
"export_dir_create_failed": "Failed to create export directory: {{.error}}",
40+
"file_create_failed": "Failed to create file: {{.error}}",
41+
"log_file_failed": "Failed to set log file: {{.error}}",
42+
"translator_failed": "Failed to initialize translator: {{.error}}",
43+
"invalid_export_type": "Invalid export type: {{.type}}",
44+
"api_url_parse_error": "Failed to parse API URL: {{.error}}",
45+
"api_response_parse_failed": "Failed to parse API response: {{.error}}"
46+
}
47+
}

temp_locales/fr.json

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{
2+
"app": {
3+
"name": "Export Trakt 4 Letterboxd",
4+
"description": "Exportez votre historique Trakt.tv au format Letterboxd"
5+
},
6+
"startup": {
7+
"loading_config": "Chargement de la configuration depuis {{.path}}",
8+
"starting": "Démarrage de Export Trakt 4 Letterboxd",
9+
"config_loaded": "Configuration chargée avec succès"
10+
},
11+
"export": {
12+
"retrieving_movies": "Récupération des films depuis Trakt.tv",
13+
"movies_retrieved": "{{.count}} films récupérés depuis Trakt.tv",
14+
"exporting_movies": "Exportation des films au format Letterboxd",
15+
"export_complete": "{{.count}} films exportés avec succès vers {{.path}}",
16+
"export_failed": "Échec de l'exportation des films : {{.error}}",
17+
"retrieving_watched_movies": "Récupération des films vus depuis Trakt.tv",
18+
"exporting_watched_movies": "Exportation des films vus au format Letterboxd",
19+
"retrieving_collection": "Récupération des films de votre collection depuis Trakt.tv",
20+
"collection_retrieved": "{{.count}} films récupérés depuis votre collection Trakt.tv",
21+
"exporting_collection": "Exportation des films de votre collection au format Letterboxd",
22+
"collection_export_complete": "{{.count}} films de collection exportés avec succès vers {{.path}}",
23+
"retrieving_watched_shows": "Récupération des séries TV vues depuis Trakt.tv",
24+
"shows_retrieved": "{{.shows}} séries avec {{.episodes}} épisodes récupérés depuis Trakt.tv",
25+
"exporting_shows": "Exportation des séries TV au format CSV",
26+
"shows_export_complete": "{{.shows}} séries avec {{.episodes}} épisodes exportés avec succès vers {{.path}}",
27+
"retrieving_ratings": "Récupération des évaluations de films depuis Trakt.tv",
28+
"ratings_retrieved": "{{.count}} évaluations de films récupérées depuis Trakt.tv",
29+
"exporting_ratings": "Exportation des évaluations de films au format Letterboxd",
30+
"ratings_export_complete": "{{.count}} évaluations de films exportées avec succès vers {{.path}}",
31+
"retrieving_watchlist": "Récupération de la liste de surveillance depuis Trakt.tv",
32+
"watchlist_retrieved": "{{.count}} films récupérés depuis votre liste de surveillance Trakt.tv",
33+
"exporting_watchlist": "Exportation de la liste de surveillance au format Letterboxd",
34+
"watchlist_export_complete": "{{.count}} films de la liste de surveillance exportés avec succès vers {{.path}}"
35+
},
36+
"errors": {
37+
"config_load_failed": "Échec du chargement de la configuration : {{.error}}",
38+
"api_request_failed": "Échec de la requête API : {{.error}}",
39+
"export_dir_create_failed": "Échec de la création du répertoire d'exportation : {{.error}}",
40+
"file_create_failed": "Échec de la création du fichier : {{.error}}",
41+
"log_file_failed": "Échec de la définition du fichier journal : {{.error}}",
42+
"translator_failed": "Échec de l'initialisation du traducteur : {{.error}}",
43+
"invalid_export_type": "Type d'exportation invalide : {{.type}}",
44+
"api_url_parse_error": "Échec de l'analyse de l'URL de l'API : {{.error}}",
45+
"api_response_parse_failed": "Échec de l'analyse de la réponse de l'API : {{.error}}"
46+
}
47+
}

0 commit comments

Comments
 (0)