I've been experimenting with enabling translation on my instance and since I've seen zero documentation about how to configure LibreTranslate with a purchased api key, I'm going to share my findings here.
Pretty much every guide out there for enabling translation on a Mastodon instance using LibreTranslate assumes that you are going to be setting up the LibreTranslate server yourself. That's admirable, but translation is pretty resource-intensive. When I tested this on my instance, it was taking about 2 seconds to translate a post, and even longer for longer posts. Plus there were some languages that weren't working at all. That was probably on me for not setting up the language packs correctly. Maybe I'll give it another try, but somewhere in the middle of wrestling with the translation server, I realized that I'm here to run a Mastodon instance, not a LibreTranslate instance, so I went and purchased an api key from LibreTranslate for their lower tier of $29 a month (good for 80 translations per minute). Based on the average donations we get each month, that seemed a reasonable cost that we could afford. The trouble was, configuring the instance to use the api key didn't seem to be working at all.
Now if you go to https://libretranslate.com it lets you play around with the api and shows what the post request and the subsequent response looks like. In the post request and in the api documentation, the endpoint for the translation service is:
https://libretranslate.com/translate
but if you set LIBRE_TRANSLATE_ENDPOINT to that value in your .env.production file, it won't work. After a bunch of googling and experimentation, I finally went and looked at the pull request for this feature on GitHub. And that's where I saw that in the code for the post request it takes the configured LIBRE_TRANSLATE_ENDPOINT value and then adds the "/translate" at the end of it.
Even though I was sure I had tried this before, I set LIBRE_TRANSLATE_ENDPOINT to:
Without the "/translate" on the end. I restarted the web service and cleared the cache and it started working perfectly.
It'd be nice if any of this was actually documented somewhere.