Skip to main content

Understanding processed words: How Lokalise measures usage

Learn how processed words are calculated in Lokalise and when they're counted across translation workflows, imports, automations, and more.

Written by Ilya Krukowski

Lokalise measures usage based on processed words — the number of words actively handled during translation operations. This includes base and target language content processed through imports, first-time translations, base language updates, AI/MT, automations, and other translation operations.

In this article, you’ll learn what qualifies as a processed word, what doesn’t, and how this usage metric applies across different workflows in Lokalise.

What are processed words?

Overview

Processed words are the core unit used to measure how much translation work is happening in your Lokalise projects. This includes words in both your base and target languages that are actively translated, updated, or processed through the platform — whether by a human, AI/MT, API, import, or automation.

Processed words are calculated from base and target language content involved in applicable translation updates, such as initial translations, base language updates, imports that modify content, AI/MT actions, and automations.

When an applicable translation update is counted, Lokalise counts the words in the resulting translation field.

Why this matters?

Your subscription includes allowances for different usage metrics, including processed words. You can view your current usage and limits on the Usage overview page.

Here’s what’s important to know:

  • All plans include unlimited translation keys.
    You can store as many keys as you need.

  • All paid plans include unlimited hosted words.
    Stored content does not consume your processed words allowance by itself.

  • Processed words are separate from AI translation allowances.
    Depending on the operation, both processed words and an AI-specific allowance may be consumed.


When are words processed?

Processed words are counted when content is created or updated through applicable translation operations, including imports, AI/MT, automations, integrations, and other supported workflows. This applies to both base and target language content.

Words are processed in the following cases

Base content:

  • When base language content is imported for the first time

  • When base content is updated (via UI, API, import, or 3rd-party integrations)

  • When a key is deleted and then re-imported, even if the key name and value are identical to the previous version

    • Deleted keys are treated as new content when re-created

Target content:

  • When a key is translated for the first time (regardless of method: UI, import, AI/MT, etc.)

  • When target content is created via bulk actions (e.g., copying source content into an empty target translation)

    • This applies even if the copied content already exists in the project in another language or variant, and no edits are made. If the target field was previously empty, creating the translation (regardless of method) counts as processed words.

  • When a translation is updated due to:

  • When a TM (translation memory) suggestion below 100% match is accepted

  • When translation is created or modified inside a branch

  • When you use pseudolocalization

Words are not processed in the following cases:

  • Manual edits to target content without any base language changes

  • TM suggestions with 100% match

  • Re-imports of the same content with no changes (determined by key–value comparison)

    • This applies only if the keys already exist in the project. If a key was deleted and then re-imported, it is treated as new content and will be counted as processed words.

    • This applies only to re-imports within the same project, since the word count is based on key-specific content.

  • Supported placeholders and markup in supported formats

    • This applies only to the placeholder or markup syntax itself. Any translatable text inside placeholder structures is still counted.

    • Unsupported placeholder-like content is treated as regular text and may count toward processed word usage.

  • Downloading (exporting) translations

  • Restoring content using translation history or snapshots

  • Creating or merging branches

  • Editing key metadata (e.g., tags, descriptions, custom attributes)

  • Copying or moving keys between projects

  • Linking keys via the duplicate finder

    • Note: When you update translation value for the linked keys, processed words are counted only for the parent.

  • Clearing translations (manual or bulk)

  • Importing TMX files to populate translation memory


How placeholders, plurals, and markup affect processed word count

Placeholders are treated differently from regular text when Lokalise calculates processed words.

In general, supported placeholders in supported placeholder formats are not counted as processed words. This means that if a string contains a placeholder used for a dynamic value, such as a name, number, amount, link, or other variable content, the placeholder itself is removed before the remaining text is counted.\

For example:

String

Processed word logic

Hello, {name}!

Hello is counted. {name} is not counted if it is recognized as a supported placeholder.

You have [%i] messages

You, have, and messages are counted. [%i] is not counted.

Welcome, {{username}}

Welcome is counted. {{username}} is not counted if this placeholder format is supported for the content being processed.

{name}

0 processed words if the whole string is a supported placeholder.

Unsupported placeholders are treated as regular text for word-counting purposes. In simple terms: if Lokalise does not recognize a placeholder as supported, it may count toward processed word usage.

For example, a custom placeholder-like block such as {name:...} may be valid in another ICU or framework-specific context, but if it is not supported by Lokalise as a placeholder, it is counted as text. In this case, it would typically count as 1 processed word.

List of supported placeholder formats and placeholder types that Lokalise doesn't count as processed

Lokalise Universal Placeholders

[%s]           – string
[%i] – integer
[%f] – float
[%.2f] – float with precision
[%1$s] – positional string
[%1$.2f] – positional float with precision
[%s:name] – named string
[%i:name] – named integer
[%.2f:name] – named float with precision

Lokalise Special Placeholders

[VOID]         – absent translation (exported as empty string)
[TRUE] – boolean true
[FALSE] – boolean false
[%] – literal % character
[SPACE] – special client case (undocumented)

Key Reference Placeholders

[%key_id:some_key_name%]
[%key_name:some_key_name%]

ICU Message Format Placeholders

