KI18n Crate for Rust

Crates.io Documentation

Introduction

KI18n is a cross-platform internationalization framework used by KDE applications. This crate is meant to allow using KI18n with Rust and qmetaobject-rs crate.

Motivation

I love KDE. I have been using it as my primary DE for quite a while. I also like Rust Programming Language. Currently, it is nearly impossible to use any KDE frameworks from Rust without some C++ FFI. While FFI is never easy, complexity with C++ is exponentially more than plain C due to the Object-Oriented nature of C++, which is entirely different from Rust's somewhat functional design.

If possible, I would like the Tier-1 KDE Frameworks to be usable from pragmatic Rust in a somewhat natural fashion. I am currently interested in KDE frameworks that are usable with QML.

Requirements

This crate requires KF5I18n to be installed or at least present in the system.

Ubuntu

shell sudo apt install libkf5i18n-dev rust

Arch Linux

shell sudo pacman -S ki18n

Custom Location for KF5I18n

The crate searches from KF5I18n using either the environment variables (KF_VERSION, KF_INCLUDE_PATH and KF_LIBRARY_PATH) if they are set or uses kf5-config to find the paths.

Features

Example

```rust use cstr::cstr; use qmetaobject::prelude::*; use ki18n::klocalizedcontext::KLocalizedContext;

fn main() { let mut engine = QmlEngine::new(); KLocalizedContext::initfromengine(&engine); engine.load_data(r#" import QtQuick 2.6 import QtQuick.Controls 2.0 as Controls import QtQuick.Layouts 1.2 import org.kde.kirigami 2.13 as Kirigami

// Base element, provides basic features needed for all kirigami applications
Kirigami.ApplicationWindow {
    // ID provides unique identifier to reference this element
    id: root

    // Window title
    // i18nc is useful for adding context for translators, also lets strings be changed for different languages
    title: i18nc("@title:window", "Hello World")

    // Initial page to be loaded on app load
    pageStack.initialPage: Kirigami.Page {

        Controls.Label {
            // Center label horizontally and vertically within parent element
            anchors.centerIn: parent
            text: i18n("Hello World!")
        }
    }
}

"#.into()); engine.exec(); } ```