Skip to content

Commit 4c0aabf

Browse files
authored
Fail build if any i18n strings were not extracted (#1864)
If `pnpm i18n:extract` produces new `msgid` lines in the en.po file, then we had some strings in our code that had not yet been extracted into en.po and checked in, so we want the CI build to fail.
1 parent 52c7b22 commit 4c0aabf

7 files changed

Lines changed: 208 additions & 61 deletions

File tree

.github/workflows/fw-lite.yaml

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,34 @@ jobs:
8585
working-directory: frontend
8686
run: |
8787
pnpm install
88+
- name: Ensure all i18n strings have been extracted
89+
working-directory: frontend/viewer
90+
shell: bash
91+
run: |
92+
set -e
93+
# GHA sets -o pipefail when shell is bash but we want to turn it off
94+
set +o pipefail
95+
rm -f src/locales/en.po.old
96+
cp src/locales/en.po src/locales/en.po.old
97+
pnpm i18n:extract
98+
DIFFCOUNT=$(diff -u src/locales/en.po{.old,} | grep '+msgid' | wc -l)
99+
if [ $DIFFCOUNT -gt 0 ]; then
100+
# Unextracted strings found, fail the build
101+
echo '***'
102+
echo $DIFFCOUNT unextracted strings found:
103+
echo '***'
104+
diff -u src/locales/en.po{.old,} | grep '+msgid' | cut -c2-
105+
echo '***'
106+
echo Please run pnpm i18n:extract
107+
exit 1
108+
fi
109+
rm -f src/locales/en.po.old
88110
- name: Set up Playwright dependencies
89111
working-directory: frontend
90112
run: pnpm exec playwright install --with-deps
91113
- name: Run snapshot tests
92114
working-directory: frontend/viewer
93115
run: task playwright-test-standalone
94-
95116
- name: Build viewer
96117
working-directory: frontend/viewer
97118
run: pnpm run build

frontend/viewer/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"check": "svelte-check",
2626
"lint": "eslint",
2727
"lint:report": "eslint . --output-file eslint_report.json --format json",
28-
"i18n:extract": "lingui extract --clean && lingui extract",
28+
"i18n:extract": "lingui extract --clean",
2929
"generate-icon-types": "node ./generate-icon-types.js",
3030
"storybook": "storybook dev -p 6006 --host 0.0.0.0",
3131
"build-storybook": "storybook build"

frontend/viewer/src/locales/en.po

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ msgstr "Account"
7676
msgid "Activity"
7777
msgstr "Activity"
7878

79-
#: src/lib/components/field-editors/audio-input.svelte:206
80-
#: src/lib/components/audio/AudioDialog.svelte:106
79+
#: src/lib/components/field-editors/audio-input.svelte:213
80+
#: src/lib/components/audio/AudioDialog.svelte:153
8181
msgid "Add audio"
8282
msgstr "Add audio"
8383

@@ -126,10 +126,18 @@ msgstr "Application version"
126126
msgid "Are you sure you want to delete {0}?"
127127
msgstr "Are you sure you want to delete {0}?"
128128

129-
#: src/lib/components/field-editors/audio-input.svelte:215
129+
#: src/lib/components/field-editors/audio-input.svelte:222
130130
msgid "Audio file not included in Send & Receive"
131131
msgstr "Audio file not included in Send & Receive"
132132

133+
#: src/lib/components/audio/AudioDialog.svelte:82
134+
msgid "Audio saved and uploaded to Lexbox"
135+
msgstr "Audio saved and uploaded to Lexbox"
136+
137+
#: src/lib/components/audio/AudioDialog.svelte:79
138+
msgid "Audio saved locally"
139+
msgstr "Audio saved locally"
140+
133141
#: src/lib/history/HistoryView.svelte:95
134142
#: src/lib/activity/ActivityView.svelte:91
135143
msgid "Author:"
@@ -160,7 +168,7 @@ msgstr "Browse"
160168
#: src/lib/entry-editor/EntryOrSensePicker.svelte:245
161169
#: src/lib/components/field-editors/select.svelte:166
162170
#: src/lib/components/field-editors/multi-select.svelte:280
163-
#: src/lib/components/audio/AudioDialog.svelte:118
171+
#: src/lib/components/audio/AudioDialog.svelte:167
164172
msgid "Cancel"
165173
msgstr "Cancel"
166174

@@ -399,14 +407,27 @@ msgstr "Field Labels"
399407
msgid "FieldWorks logo"
400408
msgstr "FieldWorks logo"
401409

410+
#: src/lib/components/audio/AudioDialog.svelte:89
411+
msgid "File already exists"
412+
msgstr "File already exists"
413+
402414
#: src/lib/components/audio/audio-editor.svelte:32
403415
msgid "File name:"
404416
msgstr "File name:"
405417

406-
#: src/lib/components/field-editors/audio-input.svelte:74
418+
#: src/lib/components/field-editors/audio-input.svelte:79
407419
msgid "File not found"
408420
msgstr "File not found"
409421

422+
#: src/lib/components/audio/AudioDialog.svelte:87
423+
msgid "File saving not supported"
424+
msgstr "File saving not supported"
425+
426+
#: src/lib/components/audio/AudioDialog.svelte:164
427+
#: src/lib/components/audio/AudioDialog.svelte:85
428+
msgid "File too big"
429+
msgstr "File too big"
430+
410431
#: src/project/browse/SearchFilter.svelte:100
411432
msgid "Filter # entries"
412433
msgstr "Filter # entries"
@@ -587,7 +608,7 @@ msgstr "New Entry"
587608
msgid "No activity found"
588609
msgstr "No activity found"
589610

590-
#: src/lib/components/field-editors/audio-input.svelte:210
611+
#: src/lib/components/field-editors/audio-input.svelte:217
591612
msgid "No audio"
592613
msgstr "No audio"
593614

@@ -604,6 +625,10 @@ msgstr "No Dictionaries found"
604625
msgid "No entries found"
605626
msgstr "No entries found"
606627

628+
#: src/lib/components/audio/AudioDialog.svelte:75
629+
msgid "No file selected"
630+
msgstr "No file selected"
631+
607632
#: src/lib/history/HistoryView.svelte:66
608633
msgid "No history found"
609634
msgstr "No history found"
@@ -645,7 +670,7 @@ msgstr "Note"
645670
msgid "Offline"
646671
msgstr "Offline"
647672

648-
#: src/lib/components/field-editors/audio-input.svelte:77
673+
#: src/lib/components/field-editors/audio-input.svelte:82
649674
msgid "Offline, unable to download"
650675
msgstr "Offline, unable to download"
651676

@@ -712,19 +737,19 @@ msgstr "Refresh Projects"
712737
msgid "Remove"
713738
msgstr "Remove"
714739

715-
#: src/lib/components/field-editors/audio-input.svelte:261
740+
#: src/lib/components/field-editors/audio-input.svelte:268
716741
msgid "Remove audio"
717742
msgstr "Remove audio"
718743

719744
#: src/lib/OpenInFieldWorksButton.svelte:41
720745
msgid "Reopen"
721746
msgstr "Reopen"
722747

723-
#: src/lib/components/field-editors/audio-input.svelte:258
748+
#: src/lib/components/field-editors/audio-input.svelte:265
724749
msgid "Replace audio"
725750
msgstr "Replace audio"
726751

727-
#: src/lib/components/audio/AudioDialog.svelte:120
752+
#: src/lib/components/audio/AudioDialog.svelte:169
728753
msgid "Save audio"
729754
msgstr "Save audio"
730755

@@ -877,10 +902,11 @@ msgid "Unknown"
877902
msgstr "Unknown"
878903

879904
#: src/project/ProjectSidebar.svelte:115
905+
#: src/lib/components/audio/AudioDialog.svelte:91
880906
msgid "Unknown error"
881907
msgstr "Unknown error"
882908

883-
#: src/lib/components/field-editors/audio-input.svelte:80
909+
#: src/lib/components/field-editors/audio-input.svelte:85
884910
msgid "Unknown error {0}"
885911
msgstr "Unknown error {0}"
886912

frontend/viewer/src/locales/es.po

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ msgstr "Cuenta"
8181
msgid "Activity"
8282
msgstr "Actividad"
8383

84-
#: src/lib/components/field-editors/audio-input.svelte:206
85-
#: src/lib/components/audio/AudioDialog.svelte:106
84+
#: src/lib/components/field-editors/audio-input.svelte:213
85+
#: src/lib/components/audio/AudioDialog.svelte:153
8686
msgid "Add audio"
8787
msgstr "Añadir audio"
8888

@@ -131,10 +131,18 @@ msgstr "Versión de la aplicación"
131131
msgid "Are you sure you want to delete {0}?"
132132
msgstr "¿Estás seguro de que quieres borrar {0}?"
133133

134-
#: src/lib/components/field-editors/audio-input.svelte:215
134+
#: src/lib/components/field-editors/audio-input.svelte:222
135135
msgid "Audio file not included in Send & Receive"
136136
msgstr "Archivo de audio no incluido en Enviar y Recibir"
137137

138+
#: src/lib/components/audio/AudioDialog.svelte:82
139+
msgid "Audio saved and uploaded to Lexbox"
140+
msgstr ""
141+
142+
#: src/lib/components/audio/AudioDialog.svelte:79
143+
msgid "Audio saved locally"
144+
msgstr ""
145+
138146
#: src/lib/history/HistoryView.svelte:95
139147
#: src/lib/activity/ActivityView.svelte:91
140148
msgid "Author:"
@@ -165,7 +173,7 @@ msgstr "Visite"
165173
#: src/lib/entry-editor/EntryOrSensePicker.svelte:245
166174
#: src/lib/components/field-editors/select.svelte:166
167175
#: src/lib/components/field-editors/multi-select.svelte:280
168-
#: src/lib/components/audio/AudioDialog.svelte:118
176+
#: src/lib/components/audio/AudioDialog.svelte:167
169177
msgid "Cancel"
170178
msgstr "Cancelar"
171179

@@ -404,14 +412,27 @@ msgstr "Etiquetas de campo"
404412
msgid "FieldWorks logo"
405413
msgstr "Logotipo de FieldWorks"
406414

415+
#: src/lib/components/audio/AudioDialog.svelte:89
416+
msgid "File already exists"
417+
msgstr ""
418+
407419
#: src/lib/components/audio/audio-editor.svelte:32
408420
msgid "File name:"
409421
msgstr "Nombre del fichero:"
410422

411-
#: src/lib/components/field-editors/audio-input.svelte:74
423+
#: src/lib/components/field-editors/audio-input.svelte:79
412424
msgid "File not found"
413425
msgstr "Archivo no encontrado"
414426

427+
#: src/lib/components/audio/AudioDialog.svelte:87
428+
msgid "File saving not supported"
429+
msgstr ""
430+
431+
#: src/lib/components/audio/AudioDialog.svelte:164
432+
#: src/lib/components/audio/AudioDialog.svelte:85
433+
msgid "File too big"
434+
msgstr ""
435+
415436
#: src/project/browse/SearchFilter.svelte:100
416437
msgid "Filter # entries"
417438
msgstr "Filtro # entradas"
@@ -592,7 +613,7 @@ msgstr "Nueva entrada"
592613
msgid "No activity found"
593614
msgstr "No se ha encontrado actividad"
594615

595-
#: src/lib/components/field-editors/audio-input.svelte:210
616+
#: src/lib/components/field-editors/audio-input.svelte:217
596617
msgid "No audio"
597618
msgstr "Sin audio"
598619

@@ -609,6 +630,10 @@ msgstr "No se han encontrado diccionarios"
609630
msgid "No entries found"
610631
msgstr "No se han encontrado entradas"
611632

633+
#: src/lib/components/audio/AudioDialog.svelte:75
634+
msgid "No file selected"
635+
msgstr ""
636+
612637
#: src/lib/history/HistoryView.svelte:66
613638
msgid "No history found"
614639
msgstr "No se han encontrado antecedentes"
@@ -650,7 +675,7 @@ msgstr "Nota"
650675
msgid "Offline"
651676
msgstr "Fuera de línea"
652677

653-
#: src/lib/components/field-editors/audio-input.svelte:77
678+
#: src/lib/components/field-editors/audio-input.svelte:82
654679
msgid "Offline, unable to download"
655680
msgstr "Desconectado, no se puede descargar"
656681

@@ -717,19 +742,19 @@ msgstr "Actualizar proyectos"
717742
msgid "Remove"
718743
msgstr "Eliminar"
719744

720-
#: src/lib/components/field-editors/audio-input.svelte:261
745+
#: src/lib/components/field-editors/audio-input.svelte:268
721746
msgid "Remove audio"
722747
msgstr "Eliminar audio"
723748

724749
#: src/lib/OpenInFieldWorksButton.svelte:41
725750
msgid "Reopen"
726751
msgstr "Vuelva a abrir"
727752

728-
#: src/lib/components/field-editors/audio-input.svelte:258
753+
#: src/lib/components/field-editors/audio-input.svelte:265
729754
msgid "Replace audio"
730755
msgstr "Sustituir audio"
731756

732-
#: src/lib/components/audio/AudioDialog.svelte:120
757+
#: src/lib/components/audio/AudioDialog.svelte:169
733758
msgid "Save audio"
734759
msgstr "Guardar audio"
735760

@@ -882,10 +907,11 @@ msgid "Unknown"
882907
msgstr "Desconocido"
883908

884909
#: src/project/ProjectSidebar.svelte:115
910+
#: src/lib/components/audio/AudioDialog.svelte:91
885911
msgid "Unknown error"
886912
msgstr "Error desconocido"
887913

888-
#: src/lib/components/field-editors/audio-input.svelte:80
914+
#: src/lib/components/field-editors/audio-input.svelte:85
889915
msgid "Unknown error {0}"
890916
msgstr "Error desconocido {0}"
891917

@@ -942,4 +968,3 @@ msgstr "Sistema de escritura: {0}"
942968
#: src/project/browse/filter/WsSelect.svelte:29
943969
msgid "Writing Systems"
944970
msgstr "Sistemas de escritura"
945-

0 commit comments

Comments
 (0)