Skip to content

Language Files

Eren edited this page Mar 9, 2025 · 5 revisions

Modifying Existing Languages

  • First, open the game's localization file located in data/localization.json.
  • Next, find the string you want to modify, I will modify the "Play demo levels" text for demonstration.
"playdemolevels": {
  "en": "Play Demo Levels",
  "owo": "Pway demo levews"
}
  • It has 2 translations, one for English and the other for the cursed language. I want to modify the English version so I will create a file named assets/lang/en.json file in my mod folder and type the following:
{
  "playdemolevels": "My custom text!"
}

Now when I open the game the "Play demo levels" text will change.

image

Adding New Languages

If you want to add new languages, the process is the same except you need to translate every string. You can name the file whatever you want as long as it's not used by the game. You can find a template for Beatblock v0.4.1 below:

Click to expand
{
  "playdemolevels": "Play Demo Levels",
  "customs": "Custom Levels",
  "settings": "Settings",
  "credits": "Credits",
  "exitgame": "Exit Game",
  "marathon": "Marathon",
  "devLevelSelect": "Developer Level Select",
  "discordLink": "Join our Discord!",
  "twitterPlug": "Follow us on Bluesky! @beatblock.bsky.social",
  "tutorialNag": "Please play the tutorial in \"Play Demo Levels\" before playing custom levels. ",
  "returnToMenuPrompt_keyboard": "(press escape to return to menu)",
  "returnToMenuPrompt_controller": "(press start to return to menu)",
  "optionsHint": "(Left and Right to change values)",
  "optionsEnabled": ": Enabled",
  "optionsDisabled": ": Disabled",
  "optionsHitsounds": "Hitsounds",
  "optionsInputOffset": "Input offset: @@1@@ ms",
  "optionsCalibrate": "Calibrate",
  "optionsSfxVolume": "SFX volume: @@1@@",
  "optionsMusicVolume": "Music volume: @@1@@",
  "optionsFullscreen": "Fullscreen",
  "optionsWindowScale": "Window scale: @@1@@x",
  "optionsPlayMenuMusic": "Play menu music",
  "optionsGraphics": "Graphics",
  "optionsAudio": "Audio",
  "optionsGameplay": "Gameplay",
  "optionsMuteOnFocusLoss": "Mute on Focus Loss",
  "optionsMouseSettings": "Mouse Settings",
  "optionsForceMouseKeyboard": "Force Mouse+Keyboard",
  "optionsCircleSnap": "Circle Snap",
  "optionsLockToWindow": "Lock Mouse to Window",
  "optionsCursorMode": "In-game Cursor mode: @@1@@",
  "optionsDisableClick": "Disable Clicking on Taps",
  "enumCursorDefault": "Default",
  "enumCursorLarge": "Large",
  "enumCursorInvert": "Invert",
  "optionsHUD": "HUD Mode: @@1@@",
  "enumHUDDefault": "Default",
  "enumHUDExpanded": "Expanded",
  "enumHUDExpandedPlus": "Expanded (w/ Miss & Barely display)",
  "enumHUDNone": "None",
  "optionsVSync": "VSync",
  "optionsAccessibility": "Accessibility",
  "optionsVFX": "VFX: @@1@@",
  "optionsVFXFull": "Full",
  "optionsVFXDecreased": "Decreased",
  "optionsVFXNone": "None",
  "optionsTaps": "Taps: @@1@@",
  "optionsSides": "Sides: @@1@@",
  "optionsNotesDefault": "Default",
  "optionsNotesLenient": "Lenient",
  "optionsNotesAuto": "Automatic",
  "optionsSaturation": "Saturation: @@1@@%",
  "optionsStrainReduction": "Eyestrain Reduction: @@1@@%",
  "optionsDisplayMode": "Display Mode: @@1@@",
  "enumWindowed": "Windowed",
  "enumBorderless": "Borderless Windowed",
  "enumFullscreen": "Fullscreen",
  "optionsKeybinds": "Controls",
  "optionsKeybindsKeyboardGameplay": "Gameplay Controls (Keyboard)",
  "optionsKeybindsKeyboardMenu": "Menu Controls (Keyboard)",
  "optionsKeybindsKeyboardEditor": "Editor Controls (Keyboard)",
  "optionsKeybindsControllerBinds": "Controller Controls",
  "back": "Back",
  "quitToMenu": "Quit to menu",
  "optionsTestEnum": "Test enum: @@1@@",
  "enumOne": "one!",
  "enumTwo": "two!",
  "enumThree": "three!",
  "optionsLanguage": "Language",
  "lang_en": "English",
  "lang_jp": "Japanese",
  "lang_zh_hant": "Traditional Chinese",
  "lang_zh_cn": "Simplified Chinese",
  "lang_owo": "OwO",
  "unplayed": "Unplayed!",
  "play": "Play",
  "edit": "Edit",
  "options": "Options",
  "createlevel": "Create level",
  "openCustomsFolder": "Open folder",
  "putLevelsInHere": "Put levels in here!",
  "bpm": "@@1@@ BPM",
  "ratemod": "Game speed: @@1@@",
  "seizureWarning": "SEIZURE WARNING",
  "noPRankMessage": "Ineligible for P-Ranks",
  "optionsMenuHeader": "Options",
  "restartOn": "Restart on: @@1@@",
  "optionsRestartOnMiss": "Miss",
  "optionsRestartOnBarely": "Miss / Barely",
  "optionsNoBarelies": "No Barelies",
  "resultsRateDisplay": "@@1@@x speed",
  "resultsAccessibilityLenient": "Lenient",
  "resultsAccessibilityAutomatic": "Automatic",
  "resultsAccessibilityVFXLow": "Decreased VFX",
  "resultsAccessibilityVFXNone": "No VFX",
  "resultsAccessibilityTaps": "Tap Notes",
  "resultsAccessibilitySides": "Side Notes",
  "resultsUnpause": "Resumed from Pause",
  "optionsMenuDescription1": "Multiplier to overall game speed. Chart will become faster or slower.",
  "optionsMenuDescription2": "Reduces intensity of game visual effects, or removes visual effects entirely.",
  "optionsMenuDescription3": "Makes tap notes more lenient, or allows you to hit tap notes automatically.",
  "optionsMenuDescription4": "Makes side notes more lenient, or allows you to hit side notes automatically.",
  "optionsMenuDescription5": "Automatically restarts the level upon missing or hitting a barely.",
  "optionsMenuDescription6": "Removes the ability to obtain Barely judgements, causing a Miss in their place instead.",
  "editorWarning": "Hello, thanks for checking out the level editor!\nWhile its usable to create levels, it is currently not very user friendly, and is prone to glitches. We plan to smooth it out over the course of development. Please consider the level editor in its current state experimental.\nThat being said, have fun, and make sure to save often!\n\n(Press enter to go to editor, or escape to quit)",
  "errorMessage": "Something broke while playing a level! Here are the details:\n@@1@@",
  "tutorial_1": "So you want to block beats?\nIt's going to take an awful lot of practice.",
  "tutorial_2_mouse": "Let's start with the basics.\nFor Blocks and Holds, simply move your paddle with the mouse to hit them.",
  "tutorial_2_controller": "Let's start with the basics.\nFor Blocks and Holds, simply move your paddle with the analog stick to hit them.",
  "tutorial_3": "Give it a go!",
  "tutorial_4": "Not bad, but let's face it, that was easy.",
  "tutorial_5": "Time for Taps.\nThey can show up either on their own, or attatched to other notes.",
  "tutorial_6_mouse": "To hit them, press Z or X when they reach your paddle.\nYou can also click with the mouse.",
  "tutorial_6_controller": "To hit them, press (A) or (X) when they reach your paddle.",
  "tutorial_7": "Why don't we take this to the next level?",
  "tutorial_8": "I have to concede, that was impressive! Next are Mines and Sides.",
  "tutorial_9": "Mines just need to be avoided,\nand Sides need to be slammed into from the side.",
  "tutorial_10": "For Sides, timing is key.\nDon't fall apart now!",
  "inverses_1": "INVERSES AHEAD!",
  "inverses_2": "hit these with the back of your paddle instead of the front!",
  "pressToContinue_mouse": "Press Z to continue",
  "pressToContinue_controller": "Press (A) to continue",
  "tutorial_new_1": "So you want to block beats?\nIt's going to take an awful lot of practice.",
  "tutorial_new_2_mouse": "Move your paddle with the mouse to hit those BLOCKS.",
  "tutorial_new_2_controller": "Move your paddle with the analog stick to hit those BLOCKS.",
  "tutorial_new_3": "Give it a go!",
  "tutorial_new_4": "Let's introduce HOLDS.\nJust follow their path with your paddle.",
  "tutorial_new_5_mouse": "Time for TAPS. Press Z or X when\nthe circle reaches your paddle,\nor click with the mouse.",
  "tutorial_new_5_controller": "Time for TAPS. Press (A) or (X) when\nthe circle reaches your paddle.",
  "tutorial_new_6": "Remember to keep hitting BLOCKS and HOLDS too!",
  "tutorial_new_7": "TAPS can also appear attached to BLOCKS and other note types. ",
  "tutorial_new_8_mouse": "On the ends of HOLDS,\nTAPS can be hit as usual\nor by releasing the key.",
  "tutorial_new_8_controller": "On the ends of HOLDS,\nTAPS can be hit as usual\nor by releasing the button.",
  "tutorial_new_9": "Not bad, but let's face it- that was easy.\nTime to put it all together.",
  "tutorial_new_10": "You've got all the basics, so\nhere's your final test.\nDon't fall apart now!",
  "calibration_1_mouse": "Press Z to the beat.",
  "calibration_1_controller": "Press (A) to the beat.",
  "calibration_2": "Calibration complete!",
  "calibration_3": "Change calibration from @@1@@ to @@2@@?",
  "calibration_4": "Change to @@1@@",
  "calibration_5": "Keep as @@1@@",
  "averageOffset": "Average offset: @@1@@",
  "combo": " combo!",
  "comboPerfect": " COMBO!!",
  "comboExpanded": "combo",
  "accuracyExpanded": "accuracy",
  "accuracyBarelySingular": " barely",
  "accuracyBarelyPlural": " barelies",
  "accuracyMissSingular": " miss",
  "accuracyMissPlural": " misses",
  "difficultySpecial": "Special",
  "difficultyEasy": "Easy",
  "difficultyHard": "Hard",
  "difficultyChallenge": "Challenge",
  "difficultyExpert": "Apocrypha",
  "pauseHeader": "- PAUSED -",
  "pauseRetry": "Retry",
  "pauseQuit": "Quit",
  "pauseResume": "Resume",
  "grade": "Grade:",
  "misses": "Misses: @@1@@",
  "barelies": "Barelies: @@1@@",
  "continue": "Continue",
  "nextLevel": "Next Level",
  "retry": "Retry",
  "averageOffsetShort": "Offset: @@1@@",
  "restartMarathon": "Restart Marathon",
  "quitMarathon": "Quit Marathon",
  "marathonResults": "Marathon results:",
  "marathonScore": "Your score:",
  "marathonPerfect": "Incredible!! A perfect marathon!!",
  "lowerIsBetter": "(lower is better)",
  "terabyteHint": "But something is still missing. Maybe if you didn't get any B ranks or lower...",
  "levelTutorial": "Tutorial",
  "levelTutorialDescription": "If you're playing for the first time, or just need a refresher on the basics, start here!",
  "levelGrittedStringsDescription": "Watch the swaps between mines and blocks, and this duel is yours.\n\nMechanics used: Mines",
  "levelSoStressedDescription": "Let the summer rain wash your worries away.",
  "levelCodeRemixDescription": "Song originally from Heaven Studio.\n\nMechanics used: Sides",
  "levelLawrenceDescription": "Mechanics used: Sides, mines",
  "levelILOVEYOUDescription": "ACCEPT THIS \"LOVELETTER\"? [Y/N]\n---\nMade by the team \"Fool's Play\" for \"THE BMS OF FIGHTERS:\nNT -Twinkle Dream Traveler-\". \n\nVFX inspired by Kusanegi's song art (@tzlandcaocong on Twitter)\n\nMechanics used: Inverses",
  "levelTerabyteDescription": "[CONNECTION LOST]\n\nMechanics used: Mines, inverses, sides",
  "crashTitle": "Beatblock has crashed!",
  "crashBody": "Beatblock crashed unexpectedly!\nWould you like to save a crash report? \nThis will create a text file that can then be sent to the developers.",
  "crashSavedTitle": "Crash Report Saved!",
  "crashSavedBody": "A crash log has been saved to \"@@1@@\".",
  "crashYes": "Yes",
  "crashNo": "No",
  "notDemoLevel": "This level is not compatible with the Beatblock Demo. To play this level please purchase the full game at:\\nhttps://store.steampowered.com/app/3045200/Beatblock/",
  "keybindsAddNew": "Add",
  "keybindsPressKey": "Press a Key...",
  "keybindspPressButton": "Press a Button...",
  "keybindsResetDefault": "Reset all keybinds in all categories",
  "keybindsJoystick": "Joystick",
  "keybindsAddJoystick": "Move a Joystick...",
  "tap1": "Tap",
  "tap2": "Tap (Alt.)",
  "pause": "pause",
  "restart": "restart",
  "select": "select",
  "menu_up": "up",
  "menu_left": "left",
  "menu_right": "right",
  "menu_down": "down",
  "move_up": "up",
  "move_left": "left",
  "move_right": "right",
  "move_down": "down",
  "modifier": "modifier",
  "save": "save",
  "delete": "delete",
  "epilepsyWarning": "Beatblock has some visuals that may trigger epilepsy or photosensitivity issues for players. Proceed with caution, and please check the accessibility options for settings to remove visual effects if needed.",
  "demoWarning": "This game is currently still in a demo phase, and acts as a preview of a small section of the experience. The difficulty curve is not representative of the full game's planned scope & difficulty, and anything in this demo is subject to change between now and release.\nThank you for your understanding!",
  "attentionPls": "Attention! Please read carefully!",
  "terabyteIntro_initFailed": "Connection to \"LAWRENCE.lvl/results\" failed...",
  "terabyteIntro_loadBackupAttempt": "Attempting to load backup...",
  "terabyteIntro_connectToLevel": "Connecting to \"@@1@@.lvl\"...",
  "terabyteIntro_connectFailed": "FAILED",
  "terabyteIntro_cursor": ">",
  "terabyteIntro_narrator_0": "...",
  "terabyteIntro_narrator_1": "Are we...",
  "terabyteIntro_narrator_2": "Are we... connected?",
  "terabyteIntro_narrator_3": "Good.",
  "terabyteIntro_narrator_4": "Then, together...",
  "terabyteIntro_narrator_5": "We shall test the limits of your ability.",
  "terabyteIntro_narrator_6": "Even should you falter at the last hurdle...",
  "terabyteIntro_narrator_7": "You should still take solace in your progress.",
  "terabyteIntro_narrator_8": "Your desire to see things through to the end, no matter the cost...",
  "terabyteIntro_narrator_9": "This desire is what connects us all.",
  "terabyteIntro_narrator_10": "Now, show me the form your desire takes...",
  "terabyteIntro_skip": "Skipping..."
}

If you want to use localization in your mods you can use loc.get("key") to retrieve the translation for the current selected language. If the translation is not found it will return "key".

Clone this wiki locally