Blog

Add Multilingual Texts & Voices to RenPy

RenPy Logo with the text; Multiple Voices and Langauges. The background is filled with many different language names.

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.

Tip

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.

Table of Contents

Translating RenPy into Multiple Languages

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.

Note

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).

Tip
Omnilingual Access makes it super simple to upload a RenPy 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.)

Adding Language-Specific Fonts to RenPy

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"
Tip

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.

RenPy Voices in Multiple 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.

Note

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.

Tip

Omnilingual Access was designed to make it easy to quickly generate quality voices, use it to:

  1. Automatically Generate Voice Recordings (and optional Character Voices) for your Default Source Language
  2. Generate Voice Recordings for all other languages
  3. Download All Voices as the above RenPy format

Finally, enable the voice languages with the RenPy Language Switcher below.

RenPy Language Switcher – with Separate Text & Audio Languages

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.

  1. 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")
  2. 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
    
    Tip

    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.

Summary

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!


Omnilingual Access Logo
Omnilingual Access

Copyright © 2025 Omnilingual Access. All rights reserved.