# What a .pot File Is and How to Translate It | Vitra.ai

> A .pot is a template with empty translations. Translating it directly is the mistake — you generate .po files from it, one per language in practice.

**Canonical URL**: https://www.vitra.ai/general/translate-pot-files
**Source**: This is the Markdown rendering of https://www.vitra.ai/general/translate-pot-files, generated at build time from that page.

---

4 min read

# What a .pot File Is and How to Translate It

A .pot is a template with empty translations. Translating it directly is the mistake — you generate .po files from it, one per language in practice.

[Samhitha J Bhatt](https://www.vitra.ai/author/samhitha)
Senior Product Manager , Vitra.ai
Updated Aug 17, 2026

![What a .pot File Is and How to Translate It](https://www.vitra.ai/static/images/blog/translate-pot-files.jpg)

Table of contents

[Template, not catalogue](#template-not-catalogue)

[Why the distinction matters operationally](#why-the-distinction-matters-operationally)

[What the template carries](#what-the-template-carries)

[Header fields are configuration](#header-fields-are-configuration)

[Keeping it continuous](#keeping-it-continuous)

[The route through](#the-route-through)

[Extraction settings decide what is translatable](#extraction-settings-decide-what-is-translatable)

[One template, many catalogues](#one-template-many-catalogues)

[Where to start](#where-to-start)

[FAQ](#faq)

Contributors

[Samhitha J Bhatt](https://www.vitra.ai/author/samhitha)
Senior Product Manager

Subscribe to our newsletter

Subscribe

> **Quick answer —** A .pot file is the empty catalogue extracted from source code: every msgid with a blank msgstr. You do not translate the .pot itself. You generate a language-specific .po from it and translate that.

## Template, not catalogue

`.pot` stands for portable object template. It is what string extraction produces: every translatable string in the codebase, with an empty translation for each.

The template is the master list. Each language gets its own `[.po](/general/translate-po-files)` generated from it, and those are what carry the actual translations. Editing the .pot to add translations works until the next extraction overwrites it.

## Why the distinction matters operationally

When developers add strings, extraction regenerates the .pot. Existing .po files are then merged against the new template, which adds the new strings, keeps existing translations, and marks changed ones fuzzy. That merge is the whole reason the two-file design exists. Skip it by translating the template directly and every regeneration destroys the work.

## What the template carries

Field

Purpose

`msgid`

The source string and the lookup key

`msgctxt`

Disambiguation where the same string means two things

Source references

The file and line each string came from

Extracted comments

Notes the developer left for translators

`#, c-format` flags

Warns that placeholders exist and must survive

The extracted comments are the most under-used part. A developer who writes a note explaining that a string is a button label has removed an entire class of translation error, and most workflows never show it to anyone.

## Header fields are configuration

The template header carries the plural rule, the character set and the project metadata. When a .po is generated, the plural rule has to be set for that language rather than inherited from the template's placeholder.

Getting this wrong is why some languages show correct singulars and wrong plurals — the file has too few forms for the language it serves.

## Keeping it continuous

Extraction, merge, translate, ship, repeat. The cycle runs every release, and the volume per cycle is small — a handful of new strings against thousands of stable ones.

[translation memory](https://www.vitra.ai/features/translation-memory) is what makes that economic: unchanged strings return their approved renderings and only genuinely new text is worked on.

## The route through

Generate the per-language .po from the template, translate those, and keep the template as the extraction output it is.

[document translation](https://www.vitra.ai/features/document-translation) handles the catalogue format and [quality control](https://www.vitra.ai/features/quality-control) verifies the placeholders and plural counts.

The template workflow is on the [POT translation integration](https://www.vitra.ai/integration/pot-translation) page, and the catalogue side on the [PO integration](https://www.vitra.ai/integration/po-translation) page.

## Extraction settings decide what is translatable

Extraction scans the source for marked strings — whatever function the project uses to wrap translatable text. Anything unwrapped never reaches the template and therefore never gets translated at all. That makes the most common localization bug an extraction bug rather than a translation one. Before blaming the catalogue, check whether the missing string was ever marked in the code.

## One template, many catalogues

A project with fifteen languages has one template and fifteen catalogues, all merged from it on every extraction. Keeping them in step is the operational job, and it is a scripting problem rather than a linguistic one.

Automate the extract-and-merge step in the build. Doing it by hand is how a language quietly falls two releases behind without anybody noticing.

## Where to start

Confirm your build regenerates the template and merges rather than overwriting. If it overwrites, fix that before translating anything.

## FAQ

**What is a .pot file?** A portable object template: the output of string extraction, listing every translatable string in the codebase with an empty translation for each. It is the master list rather than a catalogue.

**Should I translate the .pot file directly?** No. Generate a language-specific .po from it and translate that. Editing the template works until the next extraction regenerates it, at which point the work is lost.

**What happens when developers add new strings?** Extraction regenerates the template and existing .po files are merged against it, which adds new strings, keeps existing translations and marks changed ones fuzzy. That merge is why the two-file design exists.

**What is the most under-used part of a template?** Extracted comments. A developer's note explaining that a string is a button label removes a whole class of error, and most workflows never surface it to whoever is translating.

Our blog

## Lastest blog posts

Tool and strategies modern teams need to help their companies grow.

Automotive

[Automotive Brochure Localization by Market](https://www.vitra.ai/automotive/automotive-brochure-localization)
A car brochure is a spec grid, a legal footer and a photo library, all market-specific. What actually has to change, and why the layout decides the schedule.

[Samhitha J Bhatt](https://www.vitra.ai/author/samhitha)
Aug 18, 2026

Automotive

[Automotive Campaign Localization Across Markets](https://www.vitra.ai/automotive/automotive-campaign-localization)
Campaigns run through national companies and dealer networks, so one master becomes hundreds of files. Where the offer text and the disclaimers actually break.

[Samhitha J Bhatt](https://www.vitra.ai/author/samhitha)
Aug 18, 2026

Automotive

[Car Service Manual Translation for Technicians](https://www.vitra.ai/automotive/automotive-service-manual-translation)
A workshop manual is read mid-repair by someone with the car on a lift. What that demands of procedures, torque figures and fault codes, in every language.

[Samhitha J Bhatt](https://www.vitra.ai/author/samhitha)
Aug 18, 2026

[View all posts](https://www.vitra.ai/blog/page/1)

---

## Structured data

```json
{
  "@context": "https://schema.org",
  "@type": "Article",
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://www.vitra.ai/general/translate-pot-files"
  },
  "headline": "What a .pot File Is and How to Translate It",
  "image": [
    {
      "@type": "ImageObject",
      "url": "https://www.vitra.ai/static/images/blog/translate-pot-files.jpg"
    }
  ],
  "datePublished": "2026-08-17T00:00:00.000Z",
  "dateModified": "2026-08-17T00:00:00.000Z",
  "author": [
    {
      "@type": "Person",
      "name": "Samhitha J Bhatt"
    }
  ],
  "publisher": {
    "@type": "Organization",
    "name": "Vitra.ai",
    "logo": {
      "@type": "ImageObject",
      "url": "https://www.vitra.ai/static/images/vitra-v-logo.png"
    }
  },
  "description": "A .pot is a template with empty translations. Translating it directly is the mistake — you generate .po files from it, one per language in practice."
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "https://www.vitra.ai"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "General",
      "item": "https://www.vitra.ai/general"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "What a .pot File Is and How to Translate It",
      "item": "https://www.vitra.ai/general/translate-pot-files"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is a .pot file?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "A portable object template: the output of string extraction, listing every translatable string in the codebase with an empty translation for each. It is the master list rather than a catalogue."
      }
    },
    {
      "@type": "Question",
      "name": "Should I translate the .pot file directly?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. Generate a language-specific .po from it and translate that. Editing the template works until the next extraction regenerates it, at which point the work is lost."
      }
    },
    {
      "@type": "Question",
      "name": "What happens when developers add new strings?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Extraction regenerates the template and existing .po files are merged against it, which adds new strings, keeps existing translations and marks changed ones fuzzy. That merge is why the two-file design exists."
      }
    },
    {
      "@type": "Question",
      "name": "What is the most under-used part of a template?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Extracted comments. A developer's note explaining that a string is a button label removes a whole class of error, and most workflows never surface it to whoever is translating."
      }
    }
  ]
}
```
