Jump to content

[Résolu] Traduction noms des champs pour un module


Recommended Posts

Bonjour à tous,

 

j'ai un petit soucis de traduction du côté de mon BO concernant un module que je développe actuellement. Mon véritable soucis concerne la page principale de mon module côté BO, c'est à dire là ou est affiché sous forme de tableau les différentes informations de ce dernier (liste des champs de la table relative au module).

 

En effet, mes traductions des en-têtes de ce tableau ne fonctionne pas ainsi que le titre de mon module sur le fil d'arianne et pourtant tout semble normal.

$this->fields_list  = array(
  'id' => array(
'title'  => $this->l('ID'),
'width' => 20
  ),
  'table_get' => array(
'title'  => $this->l('Table')
  ),
  'field_champ' => array(
'title'  => $this->l('Field')
  ),
  'description_type' => array(
'title'  => $this->l('Description type')
  ),
  'type_code' => array(
'title'  => $this->l('Code type')
  ),
 );

Ci dessus, l'attribut field_list de mon constructeur où j'applique la fonction $this->l sur mes en-têtes de tableau.

 

Qui plus est, dans la section traduction, je répère effectivement mes 5 valeurs, je les traduit également mais après avoir changer de langue mes en-têtes ne sont jamais traduites malgré que le reste de mes traductions le soient.

 

Impossible pour moi de savoir d'où cela vient, c'est pourquoi je m'adresse à la communauté Presta pour savoir si quelqu'un aurait une piste à m'indiquer.

 

Cordialement

 

Ps: le nom du topic a été modifié, voir mon dernier post

Edited by Pepitoww (see edit history)
Link to comment
Share on other sites

Bonjour,

 

le problème de traduction est toujours d'actualité concernant le back office. Dans l'onglet traduction, toutes les traductions relatives à ma page .php admin ne sont pas pris en compte, que ce soit les traductions des champs (affiché lors des erreurs), ou bien les entêtes du tableau (renderList). Mais apparement la traductions des champs est traité à part...

 

Le problème de traduction de mon fil d'arianne et de mon onglet (les deux sont liés) est quant à lui résolu.

 

Cordialement

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour,

 

après la réalisation de différents tests sur plusieurs versions de Presta je m'apercois que mes traductions marchent bien de la 1.5.0.1.7 à la 1.5.2.0 puis sur des versions plus récentes elles ne fonctionnent plus (15.3.0 jusqu'à la dernière version sortie).

 

Par contre j'ai une nouvelle question, comment faire en sorte que la traduction des noms de mes champs soient directement comprises à l'installation de mon module, étant donné que la traduction des noms des champs interrogent un fichier spécifique je ne peux réécrire ce fichier. De plus les noms des champs de mon module n'apparaissent pas dans "Modifier la traduction"-"Traductions des noms des champs" ni dans "traductions des modules installés".

 

Cordialement

Link to comment
Share on other sites

Bonjour Pepitoww,

 

Le problème de traduction est toujours d'actualité concernant le back office. Dans l'onglet traduction, toutes les traductions relatives à ma page .php admin ne sont pas pris en compte, que ce soit les traductions des champs (affiché lors des erreurs), ou bien les entêtes du tableau (renderList).

Quelqu'un m'a donné une solution ce matin à ce genre de problème, mais je dois attendre son accord pour le partage d'info.

 

Je te tiens au courant.

Edited by indesign (see edit history)
Link to comment
Share on other sites

@Pepitoww,

 

Comme promis voila une solution.

Copier le contenu du code en début de la classe

• Il faut changer nondumodule par le nom du module

• Il faut changer AdminController par le nom de la classe

 

public static $l_cache;

protected function l($string, $class = 'AdminTab', $addslashes = FALSE, $htmlentities = TRUE)
{
	// need to be called in order to populate $classInModule
	$str = self::findTranslation('nondumodule', $string, 'AdminController');
	$str = $htmlentities ? htmlentities($str, ENT_QUOTES, 'utf-8') : $str;
	return str_replace('"', '"', ($addslashes ? addslashes($str) : stripslashes($str)));
}

/**
 * findTranslation (initially in Module class), to make translations works
 *
 * @param string $name module name
 * @param string $string string to translate
 * @param string $source current class
 * @return string translated string
 */
