## Start with a copy style

Choose a complete, ready-to-edit base for both the banner and preferences modal:

```js
lightning("init", {
  copyStarter: "friendly", // professional | clear | friendly | concise
});
```

`professional` is the default and preserves the original built-in wording.
The other starters range from direct and informative to more conversational and
compact. They all make an explicit accept/reject choice and describe optional
cookie purposes; they do not treat browsing as consent.

| Starter        | Best suited to                                     | Banner heading          |
| -------------- | -------------------------------------------------- | ----------------------- |
| `professional` | Formal or established brands                       | “We value your privacy” |
| `clear`        | Broad audiences that need direct, purpose-led copy | “Your cookie choices”   |
| `friendly`     | Consumer brands wanting a warmer tone              | “Cookies? Your call.”   |
| `concise`      | Compact, design-led experiences                    | “A quick cookie choice” |

The starter changes the complete banner and preferences-modal copy, including
button labels. It does not determine legal compliance: make sure the purposes
match the cookies your site actually uses and select the applicable regulation.

You can still replace any individual string with `text`; those overrides take
priority over the selected starter:

```js
lightning("init", {
  copyStarter: "friendly",
  text: { acceptAll: "Sounds good" },
});
```

## Override any string

Pass a `text` object to replace the selected starter's copy. Any key you omit
keeps that starter's value:

```js
lightning("init", {
  text: {
    bannerTitle: "We value your privacy",
    bannerBody: "We use cookies to improve your experience…",
    acceptAll: "Accept all",
    rejectAll: "Reject all",
    customize: "Customise",
    save: "Save preferences",
    preferencesTitle: "Privacy preferences",
    downloadReceipt: "Download receipt",
    privacyPolicy: "Privacy policy", // label for the privacy-policy link
    // …doNotSell, poweredBy, preferencesBody
  },
});
```

:::note[The privacy link needs a URL]
`privacyPolicy` only sets the link _label_. The link itself appears in the
preferences modal only when you set
[`privacyPolicyUrl`](/configure/appearance/#privacy-policy-link).
:::

## Per-category labels & descriptions

```js
lightning("init", {
  text: {
    categories: {
      statistics: {
        label: "Analytics",
        description: "Helps us understand how the site is used.",
      },
    },
  },
});
```

## Locale

```js
lightning("init", { locale: "fr-FR" }); // BCP-47; defaults to the document language
```

:::note[Copy substitution, not a dictionary]
`locale` sets the language tag on the UI; the copy for that language comes from
your `text` overrides. There's no built-in multi-language dictionary — you supply
the strings for the locale you're serving. Full guidance is being migrated from
`docs/INSTALL.md` § _“Copy, translations & locales.”_
:::