translation.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. <?php
  2. /* Copyright (C) 2007-2016 Laurent Destailleur <eldy@users.sourceforge.net>
  3. * Copyright (C) 2009 Regis Houssin <regis.houssin@capnetworks.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /**
  19. * \file htdocs/admin/translation.php
  20. * \brief Page to show translation information
  21. */
  22. require '../main.inc.php';
  23. require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
  24. require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
  25. require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php';
  26. $langs->load("companies");
  27. $langs->load("products");
  28. $langs->load("admin");
  29. $langs->load("sms");
  30. $langs->load("other");
  31. $langs->load("errors");
  32. if (!$user->admin) accessforbidden();
  33. $id=GETPOST('rowid','int');
  34. $action=GETPOST('action','alpha');
  35. $langcode=GETPOST('langcode','alpha');
  36. $transkey=GETPOST('transkey','alpha');
  37. $transvalue=GETPOST('transvalue','alpha');
  38. $mode = GETPOST('mode')?GETPOST('mode'):'overwrite';
  39. $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit;
  40. $sortfield = GETPOST("sortfield",'alpha');
  41. $sortorder = GETPOST("sortorder",'alpha');
  42. $page = GETPOST("page",'int');
  43. if (empty($page) || $page == -1) { $page = 0; } // If $page is not defined, or '' or -1
  44. $offset = $limit * $page;
  45. $pageprev = $page - 1;
  46. $pagenext = $page + 1;
  47. if (! $sortfield) $sortfield='lang,transkey';
  48. if (! $sortorder) $sortorder='ASC';
  49. /*
  50. * Actions
  51. */
  52. if (GETPOST('cancel')) { $action='list'; $massaction=''; }
  53. if (! GETPOST('confirmmassaction') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction=''; }
  54. $parameters=array('socid'=>$socid);
  55. $reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks
  56. if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
  57. include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php';
  58. // Purge search criteria
  59. if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // All tests are required to be compatible with all browsers
  60. {
  61. $transkey='';
  62. $transvalue='';
  63. $toselect='';
  64. $search_array_options=array();
  65. }
  66. if ($action == 'setMAIN_ENABLE_OVERWRITE_TRANSLATION')
  67. {
  68. if (GETPOST('value')) dolibarr_set_const($db, 'MAIN_ENABLE_OVERWRITE_TRANSLATION', 1, 'chaine', 0, '', $conf->entity);
  69. else dolibarr_set_const($db, 'MAIN_ENABLE_OVERWRITE_TRANSLATION', 0, 'chaine', 0, '', $conf->entity);
  70. }
  71. if ($action == 'add' || (GETPOST('add') && $action != 'update'))
  72. {
  73. $error=0;
  74. if (empty($langcode))
  75. {
  76. setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Language")), null, 'errors');
  77. $error++;
  78. }
  79. if ($transkey == '')
  80. {
  81. setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Key")), null, 'errors');
  82. $error++;
  83. }
  84. if ($transvalue == '')
  85. {
  86. setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("NewTranslationStringToShow")), null, 'errors');
  87. $error++;
  88. }
  89. if (! $error)
  90. {
  91. $db->begin();
  92. $sql = "INSERT INTO ".MAIN_DB_PREFIX."overwrite_trans(lang, transkey, transvalue, entity) VALUES ('".$db->escape($langcode)."','".$db->escape($transkey)."','".$db->escape($transvalue)."', ".$db->escape($conf->entity).")";
  93. $result = $db->query($sql);
  94. if ($result > 0)
  95. {
  96. $db->commit();
  97. setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
  98. $action="";
  99. $transkey="";
  100. $transvalue="";
  101. }
  102. else
  103. {
  104. $db->rollback();
  105. if ($db->lasterrno() == 'DB_ERROR_RECORD_ALREADY_EXISTS')
  106. {
  107. setEventMessages($langs->trans("WarningAnEntryAlreadyExistForTransKey"), null, 'warnings');
  108. }
  109. else
  110. {
  111. setEventMessages($db->lasterror(), null, 'errors');
  112. }
  113. $action='';
  114. }
  115. }
  116. }
  117. // Delete line from delete picto
  118. if ($action == 'delete')
  119. {
  120. $sql = "DELETE FROM ".MAIN_DB_PREFIX."overwrite_trans WHERE rowid = ".$db->escape($id);
  121. $result = $db->query($sql);
  122. if ($result >= 0)
  123. {
  124. setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs');
  125. }
  126. else
  127. {
  128. dol_print_error($db);
  129. }
  130. }
  131. /*
  132. * View
  133. */
  134. $formadmin = new FormAdmin($db);
  135. $wikihelp='EN:Setup|FR:Paramétrage|ES:Configuración';
  136. llxHeader('',$langs->trans("Setup"),$wikihelp);
  137. print load_fiche_titre($langs->trans("Translation"),'','title_setup');
  138. print $langs->trans("TranslationDesc")."<br>\n";
  139. print "<br>\n";
  140. $current_language_code=$langs->defaultlang;
  141. $s=picto_from_langcode($current_language_code);
  142. print $langs->trans("CurrentUserLanguage").': <strong>'.$s.' '.$current_language_code.'</strong><br>';
  143. print '<br>';
  144. print $langs->trans("EnableOverwriteTranslation").' ';
  145. if (empty($conf->global->MAIN_ENABLE_OVERWRITE_TRANSLATION))
  146. {
  147. // Button off, click to enable
  148. print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?action=setMAIN_ENABLE_OVERWRITE_TRANSLATION&amp;value=1">';
  149. print img_picto($langs->trans("Disabled"),'switch_off');
  150. print '</a>';
  151. }
  152. else
  153. {
  154. // Button on, click to disable
  155. print '<a class="reposition" href="'.$_SERVER["PHP_SELF"].'?action=setMAIN_ENABLE_OVERWRITE_TRANSLATION&amp;value=0">';
  156. print img_picto($langs->trans("Activated"),'switch_on');
  157. print '</a>';
  158. }
  159. print '<br><br>';
  160. $param='&mode='.$mode;
  161. if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage;
  162. if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit;
  163. if ($optioncss != '') $param.='&optioncss='.$optioncss;
  164. if ($langcode) $param.='&langcode='.urlencode($langcode);
  165. if ($transkey) $param.='&transkey='.urlencode($transkey);
  166. if ($transvalue) $param.='&transvalue='.urlencode($transvalue);
  167. print '<form action="'.$_SERVER["PHP_SELF"].((empty($user->entity) && $debug)?'?debug=1':'').'" method="POST">';
  168. if ($optioncss != '') print '<input type="hidden" name="optioncss" value="'.$optioncss.'">';
  169. print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
  170. print '<input type="hidden" name="formfilteraction" id="formfilteraction" value="list">';
  171. print '<input type="hidden" name="action" value="list">';
  172. print '<input type="hidden" name="sortfield" value="'.$sortfield.'">';
  173. print '<input type="hidden" name="sortorder" value="'.$sortorder.'">';
  174. print '<input type="hidden" name="page" value="'.$page.'">';
  175. $head=translation_prepare_head();
  176. dol_fiche_head($head, $mode, '', -1, '');
  177. if ($mode == 'overwrite')
  178. {
  179. //print load_fiche_titre($langs->trans("TranslationOverwriteKey"), '', '')."\n";
  180. print img_info().' '.$langs->trans("SomeTranslationAreUncomplete");
  181. $urlwikitranslatordoc='https://wiki.dolibarr.org/index.php/Translator_documentation';
  182. print ' ('.$langs->trans("SeeAlso").': <a href="'.$urlwikitranslatordoc.'" target="_blank">'.$urlwikitranslatordoc.'</a>)<br>';
  183. print $langs->trans("TranslationOverwriteDesc",$langs->transnoentitiesnoconv("Language"),$langs->transnoentitiesnoconv("Key"),$langs->transnoentitiesnoconv("NewTranslationStringToShow"))."\n";
  184. print ' ('.$langs->trans("TranslationOverwriteDesc2").').'."<br>\n";
  185. print '<br>';
  186. print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
  187. print '<input type="hidden" id="action" name="action" value="">';
  188. print '<input type="hidden" id="mode" name="mode" value="'.$mode.'">';
  189. print '<table class="noborder" width="100%">';
  190. print '<tr class="liste_titre">';
  191. print_liste_field_titre($langs->trans("Language").' (en_US, es_MX, ...)',$_SERVER["PHP_SELF"],'lang,transkey','',$param,'',$sortfield,$sortorder);
  192. print_liste_field_titre($langs->trans("Key"),$_SERVER["PHP_SELF"],'transkey','',$param,'',$sortfield,$sortorder);
  193. print_liste_field_titre($langs->trans("NewTranslationStringToShow"),$_SERVER["PHP_SELF"],'transvalue','',$param,'',$sortfield,$sortorder);
  194. //if (! empty($conf->multicompany->enabled) && !$user->entity) print_liste_field_titre($langs->trans("Entity"),$_SERVER["PHP_SELF"],'entity,transkey','',$param,'',$sortfield,$sortorder);
  195. print '<td align="center"></td>';
  196. print "</tr>\n";
  197. // Line to add new record
  198. print "\n";
  199. print '<tr class="oddeven"><td>';
  200. print $formadmin->select_language(GETPOST('langcode'), 'langcode', 0, null, 1, 0, 0, 'maxwidthonsmartphone', 1);
  201. print '</td>'."\n";
  202. print '<td>';
  203. print '<input type="text" class="flat maxwidthonsmartphone" name="transkey" value="">';
  204. print '</td><td>';
  205. print '<input type="text" class="quatrevingtpercent" name="transvalue" value="">';
  206. print '</td>';
  207. // Limit to superadmin
  208. /*if (! empty($conf->multicompany->enabled) && !$user->entity)
  209. {
  210. print '<td>';
  211. print '<input type="text" class="flat" size="1" name="entity" value="'.$conf->entity.'">';
  212. print '</td>';
  213. print '<td align="center">';
  214. }
  215. else
  216. {*/
  217. print '<td align="center">';
  218. print '<input type="hidden" name="entity" value="'.$conf->entity.'">';
  219. //}
  220. $disabled='';
  221. if (empty($conf->global->MAIN_ENABLE_OVERWRITE_TRANSLATION)) $disabled=' disabled="disabled"';
  222. print '<input type="submit" class="button"'.$disabled.' value="'.$langs->trans("Add").'" name="add">';
  223. print "</td>\n";
  224. print '</tr>';
  225. // Show constants
  226. $sql = "SELECT rowid, entity, lang, transkey, transvalue";
  227. $sql.= " FROM ".MAIN_DB_PREFIX."overwrite_trans";
  228. $sql.= " WHERE 1 = 1";
  229. //$sql.= " AND entity IN (".$user->entity.",".$conf->entity.")";
  230. $sql.= $db->order($sortfield, $sortorder);
  231. dol_syslog("translation::select from table", LOG_DEBUG);
  232. $result = $db->query($sql);
  233. if ($result)
  234. {
  235. $num = $db->num_rows($result);
  236. $i = 0;
  237. while ($i < $num)
  238. {
  239. $obj = $db->fetch_object($result);
  240. print "\n";
  241. print '<tr class="oddeven">';
  242. print '<td>'.$obj->lang.'</td>'."\n";
  243. print '<td>'.$obj->transkey.'</td>'."\n";
  244. // Value
  245. print '<td>';
  246. /*print '<input type="hidden" name="const['.$i.'][rowid]" value="'.$obj->rowid.'">';
  247. print '<input type="hidden" name="const['.$i.'][lang]" value="'.$obj->lang.'">';
  248. print '<input type="hidden" name="const['.$i.'][name]" value="'.$obj->transkey.'">';
  249. print '<input type="text" id="value_'.$i.'" class="flat inputforupdate" size="30" name="const['.$i.'][value]" value="'.dol_escape_htmltag($obj->transvalue).'">';
  250. */
  251. print $obj->transvalue;
  252. print '</td>';
  253. print '<td align="center">';
  254. print '<a href="'.$_SERVER['PHP_SELF'].'?rowid='.$obj->rowid.'&entity='.$obj->entity.'&action=delete'.((empty($user->entity) && $debug)?'&debug=1':'').'">'.img_delete().'</a>';
  255. print '</td>';
  256. print "</tr>\n";
  257. print "\n";
  258. $i++;
  259. }
  260. }
  261. print '</table>';
  262. }
  263. if ($mode == 'searchkey')
  264. {
  265. $langcode=GETPOST('langcode')?GETPOST('langcode'):$langs->defaultlang;
  266. $newlang=new Translate('',$conf);
  267. $newlang->setDefaultLang($langcode);
  268. $newlangfileonly=new Translate('',$conf);
  269. $newlangfileonly->setDefaultLang($langcode);
  270. $recordtoshow=array();
  271. $nbempty=0;
  272. /*var_dump($langcode);
  273. var_dump($transkey);
  274. var_dump($transvalue);*/
  275. if (empty($langcode) || $langcode == '-1') $nbempty++;
  276. if (empty($transkey)) $nbempty++;
  277. if (empty($transvalue)) $nbempty++;
  278. if ($action == 'search' && ($nbempty > 999)) // 999 to disable this
  279. {
  280. setEventMessages($langs->trans("WarningAtLeastKeyOrTranslationRequired"), null, 'warnings');
  281. }
  282. else
  283. {
  284. // Load all translations keys
  285. foreach($conf->file->dol_document_root as $keydir => $searchdir)
  286. {
  287. // Directory of translation files
  288. $dir_lang = $searchdir."/langs/".$langcode;
  289. $dir_lang_osencoded=dol_osencode($dir_lang);
  290. $filearray=dol_dir_list($dir_lang_osencoded,'files',0,'','',$sortfield,(strtolower($sortorder)=='asc'?SORT_ASC:SORT_DESC),1);
  291. foreach($filearray as $file)
  292. {
  293. $tmpfile=preg_replace('/.lang/i', '', basename($file['name']));
  294. $newlang->load($tmpfile, 0, 0, '', 0); // Load translation files + database overwrite
  295. $newlangfileonly->load($tmpfile, 0, 0, '', 1); // Load translation files only
  296. //print 'After loading lang '.$tmpfile.', newlang has '.count($newlang->tab_translate).' records<br>'."\n";
  297. }
  298. }
  299. // Now search into translation array
  300. foreach($newlang->tab_translate as $key => $val)
  301. {
  302. if ($transkey && ! preg_match('/'.preg_quote($transkey).'/', $key)) continue;
  303. if ($transvalue && ! preg_match('/'.preg_quote($transvalue).'/', $val)) continue;
  304. $recordtoshow[$key]=$val;
  305. }
  306. }
  307. //print '<br>';
  308. $nbtotalofrecordswithoutfilters = count($newlang->tab_translate);
  309. $nbtotalofrecords = count($recordtoshow);
  310. $num = $limit + 1;
  311. if (($offset + $num) > $nbtotalofrecords) $num = $limit;
  312. //print 'param='.$param.' $_SERVER["PHP_SELF"]='.$_SERVER["PHP_SELF"].' num='.$num.' page='.$page.' nbtotalofrecords='.$nbtotalofrecords." sortfield=".$sortfield." sortorder=".$sortorder;
  313. $title = $langs->trans("TranslationKeySearch");
  314. if ($nbtotalofrecords > 0) $title.=' ('.$nbtotalofrecords.' / '.$nbtotalofrecordswithoutfilters.')';
  315. print print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, -1 * $nbtotalofrecords, '', 0, '', '', $limit)."\n";
  316. print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
  317. print '<input type="hidden" id="action" name="action" value="search">';
  318. print '<input type="hidden" id="mode" name="mode" value="'.$mode.'">';
  319. print '<table class="noborder" width="100%">';
  320. print '<tr class="liste_titre">';
  321. print_liste_field_titre($langs->trans("Language").' (en_US, es_MX, ...)',$_SERVER["PHP_SELF"],'lang,transkey','',$param,'',$sortfield,$sortorder).'</td>';
  322. print_liste_field_titre($langs->trans("Key"),$_SERVER["PHP_SELF"],'transkey','',$param,'',$sortfield,$sortorder);
  323. print_liste_field_titre($langs->trans("CurrentTranslationString"),$_SERVER["PHP_SELF"],'transvalue','',$param,'',$sortfield,$sortorder);
  324. //if (! empty($conf->multicompany->enabled) && !$user->entity) print_liste_field_titre($langs->trans("Entity"),$_SERVER["PHP_SELF"],'entity,transkey','',$param,'',$sortfield,$sortorder);
  325. print '<td align="center"></td>';
  326. print "</tr>\n";
  327. // Line to search new record
  328. print "\n";
  329. print '<tr class="oddeven"><td>';
  330. //print $formadmin->select_language($langcode,'langcode',0,null,$langs->trans("All"),0,0,'',1);
  331. print $formadmin->select_language($langcode,'langcode', 0, null, 0, 0, 0, 'maxwidthonsmartphone', 1);
  332. print '</td>'."\n";
  333. print '<td>';
  334. print '<input type="text" class="flat maxwidthonsmartphone" name="transkey" value="'.$transkey.'">';
  335. print '</td><td>';
  336. print '<input type="text" class="quatrevingtpercent" name="transvalue" value="'.$transvalue.'">';
  337. // Limit to superadmin
  338. /*if (! empty($conf->multicompany->enabled) && !$user->entity)
  339. {
  340. print '</td><td>';
  341. print '<input type="text" class="flat" size="1" name="entitysearch" value="'.$conf->entity.'">';
  342. }
  343. else
  344. {*/
  345. print '<input type="hidden" name="entitysearch" value="'.$conf->entity.'">';
  346. //}
  347. print '</td>';
  348. // Action column
  349. print '<td class="liste_titre nowrap" align="right">';
  350. $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1);
  351. print $searchpicto;
  352. print '</td>';
  353. print '</tr>';
  354. if ($sortfield == 'transkey' && strtolower($sortorder) == 'asc') ksort($recordtoshow);
  355. if ($sortfield == 'transkey' && strtolower($sortorder) == 'desc') krsort($recordtoshow);
  356. if ($sortfield == 'transvalue' && strtolower($sortorder) == 'asc') asort($recordtoshow);
  357. if ($sortfield == 'transvalue' && strtolower($sortorder) == 'desc') arsort($recordtoshow);
  358. // Show result
  359. $i=0;
  360. foreach($recordtoshow as $key => $val)
  361. {
  362. $i++;
  363. if ($i <= $offset) continue;
  364. if ($i > ($offset + $limit)) break;
  365. print '<tr class="oddeven"><td>'.$langcode.'</td><td>'.$key.'</td><td>';
  366. print dol_escape_htmltag($val);
  367. print '</td><td align="right">';
  368. if (! empty($newlangfileonly->tab_translate[$key]))
  369. {
  370. if ($val != $newlangfileonly->tab_translate[$key])
  371. {
  372. $htmltext = $langs->trans("OriginalValueWas", $newlangfileonly->tab_translate[$key]);
  373. print $form->textwithpicto('', $htmltext, 1, 'info');
  374. }
  375. }
  376. else
  377. {
  378. $htmltext = $langs->trans("TransKeyWithoutOriginalValue", $key);
  379. print $form->textwithpicto('', $htmltext, 1, 'warning');
  380. }
  381. /*if (! empty($conf->multicompany->enabled) && !$user->entity)
  382. {
  383. print '<td>'.$val.'</td>';
  384. }*/
  385. print '</td></tr>'."\n";
  386. }
  387. print '</table>';
  388. print '</form>';
  389. }
  390. dol_fiche_end();
  391. print "</form>\n";
  392. llxFooter();
  393. $db->close();