public static function findTranslation($name, $string, $source)
{
	static $_MODULES;
	if (!is_array($_MODULES))
	{
		// note: $_COOKIE[iso_code] is set in createCustomToken();
		$file = _PS_MODULE_DIR_.'nondumodule/translations/'.Configuration::get('PS_LOCALE_LANGUAGE').'.php';
		if (file_exists($file) && include($file))
			$_MODULES = !empty($_MODULES)?array_merge($_MODULES, $_MODULE):$_MODULE;
	}
	$cache_key = $name.'|'.$string.'|'.$source;

	if (!isset(self::$l_cache[$cache_key]))
	{
		if (!is_array($_MODULES))
			return $string;
		// set array key to lowercase for 1.3 compatibility
		$_MODULES = array_change_key_case($_MODULES);
		if (defined('_THEME_NAME_'))
			$currentKey = '<{'.strtolower($name).'}'.strtolower(_THEME_NAME_).'>'.strtolower($source).'_'.md5($string);
		else
			$currentKey = '<{'.strtolower($name).'}default>'.strtolower($source).'_'.md5($string);
		// note : we should use a variable to define the default theme (instead of "prestashop")
		$defaultKey = '<{'.strtolower($name).'}prestashop>'.strtolower($source).'_'.md5($string);
		$currentKey = $defaultKey;

		if (isset($_MODULES[$currentKey]))
			$ret = stripslashes($_MODULES[$currentKey]);
		elseif (isset($_MODULES[strtolower($currentKey)]))
			$ret = stripslashes($_MODULES[strtolower($currentKey)]);
		elseif (isset($_MODULES[$defaultKey]))
			$ret = stripslashes($_MODULES[$defaultKey]);
		elseif (isset($_MODULES[strtolower($defaultKey)]))
			$ret = stripslashes($_MODULES[strtolower($defaultKey)]);
		else
			$ret = stripslashes($string);

		self::$l_cache[$cache_key] = $ret;
	}
	return self::$l_cache[$cache_key];
}

Edited by indesign (see edit history)
Link to comment
Share on other sites

Bonjour,

 

je viens de régler le deuxième soucis qui était la traduction de mes noms de champs lors d'erreur (maintenant je met le topic en résolu ;)) en m'inspirant du code de ton ami en overridant la méthode displayFieldName(), d'ailleurs une petite remarque concernant son code, il faut modifier une ligne si l'on veux que cela fonctionne lorsque l'on bascule le back office en anglais (ou en tout autre langue) :

 

Modifier

 $file = _PS_MODULE_DIR_.'nondumodule/translations/'.Configuration::get('PS_LOCALE_LANGUAGE').'.php';

par

$file = _PS_MODULE_DIR_.'nondumodule/translations/'.Context::getContext()->language->iso_code'.php';

 

Maintenant tous mes problèmes de traductions sont résolus.

 

Cordialement

Edited by Pepitoww (see edit history)
Link to comment
Share on other sites

Bonjour,

 

Ne manque t-il un point dans la ligne ?

Modifier

$file = _PS_MODULE_DIR_.'nondumodule/translations/'.Context::getContext()->language->iso_code'.php';

Par

$file = _PS_MODULE_DIR_.'nondumodule/translations/'.Context::getContext()->language->iso_code.'.php';

 

Les traductions des fichiers PHP fonctionnent correctement dans toutes les langues.

 

Par contre, je perds les traductions des fichiers tpl (view et form) en Italien, Espagnol et Portuguais. :( Elles s'affichent en Anglais.

 

Quant est-il pour vous ?

 

Cordialement

Edited by indesign (see edit history)
Link to comment
Share on other sites

Bonjour,

 

En effet il manquait un point dans la ligne. Même problème que vous concernant les traductions des fichiers tpl seulement en back office (en italien, espagnol et portuguais, je n'ai pas testé d'autre langue). Cela concerne t-il les même mots (supprimer la sélection, créer, enregistrer, retour à la liste) ?

 

Cordialement

Edited by Pepitoww (see edit history)
Link to comment
Share on other sites

Bonjour,

 

Cela concerne t-il les même mots (supprimer la sélection, créer, enregistrer, retour à la liste) ?

Ce sont tous les champs des fichiers tpl (view et form) qui restent en Anglais selon la langue sélectionnée : Italien, Espagnol et Portuguais.) En Français et en Anglais tout fonctionne correctement.

