From 73dc860972d0edd58ca87547d6caab49c4e46fb8 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Tue, 14 Feb 2023 01:21:52 +0100 Subject: [PATCH] I18n: Split translated messages of core and app in discting gettext domains --- composer.json | 5 +- eesyphp | 9 + example/locales/fr_FR.UTF8.js | 2 +- .../locales/fr_FR.UTF8/LC_MESSAGES/DEFAULT.mo | Bin 17289 -> 6999 bytes .../locales/fr_FR.UTF8/LC_MESSAGES/DEFAULT.po | 525 +----------------- example/locales/headers.pot | 4 +- example/locales/messages.pot | 382 +------------ locales/fr | 1 + locales/fr.js | 1 + locales/fr_FR | 1 + locales/fr_FR.UTF-8 | 1 + locales/fr_FR.UTF-8.js | 1 + locales/fr_FR.UTF8.js | 1 + locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.mo | Bin 0 -> 10749 bytes locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.po | 462 +++++++++++++++ locales/fr_FR.js | 1 + locales/fr_FR.utf-8 | 1 + locales/fr_FR.utf-8.js | 1 + locales/fr_FR.utf8 | 1 + locales/fr_FR.utf8.js | 1 + locales/headers.pot | 7 + locales/js-0-messages.pot | 44 ++ locales/messages.pot | 397 +++++++++++++ locales/php-messages.pot | 318 +++++++++++ locales/templates-0-messages.pot | 32 ++ src/App.php | 6 +- src/Cli.php | 30 +- src/Db.php | 2 +- src/Email.php | 8 +- src/I18n.php | 307 ++++++---- src/SentryIntegration.php | 2 +- src/Tpl.php | 32 +- src/Url.php | 30 +- templates/fatal_error.tpl | 8 +- templates/homepage.tpl | 4 +- 35 files changed, 1550 insertions(+), 1077 deletions(-) create mode 100755 eesyphp create mode 120000 locales/fr create mode 120000 locales/fr.js create mode 120000 locales/fr_FR create mode 120000 locales/fr_FR.UTF-8 create mode 120000 locales/fr_FR.UTF-8.js create mode 100644 locales/fr_FR.UTF8.js create mode 100644 locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.mo create mode 100644 locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.po create mode 120000 locales/fr_FR.js create mode 120000 locales/fr_FR.utf-8 create mode 120000 locales/fr_FR.utf-8.js create mode 120000 locales/fr_FR.utf8 create mode 120000 locales/fr_FR.utf8.js create mode 100644 locales/headers.pot create mode 100644 locales/js-0-messages.pot create mode 100644 locales/messages.pot create mode 100644 locales/php-messages.pot create mode 100644 locales/templates-0-messages.pot diff --git a/composer.json b/composer.json index 3fc8247..3d2454b 100644 --- a/composer.json +++ b/composer.json @@ -30,5 +30,8 @@ }, "require-dev": { "phpstan/phpstan": "^1.9" - } + }, + "bin": [ + "eesyphp" + ] } diff --git a/eesyphp b/eesyphp new file mode 100755 index 0000000..5d18956 --- /dev/null +++ b/eesyphp @@ -0,0 +1,9 @@ +#!/usr/bin/php +

Mail initialy intended for %s.<\/small><\/p>":"<\/hr>

Email initialement destin\u00e9 \u00e0 %s.<\/small><\/p>","\n\n\nMail initialy intended for %s.":"\n\n\nMail originalement destin\u00e9 \u00e0 %s.","

%s: %s<\/small><\/p>":"

