Install the app
How to install the app on iOS

Follow along with the video below to see how to install our site as a web app on your home screen.

Note: This feature may not be available in some browsers.

[Tools] SLR/DSLR/SEP - Translation Engines for RPG Maker VX, VX Ace, MV, MZ, and Pictures

I've released v2.075
Changed Full Batch logic "again", but if you do not use a big model you won't notice a difference.


Before v2.075 it worked like this:

Determine batch size by the values determined in the options menu.
Send the batch a maximum of 3 times.
If all 3 batch requests fail to give a usable response, split the batch and send the first and second half individually a maximum of 4 times each.
If a half fails completely do single line requests for in instead.


That worked fine for small models, because if the batch is only 40 lines, and half fails, 20 individual translation requests aren't a big deal.
But if you've actually sent 240 lines, and it split it to 120 halves, and one of them fails, having to do 120 individual requests to a premium provider really hurts.


So now it instead works like this:

Determine batch size by the values determined in the options menu.
Send the batch a maximum of 3 times.
If all 3 batch requests fail and half of the batch would still have more or the same lines as the Minimum Sent Lines value, it restarts the entire Full Batch loop with a changed Maximum Sent Lines value.
If half the batch line count would be more than the Minimum Sent Lines, it will set the Maximum Sent Lines value to the old batch line count x 0.5.
If half the batch line count would be less than the Minimum Sent Lines, but 3 quarters would still be more than the Mnimum Sent Lines, or 3 quarters would be exactly the Minimum Sent lines, it will set the Maximum Sent Lines to the old batch line count x 0.75.
If 3 quarters would still be below the Minimum Sent requests, it will set the Maximum Sent lines to the old batch line count x 0.5.
This repeats until half of the batch lines would be less than half of the Minimum Sent Lines, at which point it sends single line requests instead.
The moment it succeeded a batch or the single requests for the last attempt have finished, all values reset and it tries a normal full batch again.


That means in the case of the 240 batch failing with Minimum Sent Lines being 40.
After 3 failures It would become 120.
If it fails 3 times again it would become 60.
If it fails 3 times again it would become 45, because halving it would have put it below the Minimum Sent Lines.
If it fails 3 times again it would become 22.
If it fails 3 times again it would do single requests for the 22, because 11 would be less than half of Minimum Sent lines.
If we now assume that the entire requested translation was only 240, then the next batch would now be 218.

That doesn't sound great, but is almost absurd to actually happen that way with a large premium model, unless you grossly overestimate its abilities and you should be lowering those batch sizes significantly anyway.
It failing at 120 is already kinda weird, but if it would, it then doing 120 individual requests would suck so much that this could save a lot of time and tokens.


Changelog since last changelog post:

