custom default Lang

This commit is contained in:
Anthony Stirling 2023-04-02 23:59:22 +01:00
parent 9087a3ebbd
commit d4459eb6d6
27 changed files with 172 additions and 182 deletions

View File

@ -91,7 +91,9 @@ Also please note as i add new features i will google translate existing language
2. Use the application by following the instructions on the website. 2. Use the application by following the instructions on the website.
## Customize App Name ## Customize App
Stirling PDF allows easy customization of the visible application name. Stirling PDF allows easy customization of the visible application name.
Simply use environment variables APP_HOME_NAME, APP_HOME_DESCRIPTION and APP_NAVBAR_NAME with Docker or Java. Simply use environment variables APP_HOME_NAME, APP_HOME_DESCRIPTION and APP_NAVBAR_NAME with Docker or Java.
If running Java directly, you can also pass these as properties using -D arguments. If running Java directly, you can also pass these as properties using -D arguments.
Using the same method you can also change the default language by providing APP_LOCALE with values like de-DE fr-FR or ar-AR to select your default language (Will always default to English on invalid locale)

View File

@ -5,7 +5,7 @@ plugins {
} }
group = 'stirling.software' group = 'stirling.software'
version = '0.4.6' version = '0.4.7'
sourceCompatibility = '17' sourceCompatibility = '17'
repositories { repositories {

View File

@ -16,7 +16,24 @@ public class Beans implements WebMvcConfigurer {
@Bean @Bean
public LocaleResolver localeResolver() { public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver(); SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.UK);
String appLocaleEnv = System.getProperty("APP_LOCALE");
if(appLocaleEnv == null)
appLocaleEnv = System.getenv("APP_LOCALE");
Locale defaultLocale = Locale.UK; // Fallback to UK locale if environment variable is not set
if (appLocaleEnv != null && !appLocaleEnv.isEmpty()) {
Locale tempLocale = Locale.forLanguageTag(appLocaleEnv);
String tempLanguageTag = tempLocale.toLanguageTag();
if (appLocaleEnv.equalsIgnoreCase(tempLanguageTag)) {
defaultLocale = tempLocale;
} else {
System.err.println("Invalid APP_LOCALE environment variable value. Falling back to default Locale.UK.");
}
}
slr.setDefaultLocale(defaultLocale);
return slr; return slr;
} }

View File

@ -87,6 +87,10 @@ home.ocr.desc=\u064A\u0642\u0648\u0645 \u0628\u0631\u0646\u0627\u0645\u062C \u06
home.extractImages.title=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631 home.extractImages.title=\u0627\u0633\u062A\u062E\u0631\u0627\u062C \u0627\u0644\u0635\u0648\u0631
home.extractImages.desc=\u064A\u0633\u062A\u062E\u0631\u062C \u062C\u0645\u064A\u0639 \u0627\u0644\u0635\u0648\u0631 \u0645\u0646 \u0645\u0644\u0641 PDF \u0648\u064A\u062D\u0641\u0638\u0647\u0627 \u0641\u064A \u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0628\u0631\u064A\u062F\u064A home.extractImages.desc=\u064A\u0633\u062A\u062E\u0631\u062C \u062C\u0645\u064A\u0639 \u0627\u0644\u0635\u0648\u0631 \u0645\u0646 \u0645\u0644\u0641 PDF \u0648\u064A\u062D\u0641\u0638\u0647\u0627 \u0641\u064A \u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0628\u0631\u064A\u062F\u064A
home.pdfToPDFA.title = \u062A\u062D\u0648\u064A\u0644 \u0645\u0644\u0641\u0627\u062A PDF \u0625\u0644\u0649 PDF / A
home.pdfToPDFA.desc = \u062A\u062D\u0648\u064A\u0644 PDF \u0625\u0644\u0649 PDF / A \u0644\u0644\u062A\u062E\u0632\u064A\u0646 \u0637\u0648\u064A\u0644 \u0627\u0644\u0645\u062F\u0649
navbar.settings=\u0625\u0639\u062F\u0627\u062F\u0627\u062A navbar.settings=\u0625\u0639\u062F\u0627\u062F\u0627\u062A
settings.title=\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A settings.title=\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A
settings.update=\u0627\u0644\u062A\u062D\u062F\u064A\u062B \u0645\u062A\u0627\u062D settings.update=\u0627\u0644\u062A\u062D\u062F\u064A\u062B \u0645\u062A\u0627\u062D

View File

@ -13,8 +13,8 @@ multiPdfPrompt=Choisir des PDF (2+)
multiPdfDropPrompt=Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin multiPdfDropPrompt=Sélectionnez (ou glissez-déposez) tous les PDF dont vous avez besoin
imgPrompt=Choisir une image imgPrompt=Choisir une image
genericSubmit=Soumettre genericSubmit=Soumettre
processTimeWarning=AttentionÂ: ce processus peut prendre jusqu'à une minute en fonction de la taille du fichier processTimeWarning=Attention<EFBFBD>: ce processus peut prendre jusqu'à une minute en fonction de la taille du fichier
pageOrderPrompt=Ordre des pages (Entrez une liste de numéros de page séparés par des virgules)Â: pageOrderPrompt=Ordre des pages (Entrez une liste de numéros de page séparés par des virgules):
goToPage=Aller goToPage=Aller
true=Vrai true=Vrai
false=Faux false=Faux
@ -74,65 +74,66 @@ home.removePassword.desc=Supprimez la protection par mot de passe de votre docum
home.compressPdfs.title=Compresser les PDF home.compressPdfs.title=Compresser les PDF
home.compressPdfs.desc=Compressez les PDF pour réduire leur taille de fichier. home.compressPdfs.desc=Compressez les PDF pour réduire leur taille de fichier.
home.changeMetadata.title=Modifier les métadonnées home.changeMetadata.title=Modifier les métadonnées
home.changeMetadata.desc=Modifier/Supprimer/Ajouter des métadonnées d'un document PDF home.changeMetadata.desc=Modifier/Supprimer/Ajouter des métadonnées d'un document PDF
home.fileToPDF.title=Convertir un fichier en PDF home.fileToPDF.title=Convertir un fichier en PDF
home.fileToPDF.desc=Convertissez presque n\u2019importe quel fichier en PDF (DOCX, PNG, XLS, PPT, TXT et plus) home.fileToPDF.desc=Convertissez presque n\u2019importe quel fichier en PDF (DOCX, PNG, XLS, PPT, TXT et plus)
home.ocr.title=Exécuter l'OCR sur les scans PDF et/ou de nettoyage home.ocr.title=Exécuter l'OCR sur les scans PDF et/ou de nettoyage
home.ocr.desc=Le nettoyage analyse et détecte le texte des images dans un PDF et le rajoute en tant que texte. home.ocr.desc=Le nettoyage analyse et détecte le texte des images dans un PDF et le rajoute en tant que texte.
home.extractImages.title=Extraire les images home.extractImages.title=Extraire les images
home.extractImages.desc=Extrait toutes les images d\u2019un PDF et les enregistre au format zip home.extractImages.desc=Extrait toutes les images d\u2019un PDF et les enregistre au format zip
navbar.settings=Paramètres home.pdfToPDFA.title=Convertir PDF en PDF/A
settings.title=Paramètres home.pdfToPDFA.desc=Convertir un PDF en PDF/A pour un stockage à long terme
settings.update=Mise à jour disponible
settings.appVersion=Version de l\u2019application : navbar.settings=Paramètres
settings.downloadOption.title=Choisissez l\u2019option de téléchargement (pour les téléchargements sans fichier unique) : settings.title=Paramètres
settings.downloadOption.1=Ouvrir dans la même fenêtre settings.update=Mise à jour disponible
settings.downloadOption.2=Ouvrir dans une nouvelle fenêtre settings.appVersion=Version de l'application :
settings.downloadOption.3=Fichier téléchargé settings.downloadOption.title=Choisissez l'option de téléchargement (pour les téléchargements sans fichier unique) :
settings.zipThreshold=Zip les fichiers lorsque le nombre de fichiers téléchargés dépasse settings.downloadOption.1=Ouvrir dans la même fenêtre
settings.downloadOption.2=Ouvrir dans une nouvelle fenêtre
settings.downloadOption.3=Fichier téléchargé
settings.zipThreshold=Zip les fichiers lorsque le nombre de fichiers téléchargés dépasse
#OCR #OCR
ocr.title=OCR / Nettoyage de numérisation ocr.title=OCR / Nettoyage de numérisation
ocr.header=Nettoyage des scans / OCR (reconnaissance optique des caractères) ocr.header=Nettoyage des scans / OCR (reconnaissance optique des caractères)
ocr.selectText.1=Sélectionnez les langues à détecter dans le PDF (celles répertoriées sont celles actuellement détectées) : ocr.selectText.1=Sélectionnez les langues à détecter dans le PDF (celles répertoriées sont celles actuellement détectées) :
ocr.selectText.2=Produire un fichier texte contenant du texte OCR avec le PDF OCR ocr.selectText.2=Produire un fichier texte contenant du texte OCR avec le PDF OCR
ocr.selectText.3=Les pages correctes ont été numérisées à un angle oblique en les remettant en place ocr.selectText.3=Les pages correctes ont été numérisées à un angle oblique en les remettant en place
ocr.selectText.4=Nettoyer la page pour qu'il soit moins probable que l'OCR trouve du texte dans le bruit de fond. (Pas de changement de sortie) ocr.selectText.4=Nettoyer la page pour qu'il soit moins probable que l'OCR trouve du texte dans le bruit de fond. (Pas de changement de sortie)
ocr.selectText.5=Nettoyer la page afin qu'il soit moins probable que l'OCR trouve du texte dans le bruit de fond, maintient le nettoyage dans la sortie. ocr.selectText.5=Nettoyer la page afin qu'il soit moins probable que l'OCR trouve du texte dans le bruit de fond, maintient le nettoyage dans la sortie.
ocr.selectText.6=Ignore les pages contenant du texte interactif, seulement les pages OCR qui sont des images ocr.selectText.6=Ignore les pages contenant du texte interactif, seulement les pages OCR qui sont des images
ocr.selectText.7=Forcer l'OCR, OCR chaque page supprimera tous les éléments de texte d'origine ocr.selectText.7=Forcer l'OCR, OCR chaque page supprimera tous les éléments de texte d'origine
ocr.selectText.8=Normal (Erreur si le PDF contient du texte) ocr.selectText.8=Normal (Erreur si le PDF contient du texte)
ocr.selectText.9=Paramètres supplémentaires ocr.selectText.9=Paramètres supplémentaires
ocr.selectText.10=Mode ROC ocr.selectText.10=Mode ROC
ocr.help=Veuillez lire cette documentation pour savoir comment l\u2019utiliser pour d\u2019autres langues et/ou une utilisation non dans docker ocr.help=Veuillez lire cette documentation pour savoir comment l'utiliser pour d'autres langues et/ou une utilisation non dans docker
ocr.credit=Ce service utilise OCRmyPDF et Tesseract pour l\u2019OCR. ocr.credit=Ce service utilise OCRmyPDF et Tesseract pour l'OCR.
ocr.submit=Traiter PDF avec OCR ocr.submit=Traiter PDF avec OCR
extractImages.title=Extraire les images extractImages.title=Extraire les images
extractImages.header=Extraire les images extractImages.header=Extraire les images
extractImages.selectText=Sélectionner le format d\u2019image pour convertir les images extraites en extractImages.selectText=Sélectionner le format d'image pour convertir les images extraites en
extractImages.submit=Extrait extractImages.submit=Extraire
#File to PDF
#File au format PDF fileToPDF.title=Fichier au format PDF
fileToPDF.title=Fichier au PDF fileToPDF.header=Convertir n'importe quel fichier au format PDF
fileToPDF.header=Convertir n\u2019importe quel fichier au format PDF
fileToPDF.credit=Ce service utilise LibreOffice et Unoconv pour la conversion de fichiers. fileToPDF.credit=Ce service utilise LibreOffice et Unoconv pour la conversion de fichiers.
fileToPDF.supportedFileTypes=Les types de fichiers pris en charge doivent inclure les éléments ci-dessous, mais pour une liste complète et mise à jour des formats pris en charge, veuillez vous référer à la documentation de LibreOffice fileToPDF.supportedFileTypes=Les types de fichiers pris en charge doivent inclure les éléments ci-dessous, mais pour une liste complète et mise à jour des formats pris en charge, veuillez vous référer à la documentation de LibreOffice.
fileToPDF.submit=Convertir en PDF fileToPDF.submit=Convertir en PDF
#Add image #Add image
addImage.title=Ajouter une image addImage.title=Ajouter une image
addImage.header=Ajouter une image au PDF (Travail en cours) addImage.header=Ajouter une image au PDF (Travail en cours)
@ -142,13 +143,13 @@ addImage.submit=Ajouter une image
compress.title=Compresser compress.title=Compresser
compress.header=Compresser le PDF compress.header=Compresser le PDF
compress.credit=Ce service utilise OCRmyPDF pour la compression/optimisation PDF. compress.credit=Ce service utilise OCRmyPDF pour la compression/optimisation PDF.
compress.selectText.1=Niveau d\u2019optimisation : compress.selectText.1=Niveau d'optimisation :
compress.selectText.2=0 (pas d\u2019optimisation) compress.selectText.2=0 (pas d'optimisation)
compress.selectText.3=1 (par défaut, optimisation sans perte) compress.selectText.3=1 (par défaut, optimisation sans perte)
compress.selectText.4=2 (optimisation avec perte) compress.selectText.4=2 (optimisation avec perte)
compress.selectText.5=3 (optimisation avec perte, plus agressive) compress.selectText.5=3 (optimisation avec perte, plus agressive)
compress.selectText.6=Activer l\u2019affichage Web rapide (linéariser PDF) compress.selectText.6=Activer l'affichage Web rapide (linéariser PDF)
compress.selectText.7=Activer l\u2019encodage JBIG2 avec perte compress.selectText.7=Activer l'encodage JBIG2 avec perte
compress.submit=Compresser compress.submit=Compresser
@ -166,54 +167,50 @@ pdfOrganiser.submit=Réorganiser les pages
#pageRemover #pageRemover
pageRemover.title=Suppresseur de pages pageRemover.title=Suppresseur de pages
pageRemover.header=Outil de suppression de pages PDF pageRemover.header=Outil de suppression de pages PDF
pageRemover.pagesToDelete=Pages à supprimer (Entrez une liste de numéros de page séparés par des virgules)Â: pageRemover.pagesToDelete=Pages à supprimer (Entrez une liste de numéros de page séparés par des virgules):
pageRemover.submit=Supprimer des pages pageRemover.submit=Supprimer des pages
#rotate #rotate
rotate.title=Faire pivoter le PDF rotate.title=Faire pivoter le PDF
rotate.header=Faire pivoter le PDF rotate.header=Faire pivoter le PDF
rotate.selectAngle=S\u00e9lectionner l'angle de rotation (en multiples de 90 degr\u00e9s): rotate.selectAngle=Sélectionner l'angle de rotation (en multiples de 90 degrés) :
rotate.submit=Rotation rotate.submit=Rotation
#Split PDF
#merge
split.title=Fractionner le PDF split.title=Fractionner le PDF
split.header=Diviser le PDF split.header=Diviser le PDF
split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire un fractionnement split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire un fractionnement.
split.desc.2=Ainsi, la sélection de 1,3,7-8 diviserait un document de 10 pages en 6 PDF distincts avecÂ: split.desc.2=Ainsi, la sélection de 1,3,7-8 diviserait un document de 10 pages en 6 PDF distincts avec :
split.desc.3=Document #1Â: Page 1 split.desc.3=Document #1 : Page 1
split.desc.4=Document #2Â: Pages 2 et 3 split.desc.4=Document #2 : Pages 2 et 3
split.desc.5=Document #3Â: Pages 4, 5 et 6 split.desc.5=Document #3 : Pages 4, 5 et 6
split.desc.6=Document #4Â: Page 7 split.desc.6=Document #4 : Page 7
split.desc.7=Document #5Â: Page 8 split.desc.7=Document #5 : Page 8
split.desc.8=Document #6Â: Pages 9 et 10 split.desc.8=Document #6 : Pages 9 et 10
split.splitPages=Entrez les pages sur lesquelles fractionnerÂ: split.splitPages=Entrez les pages sur lesquelles fractionner :
split.submit=Diviser split.submit=Diviser
#imageToPDF
#merge
imageToPDF.title=Image au format PDF imageToPDF.title=Image au format PDF
imageToPDF.header=Image au format PDF imageToPDF.header=Image au format PDF
imageToPDF.submit=Convertir imageToPDF.submit=Convertir
imageToPDF.selectText.1=Étirer pour s'adapter imageToPDF.selectText.1=Étirer pour s'adapter
imageToPDF.selectText.2=Rotation automatique du PDF imageToPDF.selectText.2=Rotation automatique du PDF
imageToPDF.selectText.3=Logique de fichiers multiples (activé uniquement si vous travaillez avec plusieurs images) imageToPDF.selectText.3=Logique de fichiers multiples (activé uniquement si vous travaillez avec plusieurs images)
imageToPDF.selectText.4=Fusionner en un seul PDF imageToPDF.selectText.4=Fusionner en un seul PDF
imageToPDF.selectText.5=Convertir en PDFs distincts imageToPDF.selectText.5=Convertir en PDFs distincts
#pdfToImage #PDF to Image
pdfToImage.title=PDF vers image pdfToImage.title=PDF vers image
pdfToImage.header=PDF vers image pdfToImage.header=PDF vers image
pdfToImage.selectText=Format d'image pdfToImage.selectText=Format d'image
pdfToImage.singleOrMultiple=Type de résultat d'image pdfToImage.singleOrMultiple=Type de résultat d'image
pdfToImage.single=Une seule grande image pdfToImage.single=Une seule grande image
pdfToImage.multi=Plusieurs images pdfToImage.multi=Plusieurs images
pdfToImage.colorType=Type de couleur pdfToImage.colorType=Type de couleur
pdfToImage.color=Couleur pdfToImage.color=Couleur
pdfToImage.grey=Niveaux de gris pdfToImage.grey=Niveaux de gris
pdfToImage.blackwhite=Noir et Blanc (Peut perdre des données !) pdfToImage.blackwhite=Noir et Blanc (Peut perdre des données !)
pdfToImage.submit=Convertir pdfToImage.submit=Convertir
#addPassword #addPassword
@ -237,36 +234,36 @@ addPassword.submit=Crypter
#watermark #watermark
watermark.title=Ajouter un filigrane watermark.title=Ajouter un filigrane
watermark.header=Ajouter un filigrane watermark.header=Ajouter un filigrane
watermark.selectText.1=Sélectionnez le PDF auquel ajouter un filigraneÂ: watermark.selectText.1=Sélectionnez le PDF auquel ajouter un filigrane :
watermark.selectText.2=Texte du filigraneÂ: watermark.selectText.2=Texte du filigrane :
watermark.selectText.3=Taille de la policeÂ: watermark.selectText.3=Taille de la police :
watermark.selectText.4=Rotation (0-360)Â: watermark.selectText.4=Rotation (0-360) :
watermark.selectText.5=widthSpacer (Espace entre chaque filigrane horizontalement)Â: watermark.selectText.5=widthSpacer (Espace entre chaque filigrane horizontalement) :
watermark.selectText.6=heightSpacer (Espace entre chaque filigrane verticalement)Â: watermark.selectText.6=heightSpacer (Espace entre chaque filigrane verticalement) :
watermark.selectText.7=Opacité (0 % - 100 %): watermark.selectText.7=Opacité (0 % - 100 %) :
watermark.submit=Ajouter un filigrane watermark.submit=Ajouter un filigrane
#remove-watermark #remove-watermark
remove-watermark.title=Supprimer le filigrane remove-watermark.title=Supprimer le filigrane
remove-watermark.header=Supprimer le filigrane remove-watermark.header=Supprimer le filigrane
remove-watermark.selectText.1=Sélectionnez le PDF pour supprimer le filigrane: remove-watermark.selectText.1=Sélectionnez le PDF pour supprimer le filigrane :
remove-watermark.selectText.2=Texte du filigrane : remove-watermark.selectText.2=Texte du filigrane :
remove-watermark.submit=Supprimer le filigrane remove-watermark.submit=Supprimer le filigrane
#Change permissions #Change Permissions
permissions.title=Modifier les autorisations permissions.title=Modifier les autorisations
permissions.header=Modifier les autorisations permissions.header=Modifier les autorisations
permissions.warning=Attention pour que ces permissions soient immuables il est recommandé de les définir avec un mot de passe via la page add-password permissions.warning=Attention pour que ces permissions soient immuables il est recommandé de les définir avec un mot de passe via la page add-password.
permissions.selectText.1=Sélectionnez PDF pour modifier les autorisations permissions.selectText.1=Sélectionnez le PDF pour modifier les autorisations :
permissions.selectText.2=Autorisations à définir permissions.selectText.2=Autorisations à définir :
permissions.selectText.3=Employer l'assemblage du document permissions.selectText.3=Employer l'assemblage du document
permissions.selectText.4=Employer l'extraction de contenu permissions.selectText.4=Employer l'extraction de contenu
permissions.selectText.5=Employer l'extraction pour l'accessibilité permissions.selectText.5=Employer l'extraction pour l'accessibilité
permissions.selectText.6=Employer de remplir le formulaire permissions.selectText.6=Employer pour remplir le formulaire
permissions.selectText.7=Employer la modification permissions.selectText.7=Employer pour la modification
permissions.selectText.8=Employer la modification des annotations permissions.selectText.8=Employer pour la modification des annotations
permissions.selectText.9=Employer l'impression permissions.selectText.9=Employer pour l'impression
permissions.selectText.10=Emp�cher l'impression de diff�rents formats permissions.selectText.10=Empêcher l'impression de différents formats
permissions.submit=Modificateur permissions.submit=Modificateur
#supprimer le mot de passe #supprimer le mot de passe
@ -276,29 +273,30 @@ removePassword.selectText.1=Sélectionnez le PDF à déchiffrer
removePassword.selectText.2=Mot de passe removePassword.selectText.2=Mot de passe
removePassword.submit=Supprimer removePassword.submit=Supprimer
changeMetadata.title=Modifier les métadonnées #Change Metadata
changeMetadata.header=Modifier les métadonnées changeMetadata.title=Modifier les métadonnées
changeMetadata.selectText.1=Veuillez modifier les variables que vous souhaitez modifier changeMetadata.header=Modifier les métadonnées
changeMetadata.selectText.2=Supprimer toutes les métadonnées changeMetadata.selectText.1=Veuillez modifier les variables que vous souhaitez modifier.
changeMetadata.selectText.3=Afficher les métadonnées personnalisées: changeMetadata.selectText.2=Supprimer toutes les métadonnées.
changeMetadata.selectText.3=Afficher les métadonnées personnalisées :
changeMetadata.author=Auteur : changeMetadata.author=Auteur :
changeMetadata.creationDate=Date de création (aaaa/MM/jj HH:mm:ss): changeMetadata.creationDate=Date de création (aaaa/MM/jj HH:mm:ss) :
changeMetadata.creator=Créateur: changeMetadata.creator=Créateur :
changeMetadata.keywords=Mots clés: changeMetadata.keywords=Mots clés :
changeMetadata.modDate=Date de modification (aaaa/MM/jj HH:mm:ss) : changeMetadata.modDate=Date de modification (aaaa/MM/jj HH:mm:ss) :
changeMetadata.producer=Producteur : changeMetadata.producer=Producteur :
changeMetadata.subject=Objet : changeMetadata.subject=Objet :
changeMetadata.title=Titre : changeMetadata.title=Titre :
changeMetadata.trapped=Piégé: changeMetadata.trapped=Piégé :
changeMetadata.selectText.4=Autres métadonnées: changeMetadata.selectText.4=Autres métadonnées :
changeMetadata.selectText.5=Ajouter une entrée de métadonnées personnalisées changeMetadata.selectText.5=Ajouter une entrée de métadonnées personnalisées
changeMetadata.submit=Modifier changeMetadata.submit=Modifier
#XLS to PDF
xlsToPdf.title=Excel vers PDF xlsToPdf.title=Excel vers PDF
xlsToPdf.header=Excel en PDF xlsToPdf.header=Excel en PDF
xlsToPdf.selectText.1=Sélectionnez une feuille Excel XLS ou XLSX à convertir xlsToPdf.selectText.1=Sélectionnez une feuille Excel XLS ou XLSX à convertir.
xlsToPdf.convert=convertir xlsToPdf.convert=Convertir
pdfToPDFA.title=PDF vers PDF/A pdfToPDFA.title=PDF vers PDF/A
pdfToPDFA.header=PDF vers PDF/A pdfToPDFA.header=PDF vers PDF/A

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{addImage.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{addImage.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{compress.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{compress.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{fileToPDF.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{fileToPDF.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{imageToPDF.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{imageToPDF.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{pdfToImage.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{pdfToImage.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{pdfToPDFA.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{pdfToPDFA.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<head> <head>
<title>Error! :(</title> <title>Error! :(</title>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{extractImages.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{extractImages.title})}"></th:block>

View File

@ -1,63 +1,32 @@
<div th:fragment="navbar" class="mx-auto"> <div th:fragment="navbar" class="mx-auto">
<script> <script>
document document.addEventListener('DOMContentLoaded', function () {
.addEventListener( const defaultLocale = document.documentElement.lang || 'en_GB';
'DOMContentLoaded', const storedLocale = localStorage.getItem('languageCode') || defaultLocale;
function() { const dropdownItems = document.querySelectorAll('.lang_dropdown-item');
// Get the dropdown items
var dropdownItems = document
.querySelectorAll('.lang_dropdown-item');
// Loop through the dropdown items for (let i = 0; i < dropdownItems.length; i++) {
for (var i = 0; i < dropdownItems.length; i++) { const item = dropdownItems[i];
dropdownItems[i].classList item.classList.remove('active');
.remove('active'); if (item.dataset.languageCode === storedLocale) {
if (dropdownItems[i].dataset.languageCode === localStorage item.classList.add('active');
.getItem('languageCode')) {
dropdownItems[i].classList
.add('active');
} }
item.addEventListener('click', handleDropdownItemClick);
}
});
// Add a click event listener to each dropdown item function handleDropdownItemClick(event) {
dropdownItems[i] event.preventDefault();
.addEventListener( const languageCode = this.dataset.languageCode;
'click', localStorage.setItem('languageCode', languageCode);
function(event) {
// Prevent the default link behavior const currentUrl = window.location.href;
event if (currentUrl.indexOf('?lang=') === -1) {
.preventDefault(); window.location.href = currentUrl + '?lang=' + languageCode;
// Get the language code
var languageCode = this.dataset.languageCode;
// Save the language code to local storage
localStorage
.setItem(
'languageCode',
languageCode);
// Get the current URL
var currentUrl = window.location.href;
// Check if the URL already contains a "?lang" query parameter
if (currentUrl
.indexOf('?lang=') === -1) {
// Update the URL with the "?lang" query parameter
window.location.href = currentUrl
+ '?lang='
+ languageCode;
} else { } else {
// Replace the "?lang" query parameter with the new value window.location.href = currentUrl.replace(/\?lang=\w{2,}/, '?lang=' + languageCode);
window.location.href = currentUrl
.replace(
/\?lang=\w{2,}/,
'?lang='
+ languageCode);
} }
});
} }
});
</script> </script>
<script th:inline="javascript"> <script th:inline="javascript">

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title='')}"></th:block> <th:block th:insert="~{fragments/common :: head(title='')}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{merge.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{merge.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{ocr.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{ocr.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{pdfOrganiser.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{pdfOrganiser.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{pageRemover.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{pageRemover.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{rotate.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{rotate.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{addPassword.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{addPassword.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{watermark.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{watermark.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{changeMetadata.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{changeMetadata.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{permissions.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{permissions.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{removePassword.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{removePassword.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{remove-watermark.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{remove-watermark.title})}"></th:block>

View File

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org"> <html th:lang="${#locale.toString()}" th:lang-direction="#{language.direction}" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title=#{split.title})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{split.title})}"></th:block>