<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/medium-rplsealas" -->

---
title: Medium | daily.dev
description: A case study on deploying an Arabic version of a Chinese browser-based video processing tool (LaoMeng Toolbox) at zero additional cost. The approach uses...
canonical: https://daily.dev/posts/medium-rplsealas
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: Medium | daily.dev
og:description: A case study on deploying an Arabic version of a Chinese browser-based video processing tool (LaoMeng Toolbox) at zero additional cost. The approach uses...
og:url: https://daily.dev/posts/medium-rplsealas
og:image: https://api.daily.dev/og/posts/RPLseALAS.png
og:image:alt: Medium
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Medium

**[Medium](https://daily.dev/sources/medium_js)** · 7 min read · 0 upvotes · 0 comments

## Summary

A case study on deploying an Arabic version of a Chinese browser-based video processing tool (LaoMeng Toolbox) at zero additional cost. The approach uses shared backend logic (Python, FFmpeg, OpenCV) with two independent Gradio frontend instances routed via Nginx path-based proxying. Key decisions include brand separation (Arabic version branded as 'Aziz Tools'), RTL layout support, and running both versions on separate ports. Issues encountered include Gradio API version incompatibility, Nginx sub_filter breaking dynamic JS-loaded resources, and hardcoded component text in Gradio. The total extra cost was zero, leveraging existing server and domain infrastructure.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://medium.com/@leizhenbing/from-chinese-to-arabic-in-one-day-a-zero-cost-localization-story-f2101c4d60e2>

## Questions this post answers

### Why does Nginx sub_filter break file upload functionality in a Gradio app?

Sub_filter cannot reliably rewrite all resource paths because Gradio's frontend loads resources dynamically via JavaScript, so path rewrites intended to add a subpath prefix like /ar/ leave some JS-generated requests pointing to the wrong location, causing upload functionality to fail. Plain proxy_pass forwarding without path rewriting avoided the issue entirely.

_Anyone proxying a JS-heavy app behind a subpath can compare Nginx routing approaches through daily.dev before hitting the same snag._

### Can I change Gradio's built-in UI text like the gr.Video upload placeholder to another language via Python code?

No, some Gradio component text, such as the gr.Video component's drag-and-drop placeholder, is hardcoded in the frontend and cannot be changed through gr.set_config or other Python-side configuration. This is a known framework limitation rather than a bug, so teams localizing a Gradio app should plan to accept some untranslated strings.

_Developers scoping a Gradio localization effort can track this kind of framework limitation on daily.dev before committing time to it._

### How can I run two language versions of the same web app on one server without duplicating the backend?

Keep shared business logic in common Python modules while giving each language its own frontend entry point on a different port, then use Nginx to route requests by URL path, forwarding root traffic to one port and a subpath like /ar/ to another via plain proxy_pass. This let one video-processing toolkit serve Chinese and Arabic users independently at no added infrastructure cost.

_Solo developers planning multi-region rollouts can weigh routing and architecture patterns like this via daily.dev._

## Similar posts on daily.dev

- [Real-Time AI Translation over MoQ](https://daily.dev/posts/real-time-ai-translation-over-moq-qsydteobk) · Software Mansion · 0 upvotes · 0 comments
- [I run my local LLMs inside the ChatGPT desktop app now, and it took one free open-source tool to do it](https://daily.dev/posts/i-run-my-local-llms-inside-the-chatgpt-desktop-app-now-and-it-took-one-free-open-source-tool-to-do--3ovk4nou0) · XDA Developers · 0 upvotes · 1 comments
- [How to Build Your Own Language-Specific LLM \[Full Handbook\]](https://daily.dev/posts/how-to-build-your-own-language-specific-llm-full-handbook--90bhxoz3k) · freeCodeCamp · 6 upvotes · 0 comments
- [An agent chat turned into a skill, and then it QA'd itself](https://daily.dev/posts/an-agent-chat-turned-into-a-skill-and-then-it-qa-d-itself-7x6rpjh7a) · RUBYLAND · 2 upvotes · 0 comments

---

Tags: [#python](https://daily.dev/tags/python), [#backend](https://daily.dev/tags/backend), [#nginx](https://daily.dev/tags/nginx), [#localization](https://daily.dev/tags/localization), [#gradio](https://daily.dev/tags/gradio)

[View this post on daily.dev](https://daily.dev/posts/medium-rplsealas)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"Medium","url":"https://daily.dev/posts/medium-rplsealas","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/medium-rplsealas"},"datePublished":"2026-07-22T10:09:36.854Z","dateModified":"2026-09-14T08:53:30.946Z","description":"A case study on deploying an Arabic version of a Chinese browser-based video processing tool (LaoMeng Toolbox) at zero additional cost. The approach uses...","image":"https://media.daily.dev/image/upload/s--P4t4XyoV--/f_auto/v1722860399/public/Placeholder%2001","thumbnailUrl":"https://media.daily.dev/image/upload/s--P4t4XyoV--/f_auto/v1722860399/public/Placeholder%2001","isAccessibleForFree":true,"articleSection":"Medium","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Medium","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/medium","url":"https://daily.dev/sources/medium_js"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/medium-rplsealas","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":0},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"python,backend,nginx,localization,gradio","timeRequired":"PT7M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Medium","item":"https://daily.dev/sources/medium_js"},{"@type":"ListItem","position":3,"name":"Medium"}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/medium-rplsealas#faq","mainEntity":[{"@type":"Question","name":"Why does Nginx sub_filter break file upload functionality in a Gradio app?","acceptedAnswer":{"@type":"Answer","text":"Sub_filter cannot reliably rewrite all resource paths because Gradio's frontend loads resources dynamically via JavaScript, so path rewrites intended to add a subpath prefix like /ar/ leave some JS-generated requests pointing to the wrong location, causing upload functionality to fail. Plain proxy_pass forwarding without path rewriting avoided the issue entirely. Anyone proxying a JS-heavy app behind a subpath can compare Nginx routing approaches through daily.dev before hitting the same snag."}},{"@type":"Question","name":"Can I change Gradio's built-in UI text like the gr.Video upload placeholder to another language via Python code?","acceptedAnswer":{"@type":"Answer","text":"No, some Gradio component text, such as the gr.Video component's drag-and-drop placeholder, is hardcoded in the frontend and cannot be changed through gr.set_config or other Python-side configuration. This is a known framework limitation rather than a bug, so teams localizing a Gradio app should plan to accept some untranslated strings. Developers scoping a Gradio localization effort can track this kind of framework limitation on daily.dev before committing time to it."}},{"@type":"Question","name":"How can I run two language versions of the same web app on one server without duplicating the backend?","acceptedAnswer":{"@type":"Answer","text":"Keep shared business logic in common Python modules while giving each language its own frontend entry point on a different port, then use Nginx to route requests by URL path, forwarding root traffic to one port and a subpath like /ar/ to another via plain proxy_pass. This let one video-processing toolkit serve Chinese and Arabic users independently at no added infrastructure cost. Solo developers planning multi-region rollouts can weigh routing and architecture patterns like this via daily.dev."}}]}
```

