A cross-platform desktop and web app to translate and validate SRT subtitles using your existing LLM subscriptions (Gemini, ChatGPT, Claude, etc.) via CLIProxyAPI - no API keys needed.
107
stars
19
commits
TypeScript
primary language
May 1, 2026
updated
A comprehensive browser-based and desktop tool that leverages Large Language Models (LLMs) to translate SRT subtitle files and automatically validate the output for common errors. Built specifically to create high-quality, script-accurate subtitles using your existing LLM subscriptions (Gemini, ChatGPT, Claude, etc.) via CLIProxyAPI.
| Input SRT in English | Output of translated SRT in Tenglish |
|---|---|
![]() | ![]() |
[!NOTE] Screenshots are taken from Psych, an American detective comedy-drama television series created by Steve Franks for USA Network.
My mom loves to watch movies and TV shows, but she isn't fluent in English. Properly translated subtitles are the perfect way for her to enjoy and understand the content. When I set out to find a subtitle translator powered by mainstream LLMs, I hit several roadblocks.
Existing solutions either required expensive paid API keys, charged high per-token rates (I tested commercial options like GPT Subtitler, but the pricing was unsustainable for my regular usage), or completely lacked the ability to detect and automatically fix the subtle formatting errors LLMs often introduce. Furthermore, I wanted a way to leverage my existing Gemini subscription rather than paying separately for API usage—which this tool achieves via CLIProxyAPI.
While Large Language Models are incredibly powerful and can translate subtitles in minutes, they often introduce subtle errors without strict oversight, such as:
This tool automates the entire translation workflow, validates the output, and provides one-click fixes for common LLM errors—ensuring the subtitles are perfect.
This is the successor to my original SRT Subtitle Validator, which could only validate pre-translated files. The new SRT Translator & Validator combines translation and validation into a single, streamlined workflow with automatic error correction.
You can download the latest native installer for your operating system (Mac, Windows, or Linux) from the GitHub Releases page.
If you are using the downloadable native desktop application, it comes with several built-in enhancements:
@Config configured templates. Raw text templates are not supported in the desktop app to ensure a strict and automated workflow.If you are downloading the native .dmg, .exe, or .AppImage files, please ensure your system meets the following requirements:
sudo apt install libwebkit2gtk-4.1-0).CLIProxyAPI is required to access your Gemini subscription through an API interface.
For installation instructions, please visit: https://help.router-for.me/introduction/quick-start.html
Depending on which model you want to use (Gemini, Claude, OpenAI, etc.), you will need to authenticate the CLIProxyAPI.
For step-by-step instructions on authenticating different models, please go to the CLIProxyAPI Provider Configuration and click on the respective model name in the sidebar to view the correct commands.
Example for Gemini:
cliproxyapi --loginIf you're an existing Gemini Code user:
cliproxyapi --login --project_id <your_project_id>
8085Create or edit your config.yaml file.
For more information, please visit: https://help.router-for.me/configuration/basic.html or use the provided example config.yaml.
[!IMPORTANT] The
api-keysvalue inconfig.yamlmust match the API Key field in the web application. The keydummyis used by default if the field is left blank.
If installed via Homebrew:
/opt/homebrew/opt/cliproxyapi/bin/cliproxyapi --config ~/path/to/your/config.yaml
If built from source:
./cli-proxy-api --config /path/to/your/config.yaml
The server will start on http://localhost:8317 by default.
Open this link SRT Translator & Validator in any modern web browser.
http://localhost:8317/v1/chat/completionsgemini-2.5-proconfig.yaml (e.g., 1234567)By default, the tool allows:
To add your target language:
U+0C00-U+0C7F or single characters: U+0C00You can also remove any script (except special characters and line breaks) by clicking the × button.
[!CAUTION] Update your translation prompts to remove any mention of timestamps, as the model no longer sees or generates them.
Write your translation instructions in the prompt field. You can use markdown formatting and switch to Markdown View to preview how it renders.
For reusable prompts with dynamic values, create a template file with optional configuration:
.txt file with placeholders using {{Variable Name}} syntaxBasic Template Example:
You are translating subtitles for {{Show Name}}, Season {{Season}}, Episode {{Episode}}.
Translate from {{Source Language}} to {{Target Language}}.
**Style Guidelines:**
- Use {{Formality Level}} language
- Keep character names in {{Name Language}}
[Rest of your translation instructions...]
When imported, you'll be prompted to fill in: Show Name, Season, Episode, Source Language, Target Language, Formality Level, and Name Language.
Configured Template Example (Advanced):
For even more automation, add a @Config header to pre-configure settings:
@Config
{{http://localhost:8317/v1/chat/completions}}
{{gemini-3-flash-preview}} {{gemini-3.1-pro-preview}}
{{Basic Latin}} {{Latin Supplement}} {{Telugu}}
{{TV show}} {{Psych}} {{2006}} {{, S01E01}} {{, (Title)}}
You are translating subtitles for the {{Enter movie or TV show}} {{Movie/TV Show Name}} ({{Release Year}}){{Season/Episode Number}}{{Episode Title}}.
[Rest of your translation instructions...]
Configuration Format:
@Config marker{{placeholders}}When a configured template is imported:
[!TIP] See
Example Config Prompt Template.txtfor a complete configured template example.
Example Non-Template Prompt:
Your task is to translate an English .srt file into casual "Tenglish" (a mix of Telugu and English). Your primary directive is 100% accuracy in CONTENT MAPPING and SCRIPT & LANGUAGE RULES mentioned below. Failure to adhere to these rules is not an option.
**Goal:** Translate the attached English .srt file for the TV show Psych (2006), S02E02, (65 Million Years Off) into casual Telugu for a native Telugu speaker who is not fluent in English.
### Core Directives (Must be followed without exception):
**PERFECT LINE BREAKS:** Preserve the original line breaks within each subtitle entry. If the original English subtitle has two lines, the translated Tenglish subtitle must also have two lines. Do not merge lines.
**STRICT 1:1 CONTENT MAPPING (NO MERGING OR SHIFTING):**
- **ONE SOURCE = ONE TARGET:** Content in Source ID `X` MUST appear *only* in Target ID `X`.
- **ISOLATE SHORT LINES (CRITICAL):** Short interjections (e.g., "Pardon me", "Hey", "No") in ID `X+1` act as hard barriers. **NEVER** merge them into the previous block (ID `X`). They must remain standalone to prevent index shifting.
- **NO "MERGING UP":** If ID `X` ends with `...` or an incomplete thought, leave it incomplete. **DO NOT** pull text from ID `X+1` to finish the sentence.
- **NO COMPRESSION:** If the source has 3 blocks, the output must have 3 blocks. Merging `X` and `X+1` causes `X+2` to shift incorrectly, destroying synchronization.
- **PRESERVE FRAGMENT ORDER (ANTI-SOV):** If "Action" is in ID `A` and "Reason" is in ID `B`, keep them separate. Do not move the "Reason" up to ID `A` to satisfy Telugu grammar.
- **TOLERATE FRAGMENTED GRAMMAR":** Telugu grammar usually places the verb at the end (SOV). However, subtitle timing (SVO) takes precedence.
- If English Block `X` says "I went to...", the Telugu Block `X` **MUST** end with a connector or incomplete phrase (e.g., "నేను వెళ్ళాను...").
- **DO NOT** move the destination from Block `X+1` into Block `X` just to close the sentence.
- It is better to have "Broken Telugu" than "Broken Sync."
**SCRIPT & LANGUAGE RULES (CRITICAL):**
- **Definition of "Tenglish":** This is a Mixed-Script translation.
- English Words: Keep common English words, names (Shawn Spencer), and simple phrases (Who's in there?) in English.
- Telugu Words: Translate complex concepts and words (requisitioning) into casual Telugu.
- **NO ROMANIZATION:** Do not transliterate Telugu words into English letters. Use the Telugu script.
- **ALLOWED CHARACTERS:** The text may ONLY contain Standard English (Latin) characters and Telugu script characters. ABSOLUTELY NO characters from any other script are allowed. This includes, but is not limited to, Devanagari (Hindi: नी), Gujarati (હ), Japanese (気), Tamil (த), Kannada (ಚಿ), or Malayalam (മ).
### Error Correction Examples (Pay close attention to these):
This table shows the exact type of script errors to avoid and their correct replacements.
| Original English | ❌ Incorrect Translation (Mistake) | ✅ Correct Translation (Goal) |
|---|---|---|
| - I can't see a thing in here.<br>- I got it. | ఇక్కడ నాకు ఏమీ కనపడట్లేదు. నా దగ్గర ఉంది. (Merged lines) | - ఇక్కడ నాకు ఏమీ కనపడట్లేదు.<br>- నా దగ్గర ఉంది. (Correctly kept two lines) |
| a killer's window | ఒక હત్యకుడి window (Uses Gujarati હ) | ఒక హత్యకుడి window (Uses correct Telugu హ) |
| if you don't mind | మీరు気に పట్టించుకోకపోతే (Uses Japanese 気) | మీరు పట్టించుకోకపోతే (Uses correct Telugu script only) |
| I am not a suspect | నేను suspect नी కాదు (Uses Devanagari नी) | నేను suspect ని కాదు (Uses correct Telugu ని) |
| I am ready. | Nenu ready ga unnanu. (Romanized - BANNED) | నేను ready గా ఉన్నాను. (Doesn't transliterate) |
| 284<br>Sheriff Jackson mentioned we had | 284<br>ఈ రోజు town లో ఇద్దరు visitors<br>ఉన్నారని Sheriff Jackson చెప్పారు.<br>(Error: Merged 284 & 285 into index 284 to fix grammar) | Sheriff Jackson mention చేసారు మనకి<br>(Keeps sentence incomplete to match Source) |
| 285<br>a couple of visitors<br>in town today. | 285<br>Cinnamon festival cancel<br>అయిందని మీకు తెలుసు కదా.<br>(Error: Content pulled from next line...) | 285<br>కొంతమంది visitors<br>ఈ రోజు town లో ఉన్నారని.<br>(Keeps "hanging" fragment separate) |
| 286<br>You are aware the cinnamon<br>festival has been cancelled. | 286<br>Oh, అవును.<br>(Error: Merging subtitles causes cascading mismatch) | 286<br>Cinnamon festival cancel<br>అయిందని మీకు తెలుసు కదా.<br>(Restores correct content to ID 286) |
### Final Verification Protocol:
Before providing the final output, perform a self-correction check. Review your entire translated file one last time to confirm:
1. **Line Break Check:** Does the line count of every subtitle entry match the source exactly?
2. **Merge Check:** Confirm that no distinct lines or separate subtitle blocks have been merged; strict 1:1 mapping must be maintained.
3. **Script Check:** Have you scanned the entire text to ensure there are zero characters from any script other than English and Telugu? Verify common error characters like హ vs. હ.
Please begin the translation of the attached file, adhering strictly to these enhanced directives.
[!TIP] You can drag and drop files directly onto the Prompt Template and Subtitle file upload buttons.
If Gemini stops mid-translation, you'll see:
Click the button to automatically resume translation from where it stopped. This process repeats until the file is complete.
If validation found errors, click "🔧 Fix All Errors" to:
OriginalName(Language)(Model).(ISO-639-2/B Language Code).srtPsych.S04E05.1080p.BluRay.Remux.eng(Tenglish)(Gemini 3.1 Pro Preview).tel.srtThe tool includes 130+ pre-configured language scripts:
You can also add any custom Unicode range or character.
Edit the Model Name field to use other models. Since CLIProxyAPI supports OpenAI, Claude, and Gemini, you can input models like gemini-3.1-pro-preview, gpt-5.5, or claude-opus-4-7. Depending on the model selected, translation quality may vary:
gemini-3-flash-preview: Faster, cheaper, good for simple translationsgemini-2.5-pro: More accurate, better for complex translationsgemini-3.1-pro-preview: Latest model, best quality and reasoning[!WARNING] The application has only been tested with
gemini-3.1-pro-preview/gemini-2.5-proand only usesgemini-3-flash-previewto detect the target translation language for the purpose of naming the output SRT file.
Add specific character ranges for edge cases:
U+1F600-U+1F64F2200-22FF2500-257FU+20AC (€ symbol)Contributions are welcome! Some areas for improvement:
[!NOTE] The Gemini LLM was chosen as the default due to best performance on the MMMLU (Multilingual Q&A) and MRCR v2 (8-needle | Long context performance) benchmarks.
MIT License - see LICENSE file for details
Made with ❤️ for my mom and anyone else who wants to enjoy content in their native language.
19 commits
TypeScript
51.3%
HTML
39.6%
Java
5.5%
Rust
2.8%
A cross-platform desktop and web app to translate and validate SRT subtitles using your existing LLM subscriptions (Gemini, ChatGPT, Claude, etc.) via CLIProxyAPI - no API keys needed.
107
stars
19
commits
TypeScript
primary language
May 1, 2026
updated
A comprehensive browser-based and desktop tool that leverages Large Language Models (LLMs) to translate SRT subtitle files and automatically validate the output for common errors. Built specifically to create high-quality, script-accurate subtitles using your existing LLM subscriptions (Gemini, ChatGPT, Claude, etc.) via CLIProxyAPI.
| Input SRT in English | Output of translated SRT in Tenglish |
|---|---|
![]() | ![]() |
[!NOTE] Screenshots are taken from Psych, an American detective comedy-drama television series created by Steve Franks for USA Network.
My mom loves to watch movies and TV shows, but she isn't fluent in English. Properly translated subtitles are the perfect way for her to enjoy and understand the content. When I set out to find a subtitle translator powered by mainstream LLMs, I hit several roadblocks.
Existing solutions either required expensive paid API keys, charged high per-token rates (I tested commercial options like GPT Subtitler, but the pricing was unsustainable for my regular usage), or completely lacked the ability to detect and automatically fix the subtle formatting errors LLMs often introduce. Furthermore, I wanted a way to leverage my existing Gemini subscription rather than paying separately for API usage—which this tool achieves via CLIProxyAPI.
While Large Language Models are incredibly powerful and can translate subtitles in minutes, they often introduce subtle errors without strict oversight, such as:
This tool automates the entire translation workflow, validates the output, and provides one-click fixes for common LLM errors—ensuring the subtitles are perfect.
This is the successor to my original SRT Subtitle Validator, which could only validate pre-translated files. The new SRT Translator & Validator combines translation and validation into a single, streamlined workflow with automatic error correction.
You can download the latest native installer for your operating system (Mac, Windows, or Linux) from the GitHub Releases page.
If you are using the downloadable native desktop application, it comes with several built-in enhancements:
@Config configured templates. Raw text templates are not supported in the desktop app to ensure a strict and automated workflow.If you are downloading the native .dmg, .exe, or .AppImage files, please ensure your system meets the following requirements:
sudo apt install libwebkit2gtk-4.1-0).CLIProxyAPI is required to access your Gemini subscription through an API interface.
For installation instructions, please visit: https://help.router-for.me/introduction/quick-start.html
Depending on which model you want to use (Gemini, Claude, OpenAI, etc.), you will need to authenticate the CLIProxyAPI.
For step-by-step instructions on authenticating different models, please go to the CLIProxyAPI Provider Configuration and click on the respective model name in the sidebar to view the correct commands.
Example for Gemini:
cliproxyapi --loginIf you're an existing Gemini Code user:
cliproxyapi --login --project_id <your_project_id>
8085Create or edit your config.yaml file.
For more information, please visit: https://help.router-for.me/configuration/basic.html or use the provided example config.yaml.
[!IMPORTANT] The
api-keysvalue inconfig.yamlmust match the API Key field in the web application. The keydummyis used by default if the field is left blank.
If installed via Homebrew:
/opt/homebrew/opt/cliproxyapi/bin/cliproxyapi --config ~/path/to/your/config.yaml
If built from source:
./cli-proxy-api --config /path/to/your/config.yaml
The server will start on http://localhost:8317 by default.
Open this link SRT Translator & Validator in any modern web browser.
http://localhost:8317/v1/chat/completionsgemini-2.5-proconfig.yaml (e.g., 1234567)By default, the tool allows:
To add your target language:
U+0C00-U+0C7F or single characters: U+0C00You can also remove any script (except special characters and line breaks) by clicking the × button.
[!CAUTION] Update your translation prompts to remove any mention of timestamps, as the model no longer sees or generates them.
Write your translation instructions in the prompt field. You can use markdown formatting and switch to Markdown View to preview how it renders.
For reusable prompts with dynamic values, create a template file with optional configuration:
.txt file with placeholders using {{Variable Name}} syntaxBasic Template Example:
You are translating subtitles for {{Show Name}}, Season {{Season}}, Episode {{Episode}}.
Translate from {{Source Language}} to {{Target Language}}.
**Style Guidelines:**
- Use {{Formality Level}} language
- Keep character names in {{Name Language}}
[Rest of your translation instructions...]
When imported, you'll be prompted to fill in: Show Name, Season, Episode, Source Language, Target Language, Formality Level, and Name Language.
Configured Template Example (Advanced):
For even more automation, add a @Config header to pre-configure settings:
@Config
{{http://localhost:8317/v1/chat/completions}}
{{gemini-3-flash-preview}} {{gemini-3.1-pro-preview}}
{{Basic Latin}} {{Latin Supplement}} {{Telugu}}
{{TV show}} {{Psych}} {{2006}} {{, S01E01}} {{, (Title)}}
You are translating subtitles for the {{Enter movie or TV show}} {{Movie/TV Show Name}} ({{Release Year}}){{Season/Episode Number}}{{Episode Title}}.
[Rest of your translation instructions...]
Configuration Format:
@Config marker{{placeholders}}When a configured template is imported:
[!TIP] See
Example Config Prompt Template.txtfor a complete configured template example.
Example Non-Template Prompt:
Your task is to translate an English .srt file into casual "Tenglish" (a mix of Telugu and English). Your primary directive is 100% accuracy in CONTENT MAPPING and SCRIPT & LANGUAGE RULES mentioned below. Failure to adhere to these rules is not an option.
**Goal:** Translate the attached English .srt file for the TV show Psych (2006), S02E02, (65 Million Years Off) into casual Telugu for a native Telugu speaker who is not fluent in English.
### Core Directives (Must be followed without exception):
**PERFECT LINE BREAKS:** Preserve the original line breaks within each subtitle entry. If the original English subtitle has two lines, the translated Tenglish subtitle must also have two lines. Do not merge lines.
**STRICT 1:1 CONTENT MAPPING (NO MERGING OR SHIFTING):**
- **ONE SOURCE = ONE TARGET:** Content in Source ID `X` MUST appear *only* in Target ID `X`.
- **ISOLATE SHORT LINES (CRITICAL):** Short interjections (e.g., "Pardon me", "Hey", "No") in ID `X+1` act as hard barriers. **NEVER** merge them into the previous block (ID `X`). They must remain standalone to prevent index shifting.
- **NO "MERGING UP":** If ID `X` ends with `...` or an incomplete thought, leave it incomplete. **DO NOT** pull text from ID `X+1` to finish the sentence.
- **NO COMPRESSION:** If the source has 3 blocks, the output must have 3 blocks. Merging `X` and `X+1` causes `X+2` to shift incorrectly, destroying synchronization.
- **PRESERVE FRAGMENT ORDER (ANTI-SOV):** If "Action" is in ID `A` and "Reason" is in ID `B`, keep them separate. Do not move the "Reason" up to ID `A` to satisfy Telugu grammar.
- **TOLERATE FRAGMENTED GRAMMAR":** Telugu grammar usually places the verb at the end (SOV). However, subtitle timing (SVO) takes precedence.
- If English Block `X` says "I went to...", the Telugu Block `X` **MUST** end with a connector or incomplete phrase (e.g., "నేను వెళ్ళాను...").
- **DO NOT** move the destination from Block `X+1` into Block `X` just to close the sentence.
- It is better to have "Broken Telugu" than "Broken Sync."
**SCRIPT & LANGUAGE RULES (CRITICAL):**
- **Definition of "Tenglish":** This is a Mixed-Script translation.
- English Words: Keep common English words, names (Shawn Spencer), and simple phrases (Who's in there?) in English.
- Telugu Words: Translate complex concepts and words (requisitioning) into casual Telugu.
- **NO ROMANIZATION:** Do not transliterate Telugu words into English letters. Use the Telugu script.
- **ALLOWED CHARACTERS:** The text may ONLY contain Standard English (Latin) characters and Telugu script characters. ABSOLUTELY NO characters from any other script are allowed. This includes, but is not limited to, Devanagari (Hindi: नी), Gujarati (હ), Japanese (気), Tamil (த), Kannada (ಚಿ), or Malayalam (മ).
### Error Correction Examples (Pay close attention to these):
This table shows the exact type of script errors to avoid and their correct replacements.
| Original English | ❌ Incorrect Translation (Mistake) | ✅ Correct Translation (Goal) |
|---|---|---|
| - I can't see a thing in here.<br>- I got it. | ఇక్కడ నాకు ఏమీ కనపడట్లేదు. నా దగ్గర ఉంది. (Merged lines) | - ఇక్కడ నాకు ఏమీ కనపడట్లేదు.<br>- నా దగ్గర ఉంది. (Correctly kept two lines) |
| a killer's window | ఒక હત్యకుడి window (Uses Gujarati હ) | ఒక హత్యకుడి window (Uses correct Telugu హ) |
| if you don't mind | మీరు気に పట్టించుకోకపోతే (Uses Japanese 気) | మీరు పట్టించుకోకపోతే (Uses correct Telugu script only) |
| I am not a suspect | నేను suspect नी కాదు (Uses Devanagari नी) | నేను suspect ని కాదు (Uses correct Telugu ని) |
| I am ready. | Nenu ready ga unnanu. (Romanized - BANNED) | నేను ready గా ఉన్నాను. (Doesn't transliterate) |
| 284<br>Sheriff Jackson mentioned we had | 284<br>ఈ రోజు town లో ఇద్దరు visitors<br>ఉన్నారని Sheriff Jackson చెప్పారు.<br>(Error: Merged 284 & 285 into index 284 to fix grammar) | Sheriff Jackson mention చేసారు మనకి<br>(Keeps sentence incomplete to match Source) |
| 285<br>a couple of visitors<br>in town today. | 285<br>Cinnamon festival cancel<br>అయిందని మీకు తెలుసు కదా.<br>(Error: Content pulled from next line...) | 285<br>కొంతమంది visitors<br>ఈ రోజు town లో ఉన్నారని.<br>(Keeps "hanging" fragment separate) |
| 286<br>You are aware the cinnamon<br>festival has been cancelled. | 286<br>Oh, అవును.<br>(Error: Merging subtitles causes cascading mismatch) | 286<br>Cinnamon festival cancel<br>అయిందని మీకు తెలుసు కదా.<br>(Restores correct content to ID 286) |
### Final Verification Protocol:
Before providing the final output, perform a self-correction check. Review your entire translated file one last time to confirm:
1. **Line Break Check:** Does the line count of every subtitle entry match the source exactly?
2. **Merge Check:** Confirm that no distinct lines or separate subtitle blocks have been merged; strict 1:1 mapping must be maintained.
3. **Script Check:** Have you scanned the entire text to ensure there are zero characters from any script other than English and Telugu? Verify common error characters like హ vs. હ.
Please begin the translation of the attached file, adhering strictly to these enhanced directives.
[!TIP] You can drag and drop files directly onto the Prompt Template and Subtitle file upload buttons.
If Gemini stops mid-translation, you'll see:
Click the button to automatically resume translation from where it stopped. This process repeats until the file is complete.
If validation found errors, click "🔧 Fix All Errors" to:
OriginalName(Language)(Model).(ISO-639-2/B Language Code).srtPsych.S04E05.1080p.BluRay.Remux.eng(Tenglish)(Gemini 3.1 Pro Preview).tel.srtThe tool includes 130+ pre-configured language scripts:
You can also add any custom Unicode range or character.
Edit the Model Name field to use other models. Since CLIProxyAPI supports OpenAI, Claude, and Gemini, you can input models like gemini-3.1-pro-preview, gpt-5.5, or claude-opus-4-7. Depending on the model selected, translation quality may vary:
gemini-3-flash-preview: Faster, cheaper, good for simple translationsgemini-2.5-pro: More accurate, better for complex translationsgemini-3.1-pro-preview: Latest model, best quality and reasoning[!WARNING] The application has only been tested with
gemini-3.1-pro-preview/gemini-2.5-proand only usesgemini-3-flash-previewto detect the target translation language for the purpose of naming the output SRT file.
Add specific character ranges for edge cases:
U+1F600-U+1F64F2200-22FF2500-257FU+20AC (€ symbol)Contributions are welcome! Some areas for improvement:
[!NOTE] The Gemini LLM was chosen as the default due to best performance on the MMMLU (Multilingual Q&A) and MRCR v2 (8-needle | Long context performance) benchmarks.
MIT License - see LICENSE file for details
Made with ❤️ for my mom and anyone else who wants to enjoy content in their native language.
19 commits
TypeScript
51.3%
HTML
39.6%
Java
5.5%
Rust
2.8%