Back to blog

Business Translated in Spanish: A Guide for Django Devs

2026-06-29 9 min read
Business Translated in Spanish: A Guide for Django Devs

Meta description: Fix “business” translated in Spanish in Django with pgettext, glossary rules, and locale-aware .po workflows that avoid wrong UI terms.

You run makemessages, ship the strings to translation, and get back a Spanish UI where Business became negocio everywhere.

Now your pricing page says Plan de Negocio, your footer refers to your company as a negocio, and a sentence about your legal entity reads like you're talking about a shop, not a corporation. Nothing is broken at the Python level. The bug is linguistic, and users still see it.

That's the trap with business translated in Spanish. English lets one noun do too much work. Django won't disambiguate it for you. A raw gettext("Business") gives translators and AI tools almost no context, so the wrong Spanish term leaks into plans, legal copy, admin labels, and onboarding screens.

When 'Business' in Spanish Breaks Your UI

The failure usually starts with a tiny source string:

from django.utils.translation import gettext_lazy as _

PLAN_NAME = _("Business")

That string might mean:

  • a pricing tier
  • a company
  • a commercial activity
  • a matter under discussion

Spanish doesn't collapse those into one safe default. If your translator or model picks negocio, the result may be grammatically valid and still wrong for your product.

The bug isn't in gettext

Django stores the original string and gives you a translation hook. It doesn't infer domain meaning from your codebase. That gap shows up fast in UI copy, because short labels carry the least context.

Practical rule: The shorter the source string, the more likely it is to be mistranslated.

General localization advice often misses the part that hurts developers most. The problem is not just translating words. It's handling technical or context-sensitive terms with enough precision that you don't introduce ambiguity or break the product, a gap often ignored in broader business localization advice, as noted in this writeup on context-sensitive translation.

Where teams get burned

A few recurring examples:

  • Pricing pages: “Business” often means a plan tier, not commerce in general.
  • Legal pages: “business entity” usually maps closer to empresa than negocio.
  • Admin dashboards: “business address” may refer to a registered company address.
  • Support copy: “your business is growing” likely refers to the customer's company.

If you've ever searched your .po files and found one msgid "Business" reused across unrelated screens, that's the smell. You need context before translation, not after QA.

Negocio vs Empresa The Core Ambiguity

If you want cleaner Spanish output, start by deciding what English business means in each place it appears. The translation changes with the role of the noun.

Django i18n guides that deal with this problem directly point out the core mapping: empresa for a company, negocio for a trade or commercial activity, and cuestión for a matter. .po files don't auto-disambiguate, so a translator has to choose based on context, and AI tools often drift toward negocio when no context is present, as described in this Django i18n guide.

The meanings that matter in apps

Spanish Term Primary Meaning Example UI String
empresa company, corporate entity Our business is incorporated
negocio commercial activity, trade, small business Start your own business
cuestión matter, issue That's not our business
asunto affair, matter in discussion This business is confidential

For most SaaS apps, the dangerous collision is empresa vs negocio.

  • Use empresa when you mean the customer's company, employer, organization, or legal entity.
  • Use negocio when you mean commerce, a venture, or operating a business activity.
  • Use cuestión or asunto when English means “matter,” not commerce.

SaaS examples that usually need different translations

English string Better Spanish choice Why
Business plan plan context dependent, often keep brand naming under review Could be a pricing tier, not generic commerce
Your business settings configuración de la empresa Refers to the customer account or company
Start a business iniciar un negocio Refers to launching a commercial activity
Our business is growing nuestra empresa está creciendo Refers to the company
That's your business es tu cuestión / es tu asunto Means “your concern,” not commerce

Short English labels are especially nasty because they hide grammar and intent. The same thing happens with prepositions and support copy. If your team struggles with nearby wording choices, keep a language note handy. A concise resource like Verbalane's easy guide to por or para helps reviewers catch the kind of small Spanish choices that make UI text feel native instead of translated.

Treat ambiguous English source strings as a code smell. If a human reviewer has to guess, your translation workflow will guess too.

Adding Context with Django's pgettext

The fix in Django is pgettext. Use it anywhere one English string can map to different target-language terms.

A hand pointing at code showing how pgettext adds context to translations for different genders.

Replace bare gettext calls

Bad:

from django.utils.translation import gettext_lazy as _

class PlanLabels:
    BUSINESS = _("Business")

Better:

from django.utils.translation import pgettext_lazy

class PlanLabels:
    BUSINESS = pgettext_lazy("plan type", "Business")

For company references:

from django.utils.translation import pgettext_lazy

COMPANY_LABEL = pgettext_lazy("company or legal entity", "Business")

That gives translators a usable signal. “Business” no longer arrives as an orphaned token.

In templates and Python

Python:

from django.utils.translation import pgettext

def get_legal_copy():
    return pgettext("company or legal entity", "Business")

Template:

{% load i18n %}
<h2>{% translate "Business" context "plan type" %}</h2>
<p>{% translate "Business" context "company or legal entity" %}</p>

If you're using AI-assisted translation, context improves output quality more than prompt hand-waving. The pattern is the same whether you review translations manually or feed .po files through automation. The key is that the context lives in the catalog, not in someone's memory. For a good implementation pattern, see the notes on translation context in Django localization workflows.

What shows up in the .po file

After:

python manage.py makemessages --locale=es

You'll get entries like:

#: billing/models.py:14
msgctxt "plan type"
msgid "Business"
msgstr ""

#: accounts/forms.py:27
msgctxt "company or legal entity"
msgid "Business"
msgstr ""

That's what you want. Two separate entries. Two separate translations.

