

Want to make your RenPy visual novel more immersive and accessible to a global audience? Adding multilingual text and voices is now easier than ever! This step-by-step tutorial will show you how to add multiple languages and voices to your RenPy VN—without having to change your existing script.rpy! Whether you’re an indie developer or a studio, this guide will help you broaden your reach and boost player engagement.
The completed version of this Multilingual RenPy Sample Project can be downloaded here.
This RenPy guide works even if you don’t use Omnilingual Access. Occasionally this guide will mention Omnilingual Access as an optional shortcut to make life easier, but you can choose to do things your way.
Start by opening the RenPy Launcher and clicking “Extract Dialogue”. Extract a Tab-delimited Spreadsheet (dialogue.tab
).
This will create a file that can be opened in a spreadsheet program. The file contains lines of Dialogue, its Character, and its RenPy generated Identifier.
Identifiers are assigned to dialogue-character pairs. If you update a line of dialogue or its character in script.rpy
, a new identifier will be created for it.
With this file, you can create localizations of the RenPy dialogue and then re-format each language to a /game/tl/{language}/script.rpy
file (depicted below).
dialogue.tab
file, generate/write translations, and export all language translation files formatted for RenPy.You have now successfully added multiple languages to your RenPy Visual Novel.
(If you want to see what these languages look like in your game right now, skip ahead to adding the Language Switcher.)
Having multiple languages in a RenPy Visual Novel is great, but you also need the right fonts to read those languages (especially Japanese and different Chinese languages).
Thankfully, this is as easy as finding those fonts, downloading them to /game/fonts
, and updating /game/screens.rpy
with those languages’ fonts:
translate en python:
gui.text_font = "NotoSans-VariableFont_wdth,wght.ttf"
gui.name_text_font = "NotoSans-VariableFont_wdth,wght.ttf"
translate ja python:
gui.text_font = "NotoSansJP-VariableFont_wght.ttf"
gui.name_text_font = "NotoSansJP-VariableFont_wght.ttf"
translate ru python:
gui.text_font = "NotoSans-VariableFont_wdth,wght.ttf"
gui.name_text_font = "NotoSans-VariableFont_wdth,wght.ttf"
Omnilingual Access has a handy tool that automatically lists the free Google Noto Fonts needed for any set of languages, along with the /game/screens.rpy
snippets to support those languages.
Voices add a tonne of immersion, depth, and access to Visual Novels. With the ease and quality of voice generation these days, there’s no reason why a Visual Novel isn’t audibly accessible in multiple languages.
RenPy’s config.auto_voice is a wonderful setting that allows RenPy to automatically play audio files that have the same dialogue identifier (found in the earlier dialogue.tab). It can also be configured for multiple languages.
We recommend placing all voice files in /game/voices/{language}
folders.
We are not putting voice files under the translation /tl
folder. This allows us to have separate Text and Audio Language selection in RenPy, which most modern games have.
Omnilingual Access was designed to make it easy to quickly generate quality voices, use it to:
Finally, enable the voice languages with the RenPy Language Switcher below.
We will be creating a RenPy Language Switcher that allows players to individually select their Text and Audio Languages. This is a common feature in games. It is also known as simultaneous languages, or bilingual visual novels.
To create a Language Switcher in RenPy, we only need to edit the /game/screens.rpy
file.
Create a dedicated Language Settings screen in the game menu. Start by adding the following to /game/screens.rpy
: screen navigation():
. This will add a link to our Language Switcher.
textbutton _("Language") action ShowMenu("language_settings")
Create the Language Settings Screen. Add the following script to /game/screens.rpy
:
## OA: Language screen #########################################################
##
## Text and Audio Languages can be selected separately by players.
##
## Generated by OmnilingualAccess.com
# LANGUAGES DETAILS
init python:
language_details = {
"en": { "name": "English", "font": "NotoSans-VariableFont_wdth,wght.ttf" },
"ja": { "name": "日本語", "font": "NotoSansJP-VariableFont_wght.ttf" },
"ru": { "name": "Русский", "font": "NotoSans-VariableFont_wdth,wght.ttf" },
}
hidden_voice_languages = []
# VOICE LANGUAGE: init, set, and persist
init python:
# First Load: Set Voice Lang to default
if not persistent.voice_lang:
persistent.voice_lang = "en"
# Define Set Voice Lang (used by UI)
def set_voice_lang(lang):
# Set Persistent Voice Lang
persistent.voice_lang = lang
# Update config.auto_voice
def auto_voice(id, **kwargs):
return f"voices/{lang}/{id}.wav"
config.auto_voice = auto_voice
# Set VoiceLang to Stored VoiceLang
set_voice_lang(persistent.voice_lang)
# LANGUAGE SETTINGS SCREEN
screen language_settings():
tag menu
use game_menu(_("Language"), scroll="viewport"):
hbox:
box_wrap True
# TEXT LANGUAGES
vbox:
style_prefix "radio"
label _("Language")
for code, lang in language_details.items():
textbutton lang["name"] text_font lang["font"] action [Function(set_lang_on_toggle), Language(code)]
# VOICE LANGUAGES
vbox:
style_prefix "radio"
label _("Voice Language")
for code, lang in language_details.items():
if code not in hidden_voice_languages:
textbutton lang["name"] text_font lang["font"] action [Function(set_voice_lang, code)] selected persistent.voice_lang == code
Omnilingual Access will generate this script for you based on languages you specify. This saves you time looking up fonts, language codes, and language names. Alternatively, you can manually edit language_details
.
That’s it! In just a few steps, you can make your RenPy visual novel accessible in different languages with both text and voices, and offer players a globally immersive experience. 🥳🎉
If you have any questions, or are keen to share what you’ve created (we would love to play your Visual Novel 💖), please reach out!
Copyright © 2025 Omnilingual Access. All rights reserved.