{variable_name}
{0}, {1}, {2} – positional
{count, plural, one {# item} other {# items}} – plural
{gender, select, male {...} female {...}} – select
{name, date, short} – date/time
{value, number, currency} – number format

i18n / Rails Double-Bracket Placeholders
Placeholders matching regex pattern: /({{)([[:alnum:]_\-.:]+)(}})/.

{{variable_name}}, {{count}}

Ruby / Python %{name} Style
Placeholders matching regex pattern: /(%)({)([[:alnum:]_\-.:]+)(})/.

%{variable_name}, %{count}

Printf Placeholders

%s     – string
%d – decimal integer
%f – float
%@ – iOS string
%i – integer
%u – unsigned int
%x – hexadecimal
%b – binary
%c – character
%e, %E – scientific notation
%F – float (uppercase)
%o – octal
%X – hex uppercase
%ld – long decimal
%li – long integer
%lu – long unsigned
%lx – long hex
%1$s – positional string
%2$d – positional int
%.2f – float with precision

Python / Named Printf Placeholders
Placeholders matching regex pattern: /%\([0-9a-zA-Z_\-.:]+\)(...type)/.

%(name)s, %(count)d, %(variable)f, %(key)s

Symfony Placeholders

%s, %d, %name%, %variable_name%, %some.key%

.NET Placeholders
Placeholders matching regex pattern: /{\\d+(:\\d+\\.\\d+)?}/.

{0}, {1}, {0:0.00}

NSString / iOS Named Placeholders
iOS string formatting for plurals

%#@count@, %#@variable_name@

HTML Tags
This covers full HTML/XML tag pattern including namespaced tags and attributes.

<b>, </b>
<br/>, <br />
<xliff:g id="count">
<span style="color:red">

HTML Entities
Regex pattern: /&[0-9a-zA-Z]+;/.

&amp; &lt; &gt; &nbsp; &quot; &apos;

Escape Sequences
And their Unicode counterparts.

\n    – newline
\r – carriage return
\t – tab
\u00A0
\u0041\u0042
[\u00A0]

Text inside placeholder structures

Some placeholder structures may contain translatable text. In those cases, Lokalise does not count the placeholder syntax itself, but it does count the translatable words inside it.

For example, in plural or select-style messages, the technical parts of the expression are ignored where supported, but the words shown to users are still counted.

String

Processed word logic

{count, plural, one {# item} other {# items}}

The placeholder/plural syntax is ignored where supported. The user-facing words item and items are counted.

This is important because placeholders are often used around real translatable content. Lokalise only excludes the recognized placeholder or markup structure itself, not the words that users may actually see in the product.

Plural keys

For plural keys, Lokalise counts the words across plural forms together.

If a plural key stores its forms as structured values, the plural forms are combined and then counted as one text value. Supported placeholders and markup are removed from that combined text before the remaining words are counted.

For example:

Plural forms

Processed word logic

one: "{count} item"other: "{count} items"

{count} is not counted if recognized as a supported placeholder. item and items are counted.

Markup and tags

Supported markup and tags are also removed before counting processed words. This means HTML-like formatting or supported inline tags are not counted by themselves.

For example:

String

Processed word logic

<strong>Save changes</strong>

Save and changes are counted. The markup is not counted.

<br>

0 processed words if the string only contains supported markup.

However, visible text inside markup is still counted.

Word-counting behavior after placeholders are removed

After supported placeholders and markup are removed, Lokalise counts the remaining text.

The counting behavior depends on the language/script:

  • For Chinese, Japanese, and Korean text, each matched CJK character counts as 1 word.

  • For Dravidian scripts, each word-like unit counts as 1 word.

  • For other scripts, punctuation and other non-word characters are treated as separators, and words are split by whitespace.

  • Hyphens and apostrophes inside words are preserved, so a term like well-rounded is counted as 1 word.

If the remaining content has no countable words, but the original string is not empty and still contains visible content after sanitization, Lokalise applies a minimum count of 1 word.

This means that strings containing only supported placeholders or markup usually count as 0 processed words, while a string containing only a visible symbol such as ! may still count as 1 processed word.


Examples

Let’s break it down with some real cases:

Counted as processed

Scenario

Word count logic

Base content imported: "I love pizza"

3 words

Base content updated: "I love pizza!" → "I used to like pizza"

5 words

Target language first-time translation: "amo la pizza" (Italian)

3 words

Target translation updated after a base language change: "amo la pizza" → "mi piace la pizza"

4 words

Machine translation used (workflow/automation/inline suggestion)

Word count of translated string

Clicking Google-translate empty values

Translated string word count

Accept TM match at <100%

Translated string word count

Upload offline XLIFF file

New or updated translation content is counted

Automations: Insert translation, pseudolocalize, or copy source to target

Counted

Bulk actions: Fill with text, Copy keys to translations, Find & Replace

Counted

Unsupported placeholder-like text, such as {name:...}

Counted as regular text

Not counted as processed

Scenario

Counted?

Manual edit of target with no base change

No

TM suggestion accepted with 100% match

No

Re-import of content with no changes

No

Restore previous translation (via history or snapshot)

No

Branch creation or merge

No

Updating metadata, tags, or key settings

No

Copy/move key to another project

No

Bulk action: Clear translations

No

Bulk action: Cross-reference languages

No

Duplicate finder used to link keys

No

Supported placeholder-only string, such as {name} or [%s]

No

Rule of thumb

If an operation creates or updates countable translation content, it generally consumes processed words. Operations that don’t create or update translation content — such as reviewing an existing target translation without a base language change, restoring content, or reorganizing keys — generally do not.

What does this mean in practice?

Let’s say you import base content containing 10,000 keys, with an average of 6.9 words per key, and then translate it into three target languages with approximately the same average word count.

  • That’s 69,000 hosted words stored on the platform (hosted words are unlimited on paid plans).

  • Translating this content into 3 target languages adds approximately 207,000 processed words.

  • The initial base content import also consumes 69,000 processed words.

  • Total processed usage: ~276,000 words

Did this answer your question?