Fix/nation names special caracters (#4195)

> **Before opening a PR:** discuss new features on
[Discord](https://discord.gg/K9zernJB5z) first, and file bugs or small
improvements as
[issues](https://github.com/openfrontio/OpenFrontIO/issues/new/choose).
You must be assigned to an `approved` issue — unsolicited PRs will be
auto-closed.

**Add approved & assigned issue number here:** 

Resolves #4165

## Description:

This PR update the test checking validity of Nation Names to include the
new character constraint explained below.
It also fixes the 10 Nations that invalid characters (that did not
render correctly on the map).

**The new character constraint**
According to testing, the game map renders correctly all safe
Extended-ASCII characters (non colored in www.ascii-code.com =
[0x20–0x7E] or [0xA0-0xFF]). Other characters, when present in Nation
Names, are rendered correctly in the rest of the game but not on the
map, where they are trimmed to the last byte, which is then interpreted
as Extended-ASCII and rendered if possible.


**How to quickly check my assertion**
1. Change the file resources/maps/world/manifest.json, renaming one of
the countries to "a.á.आ!š!慢!".
2. Start a game on the world map without any bots
3. Verify that the nation name is well displayed in its overlay but is
shown as "a.á.!a!b!" on the map.
(characters before a point are preserved, but characters before an
exclamation mark are missing/changed).
4. run `npm run test` and notice that the NationName test fails and
lists the three non-valid characters.

Explanation: The string is represented in UNICODE-16 as
\u0061\u002e\u00e1\u002e\u0906\u0021\u0161\u0021\u6162\u0021.
Which, when we keep only the right-most byte of each character gives:
61 2e e1 2e 06 21 61 21 62 21
And, converted in Extended-ASCII gives:
a.á.�!a!b!
(which matches the showed name if we discard the control character).

**The 10 Nations which needed a fix**
Utqiaġvik from the Bearing Strait.
Ar Rayyān from the Strait of Hormuz.
6 Nations in the Bosphorus Straits.
2 Easter-egg Nations from Luna.

The 8 real-world Nations were adapted by simply removing the diacritics
(after confirmation from a speaker of arabic and turkish, but sadly none
for the Utqiaġvik Nation).
The Secret Base from Luna was renamed "T0Þ $e¢®ët Mi|¡tªr¥ ß@§£", all
within Extended-ASCII, keeping the same spirit as the original name.

However, the Monolith Nation (previously named ▊, without any flag) has
changed quite a lot and needs some explanation.

**Easter-egg Nation Monolith**
The new name is "ΜΟΝΟʟΙȚΗ", which is entirely outside of the valid
character zone but in a way that entirely disappears on the map (as the
आ character in the example above). This means that on the map, the
Nation has no name and only its Monolith-flag.
However, in all other places (leaderboard, overlay, alliances, warnings,
etc.) the name is displayed correctly.
The included test excludes this precise name from its violation list.

<img width="1512" height="632" alt="image"
src="https://github.com/user-attachments/assets/998693f2-edb4-417c-9054-35dc4819a57d"
/>
The Monolith Nation without its name but with a Monolith flag.

## Please complete the following:

- [x] I have added screenshots for all UI updates
- [x] I process any text displayed to the user through translateText()
and I've added it to the en.json file
- [x] I have added relevant tests to the test directory

## Please put your Discord username so you can be contacted if a bug or
regression is found:

Katokoda
This commit is contained in:
Katokoda
2026-06-10 22:44:37 +02:00
committed by GitHub
parent dda47b0813
commit 9e9708468c
11 changed files with 108 additions and 74 deletions
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="72" height="72" viewBox="0 0 72 72" xmlns="http://www.w3.org/2000/svg">
<rect x="319.416" y="262.264" width="0" height="0.628" fill="#000000" stroke="#000000" stroke-width="2" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0); stroke-width: 2px;"/>
<path fill="#000000" d="M 55 17 H 71.888 V 55 H 55 V 17 Z" style="fill: rgb(0, 0, 0); stroke: none;" class="st0"/>
<style>.st0 {
fill: #e60012;
}</style>
</svg>

After

Width:  |  Height:  |  Size: 478 B

+1 -1
View File
@@ -24,7 +24,7 @@
{
"coordinates": [1725, 158],
"flag": "Alaska",
"name": "Utqiaġvik"
"name": "Utqiagvik"
},
{
"coordinates": [2152, 270],
@@ -49,7 +49,7 @@
{
"coordinates": [534, 425],
"flag": "tr",
"name": "Kadıköy"
"name": "Kadiköy"
},
{
"coordinates": [559, 568],
@@ -94,27 +94,27 @@
{
"coordinates": [459, 157],
"flag": "tr",
"name": "Sarıyer"
"name": "Sariyer"
},
{
"coordinates": [477, 297],
"flag": "tr",
"name": "Beşiktaş"
"name": "Besiktas"
},
{
"coordinates": [171, 379],
"flag": "tr",
"name": "Avcılar"
"name": "Avcilar"
},
{
"coordinates": [308, 412],
"flag": "tr",
"name": "Bakırköy"
"name": "Bakirköy"
},
{
"coordinates": [263, 283],
"flag": "tr",
"name": "Başakşehir"
"name": "Basaksehir"
},
{
"coordinates": [402, 272],
+3 -3
View File
@@ -134,12 +134,12 @@
{
"coordinates": [755, 3035],
"flag": "",
"name": "T▆p░S▅cr▅t░M▊l▊t▅r▆░B▅s▅"
"name": "T0Þ $e¢®ët Mi|¡tªr¥ ß@§£"
},
{
"coordinates": [628, 921],
"flag": "",
"name": ""
"flag": "custom/luna_monolith",
"name": "ΜΟΝΟʟΙȚΗ"
}
],
"teamGameSpawnAreas": {
+1 -1
View File
@@ -99,7 +99,7 @@
{
"coordinates": [159, 756],
"flag": "qa",
"name": "Ar Rayyān"
"name": "Ar Rayyan"
},
{
"coordinates": [1103, 647],