diff --git a/example_mods/french-language/README.md b/example_mods/french-language/README.md
deleted file mode 100644
index 060eaba508..0000000000
--- a/example_mods/french-language/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# introMod
-
-This intro mod demonstrates two simple things:
-
-1. You can replace any game asset simply by placing a modded asset in the right spot.
-2. You can append to text files simply by placing a text file in the right spot, but under the `_append` directory.
\ No newline at end of file
diff --git a/example_mods/french-language/_append/locales/index.xml b/example_mods/french-language/_append/locales/index.xml
index 2fd5af99b4..c3dc4d9872 100644
--- a/example_mods/french-language/_append/locales/index.xml
+++ b/example_mods/french-language/_append/locales/index.xml
@@ -4,6 +4,6 @@
-
+
diff --git a/example_mods/french-language/_merge/locales/index.xml b/example_mods/french-language/_merge/locales/index.xml
index 641aabcdde..c05a8bd37c 100644
--- a/example_mods/french-language/_merge/locales/index.xml
+++ b/example_mods/french-language/_merge/locales/index.xml
@@ -1,8 +1,8 @@
-
+
+
+
diff --git a/example_mods/french-language/_polymod_meta.json b/example_mods/french-language/_polymod_meta.json
index 148f8d24ad..7ef0186f4a 100644
--- a/example_mods/french-language/_polymod_meta.json
+++ b/example_mods/french-language/_polymod_meta.json
@@ -1,5 +1,5 @@
{
- "title": "Intro Mod",
+ "title": "French Localization Mod",
"description": "A localization testing mod",
"contributors": [
{
diff --git a/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/roses-censored.json b/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/roses-censored.json
new file mode 100644
index 0000000000..208f2c5a67
--- /dev/null
+++ b/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/roses-censored.json
@@ -0,0 +1,59 @@
+{
+ "version": "1.0.0",
+
+ "backdrop": {
+ "type": "solid",
+ "fadeTime": 2.0,
+ "color": "#BFB3DFD8"
+ },
+
+ "music": {
+ "asset": "Lunchbox",
+ "fadeTime": 2.0,
+ "looped": true
+ },
+
+ "outro": {
+ "type": "fade",
+ "fadeTime": 1.0
+ },
+
+ "dialogue": [
+ {
+ "speaker": "senpai-angry",
+ "speakerAnimation": "talk",
+ "box": "roses",
+ "boxAnimation": "angrySenpai",
+
+ "text": ["Pas mauvais pour un ver de terre."]
+ },
+ {
+ "speaker": "senpai-angry",
+ "speakerAnimation": "talk",
+ "box": "roses",
+ "boxAnimation": "idle",
+
+ "text": ["Mais cette fois je vais te faire crier..."],
+ "speed": 0.5
+ },
+ {
+ "speaker": "senpai-angry",
+ "speakerAnimation": "talk",
+ "box": "roses",
+ "boxAnimation": "idle",
+
+ "text": [
+ "Presque autant que ta petite amie que je ferai crier plus tard ce soir, gros nain."
+ ],
+ "speed": 0.5
+ },
+ {
+ "speaker": "bf-pixel",
+ "speakerAnimation": "talkEnter",
+ "box": "roses",
+ "boxAnimation": "idle",
+
+ "text": ["Bop beep be be skdoo bep"]
+ }
+ ]
+}
diff --git a/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/roses.json b/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/roses.json
new file mode 100644
index 0000000000..ef51e47ec4
--- /dev/null
+++ b/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/roses.json
@@ -0,0 +1,49 @@
+{
+ "version": "1.0.0",
+
+ "backdrop": {
+ "type": "solid",
+ "fadeTime": 2.0,
+ "color": "#BFB3DFD8"
+ },
+
+ "music": {
+ "asset": "Lunchbox",
+ "fadeTime": 2.0,
+ "looped": true
+ },
+
+ "outro": {
+ "type": "fade",
+ "fadeTime": 1.0
+ },
+
+ "dialogue": [
+ {
+ "speaker": "senpai-angry",
+ "speakerAnimation": "talk",
+ "box": "roses",
+ "boxAnimation": "angrySenpai",
+
+ "text": ["Pas mauvais pour un ver de terre."]
+ },
+ {
+ "speaker": "senpai-angry",
+ "speakerAnimation": "talk",
+ "box": "roses",
+ "boxAnimation": "idle",
+
+ "text": [
+ "Mais cette fois, je t'arracherai les noix juste après que ta copine aura fini de jouer avec les miennes."
+ ]
+ },
+ {
+ "speaker": "bf-pixel",
+ "speakerAnimation": "talkEnter",
+ "box": "roses",
+ "boxAnimation": "idle",
+
+ "text": ["Bop beep be be skdoo bep"]
+ }
+ ]
+}
diff --git a/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/senpai.json b/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/senpai.json
new file mode 100644
index 0000000000..e507eed417
--- /dev/null
+++ b/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/senpai.json
@@ -0,0 +1,51 @@
+{
+ "version": "1.0.0",
+
+ "backdrop": {
+ "type": "solid",
+ "fadeTime": 2.0,
+ "color": "#BFB3DFD8"
+ },
+
+ "music": {
+ "asset": "Lunchbox",
+ "fadeTime": 2.0,
+ "looped": true
+ },
+
+ "outro": {
+ "type": "fade",
+ "fadeTime": 1.0
+ },
+
+ "dialogue": [
+ {
+ "speaker": "senpai",
+ "speakerAnimation": "talkEnter",
+ "box": "roses",
+ "boxAnimation": "enter",
+
+ "text": [
+ "Ah, une nouvelle belle et jeune fille est venue en quête du véritable amour !"
+ ]
+ },
+ {
+ "speaker": "senpai",
+ "speakerAnimation": "talk",
+ "box": "roses",
+ "boxAnimation": "speaking",
+
+ "text": [
+ "Une sérénade entre gentlemen décidera de qui son beau cœur appartiendra."
+ ]
+ },
+ {
+ "speaker": "bf-pixel",
+ "speakerAnimation": "talkEnter",
+ "box": "roses",
+ "boxAnimation": "speaking",
+
+ "text": ["Beep bo bop"]
+ }
+ ]
+}
diff --git a/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/thorns.json b/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/thorns.json
new file mode 100644
index 0000000000..4499b26ece
--- /dev/null
+++ b/example_mods/french-language/locales/fr-FR/assets/data/dialogue/conversations/thorns.json
@@ -0,0 +1,64 @@
+{
+ "version": "1.0.0",
+
+ "backdrop": {
+ "type": "solid",
+ "fadeTime": 2.0,
+ "color": "#BFB3DFD8"
+ },
+
+ "music": {
+ "asset": "LunchboxScary",
+ "fadeTime": 2.0,
+ "looped": true
+ },
+
+ "outro": {
+ "type": "fade",
+ "fadeTime": 1.0
+ },
+
+ "dialogue": [
+ {
+ "speaker": "spirit",
+ "speakerAnimation": "talk",
+ "box": "thorns",
+ "boxAnimation": "enter",
+
+ "text": [
+ "Contact direct avec de vrais humains, après avoir été enfermé ici pendant si longtemps...",
+ " et avec ELLE parmis tant de monde."
+ ],
+ "speed": 1.0
+ },
+ {
+ "speaker": "spirit",
+ "speakerAnimation": "talk",
+ "box": "thorns",
+ "boxAnimation": "idle",
+
+ "text": [
+ "Je ferai payer à son père ce qu'il m'a fait, à moi et à tous les autres..."
+ ]
+ },
+ {
+ "speaker": "spirit",
+ "speakerAnimation": "talk",
+ "box": "thorns",
+ "boxAnimation": "idle",
+
+ "text": ["Je te battrai et tu prendras ma place."]
+ },
+ {
+ "speaker": "spirit",
+ "speakerAnimation": "talk",
+ "box": "thorns",
+ "boxAnimation": "idle",
+
+ "text": [
+ "Cela ne vous dérange pas que vos corps soient empruntés, n'est-ce pas ?",
+ " C'est ce qu'il y a de plus juste..."
+ ]
+ }
+ ]
+}
diff --git a/example_mods/french-language/locales/fr-FR/assets/data/introText.txt b/example_mods/french-language/locales/fr-FR/assets/data/introText.txt
new file mode 100644
index 0000000000..d7114e2209
--- /dev/null
+++ b/example_mods/french-language/locales/fr-FR/assets/data/introText.txt
@@ -0,0 +1,61 @@
+shoutouts to tom fulp--lmao
+Ludum dare--extraordinaire
+cyberzone--coming soon
+love to thriftman--swag
+ultimate rhythm gaming--probably
+dope ass game--playstation magazine
+in loving memory of--henryeyes
+dancin--forever
+funkin--forever
+ritz dx--rest in peace lol
+rate five--pls no blam
+rhythm gaming--ultimate
+game of the year--forever
+you already know--we really out here
+rise and grind--love to luis
+like parappa--but cooler
+album of the year--chuckie finster
+free gitaroo man--with love to wandaboy
+better than geometry dash--fight me robtop
+kiddbrute for president--vote now
+play dead estate--on newgrounds
+this is a god damn prototype--we workin on it okay
+women are real--this is official
+too over exposed--newgrounds cant handle us
+Hatsune Miku--biggest inspiration
+too many people--my head hurts
+newgrounds--forever
+refined taste in music--if i say so myself
+his name isnt keith--dumb eggy lol
+his name isnt evan--silly tiktok
+stream chuckie finster--on spotify
+never forget to--pray to god
+dont play rust--we only funkin
+good bye--my penis
+dababy--biggest inspiration
+fashionably late--but here it is
+yooooooooooo--yooooooooo
+pico funny--pico funny
+updates each friday--on time every time
+shoutouts to mason--for da homies
+bonk--get in the discord call
+carpal tunnel--game design
+downscroll--i dont know what that is
+warning--choking hazard
+devin chat--what an honorable man
+kickstarter exclusive--intro text
+cussing--we have it
+parental advisory--explicit content
+pico says--trans rights
+album of the year--damage control
+proudly made--via newgrounds pms
+nicotine induced--game development
+free crackheads--with love to figburn
+press square--to open your popit menu
+jojo sez--shoooooooom
+updates each pico day--on time every time
+macromedia software--legally obtained
+under judgement--proud resident
+make tom proud--weekly second
+to enable pen pressure--disable windows ink
+trending--only on x
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/easy.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/easy.png
new file mode 100644
index 0000000000..793a345cc6
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/easy.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/erect.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/erect.png
new file mode 100644
index 0000000000..11be2a9ec3
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/erect.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/hard.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/hard.png
new file mode 100644
index 0000000000..d060014ce7
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/hard.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/nightmare.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/nightmare.png
new file mode 100644
index 0000000000..f540e11ccb
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/nightmare.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/nightmare.xml b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/nightmare.xml
new file mode 100644
index 0000000000..51ef647e4e
--- /dev/null
+++ b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/nightmare.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/normal.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/normal.png
new file mode 100644
index 0000000000..fa56964b03
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/difficulties/normal.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/tutorial.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/tutorial.png
new file mode 100644
index 0000000000..19a978a659
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/tutorial.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week1.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week1.png
new file mode 100644
index 0000000000..83d730749d
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week1.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week2.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week2.png
new file mode 100644
index 0000000000..7d22cdedd1
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week2.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week3.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week3.png
new file mode 100644
index 0000000000..8e47e6c30b
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week3.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week4.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week4.png
new file mode 100644
index 0000000000..7122f9791d
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week4.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week5.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week5.png
new file mode 100644
index 0000000000..1a3a02a8c6
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week5.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week6.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week6.png
new file mode 100644
index 0000000000..0e02a8b1fb
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week6.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week7.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week7.png
new file mode 100644
index 0000000000..39bf28bf2a
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/week7.png differ
diff --git a/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/weekend1.png b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/weekend1.png
new file mode 100644
index 0000000000..74e825d54e
Binary files /dev/null and b/example_mods/french-language/locales/fr-FR/assets/images/storymenu/titles/weekend1.png differ
diff --git a/source/funkin/modding/PolymodHandler.hx b/source/funkin/modding/PolymodHandler.hx
index e5bcae0f55..335198547c 100644
--- a/source/funkin/modding/PolymodHandler.hx
+++ b/source/funkin/modding/PolymodHandler.hx
@@ -335,8 +335,19 @@ class PolymodHandler
{
return {
assetLibraryPaths: [
- 'default' => 'preload', 'shared' => 'shared', 'songs' => 'songs', 'videos' => 'videos', 'tutorial' => 'tutorial', 'week1' => 'week1',
- 'week2' => 'week2', 'week3' => 'week3', 'week4' => 'week4', 'week5' => 'week5', 'week6' => 'week6', 'week7' => 'week7', 'weekend1' => 'weekend1',
+ 'default' => 'preload',
+ 'shared' => 'shared',
+ 'songs' => 'songs',
+ 'videos' => 'videos',
+ 'tutorial' => 'tutorial',
+ 'week1' => 'week1',
+ 'week2' => 'week2',
+ 'week3' => 'week3',
+ 'week4' => 'week4',
+ 'week5' => 'week5',
+ 'week6' => 'week6',
+ 'week7' => 'week7',
+ 'weekend1' => 'weekend1',
],
coreAssetRedirect: CORE_FOLDER,
}
@@ -431,5 +442,6 @@ class PolymodHandler
CharacterDataParser.loadCharacterCache(); // TODO: Migrate characters to BaseRegistry.
NoteKindManager.loadScripts();
ModuleHandler.loadModuleCache();
+ Localization.init();
}
}
diff --git a/source/funkin/ui/story/StoryMenuState.hx b/source/funkin/ui/story/StoryMenuState.hx
index 50dd2faafd..2486558da2 100644
--- a/source/funkin/ui/story/StoryMenuState.hx
+++ b/source/funkin/ui/story/StoryMenuState.hx
@@ -313,7 +313,7 @@ class StoryMenuState extends MusicBeatState
highScoreLerp = Std.int(MathUtil.smoothLerp(highScoreLerp, highScore, elapsed, 0.25));
- scoreText.text = Localization.tongue.get("$LEVEL_SCORE", "menus") + ' ${Math.round(highScoreLerp)}';
+ scoreText.text = Localization.tongue.get("$LEVEL_SCORE", "story_menu") + ' ${Math.round(highScoreLerp)}';
levelTitleText.text = currentLevel.getTitle();
levelTitleText.x = FlxG.width - (levelTitleText.width + 10); // Right align.