# Stonevoice Translator Revision History

## Version 2.2.1

### New Features

- New Align Structure with Reference command, that can be used to replace an existing translation with an updated version in-place, without the need to load the previous version as an Old Translation.
- When a reference and a translation are both loaded, the files are now compared, and, if they do not match, the user is presented with options to align the structure of the translation.
- The Contents tree view now displays part of the actual reference strings beside their names, when the string names are numeric. Additional options allow for unconditionally displaying the strings in the Contents tree view.
- New `Examples` folder, containing detailed translatable files that can be opened using Stonevoice Translator. The example files demonstrate the following features:
  - Translation Notes (`$TNote:`, `$TNotes:`)
  - Sections and subsections (`$TSection:`, `***`)
  - Additional key-value separators (`:` and `,`)
  - Comment signs (`;` and `#` and `//`)
  - Translator Trees (`.svt` files)
  - Sounds and images
- Now a warning is shown if a file with no translatable entries is opened.

### Changes

- Now the comma (`,`) is considered a valid key-value separator for all INI-like language files. This modification can cause a slight incompatibility with INI-like files that intentionally use a comma in the string name. Example of the new supported file format:

      [Strings]
      1,Message string one
      2,Message string two

- Improved parsing of FlasKMPEG-like files: now the leading and trailing whitespace in string identifiers is ignored, and identifiers with spaces in the middle are not loaded. Example:

      #1 # "Message string one"
      #string id# "This is not a valid string identifier anymore"

- It is now possible to use an empty `$TNote:` element to reset the effect of a `$TNotes:` element. Example:

      [Strings]
      ; $TNotes: This is an example string
      StringOne=Annotated string one
      StringTwo=Annotated string two
      ; $TNote:
      StringThree=This string has no note

- Now the standard information header (containing the program version and the control codes definitions) can be placed in any position before the first translatable entry or section, while previously it had to be placed in the first two lines of the file. Example of the new supported modality:

      ; Comments before the information header.
      ;
      ; Translation made with Stonevoice Translator 2.2 (http://www.stonevoice.com/auto/translator)
      ; $Translator:NL=%n:TB=%t
      ;
      ; More comments after the information header.

      [Strings]
      ; ...

- When a node in the Contents tree view is removed, any associated tag is now deleted immediately, instead of at the next tree reload. This improves tagfile (`.tgf` file) cleanliness.
- Now the the Decorations don't match and Case doesn't match properties are evaluated even if their associated alerter is disabled in the program options.
- The Options dialog has been reorganized. Now the selected tab is remembered when the window is reopened.
- Now the custom information header is recognized even if the words in it have a different case from what is specified in the Options dialog.

### Fixes

- The program might stop with run-time error '5' when a single symmetric decoration (for example, with the default configuration, the double quote character) is present in the Translation text box.
- In INI-like files, the Hide quotes option had no effect.
- In FlasKMPEG-like files, a quoted INI-like entry that should have been ignored might be parsed anyway.
- If a custom information header was set, unexpected file loading errors might occur.

## Version 2.1.11

### Fixes

- The last entry in an INI-like file was ignored if the file did not end with an end-of-line character.

## Version 2.1.10

### New Features

- Inno Setup-style subsection separations (using three asterisks) are now supported in INI-like files (both `.ini` and `.isl` file extensions). The subsections are displayed in the Contents tree view. Example:

      [Messages]

      ; *** First subsection title
      MessageNameOne=Message string

      ; *** Second subsection title
      MessageNameTwo=Message string