# Run your i18n strings from a Google Sheet

A spreadsheet is where translation actually happens: one row per key, one column per locale, and a grid your translators can read at a glance. PasteSheet publishes that sheet as a live, cached JSON API, so your app pulls localized strings straight from cells and non-developers ship copy in a new language without touching the codebase or a deploy.

*Last updated: 2026-07-11 · Source: <https://pastesheet.com/use-cases/google-sheets-translations>*

## Key facts

- One locale is one column, and a Google Sheet allows **18,278 columns** (within a **10 million cell** ceiling) — you will run out of languages long before you run out of room. ([source](https://support.google.com/drive/answer/37603))
- The strings tab holds up to **500 keys on Free** and **5,000 on Starter ($9/mo)**; **Pro ($19/mo)** removes the row cap for a large bundle.
- The endpoint is **read-only**: translators edit in Google Sheets, and the app that reads the strings can never write one back.

## Why localize from a Sheet

i18n is a table by nature: a key column and a column per locale. A spreadsheet shows the whole matrix at once, so a translator can see the English source next to the French cell they are filling in, and a missing translation is an obvious blank. Hand-editing JSON or PO files, by contrast, is a job only developers can do.

PasteSheet serves that grid as clean JSON over a fast, cached endpoint. Your app fetches the strings for a locale and renders them; translators just edit cells in Google Sheets. Add a column, add a language — no schema change, no migration, no release to get new copy in front of users.

## How to structure the sheet

One tab, one row per string key, one column per locale:

- A `key` column — the stable identifier your app looks up, like `checkout.title`.
- A column per locale — `en`, `es`, `fr`, `de` — holding the translated copy.
- Optional `context` or `notes` columns to brief translators without leaving the sheet.
- Fetch one key at a time, or pull the whole tab and cache it as your locale bundle.

## Fetch translations as JSON

Point your app at the endpoint and read the strings. Filter to one key, or pull them all and build a locale map:

```bash
curl "https://pastesheet.com/your-endpoint/Strings?key=checkout.title"

{
  "data": [
    {
      "key": "checkout.title",
      "en": "Checkout",
      "es": "Pagar",
      "fr": "Commander",
      "de": "Zur Kasse"
    }
  ]
}
```

## Read-only, so it is safe to hand to translators

Because the endpoint is **read-only by design**, it is safe to expose publicly or hand to a teammate: consumers can read and query the data but can never change the sheet. And there is **no Google Cloud project, OAuth screen, or service account** to set up — you paste a share URL and get a live API.

## What it costs

**Starter — $9/month.** For indie makers shipping a real app.

- Endpoints: 10
- Requests: 50,000 / month
- Rows per endpoint: 5,000
- Tabs per endpoint: 5
- Rate limit: 300 / minute

**Start on Starter ($9/mo)** for a custom cache TTL, so a corrected translation reaches users in seconds instead of minutes. Free works to prototype with a 5-minute cache; paid plans add private endpoints and keys when your copy should not be public.

## Frequently asked questions

### Do translators need a PasteSheet account?

No. Only you, the owner, connect the sheet once. Translators just use Google Sheets — anyone you share the sheet with can edit copy, and the API reflects their changes after the cache refreshes.

### How do I add a new language?

Add a column for the locale and fill it in. There is no schema to migrate and no code to change — the new locale appears in the JSON as soon as the cache refreshes.

### Can I fetch just one locale?

Each row returns every locale column, so you filter by key rather than by language and read the column you need. Pull the whole tab once and cache it as your locale bundle for speed.

### Can anyone change my strings via the API?

No. PasteSheet is read-only by design. The endpoint only serves the translations — there is no write path — so it is safe to expose to a client app or a public site.

## Sources

- [Files you can store in Google Drive (size limits)](https://support.google.com/drive/answer/37603) — Google

## Related use cases

- [Google Sheets for Mobile App Content](https://pastesheet.com/use-cases/google-sheets-mobile-app-content) — Ship mobile app strings, banners, and promos from a Google Sheet. PasteSheet serves them as a live, read-only JSON API — update content without a new build.
- [Google Sheets Feature Flags & Remote Config](https://pastesheet.com/use-cases/google-sheets-feature-flags) — Ship feature flags from a Google Sheet. Toggles are served as a live, read-only JSON API your app reads on launch — no deploy, no app-store review, no backend.
- [Drive a Marketing Site from Google Sheets](https://pastesheet.com/use-cases/google-sheets-content-website) — Run your marketing site's content blocks from a Google Sheet — hero copy, feature lists, section text. PasteSheet publishes it as a live, read-only JSON API.
- [A No-Code Backend From a Google Sheet](https://pastesheet.com/use-cases/google-sheets-app-backend) — Skip the server. PasteSheet turns a Google Sheet into a live, read-only JSON API your web or mobile app reads from — no database, no backend, no Google setup.

---

[PasteSheet](https://pastesheet.com) turns any Google Sheet into a live REST API and MCP server for AI agents — no backend, no code. Canonical HTML version of this page: <https://pastesheet.com/use-cases/google-sheets-translations>
