Agent skill

Lokalise Data Handling

by jeremylongshore in jeremylongshore/tons-of-skills-marketplace

Implement Lokalise translation data handling, PII management, and compliance patterns.

MITAuto-check passedWriting & Content

Install Lokalise Data Handling

skills CLI
$ npx skills add jeremylongshore/tons-of-skills-marketplace --skill lokalise-data-handling -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install jeremylongshore/tons-of-skills-marketplace lokalise-data-handling --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/jeremylongshore/tons-of-skills-marketplace.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/.curated/lokalise-data-handling .claude/skills/lokalise-data-handling && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
lokalise-data-handling
GitHub stars
2.8k
Token cost
~3k tokens
SKILL.md length
515 words
Files
2 (incl. references)
Skills in repo
3,342
Repo updated
First seen
Licence
MIT

At a glance

Implement Lokalise translation data handling, PII management, and compliance patterns.

  • Works in 7 steps: Understand the Translation Data Lifecycle → Manage Key Metadata → Use Snapshots for Translation Versioning → …
  • Handling sensitive translation data
  • SKILL.md covers Overview, Prerequisites, Instructions and Output, plus 4 more sections
  • Calls curl, jq and npm; reaches api.lokalise.com; needs LOKALISE_API_TOKEN

What it does

Lokalise Data Handling is an agent skill from jeremylongshore/tons-of-skills-marketplace. Implement Lokalise translation data handling, PII management, and compliance patterns. Use when handling sensitive translation data, implementing data redaction, or ensuring compliance with privacy regulations for Lokalise integrations. Trigger with phrases like "lokalise data", "lokalise PII", "lokalise GDPR", "lokalise data retention", "lokalise privacy", "lokalise compliance".

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/implementation-guide.md`). Compatibility notes: Designed for Claude Code

It sits in Writing & Content, covering Translation and Privacy and GDPR. The repository describes itself as: Model-agnostic agent-skills platform with a harness-free canonical layer, verified adapters, and the ccpi package manager. Explore at tonsofskills.com. The licence is MIT.

When your agent uses it

  • Handling sensitive translation data
  • Implementing data redaction
  • Ensuring compliance with privacy regulations for Lokalise integrations
  • With phrases like lokalise data

Example prompts

  • “lokalise data”
  • “lokalise PII”
  • “lokalise GDPR”
  • “/lokalise-data-handling”

Requirements

  • Node.js
  • A credential in LOKALISE_API_TOKEN
  • Compatibility (from SKILL.md): Designed for Claude Code
  • Pre-approved tools (allowed-tools): Read, Write, Edit

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Understand the Translation Data Lifecycle
  2. Manage Key Metadata
  3. Use Snapshots for Translation Versioning
  4. Use Branches for Translation Isolation
  5. Handle Export Formats
  6. Handle Character Encoding
  7. Handle Plural Forms

What it can do on your machine

Read from SKILL.md and the folder at commit cfae287. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Read
    • Write
    • Edit

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • curl
    • jq
    • npm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • api.lokalise.com

    Also links to:

    • developers.lokalise.com
    • cldr.unicode.org
    • unicode-org.github.io

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • LOKALISE_API_TOKEN

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Designed for Claude Code

    From compatibility in the SKILL.md frontmatter.

Context cost

Lokalise Data Handling loads about 3k tokens when it runs, and up to ~5k if it reads all its reference files. Until then it costs about 101 tokens; SKILL.md has 515 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~101
When it runs · the whole SKILL.md, loaded when a task matches
~3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~5k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from jeremylongshore/tons-of-skills-marketplace at commit cfae287, republished under its MIT licence (© jeremylongshore). 515 words, ~2,961 tokens.

Download SKILL.mdSave it as .claude/skills/lokalise-data-handling/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
lokalise-data-handling
description
Implement Lokalise translation data handling, PII management, and compliance patterns. Use when handling sensitive translation data, implementing data redaction, or ensuring compliance with privacy regulations for Lokalise integrations. Trigger with phrases like "lokalise data", "lokalise PII", "lokalise GDPR", "lokalise data retention", "lokalise privacy", "lokalise compliance".
allowed-tools
Read, Write, Edit
compatibility
Designed for Claude Code
version
1.14.0
license
MIT
author
Jeremy Longshore <jeremy@intentsolutions.io>
tags
saas, lokalise, compliance

Lokalise Data Handling

Overview

Lokalise manages translation data through keys, translations, snapshots, and branches. This skill covers the translation data lifecycle (create, update, export), key metadata management (tags, descriptions, screenshots), translation snapshots for versioning, branch-based translation isolation, export format handling (JSON flat/nested, XLIFF, PO), character encoding (UTF-8 BOM handling), and plural form support across locales.

Prerequisites

  • @lokalise/node-api SDK installed (npm install @lokalise/node-api)
  • API token with read/write access to the target project
  • Understanding of i18n key naming conventions for your project
  • lokalise2 CLI for bulk file operations (optional)

Instructions

1. Understand the Translation Data Lifecycle

Translation data in Lokalise follows this flow: Create keys (with platforms, tags, descriptions) -> Add base translations (source language) -> Translate (manually or via integrations) -> Review (proofread flag) -> Export (download to codebase).

Create keys with metadata that helps translators:

typescript
import { LokaliseApi } from "@lokalise/node-api";
const lokalise = new LokaliseApi({ apiKey: process.env.LOKALISE_API_TOKEN! });

// Create keys with rich metadata
await lokalise.keys().create({
  project_id: projectId,
  keys: [
    {
      key_name: {
        ios: "welcome.title",
        android: "welcome_title",
        web: "welcome.title",
        other: "welcome.title",
      },
      description: "Main heading on the welcome screen shown after signup",
      platforms: ["web", "ios", "android"],
      tags: ["onboarding", "v2.1"],
      base_translations: [
        { language_iso: "en", translation: "Welcome to {{appName}}" },
      ],
      is_plural: false,
      is_hidden: false,
    },
  ],
});
2. Manage Key Metadata

Tags, descriptions, and screenshots help translators understand context. Keep metadata current:

typescript
// Bulk update tags for release management
await lokalise.keys().bulk_update({
  project_id: projectId,
  keys: [
    { key_id: 12345, tags: ["release-3.0", "reviewed"] },
    { key_id: 12346, tags: ["release-3.0", "needs-review"] },
  ],
});

// Add a screenshot for visual context
await lokalise.screenshots().create({
  project_id: projectId,
  screenshots: [
    {
      data: base64EncodedImage, // Base64 JPEG/PNG, max 6 MB
      title: "Welcome screen — mobile layout",
      description: "Shows welcome.title and welcome.subtitle keys",
      key_ids: [12345, 12346],
    },
  ],
});

// Retrieve key with all metadata
const key = await lokalise.keys().get(keyId, {
  project_id: projectId,
  disable_references: 0, // include reference language info
});
console.log(key.key_name, key.tags, key.description);
3. Use Snapshots for Translation Versioning

Snapshots capture the entire project state at a point in time. Create them before bulk changes:

typescript
// Create a snapshot before a major update
const snapshot = await lokalise.snapshots().create({
  project_id: projectId,
  title: `Pre-release v3.0 — ${new Date().toISOString()}`,
});
console.log(`Snapshot created: ${snapshot.snapshot_id}`);

// List snapshots
const snapshots = await lokalise.snapshots().list({
  project_id: projectId,
  limit: 20,
});
snapshots.items.forEach((s) =>
  console.log(`${s.snapshot_id}: ${s.title} (${s.created_at})`)
);

// Restore a snapshot (creates a NEW project with the snapshot data)
const restored = await lokalise.snapshots().restore(snapshotId, {
  project_id: projectId,
});
console.log(`Restored to new project: ${restored.project_id}`);

Snapshots are immutable. Restoring creates a new project — it does not overwrite the current one.

4. Use Branches for Translation Isolation

Branches let you work on translations for a feature without affecting production strings:

typescript
// Create a feature branch
await lokalise.branches().create({
  project_id: projectId,
  name: "feature/checkout-redesign",
});

// List branches
const branches = await lokalise.branches().list({ project_id: projectId });

// Work on the branch — use the branch name in file operations
await lokalise.files().upload({
  project_id: projectId,
  data: base64FileContent,
  filename: "en.json",
  lang_iso: "en",
  use_automations: true,
  branch: "feature/checkout-redesign", // target the branch
});

// Merge branch back to main when translations are ready
await lokalise.branches().merge(branchId, {
  project_id: projectId,
  force_current: false, // false = conflict detection enabled
});
5. Handle Export Formats

Lokalise supports multiple export formats. Choose based on your stack:

typescript
// Download as flat JSON (React, Next.js, Vue)
const flatJson = await lokalise.files().download({
  project_id: projectId,
  format: "json",
  original_filenames: false,
  bundle_structure: "locales/%LANG_ISO%.json",
  json_unescaped_slashes: true,
  export_empty_as: "base",    // use base language for untranslated
  include_tags: ["release-3.0"],
  filter_langs: ["en", "fr", "de", "ja"],
});
// Returns { bundle_url: "https://..." } — download the ZIP
typescript
// Download as nested JSON (common for namespaced i18n)
const nestedJson = await lokalise.files().download({
  project_id: projectId,
  format: "json",
  original_filenames: false,
  bundle_structure: "locales/%LANG_ISO%/%FILENAME%.json",
  json_unescaped_slashes: true,
  export_key_as: "key_name_dots_to_nested", // a.b.c → {a:{b:{c:"..."}}}
});
bash
# Export as XLIFF 2.0 (for professional translation agencies)
lokalise2 file download \
  --token "$LOKALISE_API_TOKEN" \
  --project-id "$PROJECT_ID" \
  --format xliff \
  --dest ./translations/ \
  --include-tags "release-3.0"

# Export as PO/POT (for gettext-based projects)
lokalise2 file download \
  --token "$LOKALISE_API_TOKEN" \
  --project-id "$PROJECT_ID" \
  --format po \
  --dest ./locales/ \
  --export-empty-as base
6. Handle Character Encoding

All Lokalise exports use UTF-8. Watch for these encoding issues:

typescript
// Remove UTF-8 BOM if present (some editors add it)
function stripBOM(content: string): string {
  return content.charCodeAt(0) === 0xfeff ? content.slice(1) : content;
}

// Validate JSON translation files after download
import { readFileSync } from "fs";

function loadTranslations(filePath: string): Record<string, string> {
  const raw = readFileSync(filePath, "utf-8");
  const clean = stripBOM(raw);
  try {
    return JSON.parse(clean);
  } catch (e) {
    throw new Error(
      `Invalid JSON in ${filePath}: ${(e as Error).message}. ` +
      `Check for encoding issues or unescaped characters.`
    );
  }
}

When uploading files, always specify UTF-8 encoding. Lokalise auto-detects encoding but explicit is safer:

bash
# Upload with explicit encoding
lokalise2 file upload \
  --token "$LOKALISE_API_TOKEN" \
  --project-id "$PROJECT_ID" \
  --file ./locales/en.json \
  --lang-iso en \
  --convert-placeholders true
7. Handle Plural Forms

Lokalise uses CLDR plural rules. Different languages have different plural categories:

typescript
// Create a plural key
await lokalise.keys().create({
  project_id: projectId,
  keys: [
    {
      key_name: "items.count",
      is_plural: true,
      platforms: ["web"],
      base_translations: [
        {
          language_iso: "en",
          translation: JSON.stringify({
            one: "{{count}} item",
            other: "{{count}} items",
          }),
        },
      ],
    },
  ],
});

Plural categories by language:

LanguageCategoriesExample
Englishone, other1 item / 2 items
Frenchone, many, other1 chose / 1000000 choses / 2 choses
Arabiczero, one, two, few, many, other6 categories
JapaneseotherNo plural distinction
Polishone, few, many, other1 element / 2 elementy / 5 elementow

In JSON exports, plural keys appear as objects:

json
{
  "items.count": {
    "one": "{{count}} item",
    "other": "{{count}} items"
  }
}

Ensure your i18n framework handles plural objects (i18next, react-intl, vue-i18n all support this natively).

Show full SKILL.md (185 more words)Show less

Output

  • Translation keys created with metadata (tags, descriptions, platforms)
  • Snapshots capturing project state before bulk changes
  • Branch-based workflow isolating feature translations from production
  • Exported translation files in the target format (JSON/XLIFF/PO) with correct encoding
  • Plural keys configured with CLDR-compliant category coverage

Error Handling

IssueCauseSolution
Garbled characters in exportBOM or wrong encoding assumedStrip BOM, ensure UTF-8
Missing plural formLanguage requires categories not providedCheck CLDR plural rules for target language
Branch merge conflictSame key modified in both branchesResolve via Lokalise UI or set force_current: true
Snapshot restore failsExceeded project limit on planDelete unused projects or upgrade plan
Empty translations in exportKey has no translation for languageUse export_empty_as: "base" to fall back to source
Upload overwrites existingDefault merge behavior is replaceUse replace_modified: false to preserve existing

Examples

Upload a JSON Translation File
typescript
import { readFileSync } from "fs";

const fileContent = readFileSync("./locales/en.json", "utf-8");
const base64Content = Buffer.from(fileContent).toString("base64");

await lokalise.files().upload({
  project_id: projectId,
  data: base64Content,
  filename: "en.json",
  lang_iso: "en",
  convert_placeholders: true,
  detect_icu_plurals: true,
  replace_modified: false, // preserve manual edits
  tags_inserted_keys: ["auto-import"],
});
Export and Write to Disk
bash
#!/bin/bash
# download-translations.sh
BUNDLE_URL=$(curl -s -X POST \
  "https://api.lokalise.com/api2/projects/${PROJECT_ID}/files/download" \
  -H "X-Api-Token: ${LOKALISE_API_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "format": "json",
    "original_filenames": false,
    "bundle_structure": "locales/%LANG_ISO%.json",
    "export_empty_as": "base",
    "json_unescaped_slashes": true
  }' | jq -r '.bundle_url')

curl -sL "$BUNDLE_URL" -o translations.zip
unzip -o translations.zip -d ./src/
rm translations.zip
echo "Translations downloaded and extracted to ./src/locales/"

Resources

Next Steps

For deploying translations into your CI/CD pipeline, see lokalise-deploy-integration. For handling API errors during data operations, see lokalise-common-errors.

© jeremylongshore, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (references) in skills/.curated/lokalise-data-handling of jeremylongshore/tons-of-skills-marketplace.

  • SKILL.md
  • references/implementation-guide.md

Open the folder on GitHubat commit cfae287

Compare with similar skills

Lokalise Data Handling next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Lokalise Data Handling compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Lokalise Data Handling this skilljeremylongshore/tons-of-skills-marketplace2.8k—~3kAutomated safety check: PassMIT
Privacy Policy Generator Localizationnisrulz/app-privacy-policy-generator4.7k—~526Automated safety check: PassAGPL-3.0
Legal Translationlawve-ai/awesome-legal-skills847—~14kAutomated safety check: PassCustom licence
Regulatory Deal Card Generator Patrick Munrolawve-ai/awesome-legal-skills847—~2.1kAutomated safety check: PassAGPL-3.0
Route Legal Translationlawve-ai/awesome-legal-skills847—~1.4kAutomated safety check: PassAGPL-3.0-or-later
Client Explanation Translator Larissa Meredith Flisterlawve-ai/awesome-legal-skills847—~1.6kAutomated safety check: PassCustom licence

Similar skills

  • Privacy Policy Generator Localization

    nisrulz/app-privacy-policy-generator

    Adds or updates a language translation in the app privacy policy generator by copying the English locale file, translating its values and building the site.

    4.7k GitHub stars~526 tokensUpdated 5 days ago
    Writing & ContentAuto-check passed
  • Legal Translation

    lawve-ai/awesome-legal-skills

    Translate legal documents from any language into English while preserving .docx formatting and translating track changes and headers/footers.

    847 GitHub stars~14k tokensUpdated 8 days ago
    Writing & ContentAuto-check passed
  • Generates standalone interactive HTML "deal cards" that translate complex regulations into negotiation-ready reference tools, systematically distinguishing mandatory obligations from negotiable…

    847 GitHub stars~2.1k tokensUpdated 8 days ago
    Legal & ComplianceAuto-check passed
  • Route Legal Translation

    lawve-ai/awesome-legal-skills

    Pick the right LLM for LEGAL TRANSLATION — translating contracts, statutes, case law, and legal correspondence across languages, including Arabic/MENA.

    847 GitHub stars~1.4k tokensUpdated 8 days ago
    Writing & ContentAuto-check passed
  • Jev Question Translator

    lawve-ai/awesome-legal-skills

    Turns a legal question, a set of draft questions, or source material such as a statute, jury instruction, rubric, contract checklist, or coding manual into a battery of narrow questions that…

    847 GitHub stars~6.9k tokensUpdated 8 days ago
    Writing & ContentAuto-check passed

More from jeremylongshore/tons-of-skills-marketplace

All 3,342 skills in this repo
  • Performing Security Code Review

    jeremylongshore/tons-of-skills-marketplace

    Execute this skill enables AI assistant to conduct a security-focused code review using the security-agent plugin.

    2.8k GitHub starsUsed in 2 repos~1.3k tokens
    Auto-check: notes
  • Adapting Transfer Learning Models

    jeremylongshore/tons-of-skills-marketplace

    Build this skill automates the adaptation of pre-trained machine learning models using transfer learning techniques.

    2.8k GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Agent Context Loader

    jeremylongshore/tons-of-skills-marketplace

    Execute proactive auto-loading: automatically detects and loads agents.md files.

    2.8k GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Aggregating Performance Metrics

    jeremylongshore/tons-of-skills-marketplace

    Aggregate and centralize performance metrics from applications, systems, databases, caches, and services.

    2.8k GitHub stars~1.2k tokensUpdated today
    Auto-check passed
  • Analyzing Capacity Planning

    jeremylongshore/tons-of-skills-marketplace

    Execute this skill enables AI assistant to analyze capacity requirements and plan for future growth.

    2.8k GitHub stars~947 tokensUpdated today
    Auto-check passed
  • Analyzing Database Indexes

    jeremylongshore/tons-of-skills-marketplace

    Process use when you need to work with database indexing. An agent skill from jeremylongshore/tons-of-skills-marketplace.

    2.8k GitHub stars~2k tokensUpdated today
    Auto-check passed

Questions about Lokalise Data Handling

What does Lokalise Data Handling do?

Implement Lokalise translation data handling, PII management, and compliance patterns. Lokalise Data Handling is an agent skill from jeremylongshore/tons-of-skills-marketplace. Implement Lokalise translation data handling, PII management, and compliance patterns.

When should I use Lokalise Data Handling?

Lokalise Data Handling fits situations like: handling sensitive translation data; implementing data redaction; ensuring compliance with privacy regulations for Lokalise integrations; with phrases like lokalise data.

How do I install Lokalise Data Handling in Claude Code?

Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill lokalise-data-handling -a claude-code`. Or copy the skill folder (skills/.curated/lokalise-data-handling in jeremylongshore/tons-of-skills-marketplace) into .claude/skills/lokalise-data-handling in your project. Claude Code loads it when a task matches its description.

