# 🌏 Pluto in different languages!

**URL:** <https://discourse.julialang.org/t/pluto-in-different-languages/131540>\
**Category:** Pluto\
**Tags:** pluto, localization\
**Created:** [August 11, 2025, 9:49pm UTC](https://discourse.julialang.org/t/pluto-in-different-languages/131540 "2025-08-11T21:49:00Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![fonsp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fonsp/32/222349_2.png) [@fonsp](https://discourse.julialang.org/u/fonsp)\
**Post date:** [August 11, 2025, 9:49pm UTC](https://discourse.julialang.org/t/pluto-in-different-languages/131540/1 "2025-08-11T21:49:00Z")

</div>

We want to make Julia and Pluto more accessible to a wider audience! Since 0.20.14 (August 2025), Pluto has a _localization_ system, which means that the **Pluto UI interface can be used in a different language** , not just in English!

> ![Screenshot of Pluto in Greek](https://global.discourse-cdn.com/julialang/original/3X/d/4/d4c4b9d89b5667e93faeaf2d6245bda875edbcf2.png)  
> _A screenshot of Pluto in Greek! Also notice that one piece of text in the middle (`Enter cel code...`) has not been localized yet, so it uses English as a fallback._

A new dropdown menu in the bottom-left (or bottom-right in Arabic, one day!) lets you pick the language. In a future release, we will also auto-detect the system language and use that as the default.

## What this does not change

This does not change anything in **Julia**. For example, `sqrt(-1)` will still say “Domain Error”, regardless of the selected language. And you can still write code and Markdown in any language! This is only about the Pluto UI.

> **Example of error in Dutch**
>
> ![error message with UI text in Dutch, but an error message in English](https://global.discourse-cdn.com/julialang/original/3X/0/1/01862a239eed3866abf2eb9a6d257abe2f34a394.png)

* * *

# 🌟 Calling for contributions!

We need you! Do you speak a language other than English, and **would you like to help make Pluto available to more people**? Consider making a contribution by localizing Pluto to your language!

It’s a fun task, and your work will be appreciated by many users in years to come! [Read the language contributors documentation here](https://github.com/fonsp/Pluto.jl/tree/main/frontend/lang)

---

<div class="post-metadata">

**Author:** ![andreeco](https://avatars.discourse-cdn.com/v4/letter/a/d26b3c/32.png) [@andreeco](https://discourse.julialang.org/u/andreeco)\
**Post date:** [August 16, 2025, 7:30am UTC](https://discourse.julialang.org/t/pluto-in-different-languages/131540/2 "2025-08-16T07:30:42Z")

</div>

Hi there,

A few weeks ago, I wrote an I18nPlugin for Genie. It’s designed to be more generic and flexible, and in the future, it might not be limited to Genie at all. One of its features is the ability to automatically translate TOML files (which I find better than JSON) using AI. The translation quality is quite good and it saves a lot of time.

Feel free to take a look at the code if you’re interested! It’s not published yet, but I’d be happy to share it with you. Maybe you might only be interested in the auto-translations and adopt the code for your usecase.

(locales/en/main.toml)

```toml
[main]
welcome = "Hello, {{name}}!"

```

Lookup in Julia:

```julia
julia> @t("main!welcome"; name="Pete")
"Welcome, Pete!"

```

Manually passing a dict:

```julia
julia> t("main!welcome"; 
         locale="en", translations=I18N.dict, name="Alice")
"Hello, Alice!"

```

But maybe this part of code can help you more if you adapt it to the localization tool you use.

```julia
using I18nPlugin.AutoTranslations

translate_locales!("locales"; 
    src="en", 
    targets=["es","de","fr"], 
    model="gpt-4.1-nano")

```

I will:

1. Parse `locales/en/*.toml` (the “NEW” JSON)
2. Parse existing `locales/<lang>/*.toml` (the “OLD” JSON)
3. Send both to GPT with instructions like:

> “Keep every OLD value if the English text didn’t change. Otherwise translate the NEW JSON. Return _only_ the merged JSON object.”

4. Write back well-formed nested TOML for each target

This saves you super much time and if you have people working on it, they just have to review the toml files.

Here you will find another toml example. I choose toml because it allows you to write comments in it and is more readable and human editable.

```toml
[authentication.login]
title = "Login"
prompt = "Please authenticate in order to access the information."
username = "Username"
password = "Password"
button = "Login"
# if you enable registration:
register_link = "Not registered yet? Register"
forgot_password = "Forgot password"
forgot_password_link = "Reset password"

[authentication.register]
title = "Register"
prompt = "Please fill in the form to create an account."
username = "Username"
password = "Password"
email = "Email"
button = "Register"
terms_heading = "Terms"
accept_terms = "Accept Terms"
sucess = "Registration successful"

[authentication.confirm]
heading = "Confirmation Link Expired"
description = "Your confirmation link is no longer valid. Enter your email to get a new one."
email_label = "Email address"
resend_button = "Resend Confirmation Email"

[authentication.success]
title = "Success!"
message = "You are now logged in!"
go_home = "Go home"

[authentication.flash]
failed = "Authentication failed!"
goodbye = "Good bye!"

[authentication.forgot]
heading = "Forgot your password?"
email_label = "Enter your email address"
submit = "Send me a reset link"
sent = "If that account exists you’ll receive an email shortly."
not_found = "No account found with that email."

[authentication.reset]
heading = "Choose a new password"
invalid_token = "Invalid or expired token"
password_label = "New password"
submit = "Update password"
success = "Your password has been updated. Please log in."
expired_heading = "Reset Link Expired"
expired_description ="Sorry, your password reset link has expired. You can request a new one below."
resend_button = "Send New Reset Link"

[authentication.github_auth]
button = "Sign in with GitHub"

[authentication.github_auth.callback]
error_invalid_state = "Invalid GitHub login response."

[authentication.github_auth.login]
logged_in = "Logged in with GitHub"
account_linked = "Your GitHub account has been linked."
account_created = "New account created via GitHub"

```

in the end maybe you can profit from auto-translations in some way…

---

<div class="post-metadata">

**Author:** ![GHTaarn](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ghtaarn/32/216007_2.png) [@GHTaarn](https://discourse.julialang.org/u/GHTaarn)\
**Post date:** [August 17, 2025, 2:56am UTC](https://discourse.julialang.org/t/pluto-in-different-languages/131540/3 "2025-08-17T02:56:14Z")

</div>

> [@andreeco](#):
>
> ```julia
> julia> @t("main!welcome"; name="Pete")
> "Welcome, Pete!"
> 
> ```

Why does this not return “Hello, Pete!”?

---

<div class="post-metadata">

**Author:** ![andreeco](https://avatars.discourse-cdn.com/v4/letter/a/d26b3c/32.png) [@andreeco](https://discourse.julialang.org/u/andreeco)\
**Post date:** [August 17, 2025, 4:53am UTC](https://discourse.julialang.org/t/pluto-in-different-languages/131540/4 "2025-08-17T04:53:28Z")

</div>

It’s from two different snippets, one of which I modified for this post to show both the function and the macro version. If you call the function and macro, they will work correctly, of course.

---

<div class="post-metadata">

**Author:** ![fonsp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fonsp/32/222349_2.png) [@fonsp](https://discourse.julialang.org/u/fonsp)\
**Post date:** [August 18, 2025, 10:56am UTC](https://discourse.julialang.org/t/pluto-in-different-languages/131540/5 "2025-08-18T10:56:42Z")

</div>

Aha, very cool @andreeco !

Indeed TOML looks like a nicer format to edit 🙂 I went for JSON because it’s quite standard in the web localization world, and it makes it easy to use tools like weblate in the future. (But maybe they also support TOML actually.)

I wrote a bit specifically about using AI for localizing Pluto: [Pluto.jl/frontend/lang at main · fonsp/Pluto.jl · GitHub](https://github.com/fonsp/Pluto.jl/tree/main/frontend/lang#using-ai)

---

<div class="post-metadata">

**Author:** ![fonsp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fonsp/32/222349_2.png) [@fonsp](https://discourse.julialang.org/u/fonsp)\
**Post date:** [August 21, 2025, 4:10pm UTC](https://discourse.julialang.org/t/pluto-in-different-languages/131540/6 "2025-08-21T16:10:32Z")

</div>

This is going great! Since I wrote this post, we got contributions in:

- [Polish](https://github.com/fonsp/Pluto.jl/pull/3324) by [zymon](https://github.com/s-zymon)
- [German](https://github.com/fonsp/Pluto.jl/pull/3325) by @kellertuer
- [Norwegian Bokmål](https://github.com/fonsp/Pluto.jl/pull/3329) by @kellertuer (again!)
- [French](https://github.com/fonsp/Pluto.jl/pull/3333) by @Pangoraw and @gdalle

🌟 Looking forward to the next one! 🌟

---

<div class="post-metadata">

**Author:** ![fonsp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fonsp/32/222349_2.png) [@fonsp](https://discourse.julialang.org/u/fonsp)\
**Post date:** [September 12, 2025, 12:56pm UTC](https://discourse.julialang.org/t/pluto-in-different-languages/131540/7 "2025-09-12T12:56:52Z")

</div>

Pluto is now available in even more languages thanks to open source contributions! You can now use Pluto in these **10 languages** (in alphabetical order):

- **Deutsch** (German) _(by [@kellertuer](https://github.com/kellertuer))_
- **Ελληνικά** (Greek) _(by [@pankgeorg](https://github.com/pankgeorg))_
- **English**
- **Français** (French) _(by [@Pangoraw](https://github.com/Pangoraw) and [@gdalle](https://github.com/gdalle))_
- **Japanese** (Japanese) \_(by [@Itou-Kouki](https://github.com/Itou-Kouki))
- **Nederlands** (Dutch) _(by [@fonsp](https://github.com/fonsp))_
- **Norsk Bokmål** (Norwegian) _(by [@kellertuer](https://github.com/kellertuer))_
- **Polski** (Polish) _(by [@s-zymon](https://github.com/s-zymon))_
- **Português (Portugal)** (Portuguese Portuguese) _(by [@rgouveiamendes](https://github.com/rgouveiamendes))_
- **Suomi** (Finnish) _(by [@eteppo](https://github.com/eteppo))_

Read more about localization in Pluto here: [🌐 Language — Pluto.jl](https://plutojl.org/en/docs/language/)