Building a Glossary-Aware Translation Workflow

pgettext fixes the source side. The next problem is consistency across releases. One translator writes empresa, another writes negocio, and an AI pass flips the term again six weeks later because the prompt changed.

The old workflow invites that drift. The manual path usually starts by duplicating a .pot file into a .po file for each target language, then editing each msgstr entry by hand while keeping plural rules in the header intact, as described in this .po and .pot walkthrough.

Screenshot from https://translatebot.dev/static/images/cli_animation.svg

Put your decisions in version control

A glossary file beats tribal knowledge. I like a TRANSLATING.md at the project root.

# Spanish glossary

- Business (company or legal entity) -> empresa
- Business (commercial activity) -> negocio
- Account -> cuenta
- Billing -> facturación
- Placeholder patterns like %(name)s, %s, {0} must not be altered
- Keep HTML tags unchanged

That file gives reviewers, contractors, and automation the same source of truth. If your PMs need a shared vocabulary reference for adjacent product language, a broader glossary like PinDrop's essential terms for web project managers is useful background, especially when engineers and non-engineers are naming the same feature differently.

A reproducible Django workflow

Use a repeatable sequence, not ad hoc edits in random tools.

python manage.py makemessages --locale=es_ES
python manage.py makemessages --locale=es_MX
python manage.py translate --target-lang=es_ES
python manage.py translate --target-lang=es_MX
python manage.py compilemessages

What matters in that workflow:

  • Context survives because msgctxt travels with the string.
  • Glossary rules stick because the same terms get applied every run.
  • Diffs stay reviewable because changes land back in locale/.../django.po.

For glossary formatting ideas that work well with AI-assisted .po translation, the examples in this glossary format guide are a practical starting point.

If a term matters to product, legal, or billing, don't leave it as an unwritten convention.

A .po snippet worth reviewing carefully

#: templates/pricing.html:8
msgctxt "plan type"
msgid "Business"
msgstr "Empresa"

#: templates/legal/footer.html:3
msgctxt "company or legal entity"
msgid "Business"
msgstr "Empresa"

#: templates/onboarding/start.html:12
msgctxt "commercial activity"
msgid "Start a business"
msgstr "Iniciar un negocio"

#: templates/email/welcome.html:5
#, python-format
msgid "Welcome, %(name)s"
msgstr "Te damos la bienvenida, %(name)s"

Notice the placeholder survives untouched. That part isn't optional.

Handling Regional Spanish (es_ES vs es_MX)

Even after you fix empresa versus negocio, a single Spanish locale can still feel off. Spain and Mexico don't always use the same vocabulary, tone, or second-person forms.

An infographic comparing Spanish language vocabulary and usage between Spain and Mexico, highlighting regional linguistic differences.

Spanish matters at scale. It's the second most spoken native language globally with over 485 million speakers, and the United States alone has over 42 million native Spanish speakers, which is why regional wording choices can affect real product experience in domestic and international markets, according to these Spanish translation statistics.

When one es locale isn't enough

Django's locale layout makes regional targeting explicit:

locale/es_ES/LC_MESSAGES/django.po
locale/es_MX/LC_MESSAGES/django.po

That's usually worth doing when:

  • Support is regional: your customer success team writes market-specific copy.
  • Sales is regional: pricing, invoices, or legal terms differ by market.
  • Tone matters: vosotros in Spain can feel wrong in Mexico.
  • Vocabulary differs: common nouns vary enough to make the UI feel imported.

For support teams, regional language handling isn't just a translation problem. It's an operational one. A practical example is CallZent's Spanish support approach, which highlights why region-aware language choices matter when users expect local wording.

Keep the structure, swap the locale

You don't need a new architecture. Use the same patterns with different target files:

  • pgettext still disambiguates source meaning.
  • Your glossary can include locale-specific notes.
  • QA should review es_ES and es_MX independently.

Later, if you need a clean explainer for teammates who confuse language and locale, point them to a concise guide on what a locale means in translation workflows.

A quick visual overview helps when you're socializing that decision inside the team:

Your Workflow Before the Next Deploy

If “business translated in Spanish” is showing up wrong in your app, fix the source and the process in one pass.

Pre-flight checklist

  1. Grep for ambiguity Search for strings like _("Business"), gettext("Business"), and template labels that stand alone.

  2. Refactor to context-aware calls Replace ambiguous strings with pgettext or pgettext_lazy.

  3. Write the glossary down Add canonical term decisions to TRANSLATING.md. Include placeholder and HTML preservation rules.

  4. Regenerate message catalogs Run:

    python manage.py makemessages --locale=es_ES
    
  5. Translate with review in mind Whether you use human review, a script, or a CLI tool, inspect every msgctxt entry for high-risk terms.

  6. Compile before deploy Django's gettext stack needs human-readable .po files compiled into binary .mo files before runtime. compilemessages handles that step by running the underlying msgfmt flow described in the Django translation docs.

python manage.py compilemessages

Bad Spanish in production usually starts as bad context in source strings.

If you only do one thing today, audit every ambiguous one-word label in your codebase. Business is rarely the only offender.


If you want to automate this without leaving your editor, TranslateBot is built for the Django workflow you already use. It runs as a manage.py translate command, works with .po files and model fields, preserves placeholders and HTML, and uses providers like GPT-4o-mini, Claude, Gemini, and DeepL. Pair it with pgettext, a real glossary, and compilemessages, and you get a translation pipeline that stays reviewable in Git instead of drifting across portals and copy-paste steps.

Stop editing .po files manually

TranslateBot automates Django translations with AI. One command, all your languages, pennies per translation.