Mon module override AdminImportController.php donc pas de Front Office.

 

Ces mêmes champs étaient bien dans la bonne langue avant l'intégration de la function.

 

Cordialement,

Edited by indesign (see edit history)
Link to comment
Share on other sites

Pouvez-vous me dire quels sont vos fichiers de traductions dans votre dossier /translations de votre module ?

br, de, en, es, fr, it

 

D'accord et pour vous avec le code initial de votre ami cela marchait-il déjà correctement ?

J'avais noté des problèmes lors des changements de la langue de l'employé admin

En résumé :

tous les champs TPL OK dans toutes les langues, tous les champs PHP OK uniquement en Français

 

Compliqué comme situation :(

Link to comment
Share on other sites

D'accord, pour ma part dans mes fichiers de traductions italien, espagnol et portugais j'avais mes traductions en français (pourquoi ?). Ce que j'ai fais ce que j'ai repris ses fichiers en modifiant les traductions dans la langue voulue. Effectivement c'est plutôt fastidieux mais je n'ai pas encore de meilleur solution pour le moment.

Link to comment
Share on other sites

Bon je "crois avoir compris" :

• La traduction des fichiers TPL est obtenue par le fichier ISO.PHP contenu dans le dossier translation du thème

• La traduction des champs PHP est obtenue par le fichier ISO.PHP contenu dans le dossier translation du module

si je supprime les fichiers contenu dans le thème je perds toutes les traductions TPL.

 

J'utilise un thème autre que celui par défaut : c'était l'origine de mes problèmes de traduction PHP selon les langues.

En enregistrant les traductions dans le thème utilisé et (non dans le cœur indépendant du thème) toutes les langues fonctionnent bien en PHP et TPL

 

Ce qui voudrait dire que lorsqu'un utilisateur achètera le module, et s'il utilise un autre thème que celui par défaut, les traductions contenues dans le dossier du module ne seront pas visibles ???

 

Suis-je clair ? Vous confirmez mon raisonnement ?

Link to comment
Share on other sites

Bon je "crois avoir compris" :

• La traduction des fichiers TPL est obtenue par le fichier ISO.PHP contenu dans le dossier translation du thème

• La traduction des champs PHP est obtenue par le fichier ISO.PHP contenu dans le dossier translation du module

si je supprime les fichiers contenu dans le thème je perds toutes les traductions TPL.

 

 

Vous m'avez dis que votre module n'avait pas d'affichage en front office donc le dossier du thème se situe dans /admin/themes/... or je ne vois pas de dossier translation (je suis avec le thème par défaut d'une version 1.5.3.1 c'est peut-être pour sa) du coup les traductions des fichiers TPL sont quand même obtenues par le module je pense. A moins que pour le thème par défaut, les traductions viennent directement du dossier /translations...

Link to comment
Share on other sites

Je crois que l'on se perd mutuellement.

 

Vous m'avez dis que votre module n'avait pas d'affichage en front office

Pas d'affichage en front office : Mon module override AdminImportController.php donc pas de Front Office.

 

Le chemin des traductions du thème

themes -> defaut -> modules -> nomdumodule -> translations -> iso.php (fr.php)

themes -> autre -> modules -> nomdumodule -> translations -> iso.php (fr.php)

si je supprime les fichiers contenu dans le thème autre je perds toutes les traductions TPL.

Merge des deux dossiers translations du module et translations du thème autre.

Edited by indesign (see edit history)
Link to comment
Share on other sites

D'accord, ayant créer mon module de toute pièce je n'ai pas de dossier dans /thèmes/modules... pour ma part les traductions utilisées sont celles présentes dans le dossier translations de mon module c'est pour sa que j'avais du mal à me repérer.

 

Du coup je pense que vos suggestions sont correctes.

• La traduction des fichiers TPL est obtenue par le fichier ISO.PHP contenu dans le dossier translation du thème

• La traduction des champs PHP est obtenue par le fichier ISO.PHP contenu dans le dossier translation du module

si je supprime les fichiers contenu dans le thème je perds toutes les traductions TPL.

 

Il faudrait avoir un troisième avis permettant de confirmer vos dires.

 

Cordialement

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour,

 

Nouvelle installation PS 1.5.4.1 sur thème standard et thème personnalisé toutes les traductions fonctionnent parfaitement. :rolleyes:

Le problème était lié à l'ancienne installation et au nouveau thème.

 

Seul petit bémol : les icônes de la toolbar sont en Anglais sauf l'icône d'aide.

Sans la fonction findTranslation les icônes sont en Français. Une idée ?

 

Cordialement

Link to comment
Share on other sites

Bonjour,

 

bonne nouvelle que vous ayez résolu votre problème, concernant la traductions des icônes j'avais le même problème alors je les ai redéfinies dans mon fichier de traduction de mon module.

La méthode findTranslations() doit seulement récupèrer les traductions du module.

Edited by Pepitoww (see edit history)
Link to comment
Share on other sites

D'accord, mais comment ?

Dans le menu Traductions, Traductions des modules installés normalement tu doit avoir tes champs non traduits qui correspondent aux icones non traduites, rédéfinies les ici (retraduits les ici).

 

Peux-tu poster la solution ? merci par avance

Alors j'ai override la fonction displayFieldName() de la classe Object Controller.

 

public static function displayFieldName($field, $class = __CLASS__, $htmlentities = true, Context $context = null) {
 static $_MODULES;

	if (!is_array($_MODULES)) {
		$file = _PS_MODULE_DIR_.'nomDeTonModule/translations/'.Configuration::get('PS_LOCALE_LANGUAGE').'.php';
		if (file_exists($file) && include($file))
				$_MODULES = !empty($_MODULES)?array_merge($_MODULES, $_MODULE):$_MODULE;
	}

 $name = 'nomDeTonModule';
 $source = 'nomDeLaClasseBackOffice'; //Adminxxx

 switch($field) {
  case 'premierChamp': $string = 'NomduPremierCHamp';
  break;

  // Tu fais sa pour tous tes champs
  [...]
 }

 $defaultKey = '<{'.strtolower($name).'}prestashop>'.strtolower($source).'_'.md5($string);

 return ((is_array($_MODULES) && array_key_exists($defaultKey, $_MODULES)) ? ($htmlentities ? htmlentities($_MODULES[$defaultKey], ENT_QUOTES, 'utf-8') : $_MODULES[$defaultKey]) : $field);
}

 

Pour que cela marche il faut quand même que les traductions des champs soient présents dans le fichier fr.php (pour comparer la chaine md5).

Edited by Pepitoww (see edit history)
Link to comment
Share on other sites

Merci Petpitoww de prendre le temps de m'aider c'est plutôt rare... maintenant. :mellow:

 

Dans le menu Traductions, Traductions des modules installés normalement tu dois avoir tes champs non traduits qui correspondent aux icônes non traduites,

Non, tous les champs disponibles sont déjà traduits... (dans les 6 langues par défaut)

 

Le soucis vient de ceci :

<div class="toolbar-placeholder"><div class="toolbarBox toolbarHead" style="width: 1558px;"><ul class="cc_button"><li><a id="desc--cancel" class="toolbar_btn" title="Cancel" href="index.php?controller=AdminImport&token=1d99948d3408bd67c07557ef8006ff23"><span class="process-icon-cancel "></span><div>
  Cancel
   </div></a></li><li><a id="desc--save-import" class="toolbar_btn" title="Import .CSV data" href="#"><span class="process-icon-save"></span><div>
  Import .CSV data
   </div></a></li>

 

Qui est correct : (sans la function translate)

<div class="toolbar-placeholder"><div class="toolbarBox toolbarHead"><ul class="cc_button"><li><a id="desc--cancel" class="toolbar_btn" title="Annuler" href="index.php?controller=AdminImport&token=1d99948d3408bd67c07557ef8006ff23"><span class="process-icon-cancel "></span><div>

  Annuler
   </div></a></li><li><a id="desc--save-import" class="toolbar_btn" title="Importer les données" href="#"><span class="process-icon-save"></span><div>
  Importer les données
   </div></a></li>

 

 

redéfinies les ici (retraduits les ici).

Désolé, je comprends pas.

 

Merci bien pour ceci : je vais tester.

public static function displayFieldName($field, $class = __CLASS__, $htmlentities = true, Context $context = null) {
 static $_MODULES;

Link to comment
Share on other sites

J'ai enfin trouvé : grin.gif

Dans l'override de mon admincontroller de mon module j'ai rajouté ceci :

 

public function initToolbar()
{
	switch ($this->display)
	{
		case 'import':
			// Default cancel button - like old back link
			$back = Tools::safeOutput(Tools::getValue('back', ''));
			if (empty($back))
				$back = self::$currentIndex.'&token='.$this->token;

			$this->toolbar_btn['cancel'] = array(
				'href' => $back,
				'desc' => $this->l('Cancel')
			);
			// Default save button - action dynamically handled in javascript
			$this->toolbar_btn['save-import'] = array(
				'href' => '#',
				'desc' => $this->l('Import .CSV data')
			);
			break;
	}
}

 

et maintenant les champs apparaissent bien dans les traductions de mon module et bien sûr lors de l'affichage de la view de mon module.

OUF. Merci pour ta contribution et pour le temps passé.

Edited by indesign (see edit history)
Link to comment
Share on other sites

Bonjour,

Je reprends par ici car je ne peux plus envoyer de PM depuis ce matin (participants block ) ????

 

Le scandir retourne TOUS les fichiers du dossier _PS_DOWNLOAD_DIR_

protected function truncateTables($case)
{
	switch ((int)$case)
	{
		case $this->entities[$this->l('Product Download')]:
			Db::getInstance()->execute('TRUNCATE TABLE `'._DB_PREFIX_.'product_download');
			//Image::deleteAllImages(_PS_DOWNLOAD_DIR_);
			foreach (scandir(_PS_DOWNLOAD_DIR_) as $d)
			if($d != "." && $d != ".." && $d != "index.php")
					@unlink(_PS_DOWNLOAD_DIR_.$d);
			break;
	}
}

 

Liste des fichiers retournés :

153dea895c4cca88711a82826b83cbd1ff4bcc59
1AB0078FF2645C1A8CF19D2A12FAEFBEBD1968AA
5GED078FF2645C1A8CF19D2A12FAEFBEBD1978CC
802788133e8595397ea0c3fdb90bb874c1a3621a

 

 

Je voudrais supprimer uniquement ceux qui sont contenus dans la BD de la table PS_product_download et dans la colonne filename. (produits virtuels)

Sinon je garde le fichier. La boucle permettrait de passer au fichier suivant du dossier.

 

Dans le cas présent, voir la capture d'écran je souhaiterai supprimer uniquement

153dea895c4cca88711a82826b83cbd1ff4bcc59
802788133e8595397ea0c3fdb90bb874c1a3621a

 

Les deux autre fichiers sont des fichiers (produits pièces jointes) à garder

Edited by indesign (see edit history)
Link to comment
Share on other sites

Quelques pistes issues de la classe ProductDownload.php

 

Récupère le filename par rapport à l'ID du produit

    public static function getFilenameFromIdProduct($id_product)
   {
       return Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue('
           SELECT `filename`
           FROM `'._DB_PREFIX_.'product_download`
           WHERE `id_product` = '.(int)$id_product.'
               AND `active` = 1
       ');
   }

 

Vérifie les droits du dossier

	public static function checkWritableDir()
{
	return is_writable(_PS_DOWNLOAD_DIR_);
}

 

Vérifie si le fichier existe

	public function checkFile()
{
	if (!$this->filename) return false;
	return file_exists(_PS_DOWNLOAD_DIR_.$this->filename);
}

 

Supprime le fichier

public function deleteFile($id_product_download = null)
{
	if (!$this->checkFile())
		return false;

	return unlink(_PS_DOWNLOAD_DIR_.$this->filename)
		&& Db::getInstance()->delete('product_download', 'id_product_download = '.(int)$id_product_download);
}

 

Une boucle (foreach) sur tous les ID contenus dans la BD de la table ps_product_download

 

La fonction protected function truncateTables($case) de l'importation de PS contenu dans le fichier AdminImportController pour les produits permet de vider la table complète avant l’importation.
 J'ai repris la fonction pour le product_download. C'est celle que je souhaiterai utiliser.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...