<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body smarttemplateinserted="true" text="#000000" bgcolor="#FFFFFF">
Dear Vtiger Team,<br>
<br>
There are a small, minor issues in the translation system of vtiger
6.<br>
<br>
<b>(1) if you will create a Custom module</b> with necessary en_us
language files still will be missing language keys from the <br>
/languages/en_us/Vtiger.php<br>
/languages/en_us/Settings/Vtiger.php<br>
For example the Custom module has settings page, and defined the
Links e.g. under Integration menu on the left panel, there will be a
LABEL e.g. LABEL_CUSTOM_MODULE but not a translated string.<br>
<br>
The reason is: vtiger translation engine is looking for the string
in the /languages/en_us/Settings/Vtiger.php file if you are in the <br>
place <vtiger>/index.php?module=Vtiger&parent=Settings&view=Index<br>
And the translation engine will not find the translated keys in the
file /languages/en_us/Settings/Custommodule.php<br>
<br>
This issue also valid for the main menu system that uses keys from
the /languages/en_us/Vtiger.php file.<br>
<br>
<b>Bad solution today is:</b> adding manually - after install - the
missing language keys => value pairs to the
/languages/en_us/Vtiger.php &
/languages/en_us/Settings/Vtiger.php .<br>
But this solution is against the vtiger store policy changing core
files. (You can see in the /languages/hu_hu/Vtiger.php &
/languages/hu_hu/Settings/Vtiger.php these added dozens of plus
keys.)<br>
<br>
<b>Suggested solutions:</b> create a vtlib function and a
/languages/en_us/Common.php &
/languages/hu_hu/Settings/Common.php files to handle this issue.<br>
The vtlib function simple will open the Common.php language files
(for the named language) and will append the provided missing key
=> value pairs to the end of the file (if the provided keys are
not exist already).<br>
<br>
<b>(2) Translation engine issues </b><b>with picklist texts.</b><br>
Unfortunately the picklist (and multi-select picklist) fields data
will store in the database in text form and these texts are subject
of translation.<br>
The translations are necessary, but there is better storage form
then text.<br>
<br>
For example the vtiger system uses 2 languages (Hungarian and
English). <br>
Note: the multi-language usage in Central Europe is very widespread.
For example my consultant association works in 10 CE countries, and
our vtiger users from these countries and they use this vtiger
instance in English, German, Hungarian, Romanian, etc. languages.<br>
<br>
So, there is a 2 language vtiger system and there is a picklist with
words 'big', 'medium', 'small' and in the language file there are
translation in order 'nagy', 'közepes', 'kicsi'.<br>
<br>
If the English user will pick the 1st item, the field will store
'big' as a content. In multi-select will be stored e.g. 'big |##|
medium'. The Hungarian user will pick the 1st item the field will
store 'nagy' as a content. In multi-select will be stored e.g. 'nagy
|##| közepes'.<br>
<br>
And this case will cause <b>IMPOSSIBILITY </b>to search in the
database.<br>
<br>
My suggestion is to store in the database the picklist ID but not
the picklist label. The picklis ID will be too same using different
languages.<br>
For example here is the activitytype picklist.<br>
<p style="color: rgb(0, 0, 0); font-family: 'Times New Roman';
font-size: medium; font-style: normal; font-variant: normal;
font-weight: normal; letter-spacing: normal; line-height: normal;
orphans: auto; text-align: start; text-indent: 0px;
text-transform: none; white-space: normal; widows: auto;
word-spacing: 0px; -webkit-text-stroke-width: 0px;
background-color: rgb(255, 255, 255);"><strong>SQL lekérdezés:</strong><span
class="Apple-converted-space"> </span>SELECT * FROM
`vtiger_activitytype` LIMIT 0, 25 ;<br>
<strong>Sorok:</strong><span class="Apple-converted-space"> </span>3</p>
<div id="sqlqueryresults" class="ajax" style="color: rgb(0, 0, 0);
font-family: 'Times New Roman'; font-size: medium; font-style:
normal; font-variant: normal; font-weight: normal; letter-spacing:
normal; line-height: normal; orphans: auto; text-align: start;
text-indent: 0px; text-transform: none; white-space: normal;
widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;
background-color: rgb(255, 255, 255);">
<table id="table_results" class="data ajax" style="color: rgb(0,
0, 0); border: 0.1em solid rgb(0, 0, 0); border-collapse:
collapse; border-spacing: 0px; background-color: rgb(255, 255,
255);">
<thead><tr>
<th class="draggable" data-column="activitytypeid"
style="color: rgb(0, 0, 0); border: 0.1em solid rgb(0, 0,
0); padding: 0.2em; font-weight: bold; background-color:
rgb(229, 229, 229);">activitytypeid</th>
<th class="draggable" data-column="activitytype"
style="color: rgb(0, 0, 0); border: 0.1em solid rgb(0, 0,
0); padding: 0.2em; font-weight: bold; background-color:
rgb(229, 229, 229);">activitytype</th>
<th class="draggable" data-column="presence" style="color:
rgb(0, 0, 0); border: 0.1em solid rgb(0, 0, 0); padding:
0.2em; font-weight: bold; background-color: rgb(229, 229,
229);">presence</th>
<th class="draggable" data-column="picklist_valueid"
style="color: rgb(0, 0, 0); border: 0.1em solid rgb(0, 0,
0); padding: 0.2em; font-weight: bold; background-color:
rgb(229, 229, 229);">picklist_valueid</th>
<th class="draggable" data-column="sortorderid"
style="color: rgb(0, 0, 0); border: 0.1em solid rgb(0, 0,
0); padding: 0.2em; font-weight: bold; background-color:
rgb(229, 229, 229);">sortorderid</th>
</tr>
</thead><tbody>
<tr class="odd">
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 not_null nowrap " style="color: rgb(0, 0,
0); border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">1</td>
<td data-decimals="0" data-type="string" class="data
grid_edit click2 not_null " style="color: rgb(0, 0, 0);
border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
background-color: rgb(255, 255, 255);">Call</td>
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 not_null nowrap " style="color: rgb(0, 0,
0); border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">0</td>
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 not_null nowrap " style="color: rgb(0, 0,
0); border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">12</td>
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 nowrap " style="color: rgb(0, 0, 0);
border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">0</td>
</tr>
<tr class="even">
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 not_null nowrap " style="color: rgb(0, 0,
0); border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">2</td>
<td data-decimals="0" data-type="string" class="data
grid_edit click2 not_null " style="color: rgb(0, 0, 0);
border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
background-color: rgb(255, 255, 255);">Meeting</td>
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 not_null nowrap " style="color: rgb(0, 0,
0); border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">0</td>
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 not_null nowrap " style="color: rgb(0, 0,
0); border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">13</td>
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 nowrap " style="color: rgb(0, 0, 0);
border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">1</td>
</tr>
<tr class="odd">
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 not_null nowrap " style="color: rgb(0, 0,
0); border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">3</td>
<td data-decimals="0" data-type="string" class="data
grid_edit click2 not_null " style="color: rgb(0, 0, 0);
border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
background-color: rgb(255, 255, 255);">Mobile Call</td>
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 not_null nowrap " style="color: rgb(0, 0,
0); border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">0</td>
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 not_null nowrap " style="color: rgb(0, 0,
0); border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">321</td>
<td data-decimals="0" data-type="int" class="right data
grid_edit click2 nowrap " style="color: rgb(0, 0, 0);
border: 0.1em solid rgb(0, 0, 0); padding: 0.2em;
white-space: nowrap; background-color: rgb(255, 255,
255);">1</td>
</tr>
</tbody>
</table>
</div>
<br>
If we will store in the database the activitytypeid as picklist ID,
it will be too same for every language.<br>
For the multi-select we can store '1 |##| 2' instead of the confused
translated or not translated labels from the second column.<br>
<br>
Of course these solutions will change the UIType handling engines
and the search engine also.<br>
So, the database will contain the indexes (from the 1st column), the
translating engine will show the labels from the second column or
labels from the language files.<br>
<br>
Kindest regards:<br>
Istvan<br>
<br>
<div class="moz-signature">-- <br>
üdvözlettel:<br>
<br>
<b>Holbok István</b><br>
<br>
+3670-342-0900<br>
<b>e-mail:</b> <a class="moz-txt-link-abbreviated" href="mailto:holbok@gmail.com">holbok@gmail.com</a><br>
<b>SkyPe:</b> holboki<br>
<br>
</div>
</body>
</html>