<!-- AI agents: this is the Markdown version of an AppNorth documentation page. Index: https://www.appnorth.app/llms.txt -->

# Language and copy

`AppNorthCopy()` follows the language in which the host app is displayed. Unsupported languages fall back to English. Supply a copy value to community, detail, or chat views to override their labels.

## Follow or override the language {#language}

The bundled languages are Danish, German, English, Spanish, Finnish, French, Italian, Japanese, Korean, Norwegian Bokmål, Dutch, Polish, Brazilian Portuguese, Swedish, Turkish, Simplified Chinese, and Traditional Chinese.

Use `AppNorthCopy(language:)` for an app-owned language picker. Supported identifiers include `en`, `es`, `de`, `pt-BR`, `zh-Hans`, and `zh-Hant`. Portuguese variants resolve to Brazilian Portuguese; `no` and `nn` resolve to `nb`. Chinese script or region chooses the Chinese table.

```swift title="LocalizedCommunity.swift"
import SwiftUI
import AppNorth

struct LocalizedCommunity: View {
    let client: AppNorthClient
    let appLanguage: String

    private var copy: AppNorthCopy {
        var value = AppNorthCopy(language: appLanguage)
        value.feedback = "Ideas and updates"
        return value
    }

    var body: some View {
        AppNorthView(client: client, copy: copy)
    }
}
```

The English label override above is intentional example copy: localize your override with your own app's resources. Each writable property replaces one SDK label. `AppNorthCopy.spanish` is a compatibility convenience for `AppNorthCopy(language: "es")`. The [API reference](/docs/swift-api#appnorthcopy) lists every label.

## Translate ideas on the device {#translation}

On iOS 18 or later, the built-in detail screen uses Apple's Translation framework for an idea's title and description. `.automatic` offers the button when language detection considers the idea foreign; `.always` always offers it; `.hide` hides it. Detection is cached by idea ID. Translation text is not sent to AppNorth for translation.

```swift title="TranslationPreference.swift"
import SwiftUI
import AppNorth

struct TranslationPreference: View {
    let client: AppNorthClient

    var body: some View {
        AppNorthView(
            client: client,
            uiConfiguration: AppNorthUIConfiguration(translateButton: .automatic)
        )
    }
}
```

Translation availability depends on the OS and Apple's supported language pairs and resources. On iOS 16 and 17 the translation control is absent, including with `.always`. The translation target follows the host app's language; overriding UI copy alone does not change that target. Community content, board names, and chat messages are not automatically rewritten by `AppNorthCopy`.

## Verify {#verify}

1. Set your app language to a supported language and inspect community, detail, and chat labels.
2. Pass an unsupported identifier and confirm English fallback.
3. On iOS 18 or later, open a foreign-language idea and switch between translation and original.
4. Check `.hide` and a device running an earlier supported OS; neither should show the translation control.