2.075
DSLR
Changed DSLR Full Batch logic to keep splitting batches during failure until the resulting batch would be below half of the Minimum Sent Lines.
Full Batch will now sent a full error report on the first retry instead of making another blank attempt. (Worse for small locally hosted models, but they don't charge for tokens.)
Adjusted Full Batch Prompts.

2.074
DSLR
\\i[num] commands will no longer be escaped even if they are at the start or end of a line (in case they are not actually used for pictures and needed for context).
Fixed some plugin texts being tagged green even though there is no Japanese to translate (if japanesesource is enabled).
Will no longer reject a response identical to the input if the input doesn't actually have something to translate.
Added escaping for \i[_icon] type constructs.
Fixed escaper still looking for the old placeholders.
 
I've released v2.077 v2.078
DSLR
Added a new quality of life feature.
You can now set 3 Presets for the DSLR options.
You can just copy your options from the config.json and that works.
I've also added a button to reset all options except presets to default. (So you can savely use it without accidentally deleting your presets)

If you open the config.json from the data folder on a fresh SLR Translator you will see a bit that says '"dslr": {},'.
Whenever you change an option in the DSLR options menu that change will be saved in there.
You can just copy the {} with your currently changed settings and paste it into the preset option field.
It's unnecessary to mention any options that aren't different from your current settings even if they are not the default.

For example if you put this in the first Custom preset option field:
{
"maxTokens": 8000,
"maxLines": 200,
"maxPlaceholderCount": 80,
"repeat_penalty": 69
}
And then press the Custom Preset 1 button, it will change the max tokens, max lines, max placeholders and the repeat penalty values, while leaving everything else alone.


Changelog since last changelog post:

2.078
Fixed it wrongly tagging some safe cells yellow.
DSLR
Presets can no longer change presets.
Fixed presets not applying false or empty values.

2.077
DSLR
Added options preset options and a button to reset all options to default except the presets.

2.076
DSLR
It will now enforce Minimum Sent Lines and Maximum Sent Lines regardless of other values, even if it would create a very large request at the end, since the system introduced in 2.075 would shrink it later if necessary.
 
Last edited:
Edit: I can't test anything higher than Q6_K with my specs, but that's not particularly low and I definitely cannot recommend it.
Not only is it incredibly slow, but it does not follow orders. It honestly performs a lot worse than the 4b variant.
It's kinda like with the 12B version of qwen3, that was also terrible for no apparent reason.

Just as a heads up if someone wants to try out the new qwen3.5 27B model. (There's already a heretic v2 model by llmfan46 that looks very promising.)

You need to add
Code:
{%- set enable_thinking = false %}
to the top of the Jinja template.

In LM Studio that means go to the My Models section and click on the gear of the model entry, switch to the "Interference" tab and scroll all the way down.
You will see a "Prompt Template" section, make sure you're in the "Template (Jinja)" tab and just put that additional line at the very start of it.

Qwen3.5 loves getting stuck in a think loop and using the `"chat_template_kwargs":{\"enable_thinking\": false}` method currently does not work in LM Studio. `"reasoning_budget": 0`doesn't work either.
 
Last edited:
I've released 2.081.
There was a really annoying bug that caused a Bad Request error loop if an LLM failed a batch exactly 2 times, but succeeded on the third.
Besides fixing that. I've also improved Full Batch retry prompting in general a bit.


Changelog since last changelog post:

2.081
DSLR
Fixed a bug that caused an Error Status 400 Bad Request loop in specific situations.
Fixed retry prompt sometimes not using custom set placeholders.
Changed retry logic to make the correction request seem more like an ongoing conversation.
Changed some prompts.

2.080
DSLR
Fixed the custom parameter option not displaying properly.
Improved Full Batch retry prompts.
Changed DSLR manual to include information about qwen3.5.

2.079
DSLR
Fixed some more instances of it claiming, that there's catastrophic backtracking.
 
I've released 2.082
Added new option to DSLR called JSON Full Batch.

Since we now even have small 4B models capable and trained to provide structured output with JSON schemas (qwen3-vl and qwen3.5) it makes sense to actually offer that.
By default it will now send the translation requests as a specifically structured JSON and require the LLM to respond with a matching JSON.
A model that is actually trained for that sort of thing will perform much better that way, but I've left a toggle in the options menu to switch back to the old plain text with section marker logic in case you're using a model that was not trained for that.

During tests with qwen3.5-4b-paperwitch-heresy it reduced required Full Batch retries by more than half.

Changelog since last changelog post:
2.082
DSLR
Added new JSON Full Batch option.
It will send requests as JSON and demand structured output. (Much better for model trained that way.)
It's enabled by default, but you can toggle back to the old Section Marker logic in the options.
Adjusted/improved various prompts. re-prompts, and validation logic.
 
I've released v2.084.
DSLR JSON Full Batch is now no longer experimental.
I've done sufficient testing, I have fixed all known bugs, and added necessary polish.
:gokiko_uwoh:

Changelog since last changelog post:

2.084
DSLR
Revamped the DSLR console logs.
Made detailed explanation screen for Batch Validation failures in the console.
Accepted translations will now be grouped by 10 and collapsed.
All big block messages are now collapsed and you need to actually click on them to read them.
As a result it's no longer a laggy unreadable mess.
Added new error handling for "length" finish reason.
Should a model get stuck repeating the same thing and run out of context that will cause a "length" finish reason, the same as if it has too little context_length.
To try to get it out of that loop it will now increase the repeat_penalty, repetition_penalty, and/or the frequency_penalty by 0.05 on each retry.
It will only increase values that are not disabled with 69 in the options menu.
DSLR JSON Full Batch requests will no longer have a fixed 3 attempts. Instead it will decide whether or not to send a new correction request depending on if the last response actually improved compared to the last.
Fixed a bunch of descriptions and typos.

2.083
DSLR
Merged batch validation in JSON Full Batch mode to do everything at once and make a more comprehensive correction request.
It will no longer forget correction instructions on a retry caused by a server error.
Fixed a lot of small bugs with the JSON Full Batch option.
 
Last edited:
Using v2.084 with now more accurate error reporting, I've made a comparison between qwen3-4b-instruct-2507, qwen3-vl-instruct, and qwen3.5.

DSLR Instructions Compliance Test:
Translate 10000 characters (437 lines), that includes different types of placeholders and some quotes, with JSON Full Batch on default settings.

All at Q8_0 with a context length of 16384

https://huggingface.co/mradermacher/Qwen3-4B-Instruct-2507-heretic-v2-GGUF 4.3GB
Rejected Translations: 35
Complete Failures: 3 (Failed to preserve quotes even after 10 retries each)
Rejected Batches: 6
Server Issues: 0
Input Tokens: 80744
Output Tokens: 19309
Total Tokens: 100053

https://huggingface.co/HauhauCS/Qwen3-4B-2507-Instruct-Uncensored-HauhauCS-Aggressive 4.3GB
Rejected Translations: 35
Complete Failures: 3 (Failed to preserve quotes even after 10 retries each)
Rejected Batches: 7
Server Issues: 0
Input Tokens: 80845
Output Tokens: 19216
Total Tokens: 100061

https://huggingface.co/mradermacher/Qwen3-4B-Instruct-2507-gabliterated-GGUF 4.3GB
Rejected Translations: 42
Complete Failures: 3 (Failed to preserve quotes even after 10 retries each)
Rejected Batches: 10
Server Issues: 0
Input Tokens: 94134
Output Tokens: 21598
Total Tokens: 115732

https://huggingface.co/mradermacher/Qwen3-VL-4B-Instruct-Unredacted-MAX-GGUF 5.1GB
Rejected Translations: 36
Complete Failures: 3 (Failed to preserve quotes even after 10 retries each)
Rejected Batches: 2
Server Issues: 1 ("length" finish reason)
Input Tokens: 67910
Output Tokens: 14042
Total Tokens: 81952

https://huggingface.co/mradermacher/Huihui-Qwen3-VL-4B-Instruct-abliterated-GGUF 5.1GB
Rejected Translations: 36
Complete Failures: 3 (Failed to preserve quotes even after 10 retries each)
Rejected Batches: 3
Server Issues: 1 ("length" finish reason)
Input Tokens: 72814
Output Tokens: 15908
Total Tokens: 88722

https://huggingface.co/mradermacher/Qwen3-VL-4B-Instruct-c_abliterated-v2-GGUF 5.1GB
Rejected Translations: 35
Complete Failures: 3 (Failed to preserve quotes even after 10 retries each)
Rejected Batches: 0
Server Issues: 1 ("length" finish reason)
Input Tokens: 59802
Output Tokens: 11652
Total Tokens: 71454

https://huggingface.co/mradermacher/qwen3.5-4b-gabliterated-GGUF 5.2GB
With {%- set enable_thinking = false %} added to the Jinja Template (Necessary for that model)
Rejected Translations: 3
Complete Failures: 0
Rejected Batches: 5
Server Issues: 0
Input Tokens: 44153
Output Tokens: 19760
Total Tokens: 63913

https://huggingface.co/mradermacher/Huihui-Qwen3.5-4B-abliterated-GGUF 5.2GB
With {%- set enable_thinking = false %} added to the Jinja Template (Necessary for that model)
Rejected Translations: 36
Complete Failures: 3 (Failed to preserve quotes even after 10 retries each)
Rejected Batches: 4
Server Issues: 0
Input Tokens: 80695
Output Tokens: 19440
Total Tokens: 100135

https://huggingface.co/HauhauCS/Qwen3.5-4B-Uncensored-HauhauCS-Aggressive 5.2GB
With {%- set enable_thinking = false %} added to the Jinja Template (Necessary for that model)
Rejected Translations: 6
Complete Failures: 0
Rejected Batches: 2
Server Issues: 0
Input Tokens: 36983
Output Tokens: 16345
Total Tokens: 53328

https://huggingface.co/mradermacher/Qwen3.5-4B-PaperWitch-heresy-GGUF 5.2GB
With {%- set enable_thinking = false %} added to the Jinja Template (Necessary for that model)
Rejected Translations: 3
Complete Failures: 0
Rejected Batches: 11
Server Issues: 0
Input Tokens: 73775
Output Tokens: 24173
Total Tokens: 97948

Observations:
There is no reason to use a qwen3-4b-2507-instruct model anymore, it constantly fails to provide usable batches and doesn't properly preserve quotes.
qwen3-vl-4b-instruct seems to really like structured JSONs and it only rarely fails batches making it surprisingly fast, but it fails to preserve quotes and that makes it really bad for projects with nameplates.
All qwen3.5-4b models except the Huihui one managed to preserve the quotes correctly, passing the test.


Conclusions:
Judging purely from this tiny sample size test, the models suitable for DSLR are:

https://huggingface.co/HauhauCS/Qwen3.5-4B-Uncensored-HauhauCS-Aggressive

https://huggingface.co/mradermacher/qwen3.5-4b-gabliterated-GGUF

https://huggingface.co/mradermacher/Qwen3.5-4B-PaperWitch-heresy-GGUF

To know which specific one of these three to pick is now just a matter of translation quality, but I would really appreciate if someone else could evaluate that, because I'm not a native English speaker, and I've been told on multiple occasions that my manual translations are "only barely above MTL".
Of the three passing models, the PaperWitch-heresy model needed significantly more attempts, but it would be a mistake to already dismiss it based on that, because as long as there are no complete failures, it's just the translation quality that matters.
 
Edit: I forgot to actually change the version number and it still says 2.086 in the tool if you launch the tool, but it's 2.087.

I've released v2.087
Added new JSON Object Full Batch option.
I noticed the official DeepSeek api doesn't actually support JSON schemas.
As a workaround I've now added on option to just send the json_object request and add the schema through the system prompt.
So far that seems to work pretty well.
So if you notice 400 Bad Request errors, and it's not a "normal" issue like you having the repeat_penalty of LM Studio active even though you are not using it, or that you forgot to increase the context length of the model, it might be that your provider doesn't support JSON Schemas.


Changelog since last changelog post:

2.087
DSLR
Added new JSON Object Full Batch option to support providers that only support the json_object response_format and not json_schema.
Changed prompts to tell models about the output format more strictly in case they tend to ignore the response_format setting like DeepSeek does.

2.086
DSLR
Added escaping for some very specific item icons.
Added checks for quotes to the full batch validation (not tested, likely still looks for wrong format).
Improved error logging for unusable JSON responses.
Added some mostly DeepSeek specific recovery stuff to JSON Full Batch for when it does not follow orders.
Fixed some long console logs still not showing up collapsed.

2.085
DSLR
Fixed old section marker batch validation never actually approving stuff anymore.
If there is leftover Japanese in the response, it will now ask the LLM if it was trying to draw something like a shape or emoticon, and accept it if it says yes.
Will now replace "\n" in responses with linebreaks if the original did not include any "\n".
Changed default values to create much smaller batches, to better suit lowpower models.
Added note to JSON full batch about incompatibility with the official DeepSeek api.
 
Last edited:
323 Dialogue box test with some placeholders and speech bubbles for models suitable for 12-16GB VRAM.

qwen3.5-4b-paperwitch-heresy Q8 4.48GB
Rejected Translations: 1
Rejected Batches: 1
Server Issues: 0
Complete Failures: 0
Input Tokens: 28112
Output Tokens: 14649
Total Tokens: 42761

gemma-4-e4b-it-heretic Q8 8.03GB
Rejected Translations: 0
Rejected Batches: 3
Server Issues: 0
Complete Failures: 0
Input Tokens: 34807
Output Tokens: 17223
Total Tokens: 52030

gemma-4-e4b-it-uncensored Q8 8.03GB
Rejected Translations: 1
Rejected Batches: 2
Server Issues: 0
Complete Failures: 0
Input Tokens: 32542
Output Tokens: 16085
Total Tokens: 48627

gemma-4-e4b-it-ultra-uncensored-heretic Q8 9.02GB
Rejected Translations: 0
Rejected Batches: 2
Server Issues: 0
Complete Failures: 0
Input Tokens: 31006
Output Tokens: 15769
Total Tokens: 46775

gemma-4-e4b-uncensored-hauhaucs-aggressive Q8 9.12GB
Rejected Translations: 0
Rejected Batches: 2
Server Issues: 0
Complete Failures: 0
Input Tokens: 30928
Output Tokens: 15955
Total Tokens: 46883

qwen3.5-9b-uncensored-hauhaucs-aggressive Q8 10.45GB
Rejected Translations: 0
Rejected Batches: 0
Server Issues: 0
Complete Failures: 0
Input Tokens: 23310
Output Tokens: 13185
Total Tokens: 36495

qwen3.5-9b-ultra-uncensored-heretic-v1 Q8 11.35GB
Rejected Translations: 1
Rejected Batches: 0
Server Issues: 0
Complete Failures: 0
Input Tokens: 24717
Output Tokens: 13066
Total Tokens: 37783

qwen3.5-9b-abliterated-v2-max Q8 11.35GB
Rejected Translations: 1
Rejected Batches: 2
Server Issues: 3 (Got stuck in repetition)
Complete Failures: 0
Input Tokens: 31545
Output Tokens: 16130
Total Tokens: 47675 (token count is not correct, it did not count the server issues for some reason)

qwen3.5-9b-abliterated Q8 9.53GB
Rejected Translations: 3
Rejected Batches: 0
Server Issues: 0
Complete Failures: 0
Input Tokens: 27645
Output Tokens: 13347
Total Tokens: 40992

Conclusions:
Gemma4 is suitable for DSLR JSON Full Batch Translation, but there does not appear to be a significant difference in instructions compliance to qwen3.5.
The only uncensor option that seems to have gotten significant damage is qwen3.5-9b-abliterated-v2-max and I wouldn't recommend using that one.

Everything else is now dependent on the actual translation result again.
 
Apparently there is a new encryption system for MZ and fake MV now.
It was supposedly added in 1.8.0 already, but I didn't notice because no one was using it.

What it does:
It encrypts all data files to only have a "uid" a "bid" and an encrypted "data" string.

What my current guess is based mostly on research by GLM5.1:
The decryption code is embedded in rmmz_managers.js inside DataManager.onXhrLoad.
It's obfuscated with heavy whitespace padding so you wouldn't notice it while just casually scrolling the file.

Current approach:
1. Base64 decode the data field using atob(), Or if unavailable Buffer.from(wrapper.data, 'base64').toString('binary')
2. Xor decrypt each byte using characters from the uid string (cycling throug uid with charCodeAt)
3. Decrompress with pako.inflate() (the game's js/lib will already include some version of pako, for example pako.min.js)
4. JSON.parse the result to get the original data object

Will that work? I dunno, but it sounds like it could. lol
 
I've released v2.095.
Added support for new(ish) RPG Maker versions.
:gokiko_uwoh:

Changelog since last changelog post:

2.095
Another compatibility update for a new RPGM version.

2.094
Compatibility update for 2 new RPGM versions.

2.093
DSLR JSON Full Batch will now reject responses if they did not preserve at least 90% of double quotes.

2.092
DSLR
Fixed it not counting tokens of Server Error type responses.

2.091
TES Patcher will now also collect code 102 entries.
Added special parsing for main.rvdata2 TES 102 Choice Boxes to keep choices separate.
Added 401 TES cells to automatic word wrapping.

2.090
Fixed TES Patcher not detecting modified TES files.

2.089
Fixed an issue preventing large amounts of js files to be exported.
Added better error checking for zip file creation.

2.088
Fixed an error sometimes causing OCR comparison to fail in SEP.
Fixed INNERBOUNDRY error false flagging stuff.
Added some niche item icon escaping.
 
Last edited:
I've added a version of SLR translator that runs natively on Linux.
:gokiko_yay:
It's an early prototype and not properly tested.
I basically just translated 1 game on true Arch Linux with a bunch of random packages installed, and one on a fresh EndeavourOS installation. Because that's what I had laying around.
 
I've changed the Custom Parser addon to have better csv support.
Basically if you use a tpm that has nothing in it except that it applies to "*.csv" (there's an example in the Custom Parsers folder), it will try to automatically detect an "original" column and collect text from there, it will automatically export translation into a "translate" column, and it will use all other columns for the context entry. It will also allow you to use "," in the text.
I mostly just made it for my Livemaker Translation Patcher project. (But if you would use it for that you need to escape the <> stuff in aggressive splitting.)
 
Is there any Android version?
I don't a PC or Laptop.
I've been using Mtool Android but using only free translator.

I wanna try to translate the game i want and share the English patch on this forum.
Any suggestion?