How do I install Lokalise Data Handling in Codex?

Run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill lokalise-data-handling -a codex`. Or copy the skill folder (skills/.curated/lokalise-data-handling in jeremylongshore/tons-of-skills-marketplace) into .agents/skills/lokalise-data-handling in your project. Codex loads it when a task matches its description.

Can I use Lokalise Data Handling in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jeremylongshore/tons-of-skills-marketplace --skill lokalise-data-handling -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/lokalise-data-handling, .gemini/skills/lokalise-data-handling, .github/skills/lokalise-data-handling and .opencode/skills/lokalise-data-handling in your project.

What does Lokalise Data Handling need to run?

Going by SKILL.md and its folder, Lokalise Data Handling needs the command-line tools its instructions call (curl, jq and npm) and credentials named LOKALISE_API_TOKEN. Our summary lists: Node.js; A credential in LOKALISE_API_TOKEN. Its frontmatter pre-approves these tools: Read, Write, Edit. Compatibility (from SKILL.md): Designed for Claude Code.

Does Lokalise Data Handling access the network?

SKILL.md names 4 domains. In commands or code: api.lokalise.com; the agent is likely to contact it when it follows the instructions. As links in the text: developers.lokalise.com, cldr.unicode.org and unicode-org.github.io. This is read from the text; nothing was executed.

Is Lokalise Data Handling safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Lokalise Data Handling use?

Lokalise Data Handling is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Lokalise Data Handling use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2k tokens, read only when the agent opens those files.

What are the alternatives to Lokalise Data Handling?

Skills that share tags, products or a category with Lokalise Data Handling: Privacy Policy Generator Localization (nisrulz/app-privacy-policy-generator, 4.7k stars), Legal Translation (lawve-ai/awesome-legal-skills, 847 stars), Regulatory Deal Card Generator Patrick Munro (lawve-ai/awesome-legal-skills, 847 stars) and Route Legal Translation (lawve-ai/awesome-legal-skills, 847 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Lokalise Data Handling?

jeremylongshore (a GitHub user) maintains it in jeremylongshore/tons-of-skills-marketplace, which has 2,827 GitHub stars. The repository holds 3,342 skills in this directory. The repository was last updated on October 10, 2026.

Source: jeremylongshore/tons-of-skills-marketplace on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.