dolibarr 21.0.0-beta
traduction.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2005-2018 Regis Houssin <regis.houssin@inodbox.com>
3 * Copyright (C) 2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
4 * Copyright (C) 2010-2012 Destailleur Laurent <eldy@users.sourceforge.net>
5 * Copyright (C) 2014 Henry Florian <florian.henry@open-concept.pro>
6 * Copyright (C) 2023 Benjamin Falière <benjamin.faliere@altairis.fr>
7 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 * or see https://www.gnu.org/
22 */
23
30// Load Dolibarr environment
31require '../main.inc.php';
32require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php';
35require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
36
45// Load translation files required by the page
46$langs->loadLangs(array('products', 'languages'));
47
48$id = GETPOSTINT('id');
49$ref = GETPOST('ref', 'alpha');
50$action = GETPOST('action', 'aZ09');
51$cancel = GETPOST('cancel', 'alpha');
52
53// Security check
54$fieldvalue = (!empty($id) ? $id : (!empty($ref) ? $ref : ''));
55$fieldtype = (!empty($ref) ? 'ref' : 'rowid');
56if ($user->socid) {
57 $socid = $user->socid;
58}
59
60if ($id > 0 || !empty($ref)) {
61 $object = new Product($db);
62 $object->fetch($id, $ref);
63}
64
65// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
66$hookmanager->initHooks(array('producttranslationcard', 'globalcard'));
67
68if ($object->id > 0) {
69 if ($object->type == $object::TYPE_PRODUCT) {
70 restrictedArea($user, 'produit', $object->id, 'product&product', '', '');
71 }
72 if ($object->type == $object::TYPE_SERVICE) {
73 restrictedArea($user, 'service', $object->id, 'product&product', '', '');
74 }
75} else {
76 restrictedArea($user, 'produit|service', $fieldvalue, 'product&product', '', '', $fieldtype);
77}
78
79// Permissions
80$usercancreate = (($object->type == Product::TYPE_PRODUCT && $user->hasRight('produit', 'creer')) || ($object->type == Product::TYPE_SERVICE && $user->hasRight('service', 'creer')));
81
82
83/*
84 * Actions
85 */
86
87$parameters = array('id'=>$id, 'ref'=>$ref);
88$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
89if ($reshook < 0) {
90 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
91}
92if (empty($reshook)) {
93 // retour a l'affichage des traduction si annulation
94 if ($cancel == $langs->trans("Cancel")) {
95 $action = '';
96 }
97
98 if ($action == 'delete' && GETPOST('langtodelete', 'alpha') && $usercancreate) {
99 $object = new Product($db);
100 $object->fetch($id);
101 $object->delMultiLangs(GETPOST('langtodelete', 'alpha'), $user);
102 setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs');
103 $action = '';
104 }
105
106 // Add translation
107 if ($action == 'vadd' && $cancel != $langs->trans("Cancel") && $usercancreate) {
108 $object = new Product($db);
109 $object->fetch($id);
110 $current_lang = $langs->getDefaultLang();
111
112 // update de l'objet
113 if (GETPOST("forcelangprod") == $current_lang) {
114 $object->label = GETPOST("libelle");
115 $object->description = dol_htmlcleanlastbr(GETPOST("desc", 'restricthtml'));
116 $object->other = dol_htmlcleanlastbr(GETPOST("other", 'restricthtml'));
117
118 $object->update($object->id, $user);
119 } else {
120 $object->multilangs[GETPOST("forcelangprod")]["label"] = GETPOST("libelle");
121 $object->multilangs[GETPOST("forcelangprod")]["description"] = dol_htmlcleanlastbr(GETPOST("desc", 'restricthtml'));
122 $object->multilangs[GETPOST("forcelangprod")]["other"] = dol_htmlcleanlastbr(GETPOST("other", 'restricthtml'));
123 }
124
125 // save in database
126 if (GETPOST("forcelangprod")) {
127 $result = $object->setMultiLangs($user);
128 } else {
129 $object->error = $langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Language"));
130 $result = -1;
131 }
132
133 if ($result > 0) {
134 $action = '';
135 } else {
136 $action = 'add';
137 setEventMessages($object->error, $object->errors, 'errors');
138 }
139 }
140
141 // Edit translation
142 if ($action == 'vedit' && $cancel != $langs->trans("Cancel") && $usercancreate) {
143 $object = new Product($db);
144 $object->fetch($id);
145 $current_lang = $langs->getDefaultLang();
146
147 foreach ($object->multilangs as $key => $value) { // enregistrement des nouvelles valeurs dans l'objet
148 if ($key == $current_lang) {
149 $object->label = GETPOST("libelle-" . $key);
150 $object->description = dol_htmlcleanlastbr(GETPOST("desc-" . $key, 'restricthtml'));
151 $object->other = dol_htmlcleanlastbr(GETPOST("other-" . $key, 'restricthtml'));
152
153 $object->update($object->id, $user);
154 } else {
155 $object->multilangs[$key]["label"] = GETPOST("libelle-" . $key);
156 $object->multilangs[$key]["description"] = dol_htmlcleanlastbr(GETPOST("desc-" . $key, 'restricthtml'));
157 $object->multilangs[$key]["other"] = dol_htmlcleanlastbr(GETPOST("other-" . $key, 'restricthtml'));
158 }
159 }
160
161 $result = $object->setMultiLangs($user);
162 if ($result > 0) {
163 $action = '';
164 } else {
165 $action = 'edit';
166 setEventMessages($object->error, $object->errors, 'errors');
167 }
168 }
169
170 // Delete translation
171 if ($action == 'vdelete' && $cancel != $langs->trans("Cancel") && $usercancreate) {
172 $object = new Product($db);
173 $object->fetch($id);
174 $langtodelete = GETPOST('langdel', 'alpha');
175
176 $result = $object->delMultiLangs($langtodelete, $user);
177 if ($result > 0) {
178 $action = '';
179 } else {
180 $action = 'edit';
181 setEventMessages($object->error, $object->errors, 'errors');
182 }
183 }
184}
185
186$object = new Product($db);
187$result = $object->fetch($id, $ref);
188
189
190/*
191 * View
192 */
193
194$title = $langs->trans('ProductServiceCard');
195$helpurl = '';
196$shortlabel = dol_trunc($object->label, 16);
197if (GETPOST("type") == '0' || ($object->type == Product::TYPE_PRODUCT)) {
198 $title = $langs->trans('Product')." ".$shortlabel." - ".$langs->trans('Translation');
199 $helpurl = 'EN:Module_Products|FR:Module_Produits|ES:M&oacute;dulo_Productos';
200}
201if (GETPOST("type") == '1' || ($object->type == Product::TYPE_SERVICE)) {
202 $title = $langs->trans('Service')." ".$shortlabel." - ".$langs->trans('Translation');
203 $helpurl = 'EN:Module_Services_En|FR:Module_Services|ES:M&oacute;dulo_Servicios';
204}
205
206llxHeader('', $title, $helpurl, '', 0, 0, '', '', '', 'mod-product page-translation');
207
208$form = new Form($db);
209$formadmin = new FormAdmin($db);
210
211$head = product_prepare_head($object);
212$titre = $langs->trans("CardProduct".$object->type);
213$picto = ($object->type == Product::TYPE_SERVICE ? 'service' : 'product');
214
215
216// Calculate $cnt_trans
217$cnt_trans = 0;
218if (!empty($object->multilangs)) {
219 foreach ($object->multilangs as $key => $value) {
220 $cnt_trans++;
221 }
222}
223
224
225print dol_get_fiche_head($head, 'translation', $titre, 0, $picto);
226
227$linkback = '<a href="'.DOL_URL_ROOT.'/product/list.php?restore_lastsearch_values=1&type='.$object->type.'">'.$langs->trans("BackToList").'</a>';
228
229$shownav = 1;
230if ($user->socid && !in_array('product', explode(',', getDolGlobalString('MAIN_MODULES_FOR_EXTERNAL')))) {
231 $shownav = 0;
232}
233
234dol_banner_tab($object, 'ref', $linkback, $shownav, 'ref', '', '', '', 0, '', '', 1);
235
236print dol_get_fiche_end();
237
238
239
240/*
241 * Action bar
242 */
243print "\n".'<div class="tabsAction">'."\n";
244
245$parameters = array();
246$reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
247if (empty($reshook)) {
248 if ($action == '') {
249 if ($user->hasRight('produit', 'creer') || $user->hasRight('service', 'creer')) {
250 print '<a class="butAction" href="' . DOL_URL_ROOT . '/product/traduction.php?action=add&token='.newToken().'&id=' . $object->id . '">' . $langs->trans("Add") . '</a>';
251 if ($cnt_trans > 0) {
252 print '<a class="butAction" href="' . DOL_URL_ROOT . '/product/traduction.php?action=edit&token='.newToken().'&id=' . $object->id . '">' . $langs->trans("Modify") . '</a>';
253 }
254 }
255 }
256}
257
258print "\n".'</div>'."\n";
259
260
261
262if ($action == 'edit') {
263 //WYSIWYG Editor
264 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
265
266 print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
267 print '<input type="hidden" name="token" value="'.newToken().'">';
268 print '<input type="hidden" name="action" value="vedit">';
269 print '<input type="hidden" name="id" value="'.$object->id.'">';
270
271 if (!empty($object->multilangs)) {
272 $i = 0;
273 foreach ($object->multilangs as $key => $value) {
274 $i++;
275
276 $s = picto_from_langcode((string) $key);
277 print($i > 1 ? "<br>" : "").($s ? $s.' ' : '').' <div class="inline-block margintop marginbottomonly"><b>'.$langs->trans('Language_'.$key).'</b></div><div class="inline-block floatright"><a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'&langtodelete='.$key.'">'.img_delete('', 'class="valigntextbottom marginrightonly"').'</a></div>';
278
279 print '<div class="underbanner clearboth"></div>';
280 print '<table class="border centpercent">';
281 print '<tr><td class="tdtop titlefieldcreate fieldrequired">'.$langs->trans('Label').'</td><td><input name="libelle-'.$key.'" size="40" value="'.dol_escape_htmltag($object->multilangs[$key]["label"]).'"></td></tr>';
282 print '<tr><td class="tdtop">'.$langs->trans('Description').'</td><td>';
283 $doleditor = new DolEditor("desc-$key", $object->multilangs[$key]["description"], '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_3, '90%');
284 $doleditor->Create();
285 print '</td></tr>';
286 if (getDolGlobalString('PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION')) {
287 print '<tr><td class="tdtop">'.$langs->trans("NotePrivate").'</td><td>';
288 $doleditor = new DolEditor("other-$key", $object->multilangs[$key]["other"], '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_3, '90%');
289 $doleditor->Create();
290 }
291 print '</td></tr>';
292 print '</table>';
293 }
294 }
295
296 $parameters = array();
297 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
298
299 print '<br>';
300
301 print $form->buttonsSaveCancel();
302
303 print '</form>';
304} elseif ($action != 'add') {
305 if (!empty($object->multilangs)) {
306 $i = 0;
307 foreach ($object->multilangs as $key => $value) {
308 $i++;
309
310 $s = picto_from_langcode((string) $key);
311 print($i > 1 ? "<br>" : "").($s ? $s.' ' : '').' <div class="inline-block marginbottomonly"><b>'.$langs->trans('Language_'.$key).'</b></div><div class="inline-block floatright"><a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=delete&token='.newToken().'&langtodelete='.$key.'">'.img_delete('', 'class="valigntextbottom marginrightonly"').'</a></div>';
312
313 print '<div class="fichecenter">';
314 print '<div class="underbanner clearboth"></div>';
315 print '<table class="border centpercent">';
316 print '<tr><td class="titlefieldcreate">'.$langs->trans('Label').'</td><td>'.$object->multilangs[$key]["label"].'</td></tr>';
317 print '<tr><td class="tdtop">'.$langs->trans('Description').'</td><td>'.$object->multilangs[$key]["description"].'</td></tr>';
318 if (getDolGlobalString('PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION')) {
319 print '<tr><td>'.$langs->trans("NotePrivate").'</td><td>'.$object->multilangs[$key]["other"].'</td></tr>';
320 }
321 print '</table>';
322 print '</div>';
323 }
324 }
325 if (!$cnt_trans && $action != 'add') {
326 print '<div class="opacitymedium">'.$langs->trans('NoTranslation').'</div>';
327 }
328}
329
330
331
332/*
333 * Form to add a new translation
334 */
335
336if ($action == 'add' && ($user->hasRight('produit', 'creer') || $user->hasRight('service', 'creer'))) {
337 //WYSIWYG Editor
338 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
339
340 print '<br>';
341 print '<form action="'.$_SERVER["PHP_SELF"].'" method="post">';
342 print '<input type="hidden" name="token" value="'.newToken().'">';
343 print '<input type="hidden" name="action" value="vadd">';
344 print '<input type="hidden" name="id" value="'.GETPOSTINT("id").'">';
345
346 print dol_get_fiche_head();
347
348 print '<table class="border centpercent">';
349 print '<tr><td class="tdtop titlefieldcreate fieldrequired">'.$langs->trans('Language').'</td><td>';
350 print $formadmin->select_language(GETPOST('forcelangprod'), 'forcelangprod', 0, $object->multilangs, 1);
351 print '</td></tr>';
352 print '<tr><td class="tdtop fieldrequired">'.$langs->trans('Label').'</td><td><input name="libelle" size="40"></td></tr>';
353 print '<tr><td class="tdtop">'.$langs->trans('Description').'</td><td>';
354 $doleditor = new DolEditor('desc', '', '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_3, '90%');
355 $doleditor->Create();
356 print '</td></tr>';
357 // Other field (not used)
358 if (getDolGlobalString('PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION')) {
359 print '<tr><td class="tdtop">'.$langs->trans('NotePrivate').'</td><td>';
360 $doleditor = new DolEditor('other', '', '', 160, 'dolibarr_notes', '', false, true, getDolGlobalInt('FCKEDITOR_ENABLE_DETAILS'), ROWS_3, '90%');
361 $doleditor->Create();
362 print '</td></tr>';
363 }
364 print '</table>';
365
366 $parameters = array();
367 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
368
369 print dol_get_fiche_end();
370
371 print $form->buttonsSaveCancel();
372
373 print '</form>';
374
375 print '<br>';
376}
377
378// End of page
379llxFooter();
380$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:71
Class to manage a WYSIWYG editor.
Class to generate html code for admin pages.
Class to manage generation of HTML components Only common components must be here.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
llxFooter()
Footer empty.
Definition document.php:107
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
picto_from_langcode($codelang, $moreatt='', $notitlealt=0)
Return img flag of country for a language code or country code.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
product_prepare_head($object)
Prepare array with list of tabs.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.