localized/README.md

4.4 KiB

Localized Icon

Localized

GitHub · Contributor Docs

Localized provides a Swift package plugin for localizing cross-platform Swift code.

Use YML syntax for defining available phrases:

hello(name):
    en: Hello, (name)!
    de: Hallo, (name)!
    fr: Salut, (name)!

house:
    en: House
    de: Haus
    fr: Maison

houses(count):
    en(count == "1"): There is one house.
    en: There are (count) houses.
    de(count == "1"): Es gibt ein Haus.
    de: Es gibt (count) Häuser.

Then, access the localized strings safely in your code:

// Use the system language
print(Loc.hello(name: "Peter"))
print(Loc.house)
print(Loc.houses(count: "1"))

// Access the translation for a specific language
print(Localized.hello(name: "Peter").en)
print(Localized.house.fr)

Table of Contents

Installation

  1. Open your Swift package in GNOME Builder, Xcode, or any other IDE.
  2. Open the Package.swift file.
  3. Into the Package initializer, under dependencies, paste:
.package(url: "https://github.com/AparokshaUI/Localized", from: "0.1.0")   

Usage

Definition

Define the available phrases in a file called Localized.yml.

default: en

export:
    en: Export Document
    de: Exportiere das Dokument

send(message, name):
    en(name == ""): Send (message).
    en: Send (message) to (name).
    de: Sende (message) to (name).

As you can see, you can add parameters using brackets after the key, and conditions using brackets after the language (e.g. for pluralization).

The line default: en sets English as the fallback language.

Then, add the Localized dependency, the plugin and the Localized.yml resource to the target in the Package.swift file.

.executableTarget(
    name: "PluginTests",
    dependencies: ["Localized"],
    resources: [.process("Localized.yml")],
    plugins: ["GenerateLocalized"]
)
Use the Swift macro alternatively

If you don't want to have a separate Localized.yml resource, you can use the YML syntax directly in your Swift code using a Swift macro. Leave out the resources and plugins lines in the target definition, and instead of creating a Localized.yml file, use the following macro in a Swift file.

#localized(default: "en", yml: """
export:
    en: Export Document
    de: Exportiere das Dokument

send(message, name):
    en: Send (message) to (name).
    de: Sende (message) to (name).
""")

You cannot have a defaultLanguage set in the YML, instead, use the macro parameter.

Usage

In most cases, you want to get the translated string in the system language. This can be accomplished using the following syntax.

let export = Loc.export
let send = Loc.send(message: "Hello", name: "Peter")

You can access a specific language as well.

let export = Localized.export.en
let send = Localized.send(message: "Hallo", name: "Peter").de

If you want to get the translation for a specific language code, use the following syntax. This function will return the translation for the default language if there's no translation for the prefix of that code available.

let export = Localized.export.string(for: "de-CH")

Thanks

Dependencies

Other Thanks