2020.9.13.591 - Added Neos Localization Support, Czech translation, more to come
Neos is going multilingual! Introducing a new localization system, which currently allows all core UI to be translated into different languages. Currently it's available only in the original English version (but it has a bunch of improvements and better formatting in places as a result) and new Czech version (translated by me, might be a bit odd since I was doing it at the same time as converting all the UI, contributions to it are welcome).
If you'd like to help translate Neos into another language, you can do so through a public repository here: https://github.com/Frooxius/NeosLocale Just clone it, make your contributions and make a Pull Request so I can merge your contributions. Detailed instructions are coming within a day, you can check the en.json and cs.json files.
To quickly test your translations, simply copy them over to "Locale" subfolder next to Neos.exe, it will load them up. Make sure to use the correct language code (it uses the IETF language tag, use only the primary language tag if possible). The messages use the Unicode ICU MessageFormat syntax, details here: https://unicode-org.github.io/icu/userguide/format_parse/messages/
This build also contains some more tweaks and bugfixes, but most of the work was focused on converting into to multilingual support. There's still a few things to do, but vast majority should be translatable now! I might've also missed a few places and they might now display incorrect text as I was doing the bulk of it, please let me know.
[h2]New Features:[/h2]
- Implemented a localization/translation system for Neos, allowing the UI to be translated into any language (originally requested by @AlienInArea51 (MR-Alex) and many others)
-- You can dynamically change Neos' language if you go to Settings and type language code to "Override Locale" - e.g. en, cs or ja
-- This is done through new type of asset "LocaleResource" which contains localized strings
-- If given translation string isn't available in given locale, it will fall back to more general locale first, then to English (e.g. en-gb -> en or cs -> en)
-- New component LocaleStringDriver has been added, which will drive a string field with a localized string from the asset and optional arguments
-- Integrated the ICU MessageFormat syntax (https://unicode-org.github.io/icu/userguide/format_parse/messages/) for translation strings, allowing for variable replacement, selection, plural and number formatters to support wide variety of languages and high level of flexibility
-- Converted vast majority of Neos' UI to be localizable - dash, various dialogs, context menus, loading messages, tools, Create New, importer dialogs and many more
-- Inspector and Node names are not translatable yet, but are coming soon
-- English version of UI now has correct pluralization in places (e.g. "1 item" instead of "1 items") and various places now use % formatting instead of raw number (e.g. 42% instead of 0.42)
-- Added internal "LocaleString" type, which allows passing both non-localized and localized string data and will automatically propagate through many Neos' UI API's, automatically setting up components with LocaleStringDriver where possible (this allows the language to dynamically change without having to regenerate the UI)
-- Currently this system is only usable for core Neos UI, later on this system will be extended so you can import and reference your own locale resources to allow your items, worlds and tools be translatable as well
-- You can find the LocaleResources files in the "Locale" subfolder with your Neos installation
-- Added Czech translation of Neos (other languages depend on community contributions, will add them as they come)
- Added ConnectRetryInterval to WebsocketClient and connection retry logic
-- If the client gets disconnected or fails to connect, it will retry connection attempts at the specified interval
-- Interval is in seconds. If you want to disable the behavior, put Infinity as the value
[h2]Tweaks:[/h2]
- Changed linking mechanism for Facet presets for SearchBar and PagingControl - they are now setup themselves with general dynamic variable names, rather then being setup externally
- "Friends" tab has been renamed to "Contacts" (based on suggestions from @Shifty | Quality Control Lead, @Rue Shejn | Artist 3D and @Veer | Chief Moderation Officer on behalf of others as well)
- Cloud API now has extra validation for NCR withdrawal requests, rejecting any requests that don't contain a valid target address
- Set minimum NCR withdrawal to 50, to avoid transactions costs being higher than the transfered amount (requested by @Karel | CEO)
- Upgraded to Unity 2019.4.10f1 (from 2019.4.9f1)
[h2]Bugfixes:[/h2]
- Added SessionID check when establishing connection to a session, to prevent confusion when user joins an old invite/URL with Steam Networking Sockets (or direct IP URL) that is running a different publicly accessible session on the same Steam channel or IP (based on problem report by @Rue Shejn | Artist 3D and @Theo | Video Production)
- Fixed FilterInvalid node for quaternions defaulting the Fallback to invalid quaternion (reported by @H3BO3)
- Fixed detection when in-world laser is severely misalisnged with the userspace one, preventing the userspace laser from overriding the position and direction and the private UI to be interacted with (based on report by @SmolCookie and @Shifty | Quality Control Lead)

If you'd like to help translate Neos into another language, you can do so through a public repository here: https://github.com/Frooxius/NeosLocale Just clone it, make your contributions and make a Pull Request so I can merge your contributions. Detailed instructions are coming within a day, you can check the en.json and cs.json files.
To quickly test your translations, simply copy them over to "Locale" subfolder next to Neos.exe, it will load them up. Make sure to use the correct language code (it uses the IETF language tag, use only the primary language tag if possible). The messages use the Unicode ICU MessageFormat syntax, details here: https://unicode-org.github.io/icu/userguide/format_parse/messages/
This build also contains some more tweaks and bugfixes, but most of the work was focused on converting into to multilingual support. There's still a few things to do, but vast majority should be translatable now! I might've also missed a few places and they might now display incorrect text as I was doing the bulk of it, please let me know.
[h2]New Features:[/h2]
- Implemented a localization/translation system for Neos, allowing the UI to be translated into any language (originally requested by @AlienInArea51 (MR-Alex) and many others)
-- You can dynamically change Neos' language if you go to Settings and type language code to "Override Locale" - e.g. en, cs or ja
-- This is done through new type of asset "LocaleResource" which contains localized strings
-- If given translation string isn't available in given locale, it will fall back to more general locale first, then to English (e.g. en-gb -> en or cs -> en)
-- New component LocaleStringDriver has been added, which will drive a string field with a localized string from the asset and optional arguments
-- Integrated the ICU MessageFormat syntax (https://unicode-org.github.io/icu/userguide/format_parse/messages/) for translation strings, allowing for variable replacement, selection, plural and number formatters to support wide variety of languages and high level of flexibility
-- Converted vast majority of Neos' UI to be localizable - dash, various dialogs, context menus, loading messages, tools, Create New, importer dialogs and many more
-- Inspector and Node names are not translatable yet, but are coming soon
-- English version of UI now has correct pluralization in places (e.g. "1 item" instead of "1 items") and various places now use % formatting instead of raw number (e.g. 42% instead of 0.42)
-- Added internal "LocaleString" type, which allows passing both non-localized and localized string data and will automatically propagate through many Neos' UI API's, automatically setting up components with LocaleStringDriver where possible (this allows the language to dynamically change without having to regenerate the UI)
-- Currently this system is only usable for core Neos UI, later on this system will be extended so you can import and reference your own locale resources to allow your items, worlds and tools be translatable as well
-- You can find the LocaleResources files in the "Locale" subfolder with your Neos installation
-- Added Czech translation of Neos (other languages depend on community contributions, will add them as they come)
- Added ConnectRetryInterval to WebsocketClient and connection retry logic
-- If the client gets disconnected or fails to connect, it will retry connection attempts at the specified interval
-- Interval is in seconds. If you want to disable the behavior, put Infinity as the value
[h2]Tweaks:[/h2]
- Changed linking mechanism for Facet presets for SearchBar and PagingControl - they are now setup themselves with general dynamic variable names, rather then being setup externally
- "Friends" tab has been renamed to "Contacts" (based on suggestions from @Shifty | Quality Control Lead, @Rue Shejn | Artist 3D and @Veer | Chief Moderation Officer on behalf of others as well)
- Cloud API now has extra validation for NCR withdrawal requests, rejecting any requests that don't contain a valid target address
- Set minimum NCR withdrawal to 50, to avoid transactions costs being higher than the transfered amount (requested by @Karel | CEO)
- Upgraded to Unity 2019.4.10f1 (from 2019.4.9f1)
[h2]Bugfixes:[/h2]
- Added SessionID check when establishing connection to a session, to prevent confusion when user joins an old invite/URL with Steam Networking Sockets (or direct IP URL) that is running a different publicly accessible session on the same Steam channel or IP (based on problem report by @Rue Shejn | Artist 3D and @Theo | Video Production)
- Fixed FilterInvalid node for quaternions defaulting the Fallback to invalid quaternion (reported by @H3BO3)
- Fixed detection when in-world laser is severely misalisnged with the userspace one, preventing the userspace laser from overriding the position and direction and the private UI to be interacted with (based on report by @SmolCookie and @Shifty | Quality Control Lead)


