This is a feature that injects hidden ids for each localized string. It can be used to trace back a localized string from an application to the specific row in the Soluling project. The id is injected in the end of the translation and written using zero width Unicode characters. A zero width Unicode character is a special character that does not render. This means that the extra characters do not render making the strings to look exactly as the normal translated strings. However if you application uses some runtime code to mark or trace translations you can easily extract the id from the translated string and then find the row where the translation comes from. In order to do that you have to write some code to decode the id. The following paragraph explains the encoding algorithm.
Each row in Soluling has a unique context. The context is a combination to elements where the row belongs and the row id. These context ids is describe but they are also quite long. It would be unpractical to inject that in the the translations. Instead soluling uses and integer ids. Every row has a unique id that does not ever change. The id is like the primary key in a databases. The first row gets 1, the second row 2, etc. This id is used when injecting ids. Soluling uses four different zero wide Unicode characters to encode the ids. This four character can be any from the following characters:
|Zero width space||200B||8203||E2808B|
|Zero width non joiner||200C||8204||E2808C||‌||yes|
|Zero width joiner||200D||8205||E2808D||‍||yes|
|Left to right mark||200E||8206||E2808E||‎|
|Left to right embedding||202A||8234||E280AA|
|Pop directional formatting||202C||8236||E280AC||yes|
|Left to right overwrite||202D||8237||E280AD||yes|
|Zero width no-break space||FEFF||65279||EFBBBF|
The default characters (Zero width non joiner, Zero width joiner, Pop directional formatting, and Left to right overwrite) works with most desktop, mobile and web applications. However you might have some troubles with the certain zero width characters. For example some of them may actually render or they might cause some other issues. If this is the case try to select a different set of four characters.
Each digit of the id is coded as hex using two zero width characters. The following table contains the combinations:
|0||char1 + char1|
|1||char1 + char2|
|2||char1 + char3|
|3||char1 + char4|
|4||char2 + char1|
|5||char2 + char2|
|6||char2 + char3|
|7||char2 + char4|
|8||char3 + char1|
|9||char3 + char2|
|A||char3 + char3|
|B||char3 + char4|
|C||char4 + char1|
|D||char4 + char2|
|E||char4 + char3|
|F||char4 + char4|
char1 is the first checked character, char2 is the second, etc.
For example if you translation is "Auto" and the row id of the rows is 183 that is 0xB7 as hex. Then the following translation is generated.
"Auto" + char3 + char4 + char2 + char4
If you use the default zero width characters the string will be
"Auto" + U+202C + U+2060 + U+200D + U+2060
By default Soluling does not inject hidden ids. If you want to use them you have to turn the feature on. Use the project build options. If you use SoluMake you can also use -injectid option.
SoluMake build -injectid MyProject.ntp
You can find the following reference code to encode and decode ids and to parse translations:
|Programming language||Source code|
To see how to use the API read the source code.
Note! Hidden id injection is enabled only if you have a Soluling edition that supports it such as Enterprise edition.