* Replace non-block space with space
Fix of some editors create non-block spaces which cause issues.
* Replace non-block space with space
Fix single language run without config.sh OK
* Update Slovak po files
* revert delete of lang/po/Firmware_sk.po
* Fix typos
Unix format for md files
- using `PF-build.sh` with a parameter `-c 1` to keep lang build files after compiling
- using `PF-build.sh` with a parameter `-c 1` to keep lang build files after compiling
- change to `lang` folder
- change to `lang` folder
- check if lang scripts being able to run with `config.sh`
- check if lang scripts being able to run with `config.sh`
- if you get `Arduino main folder: NG` message change in `config.sh``export ARDUINO=C:/arduino-1.8.5` to `export ARDUINO=<Path to your Arduino IDE folder>`
- if you get `Arduino main folder: NG` message change in `config.sh``export ARDUINO=C:/arduino-1.8.5` to `export ARDUINO=<Path to your Arduino IDE folder>`
- run `lang-build.sh en` to create english `lang_en.tmp`, `lang_en.dat` and `lang_en.bin` files
- run `lang-build.sh en` to create english `lang_en.tmp`, `lang_en.dat` and `lang_en.bin` files
- change in `fw-build.sh``IGNORE_MISSING_TEXT=1` to `IGNORE_MISSING_TEXT=0` so it stops with error and generates `not_used<variant>.txt` and `not_tran<variant>.txt`
- change in `fw-build.sh``IGNORE_MISSING_TEXT=1` to `IGNORE_MISSING_TEXT=0` so it stops with error and generates `not_used<variant>.txt` and `not_tran<variant>.txt`
- run modified `fw-build.sh`
- run modified `fw-build.sh`
- `not_tran<variant>.txt` should be reviewed and added as these are potential missing translations
- `not_tran<variant>.txt` should be reviewed and added as these are potential missing translations
- copy `not_tran<variant>.txt` as `lang_add.txt`
- copy `not_tran<variant>.txt` as `lang_add.txt`
- check if there are things you don't want to translate or must be modifed
- check if there are things you don't want to translate or must be modified
- als check that the strings do not start with `spaces` as the scripts doesn't handle these well at this moment.
- als check that the strings do not start with `spaces` as the scripts doesn't handle these well at this moment.
- run `lang-add.sh lang_add.txt` to add the missing translations to `lang_en.txt` and `lang_en_??.txt`
- run `lang-add.sh lang_add.txt` to add the missing translations to `lang_en.txt` and `lang_en_??.txt`
- `not_used<variant>.txt` should only contain messages that aren't used in this variant like MK2.5/S vs MK3/S
- `not_used<variant>.txt` should only contain messages that aren't used in this variant like MK2.5/S vs MK3/S
- run `fw-clean.sh` to cleanup firmware related files
- run `fw-clean.sh` to cleanup firmware related files
- delete `not_used<variant>.txt` and `not_tran<variant>.txt`
- delete `not_used<variant>.txt` and `not_tran<variant>.txt`
- run `lang-clean.sh` to cleanup language related files
- run `lang-clean.sh` to cleanup language related files
- run `lang-export.sh all` to create PO files for translation these are stored in `/lang/po` folder
- run `lang-export.sh all` to create PO files for translation these are stored in `/lang/po` folder
- Send them to translators and reviewers or
- Send them to translators and reviewers or
- copy these to `/lang/po/new` and
- copy these to `/lang/po/new` and
- translate these with POEdit the newly added messages
- translate these with POEdit the newly added messages
- easiest way is to choose `Validate`in POEdit as it shows you `errors` and the `missing transalations` / most likely the newly added at the top.
- easiest way is to choose `Validate`in POEdit as it shows you `errors` and the `missing translations` / most likely the newly added at the top.
- The new translated files are expected in `/lang/po/new` folder so store the received files these
- The new translated files are expected in `/lang/po/new` folder so store the received files these
- run `lang-import.sh <language code (iso639-1)>` for each newly translated language
- run `lang-import.sh <language code (iso639-1)>` for each newly translated language
- script improvement to import "all" and other things would be great.
- script improvement to import "all" and other things would be great.
- Double check if something is missing or faulty
- Double check if something is missing or faulty
- run `PF-build.sh -v all -n 1 -c 1` to compile for all variants files
- run `PF-build.sh -v all -n 1 -c 1` to compile for all variants files
- check if there are still some messages in `not_tran<variant>.txt` that need attention
- check if there are still some messages in `not_tran<variant>.txt` that need attention
- After approval
- After approval
- run `fw-clean.sh` to cleanup firmware related files
- run `fw-clean.sh` to cleanup firmware related files
- run `lang-clean.sh` to cleanup language related files
- run `lang-clean.sh` to cleanup language related files
- change in `fw-build.sh` back to `IGNORE_MISSING_TEXT=1`
- change in `fw-build.sh` back to `IGNORE_MISSING_TEXT=1`
- build your firmware with `build.sh`, `PF-build.sh` or how you normally do it.
- build your firmware with `build.sh`, `PF-build.sh` or how you normally do it.
- Check/Test firmware on printer
- Check/Test firmware on printer
## Code / usage
## Code / usage
There are 2 modes of operation. If `LANG_MODE==0`, only one language is being used (the default compilation approach from plain Arduino IDE).
There are 2 modes of operation. If `LANG_MODE==0`, only one language is being used (the default compilation approach from plain Arduino IDE).
The reset of this explanation is devoted to `LANG_MODE==1`:
The reset of this explanation is devoted to `LANG_MODE==1`:
`language.h`:
`language.h`:
```C++
```C++
// section .loc_sec (originaly .progmem0) will be used for localized translated strings
// section .loc_sec (originally .progmem0) will be used for localized translated strings
- `_i` expands into `lang_get_translation((__extension__({static const char __c[] PROGMEM_I1 = "\xff\xff" s; &__c[0];})))` . Note the two 0xff's in the beginning of the string. `_i` allows for declaring a string directly inplace of C++ code, no string table is used. The downside of this approach is obvious - the compiler is not able/willing to merge duplicit strings into one.
- `_i` expands into `lang_get_translation((__extension__({static const char __c[] PROGMEM_I1 = "\xff\xff" s; &__c[0];})))` . Note the two 0xff's in the beginning of the string. `_i` allows for declaring a string directly in-place of C++ code, no string table is used. The downside of this approach is obvious - the compiler is not able/willing to merge duplicate strings into one.
- `_T` expands into `lang_get_translation(s)` without the two 0xff's at the beginning. Must be used in conjunction with MSG tables in `messages.h`. Allows to declare a string only once and use many times.
- `_T` expands into `lang_get_translation(s)` without the two 0xff's at the beginning. Must be used in conjunction with MSG tables in `messages.h`. Allows to declare a string only once and use many times.
- `_N` means not-translated. These strings reside in a different segment of memory.
- `_N` means not-translated. These strings reside in a different segment of memory.
The two 0xff's are somehow magically replaced by real string ID's where the translations are available (still don't know where).
The two 0xff's are somehow magically replaced by real string ID's where the translations are available (still don't know where).
```C++
```C++
const char* lang_get_translation(const char* s){
const char* lang_get_translation(const char* s){
if (lang_selected == 0) return s + 2; //primary language selected, return orig. str.
if (lang_selected == 0) return s + 2; //primary language selected, return orig. str.
if (lang_table == 0) return s + 2; //sec. lang table not found, return orig. str.
if (lang_table == 0) return s + 2; //sec. lang table not found, return orig. str.
uint16_t ui = pgm_read_word(((uint16_t*)s)); //read string id
uint16_t ui = pgm_read_word(((uint16_t*)s)); //read string id
if (ui == 0xffff) return s + 2; //translation not found, return orig. str.
if (ui == 0xffff) return s + 2; //translation not found, return orig. str.
"Crash detection can\x0abe turned on only in\x0aNormal mode"
"Crash detection can\x0abe turned on only in\x0aNormal mode"
```
```
### `lang_en_*.txt`
### `lang_en_*.txt`
```
```
#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
"Crash detection can\x0abe turned on only in\x0aNormal mode"
"Crash detection can\x0abe turned on only in\x0aNormal mode"
"Crash detekce muze\x0abyt zapnuta pouze v\x0aNormal modu"
"Crash detekce muze\x0abyt zapnuta pouze v\x0aNormal modu"
```
```
1. a comment - usually a MSG define with number of characters (c) and rows (r)
1. a comment - usually a MSG define with number of characters (c) and rows (r)
2. English text
2. English text
3. translated text
3. translated text
### `not_tran.txt`
### `not_tran.txt`
A simple list of strings that are not translated yet.
A simple list of strings that are not translated yet.
### `not_used.txt`
### `not_used.txt`
A list os strings not currently used in this variant of the firmware or are obsolete.
A list os strings not currently used in this variant of the firmware or are obsolete.
Example: There are MK2.5 specific messages that aren't used when you compile a MK3 variant and vice versa. So be carefull and double check the code if this message is obsolete or just not used due to the chosen variant.
Example: There are MK2.5 specific messages that aren't used when you compile a MK3 variant and vice versa. So be careful and double check the code if this message is obsolete or just not used due to the chosen variant.
## Scripts
## Scripts
### `config.sh`
### `config.sh`
- Checks setup and sets auxiliary env vars used in many other scripts.
- Checks setup and sets auxiliary env vars used in many other scripts.
- Looks for env var `ARDUINO`. If not found/empty, a default `C:/arduino-1.8.5` is used.
- Looks for env var `ARDUINO`. If not found/empty, a default `C:/arduino-1.8.5` is used.
- Sets env var `CONFIG_OK=1` when all good, otherwise sets `CONFIG_OK=0`
- Sets env var `CONFIG_OK=1` when all good, otherwise sets `CONFIG_OK=0`
### `fw-build.sh`
### `fw-build.sh`
Joins firmware HEX and language binaries into one file.
Joins firmware HEX and language binaries into one file.
### `fw-clean.sh`
### `fw-clean.sh`
### `lang-add.sh`
### `lang-add.sh`
Adds new messages into the dictionary regardless of whether there have been any older versions.
Adds new messages into the dictionary regardless of whether there have been any older versions.
### `lang-build.sh`
### `lang-build.sh`
Generates lang_xx.bin (language binary files) for the whole firmware build.
Generates lang_xx.bin (language binary files) for the whole firmware build.
Arguments:
Arguments:
- `$1` : language code (`en`, `cz`, `de`, `es`, `fr`, `it`, `pl`) or `all`
- `$1` : language code (`en`, `cz`, `de`, `es`, `fr`, `it`, `pl`) or `all`
- empty/no arguments defaults to `all`
- empty/no arguments defaults to `all`
Input: `lang_en.txt` or `lang_en_xx.txt`
Input: `lang_en.txt` or `lang_en_xx.txt`
Output: `lang_xx.bin`
Output: `lang_xx.bin`
Temporary files: `lang_xx.tmp` and `lang_xx.dat`
Temporary files: `lang_xx.tmp` and `lang_xx.dat`
Description of the process:
Description of the process:
The script first runs `lang-check.py $1` and removes empty lines and comments (and non-translated texts) into `lang_$1.tmp`.
The script first runs `lang-check.py $1` and removes empty lines and comments (and non-translated texts) into `lang_$1.tmp`.
The tmp file now contains all translated texts (some of them empty, i.e. "").
The tmp file now contains all translated texts (some of them empty, i.e. "").
The tmp file is then transformed into `lang_$1.dat`, which is a simple dump of all texts together, each terminated with a `\x00`.
The tmp file is then transformed into `lang_$1.dat`, which is a simple dump of all texts together, each terminated with a `\x00`.
Format of the `bin` file:
Format of the `bin` file:
- 00-01: `A5 5A`
- 00-01: `A5 5A`
- 02-03: `B4 4B`
- 02-03: `B4 4B`
- 04-05: 2B size
- 04-05: 2B size
- 06-07: 2B number of strings
- 06-07: 2B number of strings
- 08-09: 2B checksum
- 08-09: 2B checksum
- 0A-0B: 2B lang code hex data: basically `en` converted into `ne`, i.e. characters swapped. Only `cz` is changed into `sc` (old `cs` ISO code).
- 0A-0B: 2B lang code hex data: basically `en` converted into `ne`, i.e. characters swapped. Only `cz` is changed into `sc` (old `cs` ISO code).
- 0C-0D: 2B signature low
- 0C-0D: 2B signature low
- 0E-0F: 2B signature high
- 0E-0F: 2B signature high
- 10-(10 + 2*number of strings): table of string offsets from the beginning of this file
- 10-(10 + 2*number of strings): table of string offsets from the beginning of this file
- after the table there are the strings themselves, each terminated with `\x00`
- after the table there are the strings themselves, each terminated with `\x00`
The signature is composed of 2B number of strings and 2B checksum in lang_en.bin. Signature in lang_en.bin is zero.
The signature is composed of 2B number of strings and 2B checksum in lang_en.bin. Signature in lang_en.bin is zero.
### `lang-check.sh` and `lang-check.py`
### `lang-check.sh` and `lang-check.py`
Both do the same, only lang-check.py is newer, i.e. lang-check.sh is not used anymore.
Both do the same, only lang-check.py is newer, i.e. lang-check.sh is not used anymore.
lang-check.py makes a binary comparison between what's in the dictionary and what's in the binary.
lang-check.py makes a binary comparison between what's in the dictionary and what's in the binary.
### `lang-clean.sh`
### `lang-clean.sh`
Removes all language output files from lang folder. That means deleting:
Removes all language output files from lang folder. That means deleting:
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.