%s: %s<\/small><\/p>","\n%s: %s":"\n%s: %s","No template specified.":"Aucun template sp\u00e9cifi\u00e9.","An error occurred while displaying this page.":"Une erreur est survenue en affichant cette page.","Bad request":"Mauvaise requ\u00eate","Invalid request.":"Requ\u00eate invalide.","Authentication required":"Authentification requise","You have to be authenticated to access to this page.":"Vous devez \u00eatre authentifi\u00e9 pour acc\u00e9der \u00e0 cette page.","Access denied":"Acc\u00e8s interdit","You do not have access to this application. If you think this is an error, please contact support.":"Vous n'avez pas acc\u00e8s \u00e0 cette application. Si vous pensez qu'il s'agit d'une erreur, merci de prendre contact avec le support.","Whoops ! Page not found":"Oups ! Page introuvable","The requested page can not be found.":"La page demand\u00e9e est introuvable.","Error":"Erreur","An unknown error occurred. If problem persist, please contact support.":"Une erreur inconnue est survenue. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Unable to determine the requested page. If the problem persists, please contact support.":"Impossible de d\u00e9terminer la page demand\u00e9e. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Unable to determine the requested page (loop detected). If the problem persists, please contact support.":"Impossible de d\u00e9terminer la page demand\u00e9e (boucle d\u00e9tect\u00e9e). Si le probl\u00e8me persiste, merci de prendre contact avec le support.","This request cannot be processed.":"Cette requ\u00eate ne peut \u00eatre trait\u00e9e.","Authentication required but force_authentication function is not defined.":"Authentification requise mais la fonction force_authentication n'est pas d\u00e9finie.","This request could not be processed correctly.":"Cette requ\u00eate n'a put \u00eatre trait\u00e9e correctement.","Hello world !":"Bonjour tout le monde !","Extract messages that need to be translated":"Extraire les messages devant \u00eatre traduit","This command could be used to generate\/update locales\/messages.pot file.":"Cette commande peut-\u00eatre utilis\u00e9e pour g\u00e9n\u00e9rer\/mettre \u00e0 jour le fichier locales\/messages.pot.","Update messages in translation PO lang files":"Mettre \u00e0 jour les messages dans les fichiers de traduction PO existants","This command could be used to init\/update PO files in locales\/*\/LC_MESSAGES directories.":"Cette commande peut-\u00eatre utilis\u00e9e pour initialiser\/mettre \u00e0 jour les fichiers PO dans les dossiers locales\/*\/LC_MESSAGES.","Compile messages from existing translation PO lang files to corresponding MO files and JS catalogs":"Compiler les messages depuis les fichiers PO de traduction existants vers les fichiers MO et les catalogues JS correspondant","This command could be used to compile PO files in locales\/*\/LC_MESSAGES directories to MO files and as JS catalogs in locales directory.":"Cette commande peut-\u00eatre utilis\u00e9e pour compiler les fichiers PO dans les dossiers locales\/*\/LC_MESSAGES and les catalogues JS dans le dossier locales.","Fail to list EesyPHP PHP files.":"Une erreur est survenue en listant les fichiers PHP d'EesyPHP.","Fail to extract messages from EesyPHP PHP files using xgettext.":"Une erreur est survenue en extrayant les messages depuis les fichiers PHP d'EesyPHP en utilisant xgettext.","Fail to list application PHP files.":"Une erreur est survenue en listant les fichiers PHP de l'application.","Fail to extract messages from PHP files using xgettext.":"Impossible d'extraire les messages depuis les fichiers PHP en utilisant xgettext.","Fail to list JS files in the directory of static files '%s'.":"Une erreur est survenue en listant les fichiers JS dans le dossier des fichiers statiques '%s'.","Fail to extract messages from JS files in the directory of static files '%s' using xgettext.":"Une erreur est survenue en extrayant les messages depuis les fichiers JS du dossier des fichiers statiques '%s' en utilisant xgettext.","Fail to extract messages from templates directory '%s' using tsmarty2c.php script.":"Impossible d'extraire les messages depuis le dossier de templates '%s' en utilisant le script tsmarty2c.php.","Fail to merge messages using msgcat.":"Impossible de fusionner les messages en utilisant msgcat.","Compendium file %s not found.":"Fichier compendium %s introuvable.","POT file not found (%s). Please run extract_messages first.":"Fichier POT introuvable (%s). Merci de lancer la commande extract_messages pour commencer.","Lang directory '%s' found":"Dossier de langue '%s' trouv\u00e9","LC_MESSAGES directory not found in lang '%s' directory, ignore it.":"Le dossier LC_MESSAGES est introuvable dans le dossier de langue '%s', on l'ignore.","Fail to init messages in %s PO file using msginit (%s).":"Impossible d'initialiser les messages dans le fichier PO %s en utilisant msginit (%s).","Fail to update messages in %s PO file using msgmerge (%s).":"Impossible de mettre \u00e0 jour les messages dans les fichiers PO %s en utilisant msgmerge (%s).","PO file not found in lang '%s' directory, ignore it.":"Le fichier PO est introuvable dans le dossier de langue '%s', on l'ignore.","Fail to open root lang directory (%s).":"Impossible d'ouvrir le dossier racine des langues (%s).","Lang alias symlink found: %s -> %s":"Lien symbolique d'alias de langue trouv\u00e9 : %s -> %s","JS catalog symlink for %s -> %s created (%s)":"Lien symbolique de catalogue JS pour %s -> %s cr\u00e9\u00e9 (%s)","Fail to create JS catalog symlink for %s -> %s (%s)":"Impossible de cr\u00e9er le lien symbolique de catalogue JS pour %s -> %s (%s)","JS catalog symlink for %s -> %s already exist (%s)":"Le lien symbolique du catalogue JS pour %s -> %s existe d\u00e9j\u00e0 (%s)","JS catalog file for %s already exist, but it's not a symlink to %s (%s)":"Le catalogue JS pour %s existe, mais il ne s'agit par d'un lien symbolique vers %s (%s)","Fail to compile messages from %s PO file as MO file using msgfmt (%s).":"Impossible de compiler les messages depuis le fichier PO %s en tant que fichier MO en utilisant msgfmt (%s).","Fail to open %s JS catalog file in write mode (%s).":"Impossible d'ouvrir le catalogue JS %s en mode \u00e9criture (%s).","Fail to write %s JS catalog in file (%s).":"Impossible d'\u00e9crire le fichier du catalogue JS %s (%s).","%s JS catalog writed (%s).":"Catalogue JS %s cr\u00e9\u00e9 (%s).","Hello world!":"Salut tout le monde !","Item #%s:\n":"\u00c9l\u00e9ment #%s :\n","ID: %s":"ID : %s","Name: '%s'":"Nom : %s","Date: %s":"Date : %s","Description: %s":"Description : %s","Not set":"Non-d\u00e9fini","Status: %s":"Statut : %s","No item.\n":"Aucun \u00e9l\u00e9ment.\n","%d item(s)":"%d \u00e9l\u00e9ment(s)","List\/search items":"Lister\/rechercher les \u00e9l\u00e9ments","[patterns]":"[mots cl\u00e9s]","-o|--orderby Ordering list criterion. Possible values:":"-o|--orderby Crit\u00e8re de tri de la liste. Valeurs possibles :","-r|--reverse Reverse order":"-r|--reverse Ordre inverse","-s|--status Filter on status. Possible values:":"-s|--status Filtrer sur le statut. Valeurs possibles :","You must provide a valid ID.":"Vous devez fournir un ID valide.","Item #%s not found.":"\u00c9l\u00e9ment #%s introuvable.","Show item":"Voir un \u00e9l\u00e9ment","[ID]":"[ID]","You must provide item ID.":"Vous devez fournir un ID valide.","Invalid item ID":"ID d'\u00e9l\u00e9ment invalide","Are you sure you want to delete this item? Type 'yes' to continue: ":"\u00cates-vous s\u00fbre de vouloir supprimer cet \u00e9l\u00e9ment ? Taper 'yes' pour continuer : ","User cancel":"L'utilisateur a annul\u00e9","An error occured deleting item #%d.":"Une erreur est survenue en supprimant l'\u00e9l\u00e9ment #%d.","Delete item":"Supprimer un \u00e9l\u00e9ment","[item ID]":"[ID de l'\u00e9l\u00e9ment]","Export items (as CSV)":"Exporter les \u00e9l\u00e9ments (au format CSV)","[output file path]":"[chemin du fichier de sortie]","Restore items (from CSV)":"Restaurer les \u00e9l\u00e9ments (depuis un fichier CSV)","[input file path]":"[chemin du fichier d'entr\u00e9e]","Cron to handle item expiration":"Cron g\u00e9rant l'expiration des \u00e9l\u00e9ments","-j\/--just-try Just-try mode : do not really removed expired item(s)":"-j\/--just-try Mode just-try : Ne supprime pas r\u00e9ellement les \u00e9l\u00e9ments expir\u00e9s","-m\/--max-age Item expiration limit (in days, optional)":"-m\/--max-age Limite d'expiration des \u00e9l\u00e9ments (en secondes, optionnel)","Invalid element identifier.":"Identifiant d'\u00e9l\u00e9ment invalide.","Item #% s not found.":"L'\u00e9l\u00e9ment #%s est introuvable.","Pending":"En attente","Validated":"Valid\u00e9","Refused":"Refus\u00e9","Archived":"Archiv\u00e9","Any":"Peu importe","An error occurred while listing the items. If the problem persists, please contact support.":"Une erreur est survenue en listant les \u00e9l\u00e9ments. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Search":"Rechercher","Element %s":"\u00c9l\u00e9ment %s","The element '% s' has been created.":"L'\u00e9l\u00e9ment '%s' a bien \u00e9t\u00e9 cr\u00e9\u00e9.","An error occurred while saving this item.":"Une erreur est survenue en enregistrant cet \u00e9l\u00e9ment.","There are errors preventing this item from being saved. Please correct them before attempting to add this item.":"Des erreurs emp\u00eachent l'enregistrement de cet \u00e9l\u00e9ment. Merci de les corriger avant de tenter d'ajouter cet \u00e9l\u00e9ment.","New":"Nouveau","You cannot edit this item.":"Vous ne pouvez pas modifier cet \u00e9l\u00e9ment.","You have not made any changes to element '% s'.":"Vous n'avez apport\u00e9 aucune modification \u00e0 l'\u00e9l\u00e9ment '%s'.","The element '% s' has been updated successfully.":"L'\u00e9l\u00e9ment '%s' a bien \u00e9t\u00e9 mise \u00e0 jour.","An error occurred while updating this item.":"Une erreur est survenue en mettant \u00e0 jour cet \u00e9l\u00e9ment.","There are errors preventing this item from being saved. Please correct them before attempting to save your changes.":"Des erreurs emp\u00eachent l'enregistrement de cet \u00e9l\u00e9ment. Merci de les corriger avant de tenter d'enregistrer vos modifications.","Element %s: Modification":"\u00c9l\u00e9ment %s : Modification","This item is already archived.":"Cet \u00e9l\u00e9ment est d\u00e9j\u00e0 archiv\u00e9.","You cannot archive this item.":"Vous ne pouvez pas archiver cet \u00e9l\u00e9ment.","The element '% s' has been archived successfully.":"L'\u00e9l\u00e9ment '%s' a bien \u00e9t\u00e9 archiv\u00e9.","An error occurred while archiving this item.":"Une erreur est survenue en archivant cet \u00e9l\u00e9ment.","You cannot delete this item.":"Vous ne pouvez pas supprimer cet \u00e9l\u00e9ment.","The element '% s' has been deleted successfully.":"L'\u00e9l\u00e9ment '%s' a bien \u00e9t\u00e9 supprim\u00e9.","An error occurred while deleting this item.":"Une erreur est survenue en supprimant cet \u00e9l\u00e9ment.","Confirmation":"Confirmation","Do you confirm?":"Confirmez-vous ?","Cancel":"Annuler","Validate":"Valider","OK":"OK","Question":"Question","Please enter your answer below:":"Merci de saisir vos r\u00e9ponses ci-dessous :","Please wait":"Merci de patienter","Please wait while your request is being processed.":"Merci de patienter pendant le traitement de votre requ\u00eate.","Are you sure?":"\u00cates-vous sure ?","Name":"Nom","Creation date":"Date de cr\u00e9ation","Status":"Statut","Description":"Description","Unspecified.":"Non-sp\u00e9cifi\u00e9.","Back":"Retour","Modify":"Modifier","Are you sure you want to archive this item?":"\u00cates-vous s\u00fbre de vouloir archiver cet \u00e9l\u00e9ment ?","Archive":"Archiver","Are you sure you want to delete this item?":"\u00cates-vous s\u00fbre de vouloir supprimer cet \u00e9l\u00e9ment ?","Delete":"Supprimer","Pattern":"Mot cl\u00e9","Nb by page":"Nb par page","Reset":"R\u00e9initialiser","Add":"Ajouter","Date":"Date","Actions":"Actions","View":"Voir","No item found.":"Aucun \u00e9l\u00e9ment trouv\u00e9.","%3 element":[null,"Elements %1 to %2 on %3"],"Hello, world!":"Bonjour tout le monde !","This is a simple app to show the different possibilities and basic functionality.":"Ceci est une simple application pour montrer les diff\u00e9rentes possibilit\u00e9s et les fonctionnalit\u00e9s de base.","This app contains some demo pages:":"Cette application contient quelques pages de d\u00e9mo :","Search page":"Page de recherche","Save":"Enregistrer","A fatal error has occurred and it is preventing this application from working properly. Please try again later or contact support.":"Une erreur fatale est survenue et celle-ci emp\u00eache cette application de fonctionner correctement. Merci de r\u00e9essayer ult\u00e9rieurement ou de prendre contact avec le service support.","Error: %1":"Erreur : %1","This is the default page of a new app using EesyPHP framework. Register your own templates directory and create a homepage.tpl<\/em> file to overwrite it. You could also overwrite the URL handler for the root of the web application.":"Il s'agit de la page par d\u00e9faut d'une nouvelle application utilisant le framework EesyPHP. Configurez votre propre dossier de templates et cr\u00e9er le fichier homepage.tpl<\/em> pour l'\u00e9craser. Vous pouvez \u00e9galement \u00e9craser le gestionnaire de l'URL racine de l'application web.","This command could be used to generate\/update lang\/messages.pot file.":"Cette commande peut-\u00eatre utilis\u00e9e pour g\u00e9n\u00e9rer\/mettre \u00e0 jour le fichier lang\/messages.pot.","This command could be used to init\/update PO files in lang\/*\/LC_MESSAGES directories.":"Cette commande peut-\u00eatre utilis\u00e9e pour initialiser\/mettre \u00e0 jour les fichiers PO les dossiers lang\/*\/LC_MESSAGES.","This command could be used to compile PO files in lang\/*\/LC_MESSAGES directories to MO files and as JS catalogs in public_html\/translations.":"Cette commande peut-\u00eatre utilis\u00e9e pour compiler les fichiers PO dans les dossiers lang\/*\/LC_MESSAGES en fichiers MO and en tant que catalogues JS dans public_html\/translations.","Fail to list JS files in '%s' static directory.":"Une erreur est survenue en listant les fichiers JS dans le dossier des fichiers statiques '%s'.","Fail to extract messages from JS files in '%s' static directory using xgettext.":"Impossible d'extraire les messages depuis les fichiers JS dans le dossier des fichiers statiques '%s' en utilisant xgettext.","Smarty version not supported.":"Une erreur est survenue en affichant cette page.","An error occurred while viewing this page.":"Une erreur est survenue en affichant cette page.","Fail to list PHP files.":"Impossible de lister les fichiers PHP.","Fail to list JS files.":"Impossible de lister les fichiers JS.","Fail to extract messages from JS files using xgettext.":"Impossible d'extraire les messages depuis les fichiers JS en utilisant xgettext.","Fail to extract messages from template files using tsmarty2c.php script.":"Impossible d'extraire les messages depuis les fichiers template en utilisant le script tsmarty2c.php.","Update messages in existing translation PO lang files":"Mettre \u00e0 jour les messages dans les fichiers de traduction PO existants","This command could be used to update PO files in lang\/*\/LC_MESSAGES directories.":"Cette commande peut-\u00eatre utilis\u00e9e pour mettre \u00e0 jour les fichiers PO les dossiers lang\/*\/LC_MESSAGES.","Compile messages from existing translation PO lang files to corresponding MO files":"Compiler les messages depuis les fichiers PO de traduction existants vers les fichiers MO correspondant","This command could be used to compile PO files in lang\/*\/LC_MESSAGES directories to MO files.":"Cette commande peut-\u00eatre utilis\u00e9e pour compiler les fichiers PO dans les dossiers lang\/*\/LC_MESSAGES en fichiers MO.","Element(s) %1 to %2 on %3":"\u00c9l\u00e9ment(s) %1 \u00e0 %2 sur %3"},"locale":"fr_FR.UTF8","domain":"DEFAULT","plural_expr":"(n > 1)"}; \ No newline at end of file +translations_data = {"messages":{"Item #%s:\n":"\u00c9l\u00e9ment #%s :\n","ID: %s":"ID : %s","Name: '%s'":"Nom : %s","Date: %s":"Date : %s","Description: %s":"Description : %s","Not set":"Non-d\u00e9fini","Status: %s":"Statut : %s","No item.\n":"Aucun \u00e9l\u00e9ment.\n","%d item(s)":"%d \u00e9l\u00e9ment(s)","List\/search items":"Lister\/rechercher les \u00e9l\u00e9ments","[patterns]":"[mots cl\u00e9s]","-o|--orderby Ordering list criterion. Possible values:":"-o|--orderby Crit\u00e8re de tri de la liste. Valeurs possibles :","-r|--reverse Reverse order":"-r|--reverse Ordre inverse","-s|--status Filter on status. Possible values:":"-s|--status Filtrer sur le statut. Valeurs possibles :","You must provide a valid ID.":"Vous devez fournir un ID valide.","Item #%s not found.":"\u00c9l\u00e9ment #%s introuvable.","Show item":"Voir un \u00e9l\u00e9ment","[ID]":"[ID]","You must provide item ID.":"Vous devez fournir un ID valide.","Invalid item ID":"ID d'\u00e9l\u00e9ment invalide","Are you sure you want to delete this item? Type 'yes' to continue: ":"\u00cates-vous s\u00fbre de vouloir supprimer cet \u00e9l\u00e9ment ? Taper 'yes' pour continuer : ","User cancel":"L'utilisateur a annul\u00e9","An error occured deleting item #%d.":"Une erreur est survenue en supprimant l'\u00e9l\u00e9ment #%d.","Delete item":"Supprimer un \u00e9l\u00e9ment","[item ID]":"[ID de l'\u00e9l\u00e9ment]","Export items (as CSV)":"Exporter les \u00e9l\u00e9ments (au format CSV)","[output file path]":"[chemin du fichier de sortie]","Restore items (from CSV)":"Restaurer les \u00e9l\u00e9ments (depuis un fichier CSV)","[input file path]":"[chemin du fichier d'entr\u00e9e]","Cron to handle item expiration":"Cron g\u00e9rant l'expiration des \u00e9l\u00e9ments","-j\/--just-try Just-try mode : do not really removed expired item(s)":"-j\/--just-try Mode just-try : Ne supprime pas r\u00e9ellement les \u00e9l\u00e9ments expir\u00e9s","-m\/--max-age Item expiration limit (in days, optional)":"-m\/--max-age Limite d'expiration des \u00e9l\u00e9ments (en secondes, optionnel)","Invalid element identifier.":"Identifiant d'\u00e9l\u00e9ment invalide.","Item #% s not found.":"L'\u00e9l\u00e9ment #%s est introuvable.","Pending":"En attente","Validated":"Valid\u00e9","Refused":"Refus\u00e9","Archived":"Archiv\u00e9","Any":"Peu importe","An error occurred while listing the items. If the problem persists, please contact support.":"Une erreur est survenue en listant les \u00e9l\u00e9ments. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Search":"Rechercher","Element %s":"\u00c9l\u00e9ment %s","The element '% s' has been created.":"L'\u00e9l\u00e9ment '%s' a bien \u00e9t\u00e9 cr\u00e9\u00e9.","An error occurred while saving this item.":"Une erreur est survenue en enregistrant cet \u00e9l\u00e9ment.","There are errors preventing this item from being saved. Please correct them before attempting to add this item.":"Des erreurs emp\u00eachent l'enregistrement de cet \u00e9l\u00e9ment. Merci de les corriger avant de tenter d'ajouter cet \u00e9l\u00e9ment.","New":"Nouveau","You cannot edit this item.":"Vous ne pouvez pas modifier cet \u00e9l\u00e9ment.","You have not made any changes to element '% s'.":"Vous n'avez apport\u00e9 aucune modification \u00e0 l'\u00e9l\u00e9ment '%s'.","The element '% s' has been updated successfully.":"L'\u00e9l\u00e9ment '%s' a bien \u00e9t\u00e9 mise \u00e0 jour.","An error occurred while updating this item.":"Une erreur est survenue en mettant \u00e0 jour cet \u00e9l\u00e9ment.","There are errors preventing this item from being saved. Please correct them before attempting to save your changes.":"Des erreurs emp\u00eachent l'enregistrement de cet \u00e9l\u00e9ment. Merci de les corriger avant de tenter d'enregistrer vos modifications.","Element %s: Modification":"\u00c9l\u00e9ment %s : Modification","This item is already archived.":"Cet \u00e9l\u00e9ment est d\u00e9j\u00e0 archiv\u00e9.","You cannot archive this item.":"Vous ne pouvez pas archiver cet \u00e9l\u00e9ment.","The element '% s' has been archived successfully.":"L'\u00e9l\u00e9ment '%s' a bien \u00e9t\u00e9 archiv\u00e9.","An error occurred while archiving this item.":"Une erreur est survenue en archivant cet \u00e9l\u00e9ment.","You cannot delete this item.":"Vous ne pouvez pas supprimer cet \u00e9l\u00e9ment.","The element '% s' has been deleted successfully.":"L'\u00e9l\u00e9ment '%s' a bien \u00e9t\u00e9 supprim\u00e9.","An error occurred while deleting this item.":"Une erreur est survenue en supprimant cet \u00e9l\u00e9ment.","Name":"Nom","Creation date":"Date de cr\u00e9ation","Status":"Statut","Description":"Description","Unspecified.":"Non-sp\u00e9cifi\u00e9.","Back":"Retour","Modify":"Modifier","Are you sure you want to archive this item?":"\u00cates-vous s\u00fbre de vouloir archiver cet \u00e9l\u00e9ment ?","Archive":"Archiver","Are you sure you want to delete this item?":"\u00cates-vous s\u00fbre de vouloir supprimer cet \u00e9l\u00e9ment ?","Delete":"Supprimer","Pattern":"Mot cl\u00e9","Nb by page":"Nb par page","Reset":"R\u00e9initialiser","Add":"Ajouter","Date":"Date","Actions":"Actions","View":"Voir","No item found.":"Aucun \u00e9l\u00e9ment trouv\u00e9.","%3 element":[null,"Elements %1 to %2 on %3"],"Hello, world!":"Bonjour tout le monde !","This is a simple app to show the different possibilities and basic functionality.":"Ceci est une simple application pour montrer les diff\u00e9rentes possibilit\u00e9s et les fonctionnalit\u00e9s de base.","This app contains some demo pages:":"Cette application contient quelques pages de d\u00e9mo :","Search page":"Page de recherche","Save":"Enregistrer"},"locale":"fr_FR.UTF8","domain":"DEFAULT","plural_expr":"(n > 1)"}; \ No newline at end of file diff --git a/example/locales/fr_FR.UTF8/LC_MESSAGES/DEFAULT.mo b/example/locales/fr_FR.UTF8/LC_MESSAGES/DEFAULT.mo index 29bff47e18801ba2595ac20f33fcf2a28d812cdb..20b210840bf6aa68fe26c29d6a750286aa5da974 100644 GIT binary patch delta 2156 zcmXxlYiyHM9LMp~F(+fVvAM#4T{;I8wox`1yTOL+f^rczwh?4r*02uimJZfdA%qkn zYL<`~I4T$`MVA;vqA^5`LR1pLh~MAS$CLj1Ip?{Y=Uo0z zJNkm>o7%*8dFd}3N)J&;e3WL)ZXCLcFG|(j#@vV1I0L(J9X^4Lcp6vZRrF!;bYoWH z8sw0P<22llWq1%P@eQmnCSksy(#wH=aS3kEbWWH;-9FFXJn;1D8Tu& zOHlW%!hGC__hKKapBUz10`=e{sDU2Wd7f`hs)A=wGfrYQo<}BUE}&Lm(sj!9d)I5I z-MWq%@J-YMa%QF;n2#JX^HKfz-Q(4m(1Yu#RAVb@kK$N`ueyGM!?bT>6bD%b<-`^2 z#56{$rS3*9F;Ub551<}+7&V|*un13}a_yaL)_)$AuQ{*`Z@4E)SpT-~E^Sx|z1MQ=z8GnjOvMJZAsQZ3Ky%i-SNEh~?a$zh%MKe2xi}6F$ zjDJDR^t$UUoJ~8OOmy}VnUwLPmb@O7jP0lu2;v+ZMNQ}wmg1Ou{37~jCw`!!El8(# zby$KrQH7dGCn_noyY0tO1K5e`IEqTTeW;1N8?%|K&j{D~URSMKx;)4V>{iuXhWo zD6ce873cleyZbPq<<$(GR|Ol01w<#&Ol&493C&V7QqdNuXr?M!S|6b$e~4I4sIb@0 z{{%0N^S`lC2etppQWfW0KRzV7DIxTls4OLx5bpnx4mpV`SLusVpTfx-C96s;v4tSN zogW(|ol1KO=exj}7FD*yEFvBtv`0!fw$J&oNW=RHWi!7o&VN8Ds@UhVmnA2&XM60# ztW)-6?rZi;-r4k);Eq9iFn`eglfTebd%bp|pvCT=yTVS*>+;5Y(NN5E1Y@z#NW^r6 zBK_gWPP?tJ&)T9nwyfy&hcbdy;bYXPY z_?QMUJ{B;W{P9?LC>#yOLh%t_&=-tE;zQ$OW@~ULOowLcaCpQ%x%Nf7r=`i}w$8R0 HtT~dB@w2_;Ch|4cNSlTei=4vbA@X3^AM~*|HwinLFvElVlrP7IV9EcO&i2 ztY>ylcg7Gycw+(t^GFDf5FkD!6$p={QX~}NNGPgOgi2LXkT{`Sgak083P_Pu9+2O^ zduDfbbthYnlP&fAcV@bKy1(!1@45Pii_dcMtG~&o`cK%sTL! z;JM&`g4cj&J;Rt6fg|8$;3W70@ECXn_$E+OoB*E>eh%CPejOYGFTId=f%`!Vz5{#- z_$lyZ;6H&{kA0>wuLHM$yxM#b)H=Qfo(295cqRC^;0Ew#;I-hj7a3ClZwK!J-vF)$ z9|iUNf{TqA0&f7dt|Or4`vj=@Pk`rvp9a6d&FKYQLWWwf{fOufGOr zpO1i&r*DJW-_Jqu@xtdB1B=ZukS&_~K}c!d1!~_P2X6&G1#SZW9h6*LixA!d-T_KJ zKLGN`d;vrx%r`*2_xqse{v%NH{WQljSd8T3X&@qOo(YPcmxGYRtOq4GH-l$_yFt<6 z<=~6KCU_(GaZvpp&GCDn==dX0e7y*v*SaqQ#rG*t{qF?D#{h&BW)9Rk9{{!PH-H-d zAgFb{KfnJ`Q2SU0wVuy{Bj7i|jo^6*qxd!kUI*Tj<2yk0|00-x-vKl5Ai^p7eHDB& z_yce^*k%)VfL{RjftOli9s?s#@_Y~_B0bXLkKX@YQ1kp5I1hdo)cAeelsudO#kW5M zdA0dRQ2RTR#hwQ~1Jph*1x1H-Afjfj2GxHn$QI4rAS^UX;0*W>I12t7D83A_N!JgQ zJS>5l@729#X?9jNy|1|9&<i*5rGQ1t(6@I3I*9KR20 zzMp_E0f%AQGqPDfnYhbh;MeqKeISP}g^YqSL(~N5(AW_dftOx&91zF?bcsu;2}# z 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\n" "Language-Team: \n" @@ -12,377 +12,6 @@ msgstr "" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: Cli.php:34 -#, php-format -msgid "The CLI command '%s' already exists." -msgstr "La commande CLI '%s' n'existe pas." - -#: Cli.php:39 -#, php-format -msgid "The CLI command '%s' handler is not callable !" -msgstr "La fonction implémentant la commande CLI '%s' n'est pas exécutable !" - -#: Cli.php:71 -#, php-format -msgid "Usage: %s [-h] [-qd] command\n" -msgstr "Utilisation: %s [-h] [-qd] commande\n" - -#: Cli.php:72 -msgid " -h Show this message\n" -msgstr " -h Affiche ce message\n" - -#: Cli.php:73 -msgid " -q / -d Quiet/Debug mode\n" -msgstr " -q / -d Mode silencieux/debug\n" - -#: Cli.php:74 -msgid " --trace Trace mode (the most verbose)\n" -msgstr " --trace Mode trace (le plus verbeux)\n" - -#: Cli.php:75 -msgid " command Command to run\n" -msgstr " command La commande à exécuter\n" - -#: Cli.php:77 -msgid "Available commands:\n" -msgstr "Commandes disponibles:\n" - -#: Cli.php:125 -msgid "Only one command could be executed !" -msgstr "Une seul commande peut-être exécutée !" - -#: Cli.php:153 -#, php-format -msgid "" -"Invalid parameter \"%s\".\n" -"Note: Command's parameter/argument must be place after the command." -msgstr "" -"Paramètre \"%s\" invalide.\n" -"Note : Les paramètres/arguments de la requête doivent être placés après " -"celle-ci." - -#: Cli.php:178 -#, php-format -msgid "An exception occured running command %s" -msgstr "Une exception est survenue en exécutant la commande %s" - -#: Db.php:74 -msgid "Unable to connect to the database." -msgstr "Impossible de se connecter à la base de données." - -#: Email.php:141 -#, php-format -msgid "

Mail initialy intended for %s.

" -msgstr "

Email initialement destiné à %s.

" - -#: Email.php:142 -#, php-format -msgid "" -"\n" -"\n" -"\n" -"Mail initialy intended for %s." -msgstr "" -"\n" -"\n" -"\n" -"Mail originalement destiné à %s." - -#: Email.php:178 -#, php-format -msgid "

%s: %s

" -msgstr "

%s: %s

" - -#: Email.php:179 -#, php-format -msgid "" -"\n" -"%s: %s" -msgstr "" -"\n" -"%s: %s" - -#: Tpl.php:339 -msgid "No template specified." -msgstr "Aucun template spécifié." - -#: Tpl.php:370 -msgid "An error occurred while displaying this page." -msgstr "Une erreur est survenue en affichant cette page." - -#: Url.php:141 -msgid "Bad request" -msgstr "Mauvaise requête" - -#: Url.php:142 -msgid "Invalid request." -msgstr "Requête invalide." - -#: Url.php:145 -msgid "Authentication required" -msgstr "Authentification requise" - -#: Url.php:146 -msgid "You have to be authenticated to access to this page." -msgstr "Vous devez être authentifié pour accéder à cette page." - -#: Url.php:149 -msgid "Access denied" -msgstr "Accès interdit" - -#: Url.php:150 -msgid "" -"You do not have access to this application. If you think this is an error, " -"please contact support." -msgstr "" -"Vous n'avez pas accès à cette application. Si vous pensez qu'il s'agit d'une " -"erreur, merci de prendre contact avec le support." - -#: Url.php:153 -msgid "Whoops ! Page not found" -msgstr "Oups ! Page introuvable" - -#: Url.php:154 -msgid "The requested page can not be found." -msgstr "La page demandée est introuvable." - -#: Url.php:162 -msgid "Error" -msgstr "Erreur" - -#: Url.php:163 -msgid "An unknown error occurred. If problem persist, please contact support." -msgstr "" -"Une erreur inconnue est survenue. Si le problème persiste, merci de prendre " -"contact avec le support." - -#: Url.php:226 -msgid "" -"Unable to determine the requested page. If the problem persists, please " -"contact support." -msgstr "" -"Impossible de déterminer la page demandée. Si le problème persiste, merci de " -"prendre contact avec le support." - -#: Url.php:376 -msgid "" -"Unable to determine the requested page (loop detected). If the problem " -"persists, please contact support." -msgstr "" -"Impossible de déterminer la page demandée (boucle détectée). Si le problème " -"persiste, merci de prendre contact avec le support." - -#: Url.php:407 -msgid "This request cannot be processed." -msgstr "Cette requête ne peut être traitée." - -#: Url.php:420 -msgid "" -"Authentication required but force_authentication function is not defined." -msgstr "" -"Authentification requise mais la fonction force_authentication n'est pas " -"définie." - -#: Url.php:429 -msgid "This request could not be processed correctly." -msgstr "Cette requête n'a put être traitée correctement." - -#: I18n.php:114 App.php:120 -msgid "Hello world !" -msgstr "Bonjour tout le monde !" - -#: I18n.php:130 -msgid "Extract messages that need to be translated" -msgstr "Extraire les messages devant être traduit" - -#: I18n.php:132 -msgid "" -"This command could be used to generate/update locales/messages.pot file." -msgstr "" -"Cette commande peut-être utilisée pour générer/mettre à jour le fichier " -"locales/messages.pot." - -#: I18n.php:138 -msgid "Update messages in translation PO lang files" -msgstr "" -"Mettre à jour les messages dans les fichiers de traduction PO existants" - -#: I18n.php:140 -msgid "" -"This command could be used to init/update PO files in locales/*/LC_MESSAGES " -"directories." -msgstr "" -"Cette commande peut-être utilisée pour initialiser/mettre à jour les " -"fichiers PO dans les dossiers locales/*/LC_MESSAGES." - -#: I18n.php:147 -msgid "" -"Compile messages from existing translation PO lang files to corresponding MO " -"files and JS catalogs" -msgstr "" -"Compiler les messages depuis les fichiers PO de traduction existants vers " -"les fichiers MO et les catalogues JS correspondant" - -#: I18n.php:152 -msgid "" -"This command could be used to compile PO files in locales/*/LC_MESSAGES " -"directories to MO files and as JS catalogs in locales directory." -msgstr "" -"Cette commande peut-être utilisée pour compiler les fichiers PO dans les " -"dossiers locales/*/LC_MESSAGES and les catalogues JS dans le dossier locales." - -#: I18n.php:277 -msgid "Fail to list EesyPHP PHP files." -msgstr "Une erreur est survenue en listant les fichiers PHP d'EesyPHP." - -#: I18n.php:297 -msgid "Fail to extract messages from EesyPHP PHP files using xgettext." -msgstr "" -"Une erreur est survenue en extrayant les messages depuis les fichiers PHP " -"d'EesyPHP en utilisant xgettext." - -#: I18n.php:309 -msgid "Fail to list application PHP files." -msgstr "Une erreur est survenue en listant les fichiers PHP de l'application." - -#: I18n.php:329 -msgid "Fail to extract messages from PHP files using xgettext." -msgstr "" -"Impossible d'extraire les messages depuis les fichiers PHP en utilisant " -"xgettext." - -#: I18n.php:342 -#, php-format -msgid "Fail to list JS files in the directory of static files '%s'." -msgstr "" -"Une erreur est survenue en listant les fichiers JS dans le dossier des " -"fichiers statiques '%s'." - -#: I18n.php:364 -#, php-format -msgid "" -"Fail to extract messages from JS files in the directory of static files '%s' " -"using xgettext." -msgstr "" -"Une erreur est survenue en extrayant les messages depuis les fichiers JS du " -"dossier des fichiers statiques '%s' en utilisant xgettext." - -#: I18n.php:384 -#, php-format -msgid "" -"Fail to extract messages from templates directory '%s' using tsmarty2c.php " -"script." -msgstr "" -"Impossible d'extraire les messages depuis le dossier de templates '%s' en " -"utilisant le script tsmarty2c.php." - -#: I18n.php:420 -msgid "Fail to merge messages using msgcat." -msgstr "Impossible de fusionner les messages en utilisant msgcat." - -#: I18n.php:434 -#, php-format -msgid "Compendium file %s not found." -msgstr "Fichier compendium %s introuvable." - -#: I18n.php:441 -#, php-format -msgid "POT file not found (%s). Please run extract_messages first." -msgstr "" -"Fichier POT introuvable (%s). Merci de lancer la commande extract_messages " -"pour commencer." - -#: I18n.php:453 I18n.php:561 -#, php-format -msgid "Lang directory '%s' found" -msgstr "Dossier de langue '%s' trouvé" - -#: I18n.php:459 I18n.php:567 -#, php-format -msgid "LC_MESSAGES directory not found in lang '%s' directory, ignore it." -msgstr "" -"Le dossier LC_MESSAGES est introuvable dans le dossier de langue '%s', on " -"l'ignore." - -#: I18n.php:474 -#, php-format -msgid "Fail to init messages in %s PO file using msginit (%s)." -msgstr "" -"Impossible d'initialiser les messages dans le fichier PO %s en utilisant " -"msginit (%s)." - -#: I18n.php:492 -#, php-format -msgid "Fail to update messages in %s PO file using msgmerge (%s)." -msgstr "" -"Impossible de mettre à jour les messages dans les fichiers PO %s en " -"utilisant msgmerge (%s)." - -#: I18n.php:498 I18n.php:575 -#, php-format -msgid "PO file not found in lang '%s' directory, ignore it." -msgstr "" -"Le fichier PO est introuvable dans le dossier de langue '%s', on l'ignore." - -#: I18n.php:505 I18n.php:615 -#, php-format -msgid "Fail to open root lang directory (%s)." -msgstr "Impossible d'ouvrir le dossier racine des langues (%s)." - -#: I18n.php:531 -#, php-format -msgid "Lang alias symlink found: %s -> %s" -msgstr "Lien symbolique d'alias de langue trouvé : %s -> %s" - -#: I18n.php:538 -#, php-format -msgid "JS catalog symlink for %s -> %s created (%s)" -msgstr "Lien symbolique de catalogue JS pour %s -> %s créé (%s)" - -#: I18n.php:542 -#, php-format -msgid "Fail to create JS catalog symlink for %s -> %s (%s)" -msgstr "" -"Impossible de créer le lien symbolique de catalogue JS pour %s -> %s (%s)" - -#: I18n.php:548 -#, php-format -msgid "JS catalog symlink for %s -> %s already exist (%s)" -msgstr "Le lien symbolique du catalogue JS pour %s -> %s existe déjà (%s)" - -#: I18n.php:553 -#, php-format -msgid "JS catalog file for %s already exist, but it's not a symlink to %s (%s)" -msgstr "" -"Le catalogue JS pour %s existe, mais il ne s'agit par d'un lien symbolique " -"vers %s (%s)" - -#: I18n.php:588 -#, php-format -msgid "Fail to compile messages from %s PO file as MO file using msgfmt (%s)." -msgstr "" -"Impossible de compiler les messages depuis le fichier PO %s en tant que " -"fichier MO en utilisant msgfmt (%s)." - -#: I18n.php:598 -#, php-format -msgid "Fail to open %s JS catalog file in write mode (%s)." -msgstr "Impossible d'ouvrir le catalogue JS %s en mode écriture (%s)." - -#: I18n.php:603 -#, php-format -msgid "Fail to write %s JS catalog in file (%s)." -msgstr "Impossible d'écrire le fichier du catalogue JS %s (%s)." - -#: I18n.php:608 -#, php-format -msgid "%s JS catalog writed (%s)." -msgstr "Catalogue JS %s créé (%s)." - -#: App.php:122 -msgid "Hello world!" -msgstr "Salut tout le monde !" - #: includes/cli.php:23 #, php-format msgid "Item #%s:\n" @@ -654,47 +283,6 @@ msgstr "L'élément '%s' a bien été supprimé." msgid "An error occurred while deleting this item." msgstr "Une erreur est survenue en supprimant cet élément." -#: static/js/myconfirm.js:4 static/js/myconfirm.js:171 -#: static/js/myconfirm.js:200 -msgid "Confirmation" -msgstr "Confirmation" - -#: static/js/myconfirm.js:5 -msgid "Do you confirm?" -msgstr "Confirmez-vous ?" - -#: static/js/myconfirm.js:11 static/js/myconfirm.js:108 -msgid "Cancel" -msgstr "Annuler" - -#: static/js/myconfirm.js:17 static/js/myconfirm.js:114 -msgid "Validate" -msgstr "Valider" - -#: static/js/myconfirm.js:52 -msgid "OK" -msgstr "OK" - -#: static/js/myconfirm.js:91 -msgid "Question" -msgstr "Question" - -#: static/js/myconfirm.js:92 -msgid "Please enter your answer below:" -msgstr "Merci de saisir vos réponses ci-dessous :" - -#: static/js/myconfirm.js:143 -msgid "Please wait" -msgstr "Merci de patienter" - -#: static/js/myconfirm.js:144 -msgid "Please wait while your request is being processed." -msgstr "Merci de patienter pendant le traitement de votre requête." - -#: static/js/myconfirm.js:172 static/js/myconfirm.js:201 -msgid "Are you sure?" -msgstr "Êtes-vous sure ?" - #: templates/show.tpl:5 templates/search.tpl:36 templates/form.tpl:7 msgid "Name" msgstr "Nom" @@ -800,114 +388,3 @@ msgstr "Page de recherche" #: templates/form.tpl:36 msgid "Save" msgstr "Enregistrer" - -#: templates/fatal_error.tpl:5 -msgid "" -"A fatal error has occurred and it is preventing this application from " -"working properly. Please try again later or contact support." -msgstr "" -"Une erreur fatale est survenue et celle-ci empêche cette application de " -"fonctionner correctement. Merci de réessayer ultérieurement ou de prendre " -"contact avec le service support." - -#: templates/fatal_error.tpl:7 -msgid "Error: %1" -msgstr "Erreur : %1" - -#: templates/homepage.tpl:6 -msgid "" -"This is the default page of a new app using EesyPHP framework. Register your " -"own templates directory and create a homepage.tpl file to overwrite " -"it. You could also overwrite the URL handler for the root of the web " -"application." -msgstr "" -"Il s'agit de la page par défaut d'une nouvelle application utilisant le " -"framework EesyPHP. Configurez votre propre dossier de templates et créer le " -"fichier homepage.tpl pour l'écraser. Vous pouvez également écraser " -"le gestionnaire de l'URL racine de l'application web." - -#~ msgid "" -#~ "This command could be used to generate/update lang/messages.pot file." -#~ msgstr "" -#~ "Cette commande peut-être utilisée pour générer/mettre à jour le fichier " -#~ "lang/messages.pot." - -#~ msgid "" -#~ "This command could be used to init/update PO files in lang/*/LC_MESSAGES " -#~ "directories." -#~ msgstr "" -#~ "Cette commande peut-être utilisée pour initialiser/mettre à jour les " -#~ "fichiers PO les dossiers lang/*/LC_MESSAGES." - -#~ msgid "" -#~ "This command could be used to compile PO files in lang/*/LC_MESSAGES " -#~ "directories to MO files and as JS catalogs in public_html/translations." -#~ msgstr "" -#~ "Cette commande peut-être utilisée pour compiler les fichiers PO dans les " -#~ "dossiers lang/*/LC_MESSAGES en fichiers MO and en tant que catalogues JS " -#~ "dans public_html/translations." - -#, php-format -#~ msgid "Fail to list JS files in '%s' static directory." -#~ msgstr "" -#~ "Une erreur est survenue en listant les fichiers JS dans le dossier des " -#~ "fichiers statiques '%s'." - -#, php-format -#~ msgid "" -#~ "Fail to extract messages from JS files in '%s' static directory using " -#~ "xgettext." -#~ msgstr "" -#~ "Impossible d'extraire les messages depuis les fichiers JS dans le dossier " -#~ "des fichiers statiques '%s' en utilisant xgettext." - -#~ msgid "Smarty version not supported." -#~ msgstr "Une erreur est survenue en affichant cette page." - -#~ msgid "An error occurred while viewing this page." -#~ msgstr "Une erreur est survenue en affichant cette page." - -#~ msgid "Fail to list PHP files." -#~ msgstr "Impossible de lister les fichiers PHP." - -#~ msgid "Fail to list JS files." -#~ msgstr "Impossible de lister les fichiers JS." - -#~ msgid "Fail to extract messages from JS files using xgettext." -#~ msgstr "" -#~ "Impossible d'extraire les messages depuis les fichiers JS en utilisant " -#~ "xgettext." - -#~ msgid "" -#~ "Fail to extract messages from template files using tsmarty2c.php script." -#~ msgstr "" -#~ "Impossible d'extraire les messages depuis les fichiers template en " -#~ "utilisant le script tsmarty2c.php." - -#~ msgid "Update messages in existing translation PO lang files" -#~ msgstr "" -#~ "Mettre à jour les messages dans les fichiers de traduction PO existants" - -#~ msgid "" -#~ "This command could be used to update PO files in lang/*/LC_MESSAGES " -#~ "directories." -#~ msgstr "" -#~ "Cette commande peut-être utilisée pour mettre à jour les fichiers PO les " -#~ "dossiers lang/*/LC_MESSAGES." - -#~ msgid "" -#~ "Compile messages from existing translation PO lang files to corresponding " -#~ "MO files" -#~ msgstr "" -#~ "Compiler les messages depuis les fichiers PO de traduction existants vers " -#~ "les fichiers MO correspondant" - -#~ msgid "" -#~ "This command could be used to compile PO files in lang/*/LC_MESSAGES " -#~ "directories to MO files." -#~ msgstr "" -#~ "Cette commande peut-être utilisée pour compiler les fichiers PO dans les " -#~ "dossiers lang/*/LC_MESSAGES en fichiers MO." - -#~ msgid "Element(s) %1 to %2 on %3" -#~ msgstr "Élément(s) %1 à %2 sur %3" diff --git a/example/locales/headers.pot b/example/locales/headers.pot index c4477c1..f354805 100644 --- a/example/locales/headers.pot +++ b/example/locales/headers.pot @@ -1,7 +1,7 @@ msgid "" msgstr "" -"POT-Creation-Date: 2023-02-13 03:00+0100\n" -"PO-Revision-Date: 2023-02-13 03:00+0100\n" +"POT-Creation-Date: 2023-02-14 01:18+0100\n" +"PO-Revision-Date: 2023-02-14 01:18+0100\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" \ No newline at end of file diff --git a/example/locales/messages.pot b/example/locales/messages.pot index 2d43a66..4d6039d 100644 --- a/example/locales/messages.pot +++ b/example/locales/messages.pot @@ -1,330 +1,11 @@ msgid "" msgstr "" -"POT-Creation-Date: 2023-02-13 03:00+0100\n" -"PO-Revision-Date: 2023-02-13 03:00+0100\n" +"POT-Creation-Date: 2023-02-14 01:18+0100\n" +"PO-Revision-Date: 2023-02-14 01:18+0100\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Cli.php:34 -#, php-format -msgid "The CLI command '%s' already exists." -msgstr "" - -#: Cli.php:39 -#, php-format -msgid "The CLI command '%s' handler is not callable !" -msgstr "" - -#: Cli.php:71 -#, php-format -msgid "Usage: %s [-h] [-qd] command\n" -msgstr "" - -#: Cli.php:72 -msgid " -h Show this message\n" -msgstr "" - -#: Cli.php:73 -msgid " -q / -d Quiet/Debug mode\n" -msgstr "" - -#: Cli.php:74 -msgid " --trace Trace mode (the most verbose)\n" -msgstr "" - -#: Cli.php:75 -msgid " command Command to run\n" -msgstr "" - -#: Cli.php:77 -msgid "Available commands:\n" -msgstr "" - -#: Cli.php:125 -msgid "Only one command could be executed !" -msgstr "" - -#: Cli.php:153 -#, php-format -msgid "" -"Invalid parameter \"%s\".\n" -"Note: Command's parameter/argument must be place after the command." -msgstr "" - -#: Cli.php:178 -#, php-format -msgid "An exception occured running command %s" -msgstr "" - -#: Db.php:74 -msgid "Unable to connect to the database." -msgstr "" - -#: Email.php:141 -#, php-format -msgid "

Mail initialy intended for %s.

" -msgstr "" - -#: Email.php:142 -#, php-format -msgid "" -"\n" -"\n" -"\n" -"Mail initialy intended for %s." -msgstr "" - -#: Email.php:178 -#, php-format -msgid "

%s: %s

" -msgstr "" - -#: Email.php:179 -#, php-format -msgid "" -"\n" -"%s: %s" -msgstr "" - -#: Tpl.php:339 -msgid "No template specified." -msgstr "" - -#: Tpl.php:370 -msgid "An error occurred while displaying this page." -msgstr "" - -#: Url.php:141 -msgid "Bad request" -msgstr "" - -#: Url.php:142 -msgid "Invalid request." -msgstr "" - -#: Url.php:145 -msgid "Authentication required" -msgstr "" - -#: Url.php:146 -msgid "You have to be authenticated to access to this page." -msgstr "" - -#: Url.php:149 -msgid "Access denied" -msgstr "" - -#: Url.php:150 -msgid "" -"You do not have access to this application. If you think this is an error, " -"please contact support." -msgstr "" - -#: Url.php:153 -msgid "Whoops ! Page not found" -msgstr "" - -#: Url.php:154 -msgid "The requested page can not be found." -msgstr "" - -#: Url.php:162 -msgid "Error" -msgstr "" - -#: Url.php:163 -msgid "An unknown error occurred. If problem persist, please contact support." -msgstr "" - -#: Url.php:226 -msgid "" -"Unable to determine the requested page. If the problem persists, please " -"contact support." -msgstr "" - -#: Url.php:376 -msgid "" -"Unable to determine the requested page (loop detected). If the problem " -"persists, please contact support." -msgstr "" - -#: Url.php:407 -msgid "This request cannot be processed." -msgstr "" - -#: Url.php:420 -msgid "" -"Authentication required but force_authentication function is not defined." -msgstr "" - -#: Url.php:429 -msgid "This request could not be processed correctly." -msgstr "" - -#: I18n.php:114 App.php:120 -msgid "Hello world !" -msgstr "" - -#: I18n.php:130 -msgid "Extract messages that need to be translated" -msgstr "" - -#: I18n.php:132 -msgid "" -"This command could be used to generate/update locales/messages.pot file." -msgstr "" - -#: I18n.php:138 -msgid "Update messages in translation PO lang files" -msgstr "" - -#: I18n.php:140 -msgid "" -"This command could be used to init/update PO files in locales/*/LC_MESSAGES " -"directories." -msgstr "" - -#: I18n.php:147 -msgid "" -"Compile messages from existing translation PO lang files to corresponding MO " -"files and JS catalogs" -msgstr "" - -#: I18n.php:152 -msgid "" -"This command could be used to compile PO files in locales/*/LC_MESSAGES " -"directories to MO files and as JS catalogs in locales directory." -msgstr "" - -#: I18n.php:277 -msgid "Fail to list EesyPHP PHP files." -msgstr "" - -#: I18n.php:297 -msgid "Fail to extract messages from EesyPHP PHP files using xgettext." -msgstr "" - -#: I18n.php:309 -msgid "Fail to list application PHP files." -msgstr "" - -#: I18n.php:329 -msgid "Fail to extract messages from PHP files using xgettext." -msgstr "" - -#: I18n.php:342 -#, php-format -msgid "Fail to list JS files in the directory of static files '%s'." -msgstr "" - -#: I18n.php:364 -#, php-format -msgid "" -"Fail to extract messages from JS files in the directory of static files '%s' " -"using xgettext." -msgstr "" - -#: I18n.php:384 -#, php-format -msgid "" -"Fail to extract messages from templates directory '%s' using tsmarty2c.php " -"script." -msgstr "" - -#: I18n.php:420 -msgid "Fail to merge messages using msgcat." -msgstr "" - -#: I18n.php:434 -#, php-format -msgid "Compendium file %s not found." -msgstr "" - -#: I18n.php:441 -#, php-format -msgid "POT file not found (%s). Please run extract_messages first." -msgstr "" - -#: I18n.php:453 I18n.php:561 -#, php-format -msgid "Lang directory '%s' found" -msgstr "" - -#: I18n.php:459 I18n.php:567 -#, php-format -msgid "LC_MESSAGES directory not found in lang '%s' directory, ignore it." -msgstr "" - -#: I18n.php:474 -#, php-format -msgid "Fail to init messages in %s PO file using msginit (%s)." -msgstr "" - -#: I18n.php:492 -#, php-format -msgid "Fail to update messages in %s PO file using msgmerge (%s)." -msgstr "" - -#: I18n.php:498 I18n.php:575 -#, php-format -msgid "PO file not found in lang '%s' directory, ignore it." -msgstr "" - -#: I18n.php:505 I18n.php:615 -#, php-format -msgid "Fail to open root lang directory (%s)." -msgstr "" - -#: I18n.php:531 -#, php-format -msgid "Lang alias symlink found: %s -> %s" -msgstr "" - -#: I18n.php:538 -#, php-format -msgid "JS catalog symlink for %s -> %s created (%s)" -msgstr "" - -#: I18n.php:542 -#, php-format -msgid "Fail to create JS catalog symlink for %s -> %s (%s)" -msgstr "" - -#: I18n.php:548 -#, php-format -msgid "JS catalog symlink for %s -> %s already exist (%s)" -msgstr "" - -#: I18n.php:553 -#, php-format -msgid "JS catalog file for %s already exist, but it's not a symlink to %s (%s)" -msgstr "" - -#: I18n.php:588 -#, php-format -msgid "Fail to compile messages from %s PO file as MO file using msgfmt (%s)." -msgstr "" - -#: I18n.php:598 -#, php-format -msgid "Fail to open %s JS catalog file in write mode (%s)." -msgstr "" - -#: I18n.php:603 -#, php-format -msgid "Fail to write %s JS catalog in file (%s)." -msgstr "" - -#: I18n.php:608 -#, php-format -msgid "%s JS catalog writed (%s)." -msgstr "" - -#: App.php:122 -msgid "Hello world!" -msgstr "" - #: includes/cli.php:23 #, php-format msgid "Item #%s:\n" @@ -585,47 +266,6 @@ msgstr "" msgid "An error occurred while deleting this item." msgstr "" -#: static/js/myconfirm.js:4 static/js/myconfirm.js:171 -#: static/js/myconfirm.js:200 -msgid "Confirmation" -msgstr "" - -#: static/js/myconfirm.js:5 -msgid "Do you confirm?" -msgstr "" - -#: static/js/myconfirm.js:11 static/js/myconfirm.js:108 -msgid "Cancel" -msgstr "" - -#: static/js/myconfirm.js:17 static/js/myconfirm.js:114 -msgid "Validate" -msgstr "" - -#: static/js/myconfirm.js:52 -msgid "OK" -msgstr "" - -#: static/js/myconfirm.js:91 -msgid "Question" -msgstr "" - -#: static/js/myconfirm.js:92 -msgid "Please enter your answer below:" -msgstr "" - -#: static/js/myconfirm.js:143 -msgid "Please wait" -msgstr "" - -#: static/js/myconfirm.js:144 -msgid "Please wait while your request is being processed." -msgstr "" - -#: static/js/myconfirm.js:172 static/js/myconfirm.js:201 -msgid "Are you sure?" -msgstr "" - #: templates/show.tpl:5 templates/search.tpl:36 templates/form.tpl:7 msgid "Name" msgstr "" @@ -729,21 +369,3 @@ msgstr "" #: templates/form.tpl:36 msgid "Save" msgstr "" - -#: templates/fatal_error.tpl:5 -msgid "" -"A fatal error has occurred and it is preventing this application from " -"working properly. Please try again later or contact support." -msgstr "" - -#: templates/fatal_error.tpl:7 -msgid "Error: %1" -msgstr "" - -#: templates/homepage.tpl:6 -msgid "" -"This is the default page of a new app using EesyPHP framework. Register your " -"own templates directory and create a homepage.tpl file to overwrite " -"it. You could also overwrite the URL handler for the root of the web " -"application." -msgstr "" diff --git a/locales/fr b/locales/fr new file mode 120000 index 0000000..247adce --- /dev/null +++ b/locales/fr @@ -0,0 +1 @@ +fr_FR.UTF8 \ No newline at end of file diff --git a/locales/fr.js b/locales/fr.js new file mode 120000 index 0000000..60adcc8 --- /dev/null +++ b/locales/fr.js @@ -0,0 +1 @@ +fr_FR.UTF8.js \ No newline at end of file diff --git a/locales/fr_FR b/locales/fr_FR new file mode 120000 index 0000000..247adce --- /dev/null +++ b/locales/fr_FR @@ -0,0 +1 @@ +fr_FR.UTF8 \ No newline at end of file diff --git a/locales/fr_FR.UTF-8 b/locales/fr_FR.UTF-8 new file mode 120000 index 0000000..247adce --- /dev/null +++ b/locales/fr_FR.UTF-8 @@ -0,0 +1 @@ +fr_FR.UTF8 \ No newline at end of file diff --git a/locales/fr_FR.UTF-8.js b/locales/fr_FR.UTF-8.js new file mode 120000 index 0000000..60adcc8 --- /dev/null +++ b/locales/fr_FR.UTF-8.js @@ -0,0 +1 @@ +fr_FR.UTF8.js \ No newline at end of file diff --git a/locales/fr_FR.UTF8.js b/locales/fr_FR.UTF8.js new file mode 100644 index 0000000..74c40b7 --- /dev/null +++ b/locales/fr_FR.UTF8.js @@ -0,0 +1 @@ +translations_data = {"messages":{"The CLI command '%s' already exists.":"La commande CLI '%s' n'existe pas.","The CLI command '%s' handler is not callable !":"La fonction impl\u00e9mentant la commande CLI '%s' n'est pas ex\u00e9cutable !","Usage: %s [-h] [-qd] command\n":"Utilisation: %s [-h] [-qd] commande\n"," -h Show this message\n":" -h Affiche ce message\n"," -q \/ -d Quiet\/Debug mode\n":" -q \/ -d Mode silencieux\/debug\n"," --trace Trace mode (the most verbose)\n":" --trace Mode trace (le plus verbeux)\n"," command Command to run\n":" command La commande \u00e0 ex\u00e9cuter\n","Available commands:\n":"Commandes disponibles:\n","Only one command could be executed !":"Une seul commande peut-\u00eatre ex\u00e9cut\u00e9e !","Invalid parameter \"%s\".\nNote: Command's parameter\/argument must be place after the command.":"Param\u00e8tre \"%s\" invalide.\nNote : Les param\u00e8tres\/arguments de la requ\u00eate doivent \u00eatre plac\u00e9s apr\u00e8s celle-ci.","An exception occured running command %s":"Une exception est survenue en ex\u00e9cutant la commande %s","Unable to connect to the database.":"Impossible de se connecter \u00e0 la base de donn\u00e9es.","<\/hr>

Mail initialy intended for %s.<\/small><\/p>":"<\/hr>

Email initialement destin\u00e9 \u00e0 %s.<\/small><\/p>","\n\n\nMail initialy intended for %s.":"\n\n\nMail originalement destin\u00e9 \u00e0 %s.","

%s: %s<\/small><\/p>":"

%s: %s<\/small><\/p>","\n%s: %s":"\n%s: %s","No template specified.":"Aucun template sp\u00e9cifi\u00e9.","An error occurred while displaying this page.":"Une erreur est survenue en affichant cette page.","Bad request":"Mauvaise requ\u00eate","Invalid request.":"Requ\u00eate invalide.","Authentication required":"Authentification requise","You have to be authenticated to access to this page.":"Vous devez \u00eatre authentifi\u00e9 pour acc\u00e9der \u00e0 cette page.","Access denied":"Acc\u00e8s interdit","You do not have access to this application. If you think this is an error, please contact support.":"Vous n'avez pas acc\u00e8s \u00e0 cette application. Si vous pensez qu'il s'agit d'une erreur, merci de prendre contact avec le support.","Whoops ! Page not found":"Oups ! Page introuvable","The requested page can not be found.":"La page demand\u00e9e est introuvable.","Error":"Erreur","An unknown error occurred. If problem persist, please contact support.":"Une erreur inconnue est survenue. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Unable to determine the requested page. If the problem persists, please contact support.":"Impossible de d\u00e9terminer la page demand\u00e9e. Si le probl\u00e8me persiste, merci de prendre contact avec le support.","Unable to determine the requested page (loop detected). If the problem persists, please contact support.":"Impossible de d\u00e9terminer la page demand\u00e9e (boucle d\u00e9tect\u00e9e). Si le probl\u00e8me persiste, merci de prendre contact avec le support.","This request cannot be processed.":"Cette requ\u00eate ne peut \u00eatre trait\u00e9e.","Authentication required but force_authentication function is not defined.":"Authentification requise mais la fonction force_authentication n'est pas d\u00e9finie.","This request could not be processed correctly.":"Cette requ\u00eate n'a put \u00eatre trait\u00e9e correctement.","Hello world !":"Bonjour tout le monde !","Extract messages that need to be translated":"Extraire les messages devant \u00eatre traduit","This command could be used to generate\/update locales\/messages.pot file.":"Cette commande peut-\u00eatre utilis\u00e9e pour g\u00e9n\u00e9rer\/mettre \u00e0 jour le fichier locales\/messages.pot.","Update messages in translation PO lang files":"Mettre \u00e0 jour les messages dans les fichiers de traduction PO existants","This command could be used to init\/update PO files in locales\/*\/LC_MESSAGES directories.":"Cette commande peut-\u00eatre utilis\u00e9e pour initialiser\/mettre \u00e0 jour les fichiers PO dans les dossiers locales\/*\/LC_MESSAGES.","Compile messages from existing translation PO lang files to corresponding MO files and JS catalogs":"Compiler les messages depuis les fichiers PO de traduction existants vers les fichiers MO et les catalogues JS correspondant","This command could be used to compile PO files in locales\/*\/LC_MESSAGES directories to MO files and as JS catalogs in locales directory.":"Cette commande peut-\u00eatre utilis\u00e9e pour compiler les fichiers PO dans les dossiers locales\/*\/LC_MESSAGES and les catalogues JS dans le dossier locales.","Fail to list EesyPHP PHP files.":"Une erreur est survenue en listant les fichiers PHP d'EesyPHP.","Fail to extract messages from EesyPHP PHP files using xgettext.":"Une erreur est survenue en extrayant les messages depuis les fichiers PHP d'EesyPHP en utilisant xgettext.","Fail to list application PHP files.":"Une erreur est survenue en listant les fichiers PHP de l'application.","Fail to extract messages from PHP files using xgettext.":"Impossible d'extraire les messages depuis les fichiers PHP en utilisant xgettext.","Fail to list JS files in the directory of static files '%s'.":"Une erreur est survenue en listant les fichiers JS dans le dossier des fichiers statiques '%s'.","Fail to extract messages from JS files in the directory of static files '%s' using xgettext.":"Une erreur est survenue en extrayant les messages depuis les fichiers JS du dossier des fichiers statiques '%s' en utilisant xgettext.","Fail to extract messages from templates directory '%s' using tsmarty2c.php script.":"Impossible d'extraire les messages depuis le dossier de templates '%s' en utilisant le script tsmarty2c.php.","Fail to merge messages using msgcat.":"Impossible de fusionner les messages en utilisant msgcat.","Compendium file %s not found.":"Fichier compendium %s introuvable.","POT file not found (%s). Please run extract_messages first.":"Fichier POT introuvable (%s). Merci de lancer la commande extract_messages pour commencer.","Lang directory '%s' found":"Dossier de langue '%s' trouv\u00e9","LC_MESSAGES directory not found in lang '%s' directory, ignore it.":"Le dossier LC_MESSAGES est introuvable dans le dossier de langue '%s', on l'ignore.","Fail to init messages in %s PO file using msginit (%s).":"Impossible d'initialiser les messages dans le fichier PO %s en utilisant msginit (%s).","Fail to update messages in %s PO file using msgmerge (%s).":"Impossible de mettre \u00e0 jour les messages dans les fichiers PO %s en utilisant msgmerge (%s).","PO file not found in lang '%s' directory, ignore it.":"Le fichier PO est introuvable dans le dossier de langue '%s', on l'ignore.","Fail to open root lang directory (%s).":"Impossible d'ouvrir le dossier racine des langues (%s).","Lang alias symlink found: %s -> %s":"Lien symbolique d'alias de langue trouv\u00e9 : %s -> %s","JS catalog symlink for %s -> %s created (%s)":"Lien symbolique de catalogue JS pour %s -> %s cr\u00e9\u00e9 (%s)","Fail to create JS catalog symlink for %s -> %s (%s)":"Impossible de cr\u00e9er le lien symbolique de catalogue JS pour %s -> %s (%s)","JS catalog symlink for %s -> %s already exist (%s)":"Le lien symbolique du catalogue JS pour %s -> %s existe d\u00e9j\u00e0 (%s)","JS catalog file for %s already exist, but it's not a symlink to %s (%s)":"Le catalogue JS pour %s existe, mais il ne s'agit par d'un lien symbolique vers %s (%s)","Fail to compile messages from %s PO file as MO file using msgfmt (%s).":"Impossible de compiler les messages depuis le fichier PO %s en tant que fichier MO en utilisant msgfmt (%s).","Fail to open %s JS catalog file in write mode (%s).":"Impossible d'ouvrir le catalogue JS %s en mode \u00e9criture (%s).","Fail to write %s JS catalog in file (%s).":"Impossible d'\u00e9crire le fichier du catalogue JS %s (%s).","%s JS catalog writed (%s).":"Catalogue JS %s cr\u00e9\u00e9 (%s).","Hello world!":"Salut tout le monde !","Confirmation":"Confirmation","Do you confirm?":"Confirmez-vous ?","Cancel":"Annuler","Validate":"Valider","OK":"OK","Question":"Question","Please enter your answer below:":"Merci de saisir vos r\u00e9ponses ci-dessous :","Please wait":"Merci de patienter","Please wait while your request is being processed.":"Merci de patienter pendant le traitement de votre requ\u00eate.","Are you sure?":"\u00cates-vous sure ?","Oops...":"Oups...","A fatal error has occurred and it is preventing this application from working properly. Please try again later or contact support.":"Une erreur fatale est survenue et celle-ci emp\u00eache cette application de fonctionner correctement. Merci de r\u00e9essayer ult\u00e9rieurement ou de prendre contact avec le service support.","Error: %1":"Erreur : %1","Back":"Retour","Hello, world!":"Bonjour tout le monde !","This is the default page of a new app using EesyPHP framework. Register your own templates directory and create a homepage.tpl<\/em> file to overwrite it. You could also overwrite the URL handler for the root of the web application.":"Il s'agit de la page par d\u00e9faut d'une nouvelle application utilisant le framework EesyPHP. Configurez votre propre dossier de templates et cr\u00e9er le fichier homepage.tpl<\/em> pour l'\u00e9craser. Vous pouvez \u00e9galement \u00e9craser le gestionnaire de l'URL racine de l'application web."},"locale":"fr_FR.UTF8","domain":"DEFAULT","plural_expr":"(n > 1)"}; \ No newline at end of file diff --git a/locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.mo b/locales/fr_FR.UTF8/LC_MESSAGES/EESYPHP.mo new file mode 100644 index 0000000000000000000000000000000000000000..94e8e7a23cccd9d0e1f6dd0a7bc50aeb8899794c GIT binary patch literal 10749 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\n" +"Language-Team: \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: Cli.php:34 +#, php-format +msgid "The CLI command '%s' already exists." +msgstr "La commande CLI '%s' n'existe pas." + +#: Cli.php:39 +#, php-format +msgid "The CLI command '%s' handler is not callable !" +msgstr "La fonction implémentant la commande CLI '%s' n'est pas exécutable !" + +#: Cli.php:71 +#, php-format +msgid "Usage: %s [-h] [-qd] command\n" +msgstr "Utilisation: %s [-h] [-qd] commande\n" + +#: Cli.php:72 +msgid " -h Show this message\n" +msgstr " -h Affiche ce message\n" + +#: Cli.php:73 +msgid " -q / -d Quiet/Debug mode\n" +msgstr " -q / -d Mode silencieux/debug\n" + +#: Cli.php:74 +msgid " --trace Trace mode (the most verbose)\n" +msgstr " --trace Mode trace (le plus verbeux)\n" + +#: Cli.php:75 +msgid " command Command to run\n" +msgstr " command La commande à exécuter\n" + +#: Cli.php:77 +msgid "Available commands:\n" +msgstr "Commandes disponibles:\n" + +#: Cli.php:125 +msgid "Only one command could be executed !" +msgstr "Une seul commande peut-être exécutée !" + +#: Cli.php:153 +#, php-format +msgid "" +"Invalid parameter \"%s\".\n" +"Note: Command's parameter/argument must be place after the command." +msgstr "" +"Paramètre \"%s\" invalide.\n" +"Note : Les paramètres/arguments de la requête doivent être placés après " +"celle-ci." + +#: Cli.php:178 +#, php-format +msgid "An exception occured running command %s" +msgstr "Une exception est survenue en exécutant la commande %s" + +#: Db.php:74 +msgid "Unable to connect to the database." +msgstr "Impossible de se connecter à la base de données." + +#: Email.php:141 +#, php-format +msgid "

Mail initialy intended for %s.

" +msgstr "

Email initialement destiné à %s.

" + +#: Email.php:142 +#, php-format +msgid "" +"\n" +"\n" +"\n" +"Mail initialy intended for %s." +msgstr "" +"\n" +"\n" +"\n" +"Mail originalement destiné à %s." + +#: Email.php:178 +#, php-format +msgid "

%s: %s

" +msgstr "

%s: %s

" + +#: Email.php:179 +#, php-format +msgid "" +"\n" +"%s: %s" +msgstr "" +"\n" +"%s: %s" + +#: Tpl.php:355 +msgid "No template specified." +msgstr "Aucun template spécifié." + +#: Tpl.php:386 +msgid "An error occurred while displaying this page." +msgstr "Une erreur est survenue en affichant cette page." + +#: Url.php:141 +msgid "Bad request" +msgstr "Mauvaise requête" + +#: Url.php:142 +msgid "Invalid request." +msgstr "Requête invalide." + +#: Url.php:145 +msgid "Authentication required" +msgstr "Authentification requise" + +#: Url.php:146 +msgid "You have to be authenticated to access to this page." +msgstr "Vous devez être authentifié pour accéder à cette page." + +#: Url.php:149 +msgid "Access denied" +msgstr "Accès interdit" + +#: Url.php:150 +msgid "" +"You do not have access to this application. If you think this is an error, " +"please contact support." +msgstr "" +"Vous n'avez pas accès à cette application. Si vous pensez qu'il s'agit d'une " +"erreur, merci de prendre contact avec le support." + +#: Url.php:153 +msgid "Whoops ! Page not found" +msgstr "Oups ! Page introuvable" + +#: Url.php:154 +msgid "The requested page can not be found." +msgstr "La page demandée est introuvable." + +#: Url.php:162 +msgid "Error" +msgstr "Erreur" + +#: Url.php:163 +msgid "An unknown error occurred. If problem persist, please contact support." +msgstr "" +"Une erreur inconnue est survenue. Si le problème persiste, merci de prendre " +"contact avec le support." + +#: Url.php:226 +msgid "" +"Unable to determine the requested page. If the problem persists, please " +"contact support." +msgstr "" +"Impossible de déterminer la page demandée. Si le problème persiste, merci de " +"prendre contact avec le support." + +#: Url.php:376 +msgid "" +"Unable to determine the requested page (loop detected). If the problem " +"persists, please contact support." +msgstr "" +"Impossible de déterminer la page demandée (boucle détectée). Si le problème " +"persiste, merci de prendre contact avec le support." + +#: Url.php:407 +msgid "This request cannot be processed." +msgstr "Cette requête ne peut être traitée." + +#: Url.php:420 +msgid "" +"Authentication required but force_authentication function is not defined." +msgstr "" +"Authentification requise mais la fonction force_authentication n'est pas " +"définie." + +#: Url.php:429 +msgid "This request could not be processed correctly." +msgstr "Cette requête n'a put être traitée correctement." + +#: I18n.php:122 App.php:120 +msgid "Hello world !" +msgstr "Bonjour tout le monde !" + +#: I18n.php:142 +msgid "Extract messages that need to be translated" +msgstr "Extraire les messages devant être traduit" + +#: I18n.php:144 +msgid "" +"This command could be used to generate/update locales/messages.pot file." +msgstr "" +"Cette commande peut-être utilisée pour générer/mettre à jour le fichier " +"locales/messages.pot." + +#: I18n.php:150 +msgid "Update messages in translation PO lang files" +msgstr "" +"Mettre à jour les messages dans les fichiers de traduction PO existants" + +#: I18n.php:152 +msgid "" +"This command could be used to init/update PO files in locales/*/LC_MESSAGES " +"directories." +msgstr "" +"Cette commande peut-être utilisée pour initialiser/mettre à jour les " +"fichiers PO dans les dossiers locales/*/LC_MESSAGES." + +#: I18n.php:159 +msgid "" +"Compile messages from existing translation PO lang files to corresponding MO " +"files and JS catalogs" +msgstr "" +"Compiler les messages depuis les fichiers PO de traduction existants vers " +"les fichiers MO et les catalogues JS correspondant" + +#: I18n.php:164 +msgid "" +"This command could be used to compile PO files in locales/*/LC_MESSAGES " +"directories to MO files and as JS catalogs in locales directory." +msgstr "" +"Cette commande peut-être utilisée pour compiler les fichiers PO dans les " +"dossiers locales/*/LC_MESSAGES and les catalogues JS dans le dossier locales." + +#: I18n.php:336 +msgid "Fail to list EesyPHP PHP files." +msgstr "Une erreur est survenue en listant les fichiers PHP d'EesyPHP." + +#: I18n.php:356 +msgid "Fail to extract messages from EesyPHP PHP files using xgettext." +msgstr "" +"Une erreur est survenue en extrayant les messages depuis les fichiers PHP " +"d'EesyPHP en utilisant xgettext." + +#: I18n.php:369 +msgid "Fail to list application PHP files." +msgstr "Une erreur est survenue en listant les fichiers PHP de l'application." + +#: I18n.php:389 +msgid "Fail to extract messages from PHP files using xgettext." +msgstr "" +"Impossible d'extraire les messages depuis les fichiers PHP en utilisant " +"xgettext." + +#: I18n.php:405 +#, php-format +msgid "Fail to list JS files in the directory of static files '%s'." +msgstr "" +"Une erreur est survenue en listant les fichiers JS dans le dossier des " +"fichiers statiques '%s'." + +#: I18n.php:427 +#, php-format +msgid "" +"Fail to extract messages from JS files in the directory of static files '%s' " +"using xgettext." +msgstr "" +"Une erreur est survenue en extrayant les messages depuis les fichiers JS du " +"dossier des fichiers statiques '%s' en utilisant xgettext." + +#: I18n.php:449 +#, php-format +msgid "" +"Fail to extract messages from templates directory '%s' using tsmarty2c.php " +"script." +msgstr "" +"Impossible d'extraire les messages depuis le dossier de templates '%s' en " +"utilisant le script tsmarty2c.php." + +#: I18n.php:485 +msgid "Fail to merge messages using msgcat." +msgstr "Impossible de fusionner les messages en utilisant msgcat." + +#: I18n.php:502 +#, php-format +msgid "Compendium file %s not found." +msgstr "Fichier compendium %s introuvable." + +#: I18n.php:513 +#, php-format +msgid "POT file not found (%s). Please run extract_messages first." +msgstr "" +"Fichier POT introuvable (%s). Merci de lancer la commande extract_messages " +"pour commencer." + +#: I18n.php:525 I18n.php:636 +#, php-format +msgid "Lang directory '%s' found" +msgstr "Dossier de langue '%s' trouvé" + +#: I18n.php:531 I18n.php:642 +#, php-format +msgid "LC_MESSAGES directory not found in lang '%s' directory, ignore it." +msgstr "" +"Le dossier LC_MESSAGES est introuvable dans le dossier de langue '%s', on " +"l'ignore." + +#: I18n.php:546 +#, php-format +msgid "Fail to init messages in %s PO file using msginit (%s)." +msgstr "" +"Impossible d'initialiser les messages dans le fichier PO %s en utilisant " +"msginit (%s)." + +#: I18n.php:564 +#, php-format +msgid "Fail to update messages in %s PO file using msgmerge (%s)." +msgstr "" +"Impossible de mettre à jour les messages dans les fichiers PO %s en " +"utilisant msgmerge (%s)." + +#: I18n.php:570 I18n.php:650 +#, php-format +msgid "PO file not found in lang '%s' directory, ignore it." +msgstr "" +"Le fichier PO est introuvable dans le dossier de langue '%s', on l'ignore." + +#: I18n.php:577 I18n.php:690 +#, php-format +msgid "Fail to open root lang directory (%s)." +msgstr "Impossible d'ouvrir le dossier racine des langues (%s)." + +#: I18n.php:606 +#, php-format +msgid "Lang alias symlink found: %s -> %s" +msgstr "Lien symbolique d'alias de langue trouvé : %s -> %s" + +#: I18n.php:613 +#, php-format +msgid "JS catalog symlink for %s -> %s created (%s)" +msgstr "Lien symbolique de catalogue JS pour %s -> %s créé (%s)" + +#: I18n.php:617 +#, php-format +msgid "Fail to create JS catalog symlink for %s -> %s (%s)" +msgstr "" +"Impossible de créer le lien symbolique de catalogue JS pour %s -> %s (%s)" + +#: I18n.php:623 +#, php-format +msgid "JS catalog symlink for %s -> %s already exist (%s)" +msgstr "Le lien symbolique du catalogue JS pour %s -> %s existe déjà (%s)" + +#: I18n.php:628 +#, php-format +msgid "JS catalog file for %s already exist, but it's not a symlink to %s (%s)" +msgstr "" +"Le catalogue JS pour %s existe, mais il ne s'agit par d'un lien symbolique " +"vers %s (%s)" + +#: I18n.php:663 +#, php-format +msgid "Fail to compile messages from %s PO file as MO file using msgfmt (%s)." +msgstr "" +"Impossible de compiler les messages depuis le fichier PO %s en tant que " +"fichier MO en utilisant msgfmt (%s)." + +#: I18n.php:673 +#, php-format +msgid "Fail to open %s JS catalog file in write mode (%s)." +msgstr "Impossible d'ouvrir le catalogue JS %s en mode écriture (%s)." + +#: I18n.php:678 +#, php-format +msgid "Fail to write %s JS catalog in file (%s)." +msgstr "Impossible d'écrire le fichier du catalogue JS %s (%s)." + +#: I18n.php:683 +#, php-format +msgid "%s JS catalog writed (%s)." +msgstr "Catalogue JS %s créé (%s)." + +#: App.php:122 +msgid "Hello world!" +msgstr "Salut tout le monde !" + +#: static/js/myconfirm.js:4 static/js/myconfirm.js:171 +#: static/js/myconfirm.js:200 +msgid "Confirmation" +msgstr "Confirmation" + +#: static/js/myconfirm.js:5 +msgid "Do you confirm?" +msgstr "Confirmez-vous ?" + +#: static/js/myconfirm.js:11 static/js/myconfirm.js:108 +msgid "Cancel" +msgstr "Annuler" + +#: static/js/myconfirm.js:17 static/js/myconfirm.js:114 +msgid "Validate" +msgstr "Valider" + +#: static/js/myconfirm.js:52 +msgid "OK" +msgstr "OK" + +#: static/js/myconfirm.js:91 +msgid "Question" +msgstr "Question" + +#: static/js/myconfirm.js:92 +msgid "Please enter your answer below:" +msgstr "Merci de saisir vos réponses ci-dessous :" + +#: static/js/myconfirm.js:143 +msgid "Please wait" +msgstr "Merci de patienter" + +#: static/js/myconfirm.js:144 +msgid "Please wait while your request is being processed." +msgstr "Merci de patienter pendant le traitement de votre requête." + +#: static/js/myconfirm.js:172 static/js/myconfirm.js:201 +msgid "Are you sure?" +msgstr "Êtes-vous sure ?" + +#: templates/fatal_error.tpl:3 +msgid "Oops..." +msgstr "Oups..." + +#: templates/fatal_error.tpl:5 +msgid "" +"A fatal error has occurred and it is preventing this application from " +"working properly. Please try again later or contact support." +msgstr "" +"Une erreur fatale est survenue et celle-ci empêche cette application de " +"fonctionner correctement. Merci de réessayer ultérieurement ou de prendre " +"contact avec le service support." + +#: templates/fatal_error.tpl:7 +msgid "Error: %1" +msgstr "Erreur : %1" + +#: templates/fatal_error.tpl:9 +msgid "Back" +msgstr "Retour" + +#: templates/homepage.tpl:5 +msgid "Hello, world!" +msgstr "Bonjour tout le monde !" + +#: templates/homepage.tpl:6 +msgid "" +"This is the default page of a new app using EesyPHP framework. Register your " +"own templates directory and create a homepage.tpl file to overwrite " +"it. You could also overwrite the URL handler for the root of the web " +"application." +msgstr "" +"Il s'agit de la page par défaut d'une nouvelle application utilisant le " +"framework EesyPHP. Configurez votre propre dossier de templates et créer le " +"fichier homepage.tpl pour l'écraser. Vous pouvez également écraser " +"le gestionnaire de l'URL racine de l'application web." diff --git a/locales/fr_FR.js b/locales/fr_FR.js new file mode 120000 index 0000000..60adcc8 --- /dev/null +++ b/locales/fr_FR.js @@ -0,0 +1 @@ +fr_FR.UTF8.js \ No newline at end of file diff --git a/locales/fr_FR.utf-8 b/locales/fr_FR.utf-8 new file mode 120000 index 0000000..247adce --- /dev/null +++ b/locales/fr_FR.utf-8 @@ -0,0 +1 @@ +fr_FR.UTF8 \ No newline at end of file diff --git a/locales/fr_FR.utf-8.js b/locales/fr_FR.utf-8.js new file mode 120000 index 0000000..60adcc8 --- /dev/null +++ b/locales/fr_FR.utf-8.js @@ -0,0 +1 @@ +fr_FR.UTF8.js \ No newline at end of file diff --git a/locales/fr_FR.utf8 b/locales/fr_FR.utf8 new file mode 120000 index 0000000..247adce --- /dev/null +++ b/locales/fr_FR.utf8 @@ -0,0 +1 @@ +fr_FR.UTF8 \ No newline at end of file diff --git a/locales/fr_FR.utf8.js b/locales/fr_FR.utf8.js new file mode 120000 index 0000000..60adcc8 --- /dev/null +++ b/locales/fr_FR.utf8.js @@ -0,0 +1 @@ +fr_FR.UTF8.js \ No newline at end of file diff --git a/locales/headers.pot b/locales/headers.pot new file mode 100644 index 0000000..7d2ed67 --- /dev/null +++ b/locales/headers.pot @@ -0,0 +1,7 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2023-02-14 01:17+0100\n" +"PO-Revision-Date: 2023-02-14 01:17+0100\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" \ No newline at end of file diff --git a/locales/js-0-messages.pot b/locales/js-0-messages.pot new file mode 100644 index 0000000..310fe62 --- /dev/null +++ b/locales/js-0-messages.pot @@ -0,0 +1,44 @@ +#: static/js/myconfirm.js:4 static/js/myconfirm.js:171 +#: static/js/myconfirm.js:200 +msgid "Confirmation" +msgstr "" + +#: static/js/myconfirm.js:5 +msgid "Do you confirm?" +msgstr "" + +#: static/js/myconfirm.js:11 static/js/myconfirm.js:108 +msgid "Cancel" +msgstr "" + +#: static/js/myconfirm.js:17 static/js/myconfirm.js:114 +msgid "Validate" +msgstr "" + +#: static/js/myconfirm.js:44 +msgid "Error" +msgstr "" + +#: static/js/myconfirm.js:52 +msgid "OK" +msgstr "" + +#: static/js/myconfirm.js:91 +msgid "Question" +msgstr "" + +#: static/js/myconfirm.js:92 +msgid "Please enter your answer below:" +msgstr "" + +#: static/js/myconfirm.js:143 +msgid "Please wait" +msgstr "" + +#: static/js/myconfirm.js:144 +msgid "Please wait while your request is being processed." +msgstr "" + +#: static/js/myconfirm.js:172 static/js/myconfirm.js:201 +msgid "Are you sure?" +msgstr "" diff --git a/locales/messages.pot b/locales/messages.pot new file mode 100644 index 0000000..c3a2ba7 --- /dev/null +++ b/locales/messages.pot @@ -0,0 +1,397 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2023-02-14 01:17+0100\n" +"PO-Revision-Date: 2023-02-14 01:17+0100\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: Cli.php:34 +#, php-format +msgid "The CLI command '%s' already exists." +msgstr "" + +#: Cli.php:39 +#, php-format +msgid "The CLI command '%s' handler is not callable !" +msgstr "" + +#: Cli.php:71 +#, php-format +msgid "Usage: %s [-h] [-qd] command\n" +msgstr "" + +#: Cli.php:72 +msgid " -h Show this message\n" +msgstr "" + +#: Cli.php:73 +msgid " -q / -d Quiet/Debug mode\n" +msgstr "" + +#: Cli.php:74 +msgid " --trace Trace mode (the most verbose)\n" +msgstr "" + +#: Cli.php:75 +msgid " command Command to run\n" +msgstr "" + +#: Cli.php:77 +msgid "Available commands:\n" +msgstr "" + +#: Cli.php:125 +msgid "Only one command could be executed !" +msgstr "" + +#: Cli.php:153 +#, php-format +msgid "" +"Invalid parameter \"%s\".\n" +"Note: Command's parameter/argument must be place after the command." +msgstr "" + +#: Cli.php:178 +#, php-format +msgid "An exception occured running command %s" +msgstr "" + +#: Db.php:74 +msgid "Unable to connect to the database." +msgstr "" + +#: Email.php:141 +#, php-format +msgid "

Mail initialy intended for %s.

" +msgstr "" + +#: Email.php:142 +#, php-format +msgid "" +"\n" +"\n" +"\n" +"Mail initialy intended for %s." +msgstr "" + +#: Email.php:178 +#, php-format +msgid "

%s: %s

" +msgstr "" + +#: Email.php:179 +#, php-format +msgid "" +"\n" +"%s: %s" +msgstr "" + +#: Tpl.php:355 +msgid "No template specified." +msgstr "" + +#: Tpl.php:386 +msgid "An error occurred while displaying this page." +msgstr "" + +#: Url.php:141 +msgid "Bad request" +msgstr "" + +#: Url.php:142 +msgid "Invalid request." +msgstr "" + +#: Url.php:145 +msgid "Authentication required" +msgstr "" + +#: Url.php:146 +msgid "You have to be authenticated to access to this page." +msgstr "" + +#: Url.php:149 +msgid "Access denied" +msgstr "" + +#: Url.php:150 +msgid "" +"You do not have access to this application. If you think this is an error, " +"please contact support." +msgstr "" + +#: Url.php:153 +msgid "Whoops ! Page not found" +msgstr "" + +#: Url.php:154 +msgid "The requested page can not be found." +msgstr "" + +#: Url.php:162 +msgid "Error" +msgstr "" + +#: Url.php:163 +msgid "An unknown error occurred. If problem persist, please contact support." +msgstr "" + +#: Url.php:226 +msgid "" +"Unable to determine the requested page. If the problem persists, please " +"contact support." +msgstr "" + +#: Url.php:376 +msgid "" +"Unable to determine the requested page (loop detected). If the problem " +"persists, please contact support." +msgstr "" + +#: Url.php:407 +msgid "This request cannot be processed." +msgstr "" + +#: Url.php:420 +msgid "" +"Authentication required but force_authentication function is not defined." +msgstr "" + +#: Url.php:429 +msgid "This request could not be processed correctly." +msgstr "" + +#: I18n.php:122 App.php:120 +msgid "Hello world !" +msgstr "" + +#: I18n.php:142 +msgid "Extract messages that need to be translated" +msgstr "" + +#: I18n.php:144 +msgid "" +"This command could be used to generate/update locales/messages.pot file." +msgstr "" + +#: I18n.php:150 +msgid "Update messages in translation PO lang files" +msgstr "" + +#: I18n.php:152 +msgid "" +"This command could be used to init/update PO files in locales/*/LC_MESSAGES " +"directories." +msgstr "" + +#: I18n.php:159 +msgid "" +"Compile messages from existing translation PO lang files to corresponding MO " +"files and JS catalogs" +msgstr "" + +#: I18n.php:164 +msgid "" +"This command could be used to compile PO files in locales/*/LC_MESSAGES " +"directories to MO files and as JS catalogs in locales directory." +msgstr "" + +#: I18n.php:336 +msgid "Fail to list EesyPHP PHP files." +msgstr "" + +#: I18n.php:356 +msgid "Fail to extract messages from EesyPHP PHP files using xgettext." +msgstr "" + +#: I18n.php:369 +msgid "Fail to list application PHP files." +msgstr "" + +#: I18n.php:389 +msgid "Fail to extract messages from PHP files using xgettext." +msgstr "" + +#: I18n.php:405 +#, php-format +msgid "Fail to list JS files in the directory of static files '%s'." +msgstr "" + +#: I18n.php:427 +#, php-format +msgid "" +"Fail to extract messages from JS files in the directory of static files '%s' " +"using xgettext." +msgstr "" + +#: I18n.php:449 +#, php-format +msgid "" +"Fail to extract messages from templates directory '%s' using tsmarty2c.php " +"script." +msgstr "" + +#: I18n.php:485 +msgid "Fail to merge messages using msgcat." +msgstr "" + +#: I18n.php:502 +#, php-format +msgid "Compendium file %s not found." +msgstr "" + +#: I18n.php:513 +#, php-format +msgid "POT file not found (%s). Please run extract_messages first." +msgstr "" + +#: I18n.php:525 I18n.php:636 +#, php-format +msgid "Lang directory '%s' found" +msgstr "" + +#: I18n.php:531 I18n.php:642 +#, php-format +msgid "LC_MESSAGES directory not found in lang '%s' directory, ignore it." +msgstr "" + +#: I18n.php:546 +#, php-format +msgid "Fail to init messages in %s PO file using msginit (%s)." +msgstr "" + +#: I18n.php:564 +#, php-format +msgid "Fail to update messages in %s PO file using msgmerge (%s)." +msgstr "" + +#: I18n.php:570 I18n.php:650 +#, php-format +msgid "PO file not found in lang '%s' directory, ignore it." +msgstr "" + +#: I18n.php:577 I18n.php:690 +#, php-format +msgid "Fail to open root lang directory (%s)." +msgstr "" + +#: I18n.php:606 +#, php-format +msgid "Lang alias symlink found: %s -> %s" +msgstr "" + +#: I18n.php:613 +#, php-format +msgid "JS catalog symlink for %s -> %s created (%s)" +msgstr "" + +#: I18n.php:617 +#, php-format +msgid "Fail to create JS catalog symlink for %s -> %s (%s)" +msgstr "" + +#: I18n.php:623 +#, php-format +msgid "JS catalog symlink for %s -> %s already exist (%s)" +msgstr "" + +#: I18n.php:628 +#, php-format +msgid "JS catalog file for %s already exist, but it's not a symlink to %s (%s)" +msgstr "" + +#: I18n.php:663 +#, php-format +msgid "Fail to compile messages from %s PO file as MO file using msgfmt (%s)." +msgstr "" + +#: I18n.php:673 +#, php-format +msgid "Fail to open %s JS catalog file in write mode (%s)." +msgstr "" + +#: I18n.php:678 +#, php-format +msgid "Fail to write %s JS catalog in file (%s)." +msgstr "" + +#: I18n.php:683 +#, php-format +msgid "%s JS catalog writed (%s)." +msgstr "" + +#: App.php:122 +msgid "Hello world!" +msgstr "" + +#: static/js/myconfirm.js:4 static/js/myconfirm.js:171 +#: static/js/myconfirm.js:200 +msgid "Confirmation" +msgstr "" + +#: static/js/myconfirm.js:5 +msgid "Do you confirm?" +msgstr "" + +#: static/js/myconfirm.js:11 static/js/myconfirm.js:108 +msgid "Cancel" +msgstr "" + +#: static/js/myconfirm.js:17 static/js/myconfirm.js:114 +msgid "Validate" +msgstr "" + +#: static/js/myconfirm.js:52 +msgid "OK" +msgstr "" + +#: static/js/myconfirm.js:91 +msgid "Question" +msgstr "" + +#: static/js/myconfirm.js:92 +msgid "Please enter your answer below:" +msgstr "" + +#: static/js/myconfirm.js:143 +msgid "Please wait" +msgstr "" + +#: static/js/myconfirm.js:144 +msgid "Please wait while your request is being processed." +msgstr "" + +#: static/js/myconfirm.js:172 static/js/myconfirm.js:201 +msgid "Are you sure?" +msgstr "" + +#: templates/fatal_error.tpl:3 +msgid "Oops..." +msgstr "" + +#: templates/fatal_error.tpl:5 +msgid "" +"A fatal error has occurred and it is preventing this application from " +"working properly. Please try again later or contact support." +msgstr "" + +#: templates/fatal_error.tpl:7 +msgid "Error: %1" +msgstr "" + +#: templates/fatal_error.tpl:9 +msgid "Back" +msgstr "" + +#: templates/homepage.tpl:5 +msgid "Hello, world!" +msgstr "" + +#: templates/homepage.tpl:6 +msgid "" +"This is the default page of a new app using EesyPHP framework. Register your " +"own templates directory and create a homepage.tpl file to overwrite " +"it. You could also overwrite the URL handler for the root of the web " +"application." +msgstr "" diff --git a/locales/php-messages.pot b/locales/php-messages.pot new file mode 100644 index 0000000..3019565 --- /dev/null +++ b/locales/php-messages.pot @@ -0,0 +1,318 @@ +#: Cli.php:34 +#, php-format +msgid "The CLI command '%s' already exists." +msgstr "" + +#: Cli.php:39 +#, php-format +msgid "The CLI command '%s' handler is not callable !" +msgstr "" + +#: Cli.php:71 +#, php-format +msgid "Usage: %s [-h] [-qd] command\n" +msgstr "" + +#: Cli.php:72 +msgid " -h Show this message\n" +msgstr "" + +#: Cli.php:73 +msgid " -q / -d Quiet/Debug mode\n" +msgstr "" + +#: Cli.php:74 +msgid " --trace Trace mode (the most verbose)\n" +msgstr "" + +#: Cli.php:75 +msgid " command Command to run\n" +msgstr "" + +#: Cli.php:77 +msgid "Available commands:\n" +msgstr "" + +#: Cli.php:125 +msgid "Only one command could be executed !" +msgstr "" + +#: Cli.php:153 +#, php-format +msgid "" +"Invalid parameter \"%s\".\n" +"Note: Command's parameter/argument must be place after the command." +msgstr "" + +#: Cli.php:178 +#, php-format +msgid "An exception occured running command %s" +msgstr "" + +#: Db.php:74 +msgid "Unable to connect to the database." +msgstr "" + +#: Email.php:141 +#, php-format +msgid "

Mail initialy intended for %s.

" +msgstr "" + +#: Email.php:142 +#, php-format +msgid "" +"\n" +"\n" +"\n" +"Mail initialy intended for %s." +msgstr "" + +#: Email.php:178 +#, php-format +msgid "

%s: %s

" +msgstr "" + +#: Email.php:179 +#, php-format +msgid "" +"\n" +"%s: %s" +msgstr "" + +#: Tpl.php:355 +msgid "No template specified." +msgstr "" + +#: Tpl.php:386 +msgid "An error occurred while displaying this page." +msgstr "" + +#: Url.php:141 +msgid "Bad request" +msgstr "" + +#: Url.php:142 +msgid "Invalid request." +msgstr "" + +#: Url.php:145 +msgid "Authentication required" +msgstr "" + +#: Url.php:146 +msgid "You have to be authenticated to access to this page." +msgstr "" + +#: Url.php:149 +msgid "Access denied" +msgstr "" + +#: Url.php:150 +msgid "" +"You do not have access to this application. If you think this is an error, " +"please contact support." +msgstr "" + +#: Url.php:153 +msgid "Whoops ! Page not found" +msgstr "" + +#: Url.php:154 +msgid "The requested page can not be found." +msgstr "" + +#: Url.php:162 +msgid "Error" +msgstr "" + +#: Url.php:163 +msgid "An unknown error occurred. If problem persist, please contact support." +msgstr "" + +#: Url.php:226 +msgid "" +"Unable to determine the requested page. If the problem persists, please " +"contact support." +msgstr "" + +#: Url.php:376 +msgid "" +"Unable to determine the requested page (loop detected). If the problem " +"persists, please contact support." +msgstr "" + +#: Url.php:407 +msgid "This request cannot be processed." +msgstr "" + +#: Url.php:420 +msgid "" +"Authentication required but force_authentication function is not defined." +msgstr "" + +#: Url.php:429 +msgid "This request could not be processed correctly." +msgstr "" + +#: I18n.php:122 App.php:120 +msgid "Hello world !" +msgstr "" + +#: I18n.php:142 +msgid "Extract messages that need to be translated" +msgstr "" + +#: I18n.php:144 +msgid "" +"This command could be used to generate/update locales/messages.pot file." +msgstr "" + +#: I18n.php:150 +msgid "Update messages in translation PO lang files" +msgstr "" + +#: I18n.php:152 +msgid "" +"This command could be used to init/update PO files in locales/*/LC_MESSAGES " +"directories." +msgstr "" + +#: I18n.php:159 +msgid "" +"Compile messages from existing translation PO lang files to corresponding MO " +"files and JS catalogs" +msgstr "" + +#: I18n.php:164 +msgid "" +"This command could be used to compile PO files in locales/*/LC_MESSAGES " +"directories to MO files and as JS catalogs in locales directory." +msgstr "" + +#: I18n.php:336 +msgid "Fail to list EesyPHP PHP files." +msgstr "" + +#: I18n.php:356 +msgid "Fail to extract messages from EesyPHP PHP files using xgettext." +msgstr "" + +#: I18n.php:369 +msgid "Fail to list application PHP files." +msgstr "" + +#: I18n.php:389 +msgid "Fail to extract messages from PHP files using xgettext." +msgstr "" + +#: I18n.php:405 +#, php-format +msgid "Fail to list JS files in the directory of static files '%s'." +msgstr "" + +#: I18n.php:427 +#, php-format +msgid "" +"Fail to extract messages from JS files in the directory of static files '%s' " +"using xgettext." +msgstr "" + +#: I18n.php:449 +#, php-format +msgid "" +"Fail to extract messages from templates directory '%s' using tsmarty2c.php " +"script." +msgstr "" + +#: I18n.php:485 +msgid "Fail to merge messages using msgcat." +msgstr "" + +#: I18n.php:502 +#, php-format +msgid "Compendium file %s not found." +msgstr "" + +#: I18n.php:513 +#, php-format +msgid "POT file not found (%s). Please run extract_messages first." +msgstr "" + +#: I18n.php:525 I18n.php:636 +#, php-format +msgid "Lang directory '%s' found" +msgstr "" + +#: I18n.php:531 I18n.php:642 +#, php-format +msgid "LC_MESSAGES directory not found in lang '%s' directory, ignore it." +msgstr "" + +#: I18n.php:546 +#, php-format +msgid "Fail to init messages in %s PO file using msginit (%s)." +msgstr "" + +#: I18n.php:564 +#, php-format +msgid "Fail to update messages in %s PO file using msgmerge (%s)." +msgstr "" + +#: I18n.php:570 I18n.php:650 +#, php-format +msgid "PO file not found in lang '%s' directory, ignore it." +msgstr "" + +#: I18n.php:577 I18n.php:690 +#, php-format +msgid "Fail to open root lang directory (%s)." +msgstr "" + +#: I18n.php:606 +#, php-format +msgid "Lang alias symlink found: %s -> %s" +msgstr "" + +#: I18n.php:613 +#, php-format +msgid "JS catalog symlink for %s -> %s created (%s)" +msgstr "" + +#: I18n.php:617 +#, php-format +msgid "Fail to create JS catalog symlink for %s -> %s (%s)" +msgstr "" + +#: I18n.php:623 +#, php-format +msgid "JS catalog symlink for %s -> %s already exist (%s)" +msgstr "" + +#: I18n.php:628 +#, php-format +msgid "JS catalog file for %s already exist, but it's not a symlink to %s (%s)" +msgstr "" + +#: I18n.php:663 +#, php-format +msgid "Fail to compile messages from %s PO file as MO file using msgfmt (%s)." +msgstr "" + +#: I18n.php:673 +#, php-format +msgid "Fail to open %s JS catalog file in write mode (%s)." +msgstr "" + +#: I18n.php:678 +#, php-format +msgid "Fail to write %s JS catalog in file (%s)." +msgstr "" + +#: I18n.php:683 +#, php-format +msgid "%s JS catalog writed (%s)." +msgstr "" + +#: App.php:122 +msgid "Hello world!" +msgstr "" diff --git a/locales/templates-0-messages.pot b/locales/templates-0-messages.pot new file mode 100644 index 0000000..fd2244d --- /dev/null +++ b/locales/templates-0-messages.pot @@ -0,0 +1,32 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8\n" + +#: templates/fatal_error.tpl:3 +msgid "Oops..." +msgstr "" + +#: templates/fatal_error.tpl:5 +msgid "" +"A fatal error has occurred and it is preventing this application from " +"working properly. Please try again later or contact support." +msgstr "" + +#: templates/fatal_error.tpl:7 +msgid "Error: %1" +msgstr "" + +#: templates/fatal_error.tpl:9 +msgid "Back" +msgstr "" + +#: templates/homepage.tpl:5 +msgid "Hello, world!" +msgstr "" + +#: templates/homepage.tpl:6 +msgid "" +"This is the default page of a new app using EesyPHP framework. Register your " +"own templates directory and create a homepage.tpl file to overwrite " +"it. You could also overwrite the URL handler for the root of the web " +"application." +msgstr "" diff --git a/src/App.php b/src/App.php index 33a3a09..d0b2da5 100644 --- a/src/App.php +++ b/src/App.php @@ -34,7 +34,7 @@ class App { Config::register_extra_variable('root_directory_path', $root_directory_path); $config_file = Config::replace_variables($config_file); - if (!Config::load($config_file)) { + if ($config_file && !Config::load($config_file)) { Log::fatal('Fail to load configuration file (%s)', $config_file); exit(1); } @@ -117,9 +117,9 @@ class App { */ public static function handle_homepage($request) { if (Tpl::initialized()) - Tpl :: display("homepage.tpl", _("Hello world !")); + Tpl :: display("homepage.tpl", I18n::_("Hello world !")); else - echo "

"._("Hello world!")."

"; + echo "

".I18n::_("Hello world!")."

"; } } diff --git a/src/Cli.php b/src/Cli.php index 280507d..c525036 100644 --- a/src/Cli.php +++ b/src/Cli.php @@ -31,12 +31,12 @@ class Cli { public static function add_command($command, $handler, $short_desc, $usage_args=null, $long_desc=null, $override=false) { if (array_key_exists($command, self :: $commands) && !$override) { - Log :: error(_("The CLI command '%s' already exists."), $command); + Log :: error(I18n::_("The CLI command '%s' already exists."), $command); return False; } if (!is_callable($handler)) { - Log :: error(_("The CLI command '%s' handler is not callable !"), $command); + Log :: error(I18n::_("The CLI command '%s' handler is not callable !"), $command); return False; } @@ -68,13 +68,13 @@ class Cli { if ($error) echo "$error\n\n"; - printf(_("Usage: %s [-h] [-qd] command\n"), basename($argv[0])); - echo _(" -h Show this message\n"); - echo _(" -q / -d Quiet/Debug mode\n"); - echo _(" --trace Trace mode (the most verbose)\n"); - echo _(" command Command to run\n"); + echo(I18n::_("Usage: %s [-h] [-qd] command\n", basename($argv[0]))); + echo I18n::_(" -h Show this message\n"); + echo I18n::_(" -q / -d Quiet/Debug mode\n"); + echo I18n::_(" --trace Trace mode (the most verbose)\n"); + echo I18n::_(" command Command to run\n"); echo "\n"; - echo _("Available commands:\n"); + echo I18n::_("Available commands:\n"); foreach (self :: $commands as $command => $info) { if (self :: $command && $command != self :: $command) @@ -82,21 +82,21 @@ class Cli { echo ( " ".str_replace( "\n", "\n ", - wordwrap("$command : "._($info['short_desc']))) + wordwrap("$command : ".I18n::_($info['short_desc']))) ."\n\n"); echo ( " ".basename($argv[0])." $command ". - ($info['usage_args']?_($info['usage_args']):''). + ($info['usage_args']?I18n::_($info['usage_args']):''). "\n"); if ($info['long_desc']) { if (is_array($info['long_desc'])) { $lines = array(); foreach ($info['long_desc'] as $line) - $lines[] = _($line); + $lines[] = I18n::_($line); $info['long_desc'] = implode("\n", $lines); } else - $info['long_desc'] = _($info['long_desc']); + $info['long_desc'] = I18n::_($info['long_desc']); echo "\n ".str_replace("\n", "\n ", wordwrap($info['long_desc']))."\n"; } @@ -122,7 +122,7 @@ class Cli { if (!self :: $command) self :: $command = $args[$i]; else - self :: usage(_("Only one command could be executed !")); + self :: usage(I18n::_("Only one command could be executed !")); } else { switch($args[$i]) { @@ -149,7 +149,7 @@ class Cli { $command_args[] = $args[$i]; else self :: usage( - _( + I18n::_( "Invalid parameter \"%s\".\nNote: Command's parameter/argument must be place ". "after the command." ), $args[$i] @@ -175,7 +175,7 @@ class Cli { exit($result?0:1); } catch(Exception $e) { - Log :: exception($e, _("An exception occured running command %s"), self :: $command); + Log :: exception($e, I18n::_("An exception occured running command %s"), self :: $command); exit(1); } } diff --git a/src/Db.php b/src/Db.php index 421eb54..3d5b895 100644 --- a/src/Db.php +++ b/src/Db.php @@ -71,7 +71,7 @@ class Db { } catch(Exception $e) { Log :: error("Fail to connect to DB (DSN : '%s') : %s", $dsn, $e->getMessage()); - Log :: fatal(_('Unable to connect to the database.')); + Log :: fatal(I18n::_('Unable to connect to the database.')); } } diff --git a/src/Email.php b/src/Email.php index 6fa9f5b..3082b93 100644 --- a/src/Email.php +++ b/src/Email.php @@ -138,8 +138,8 @@ class Email { $msg .= sprintf( ( $html? - _("

Mail initialy intended for %s.

"): - _("\n\n\nMail initialy intended for %s.") + I18n::_("

Mail initialy intended for %s.

"): + I18n::_("\n\n\nMail initialy intended for %s.") ), (is_array($to)?implode(',', $to):$to)); $headers["X-Orig-To"] = $to; @@ -175,8 +175,8 @@ class Email { $msg .= sprintf( ( $html? - _("

%s: %s

"): - _("\n%s: %s") + I18n::_("

%s: %s

"): + I18n::_("\n%s: %s") ), strtoupper($header), (is_array($headers[$header])?implode(',', $headers[$header]):$headers[$header])); diff --git a/src/I18n.php b/src/I18n.php index 451ab5b..892d504 100644 --- a/src/I18n.php +++ b/src/I18n.php @@ -5,9 +5,18 @@ namespace EesyPHP; use Locale; class I18n { - // Gettext text domain + // Gettext application text domain public const TEXT_DOMAIN = 'DEFAULT'; + // Gettext core text domain + public const CORE_TEXT_DOMAIN = 'EESYPHP'; + + /** + * The core root directory path of translation files + * @var string + */ + protected static string $core_root_path = __DIR__.'/../locales'; + /** * The root directory path of translation files * @var string @@ -42,7 +51,7 @@ class I18n { self :: $root_path = $root_path; if (is_null($default_locale)) - self :: $default_locale = App::get('i18n.default_locale', null, 'string'); + $default_locale = App::get('i18n.default_locale', null, 'string'); if (!is_null($default_locale)) self :: $default_locale = $default_locale; @@ -108,10 +117,13 @@ class I18n { Log :: error("An error occured setting locale to '$locale'"); // Configure and set the text domain + $fullpath = bindtextdomain(self :: CORE_TEXT_DOMAIN, self :: $core_root_path); + Log :: trace("Core text domain %s fullpath is '%s'.", self :: CORE_TEXT_DOMAIN, $fullpath); + Log :: trace("Test: ".self::_('Hello world !')); + $fullpath = bindtextdomain(self :: TEXT_DOMAIN, self :: $root_path); - Log :: trace("Text domain fullpath is '$fullpath'."); - Log :: trace("Text domain is '".textdomain(self :: TEXT_DOMAIN)."'."); - Log :: trace("Test: "._('Hello world !')); + Log :: trace("Default text domain %s fullpath is '%s'.", self :: TEXT_DOMAIN, $fullpath); + Log :: trace("Default text domain is '".textdomain(self :: TEXT_DOMAIN)."'."); // JS translation file if ( @@ -207,11 +219,54 @@ class I18n { return $default; } + /* + ******************************************************************** + * Translations helpers * + ******************************************************************** + */ + /** - * Helper function: just mark message for translation - * + * Translate a message using gettext + * @param string $message The string to translate + * @param array $extra_args Extra arguments used to compute the message using sprintf + * @return string The translated and computed message + */ + public static function _(string $message, ...$extra_args) { + $return = dgettext(self :: CORE_TEXT_DOMAIN, $message); + // If extra arguments passed, format message using sprintf + if ($extra_args) { + $return = call_user_func_array( + 'sprintf', + array_merge(array($return), $extra_args) + ); + } + return $return; + } + + /** + * Translate a message with singular and plural forms using gettext + * @param string $singular The singular message to translate + * @param string $plural The plural message to translate + * @param int $count The item count to determine if the singular or the plural forms must to be + * used + * @param array $extra_args Extra arguments used to compute the message using sprintf + * @return string The translated and computed message + */ + public static function ngettext(string $singular, string $plural, int $count, ...$extra_args) { + $return = dngettext(self :: CORE_TEXT_DOMAIN, $singular, $plural, $count); + // If extra arguments passed, format message using sprintf + if ($extra_args) { + $return = call_user_func_array( + 'sprintf', + array_merge(array($return), $extra_args) + ); + } + return $return; + } + + /** + * Just mark message for translation * @param string $msg The message to translate - * * @return string The message without transformation */ public static function ___($msg) { @@ -263,74 +318,82 @@ class I18n { * @return void */ public static function cli_extract_messages($command_args) { + $core_mode = in_array('--core', $command_args); + $root_path = $core_mode?self::$core_root_path:self::$root_path; + // Store list of generated POT files $pot_files = array(); - // List EesyPHP PHP files to parse - $eesyphp_php_files = run_external_command( - array('find', '-name', "'*.php'"), - null, // no STDIN data - false, // do not escape command args (already done) - __DIR__ // Run from EesyPHP src directory - ); - if (!is_array($eesyphp_php_files) || $eesyphp_php_files[0] != 0) { - Log :: fatal(_("Fail to list EesyPHP PHP files.")); + if ($core_mode) { + // List EesyPHP PHP files to parse + $eesyphp_php_files = run_external_command( + array('find', '-name', "'*.php'"), + null, // no STDIN data + false, // do not escape command args (already done) + __DIR__ // Run from EesyPHP src directory + ); + if (!is_array($eesyphp_php_files) || $eesyphp_php_files[0] != 0) { + Log :: fatal(self::_("Fail to list EesyPHP PHP files.")); + } + + // Extract messages from EesyPHP PHP files using xgettext + $pot_file = "$root_path/php-messages.pot"; + $result = run_external_command( + array( + "xgettext", + "--from-code utf-8", + "--language=PHP", + "-o", $pot_file, // Output + "--omit-header", // No POT header + "--keyword=___", // Handle custom ___() translation function + "--files=-" // Read files to parse from STDIN + ), + $eesyphp_php_files[1], // Pass PHP files list via STDIN + true, // Escape parameters + __DIR__ // Run from EesyPHP src directory + ); + if (!is_array($result) || $result[0] != 0) + Log :: fatal(self::_("Fail to extract messages from EesyPHP PHP files using xgettext.")); + if (is_file($pot_file)) + $pot_files[] = $pot_file; } + else { + // List application PHP files to parse + $php_files = run_external_command( + array('find', '-name', "'*.php'"), + null, // no STDIN data + false, // do not escape command args (already done) + App :: root_directory_path() // Run from Application root directory + ); + if (!is_array($php_files) || $php_files[0] != 0) { + Log :: fatal(self::_("Fail to list application PHP files.")); + } - // Extract messages from EesyPHP PHP files using xgettext - $pot_file = self :: $root_path."/eesyphp-messages.pot"; - $result = run_external_command( - array( - "xgettext", - "--from-code utf-8", - "--language=PHP", - "-o", $pot_file, // Output - "--omit-header", // No POT header - "--keyword=___", // Handle custom ___() translation function - "--files=-" // Read files to parse from STDIN - ), - $eesyphp_php_files[1], // Pass PHP files list via STDIN - true, // Escape parameters - __DIR__ // Run from EesyPHP src directory - ); - if (!is_array($result) || $result[0] != 0) - Log :: fatal(_("Fail to extract messages from EesyPHP PHP files using xgettext.")); - if (is_file($pot_file)) - $pot_files[] = $pot_file; - - // List application PHP files to parse - $php_files = run_external_command( - array('find', '-name', "'*.php'"), - null, // no STDIN data - false, // do not escape command args (already done) - App :: root_directory_path() // Run from Application root directory - ); - if (!is_array($php_files) || $php_files[0] != 0) { - Log :: fatal(_("Fail to list application PHP files.")); + // Extract messages from PHP files using xgettext + $pot_file = "$root_path/php-messages.pot"; + $result = run_external_command( + array( + "xgettext", + "--from-code utf-8", + "--language=PHP", + "-o", $pot_file, // Output + "--omit-header", // No POT header + "--keyword=___", // Handle custom ___() translation function + "--files=-" // Read files to parse from STDIN + ), + $php_files[1], // Pass PHP files list via STDIN + true, // Escape parameters + App :: root_directory_path() // Run from EesyPHP src directory + ); + if (!is_array($result) || $result[0] != 0) + Log :: fatal(self::_("Fail to extract messages from PHP files using xgettext.")); + $pot_files[] = "$root_path/php-messages.pot"; } - // Extract messages from PHP files using xgettext - $pot_file = self :: $root_path."/php-messages.pot"; - $result = run_external_command( - array( - "xgettext", - "--from-code utf-8", - "--language=PHP", - "-o", $pot_file, // Output - "--omit-header", // No POT header - "--keyword=___", // Handle custom ___() translation function - "--files=-" // Read files to parse from STDIN - ), - $php_files[1], // Pass PHP files list via STDIN - true, // Escape parameters - App :: root_directory_path() // Run from EesyPHP src directory - ); - if (!is_array($result) || $result[0] != 0) - Log :: fatal(_("Fail to extract messages from PHP files using xgettext.")); - $pot_files[] = self :: $root_path."/php-messages.pot"; - // Extract messages from JS files using xgettext in each registered static directories foreach(Tpl::static_directories() as $idx => $static_directory) { + if ($core_mode && $static_directory != Tpl::$core_static_directory) continue; + if (!$core_mode && $static_directory == Tpl::$core_static_directory) continue; // List JS files to parse $result = run_external_command( array('find', escapeshellarg(basename($static_directory)), '-name', "'*.js'"), @@ -339,12 +402,12 @@ class I18n { dirname($static_directory) // Run from parent directory ); if (!is_array($result) || $result[0] != 0) { - Log :: fatal(_("Fail to list JS files in the directory of static files '%s'."), $static_directory); + Log :: fatal(self::_("Fail to list JS files in the directory of static files '%s'."), $static_directory); return; } // Extract messages from JS files using xgettext - $pot_file = self :: $root_path."/js-$idx-messages.pot"; + $pot_file = "$root_path/js-$idx-messages.pot"; $result = run_external_command( array( "xgettext", @@ -361,7 +424,7 @@ class I18n { ); if (!is_array($result) || $result[0] != 0) Log :: fatal( - _("Fail to extract messages from JS files in the directory of static files '%s' using xgettext."), + self::_("Fail to extract messages from JS files in the directory of static files '%s' using xgettext."), $static_directory); if (is_file($pot_file)) $pot_files[] = $pot_file; @@ -369,6 +432,8 @@ class I18n { if (Tpl :: initialized()) { foreach (Tpl :: templates_directories() as $idx => $templates_directory) { + if ($core_mode && $templates_directory != Tpl::$core_templates_directory) continue; + if (!$core_mode && $templates_directory == Tpl::$core_templates_directory) continue; // Extract messages from templates files using tsmarty2c.php $result = run_external_command( array( @@ -381,11 +446,11 @@ class I18n { ); if (!is_array($result) || $result[0] != 0) Log :: fatal( - _("Fail to extract messages from templates directory '%s' using tsmarty2c.php script."), + self::_("Fail to extract messages from templates directory '%s' using tsmarty2c.php script."), $templates_directory ); if (!$result[1]) continue; - $pot_file = self :: $root_path."/templates-$idx-messages.pot"; + $pot_file = "$root_path/templates-$idx-messages.pot"; $fd = fopen($pot_file, 'w'); fwrite($fd, $result[1]); fclose($fd); @@ -393,7 +458,7 @@ class I18n { } } - $fd = fopen(self :: $root_path."/headers.pot", 'w'); + $fd = fopen("$root_path/headers.pot", 'w'); $headers = array( 'msgid ""', 'msgstr ""', @@ -411,13 +476,13 @@ class I18n { array( 'msgcat', "-t", "utf-8", "--use-first", - "-o", self :: $root_path."/messages.pot", - self :: $root_path."/headers.pot", + "-o", "$root_path/messages.pot", + "$root_path/headers.pot", ), $pot_files )); if (!is_array($result) || $result[0] != 0) - Log :: fatal(_("Fail to merge messages using msgcat.")); + Log :: fatal(self::_("Fail to merge messages using msgcat.")); } /** @@ -428,40 +493,47 @@ class I18n { * @return bool */ public static function cli_update_messages($command_args) { + $core_mode = false; $compendium_args = array(); - foreach ($command_args as $path) { - if (!file_exists($path)) - Log :: fatal(_("Compendium file %s not found."), $path); - $compendium_args[] = '-C'; - $compendium_args[] = $path; + foreach ($command_args as $arg) { + if ($arg == '--core') + $core_mode = true; + else if (!file_exists($arg)) + Log :: fatal(self::_("Compendium file %s not found."), $arg); + else { + $compendium_args[] = '-C'; + $compendium_args[] = $arg; + } } + $domain = $core_mode?self::CORE_TEXT_DOMAIN:self::TEXT_DOMAIN; + $root_path = $core_mode?self::$core_root_path:self::$root_path; - $pot_file = self :: $root_path."/messages.pot"; + $pot_file = "$root_path/messages.pot"; if (!is_file($pot_file)) - Log :: fatal(_("POT file not found (%s). Please run extract_messages first."), $pot_file); + Log :: fatal(self::_("POT file not found (%s). Please run extract_messages first."), $pot_file); - if ($dh = opendir(self :: $root_path)) { + if ($dh = opendir($root_path)) { $error = False; while (($file = readdir($dh)) !== false) { if ( - !is_dir(self :: $root_path . '/' . $file) || + !is_dir("$root_path/$file") || in_array($file, array('.', '..')) || - is_link(self :: $root_path . '/' . $file) + is_link("$root_path/$file") ) continue; - Log :: debug(_("Lang directory '%s' found"), $file); + Log :: debug(self::_("Lang directory '%s' found"), $file); // Check LC_MESSAGES directory exists $lang = $file; - $lang_dir = self :: $root_path . '/' . $file . '/LC_MESSAGES' ; + $lang_dir = "$root_path/$file/LC_MESSAGES" ; if (!is_dir($lang_dir)) { - Log :: debug(_("LC_MESSAGES directory not found in lang '%s' directory, ignore it."), + Log :: debug(self::_("LC_MESSAGES directory not found in lang '%s' directory, ignore it."), $lang); continue; } - $po_file = $lang_dir . '/' . self :: TEXT_DOMAIN . '.po'; + $po_file = "$lang_dir/$domain.po"; $created = false; if (!is_file($po_file)) { // Init PO file from POT file using msginit @@ -471,7 +543,7 @@ class I18n { if (is_array($result) && $result[0] == 0) { $created = true; } else { - Log :: error(_("Fail to init messages in %s PO file using msginit (%s)."), + Log :: error(self::_("Fail to init messages in %s PO file using msginit (%s)."), $lang, $po_file); $error = True; } @@ -489,20 +561,20 @@ class I18n { ) ); if (!is_array($result) || $result[0] != 0) { - Log :: error(_("Fail to update messages in %s PO file using msgmerge (%s)."), + Log :: error(self::_("Fail to update messages in %s PO file using msgmerge (%s)."), $lang, $po_file); $error = True; } } elseif (!$created) { - Log :: debug(_("PO file not found in lang '%s' directory, ignore it."), $lang); + Log :: debug(self::_("PO file not found in lang '%s' directory, ignore it."), $lang); } } closedir($dh); return !$error; } - Log :: fatal(_("Fail to open root lang directory (%s)."), App :: root_directory_path()); + Log :: fatal(self::_("Fail to open root lang directory (%s)."), App :: root_directory_path()); return false; } @@ -514,43 +586,46 @@ class I18n { * @return bool */ public static function cli_compile_messages($command_args) { - if ($dh = opendir(self :: $root_path)) { + $core_mode = in_array('--core', $command_args); + $domain = $core_mode?self::CORE_TEXT_DOMAIN:self::TEXT_DOMAIN; + $root_path = $core_mode?self::$core_root_path:self::$root_path; + if ($dh = opendir($root_path)) { $error = False; while (($file = readdir($dh)) !== false) { if ( - !is_dir(self :: $root_path . '/' . $file) || + !is_dir("$root_path/$file") || in_array($file, array('.', '..')) ) continue; - if (is_link(self :: $root_path . '/' . $file)) { - $real_lang_dir = readlink(self :: $root_path . '/' . $file); - if (dirname($real_lang_dir) != '.' || !is_dir(self :: $root_path . '/' . $real_lang_dir)) + if (is_link("$root_path/$file")) { + $real_lang_dir = readlink("$root_path/$file"); + if (dirname($real_lang_dir) != '.' || !is_dir("$root_path/$real_lang_dir")) continue; $lang = $file; - Log :: debug(_("Lang alias symlink found: %s -> %s"), $lang, $real_lang_dir); + Log :: debug(self::_("Lang alias symlink found: %s -> %s"), $lang, $real_lang_dir); // Create JS catalog symlink (if not exists) - $js_link = self :: $root_path."/$lang.js"; + $js_link = "$root_path/$lang.js"; $link_target = "$real_lang_dir.js"; if (!file_exists($js_link)) { if (symlink($link_target, $js_link)) { - Log :: info(_("JS catalog symlink for %s -> %s created (%s)"), + Log :: info(self::_("JS catalog symlink for %s -> %s created (%s)"), $lang, $real_lang_dir, $js_link); } else { - Log :: error(_("Fail to create JS catalog symlink for %s -> %s (%s)"), + Log :: error(self::_("Fail to create JS catalog symlink for %s -> %s (%s)"), $lang, $real_lang_dir, $js_link); $error = True; } } elseif (readlink($js_link) == $link_target) { - Log :: debug(_("JS catalog symlink for %s -> %s already exist (%s)"), + Log :: debug(self::_("JS catalog symlink for %s -> %s already exist (%s)"), $lang, $real_lang_dir, $js_link); } else { Log :: warning( - _("JS catalog file for %s already exist, but it's not a symlink to %s (%s)"), + self::_("JS catalog file for %s already exist, but it's not a symlink to %s (%s)"), $lang, $real_lang_dir, $js_link ); $error = True; @@ -558,21 +633,21 @@ class I18n { continue; } - Log :: debug(_("Lang directory '%s' found"), $file); + Log :: debug(self::_("Lang directory '%s' found"), $file); // Check LC_MESSAGES directory exists $lang = $file; - $lang_dir = self :: $root_path . '/' . $file . '/LC_MESSAGES' ; + $lang_dir = "$root_path/$file/LC_MESSAGES" ; if (!is_dir($lang_dir)) { - Log :: debug(_("LC_MESSAGES directory not found in lang '%s' directory, ignore it."), + Log :: debug(self::_("LC_MESSAGES directory not found in lang '%s' directory, ignore it."), $lang); continue; } // Test .PO file is present - $po_file = $lang_dir . '/' . self :: TEXT_DOMAIN . '.po'; + $po_file = "$lang_dir/$domain.po"; if (!is_file($po_file)) { - Log :: debug(_("PO file not found in lang '%s' directory, ignore it."), + Log :: debug(self::_("PO file not found in lang '%s' directory, ignore it."), $lang); continue; } @@ -585,7 +660,7 @@ class I18n { ); if (!is_array($result) || $result[0] != 0) { Log :: error( - _("Fail to compile messages from %s PO file as MO file using msgfmt (%s)."), + self::_("Fail to compile messages from %s PO file as MO file using msgfmt (%s)."), $lang, $po_file ); $error = True; @@ -593,26 +668,26 @@ class I18n { // Compile messages from PO file to JS catalog file $js_catalog = self :: po2json($lang, $po_file); - $js_file = self :: $root_path."/$lang.js"; + $js_file = "$root_path/$lang.js"; if(!$fd = fopen($js_file, 'w')) { - Log :: error(_("Fail to open %s JS catalog file in write mode (%s)."), + Log :: error(self::_("Fail to open %s JS catalog file in write mode (%s)."), $lang, $js_file); $error = True; } elseif (fwrite($fd, sprintf("translations_data = %s;", $js_catalog)) === false) { - Log :: error(_("Fail to write %s JS catalog in file (%s)."), + Log :: error(self::_("Fail to write %s JS catalog in file (%s)."), $lang, $js_file); $error = True; } else { - Log :: info(_("%s JS catalog writed (%s)."), $lang, $js_file); + Log :: info(self::_("%s JS catalog writed (%s)."), $lang, $js_file); } } closedir($dh); return !$error; } - Log :: fatal(_("Fail to open root lang directory (%s)."), App :: root_directory_path()); + Log :: fatal(self::_("Fail to open root lang directory (%s)."), App :: root_directory_path()); return false; } diff --git a/src/SentryIntegration.php b/src/SentryIntegration.php index 98cda96..91bda43 100644 --- a/src/SentryIntegration.php +++ b/src/SentryIntegration.php @@ -52,7 +52,7 @@ class SentryIntegration { 'id' => isset($auth_user) && $auth_user?$auth_user['uid']:null, 'email' => isset($auth_user) && $auth_user?$auth_user['mail']:null, 'segment' => isset($auth_user) && $auth_user?$auth_user['type']:null, - 'ip_address' => $_SERVER['REMOTE_ADDR'], + 'ip_address' => php_sapi_name()=='cli'?null:$_SERVER['REMOTE_ADDR'], ]); }); diff --git a/src/Tpl.php b/src/Tpl.php index a340eb3..af0d4b1 100644 --- a/src/Tpl.php +++ b/src/Tpl.php @@ -21,6 +21,12 @@ class Tpl { */ public static $smarty_security_policy = null; + /** + * Core Smarty templates directory + * @var string + */ + public static string $core_templates_directory; + /** * Smarty templates directories path with their priority * @var array @@ -39,6 +45,12 @@ class Tpl { */ public static bool $_debug_ajax; + /** + * Core static directory + * @var string|null + */ + public static $core_static_directory = null; + /** * Static directories path with their priority * @var array @@ -86,8 +98,8 @@ class Tpl { public static function init($templates_dir=null, $templates_c_dir=null, $debug_ajax=null, $static_root_url=null) { // Handle templates directories - $default_templates_directory = realpath(__DIR__."/../templates"); - self :: register_templates_directory($default_templates_directory); + self :: $core_templates_directory = realpath(__DIR__."/../templates"); + self :: register_templates_directory(self :: $core_templates_directory); if (is_null($templates_dir)) $templates_dir = App::get('templates.directory', null, 'string'); if ($templates_dir) { @@ -127,7 +139,7 @@ class Tpl { if (substr($unique_name, -1) == '/') $unique_name = substr($unique_name, 0, -1); } - $templates_c_dir = sys_get_temp_dir().str_replace( + $templates_c_dir = sys_get_temp_dir().'/'.str_replace( '/', '_', "eesyphp_templates_cache_$unique_name" ); if (!is_dir($templates_c_dir) && !mkdir($templates_c_dir)) { @@ -138,7 +150,7 @@ class Tpl { } } self :: $smarty = new Smarty(); - self :: $smarty->setTemplateDir($default_templates_directory); + self :: $smarty->setTemplateDir(self :: $core_templates_directory); self :: $smarty->setCompileDir($templates_c_dir); self :: $smarty->registerResource('Tpl', new TplSmartyResource()); if (is_null($debug_ajax)) @@ -154,8 +166,8 @@ class Tpl { if (substr($static_root_url, -1) != '/') $static_root_url = "$static_root_url/"; self :: $static_root_url = $static_root_url; - $default_static_directory = realpath(__DIR__."/../static"); - self :: register_static_directory($default_static_directory, 100); + self :: $core_static_directory = realpath(__DIR__."/../static"); + self :: register_static_directory(self :: $core_static_directory, 100); self :: register_function('static_url', array('EesyPHP\\Tpl', 'smarty_static_url')); foreach(App :: get('templates.static_directories', array(), 'array') as $path) @@ -322,6 +334,10 @@ class Tpl { self :: assign('css', self :: $css_files); self :: assign('js', self :: $js_files); + // I18n text domains + self :: assign('CORE_TEXT_DOMAIN', I18n :: CORE_TEXT_DOMAIN); + self :: assign('TEXT_DOMAIN', I18n :: TEXT_DOMAIN); + // Authenticated user info if (isset($auth_user)) self :: assign('auth_user', $auth_user); @@ -336,7 +352,7 @@ class Tpl { */ public static function display($template, $pagetitle=null, ...$extra_args) { if (!$template) { - Log :: fatal(_("No template specified.")); + Log :: fatal(I18n::_("No template specified.")); return; } @@ -367,7 +383,7 @@ class Tpl { catch (Exception $e) { Log :: exception($e, "Smarty - An exception occured displaying template '$template'"); if ($template != 'fatal_error.tpl') - Log :: fatal(_("An error occurred while displaying this page.")); + Log :: fatal(I18n::_("An error occurred while displaying this page.")); return; } unset($_SESSION['errors']); diff --git a/src/Url.php b/src/Url.php index 5758ebc..42fcd7e 100644 --- a/src/Url.php +++ b/src/Url.php @@ -138,20 +138,20 @@ class Url { public static function error_page($request=null, $error_code=null) { $http_errors = array( 400 => array( - 'pagetitle' => _("Bad request"), - 'message' => _("Invalid request."), + 'pagetitle' => I18n::_("Bad request"), + 'message' => I18n::_("Invalid request."), ), 401 => array( - 'pagetitle' => _("Authentication required"), - 'message' => _("You have to be authenticated to access to this page."), + 'pagetitle' => I18n::_("Authentication required"), + 'message' => I18n::_("You have to be authenticated to access to this page."), ), 403 => array( - 'pagetitle' => _("Access denied"), - 'message' => _("You do not have access to this application. If you think this is an error, please contact support."), + 'pagetitle' => I18n::_("Access denied"), + 'message' => I18n::_("You do not have access to this application. If you think this is an error, please contact support."), ), 404 => array( - 'pagetitle' => _("Whoops ! Page not found"), - 'message' => _("The requested page can not be found."), + 'pagetitle' => I18n::_("Whoops ! Page not found"), + 'message' => I18n::_("The requested page can not be found."), ), ); $error_code = ($error_code?intval($error_code):400); @@ -159,8 +159,8 @@ class Url { $error = $http_errors[intval($error_code)]; else $error = array( - 'pagetitle' => _('Error'), - 'message' => _('An unknown error occurred. If problem persist, please contact support.'), + 'pagetitle' => I18n::_('Error'), + 'message' => I18n::_('An unknown error occurred. If problem persist, please contact support.'), ); http_response_code($error_code); @@ -223,7 +223,7 @@ class Url { $current_url = self :: get_current_url(); if ($current_url === false) { Log :: fatal( - _('Unable to determine the requested page. '. + I18n::_('Unable to determine the requested page. '. 'If the problem persists, please contact support.') ); exit(); @@ -373,7 +373,7 @@ class Url { // Prevent loop if (isset($_SESSION['last_redirect']) && $_SESSION['last_redirect'] == $url) Log :: fatal( - _('Unable to determine the requested page (loop detected). '. + I18n::_('Unable to determine the requested page (loop detected). '. 'If the problem persists, please contact support.')); else $_SESSION['last_redirect'] = $url; @@ -404,7 +404,7 @@ class Url { Log :: error( "URL handler function %s does not exists !", format_callable($request -> handler)); - Log :: fatal(_("This request cannot be processed.")); + Log :: fatal(I18n::_("This request cannot be processed.")); } if ($request -> api_mode) @@ -417,7 +417,7 @@ class Url { if (function_exists('force_authentication')) force_authentication(); else - Log :: fatal(_("Authentication required but force_authentication function is not defined.")); + Log :: fatal(I18n::_("Authentication required but force_authentication function is not defined.")); try { call_user_func($request -> handler, $request); @@ -426,7 +426,7 @@ class Url { Log :: exception( $e, "An exception occured running URL handler function %s()", format_callable($request -> handler)); - Log :: fatal(_("This request could not be processed correctly.")); + Log :: fatal(I18n::_("This request could not be processed correctly.")); } $sentry_span->finish(); } diff --git a/templates/fatal_error.tpl b/templates/fatal_error.tpl index f802580..29a4bee 100644 --- a/templates/fatal_error.tpl +++ b/templates/fatal_error.tpl @@ -1,10 +1,10 @@ {extends file='Tpl:empty.tpl'} {block name="content"} -

Oops ...

+

{t domain=$CORE_TEXT_DOMAIN}Oops...{/t}

-

{t}A fatal error has occurred and it is preventing this application from working properly. Please try again later or contact support.{/t}

+

{t domain=$CORE_TEXT_DOMAIN}A fatal error has occurred and it is preventing this application from working properly. Please try again later or contact support.{/t}

-

{t 1=$fatal_error}Error: %1{/t}

+

{t 1=$fatal_error domain=$CORE_TEXT_DOMAIN}Error: %1{/t}

- + {/block} diff --git a/templates/homepage.tpl b/templates/homepage.tpl index 4065351..260df8c 100644 --- a/templates/homepage.tpl +++ b/templates/homepage.tpl @@ -2,7 +2,7 @@ {block name="pagetitle"}{/block} {block name="content"}
-

{t}Hello, world!{/t}

-

{t escape=off}This is the default page of a new app using EesyPHP framework. Register your own templates directory and create a homepage.tpl file to overwrite it. You could also overwrite the URL handler for the root of the web application.{/t}

+

{t domain=$CORE_TEXT_DOMAIN}Hello, world!{/t}

+

{t escape=off domain=$CORE_TEXT_DOMAIN}This is the default page of a new app using EesyPHP framework. Register your own templates directory and create a homepage.tpl file to overwrite it. You could also overwrite the URL handler for the root of the web application.{/t}

{/block}