[English](README.md) | [Deutsch](README.de.md) | [हिन्दी](README.hi.md) | [Español](README.es.md) | [Français](README.fr.md) | [العربية](README.ar.md) | [বাংলা](README.bn.md) | [Русский](README.ru.md) | [Português](README.pt.md) | [اردو](README.ur.md) | [Indonesia](README.id.md) | [中文](README.zh.md) | [日本語](README.ja.md) | [한국어](README.ko.md) | [Türkçe](README.tr.md) | [Italiano](README.it.md) | [Polski](README.pl.md) | [Українська](README.uk.md) | [Nederlands](README.nl.md) | [فارسی](README.fa.md) | [Tiếng Việt](README.vi.md) | [ไทย](README.th.md) | [Bahasa Melayu](README.ms.md) | [Čeština](README.cs.md) | [Magyar](README.hu.md) | [Română](README.ro.md)

[![CI](https://ci.angussoftware.dev/api/badges/RhoMancer/temperlux/status.svg)](https://ci.angussoftware.dev/RhoMancer/temperlux)
[![crates.io](https://img.shields.io/crates/v/temperlux.svg)](https://crates.io/crates/temperlux)
[![License: GPL-3.0-or-later](https://img.shields.io/badge/license-GPL--3.0--or--later-blue.svg)](LICENSE)

# Temperlux

Bộ điều khiển độ sáng cho màn hình ngoài (DDC/CI) và màn hình trong (đèn nền), được viết bằng Rust với giao diện GTK4/Libadwaita. Dựa trên [Luminance](https://github.com/sidevesh/Luminance) của sidevesh — viết lại từ đầu với DDC dựa trên FFI cho hiệu suất và kiến trúc có thể kiểm tra.

![Temperlux — Angus (dark)](docs/screenshot-angus.png)

## Tính năng

### Điều khiển màn hình

- **GUI** — thanh trượt độ sáng cho từng màn hình với điều khiển phần cứng trực tiếp
- **CLI** — bộ lệnh đầy đủ cho kịch bản và sử dụng terminal
- **Đa màn hình** — hỗ trợ mọi kết hợp màn hình ngoài DDC/CI và đèn nền trong
- **Hỗ trợ laptop** — tự động phát hiện màn hình đèn nền trong qua `/sys/class/backlight`
- **Phát hiện phần cứng** — tích hợp `libddcutil` dựa trên FFI để liệt kê màn hình đáng tin cậy

### Chế độ đồng bộ

Kiểm soát mối quan hệ độ sáng trên nhiều màn hình:

| Chế độ | Hành vi |
|------|----------|
| **Tắt** | Mỗi màn hình được điều khiển độc lập |
| **Cùng giá trị** | Tất cả màn hình đặt cùng phần trăm độ sáng |
| **Tỷ lệ** | Màn hình duy trì tỷ lệ độ sáng tương ứng |

### Giới hạn độ sáng

Đặt giới hạn độ sáng tối thiểu và tối đa cho từng màn hình (0–100%). Giới hạn áp dụng cho cả thanh trượt GUI và lệnh CLI:

```bash
# Clamp display 1 to range 20–80%
temperlux caps 1 --min 20 --max 80
```

### Lập lịch

Tự động hóa thay đổi độ sáng dựa trên thời gian trong ngày, bình minh hoặc hoàng hôn:

```bash
# Dim monitors at sunset
temperlux schedule add --name "Evening" --after-sunset 0 --monitors "all=30"

# Full brightness at sunrise
temperlux schedule add --name "Morning" --after-sunrise 0 --monitors "all=80"

# Specific time
temperlux schedule add --name "Night" --time "23:00" --monitors "ddc:1=10,ddc:2=15"
```

**Tính toán bình minh/hoàng hôn** — đặt vị trí địa lý của bạn để tính thời gian mặt trời chính xác:

```bash
temperlux schedule location --lat 41.88 --lon -87.63   # Chicago
temperlux schedule detect-location                       # auto-detect via IP
```

**Tích hợp bộ hẹn giờ systemd** — tạo đơn vị hẹn giờ người dùng cho lập lịch không giao diện:

```bash
temperlux schedule generate-timers
```

### Quản lý màn hình

- **Đổi tên** — tên màn hình tùy chỉnh được lưu giữa các phiên
- **Sắp xếp lại** — kéo thả màn hình trong Tùy chọn; thứ tự được giữ qua các lần khởi động lại
- **Làm mới** — quét lại thay đổi cắm màn hình nóng mà không cần khởi động lại

### Định dạng màn hình

```bash
# Show/hide display numbers
temperlux config --show-numbers false

# Toggle 24-hour time format in schedule editor
temperlux config --use-24h true

# Show/hide brightness range labels
temperlux config --show-range-labels true
```

### Đầu ra JSON

Đầu ra JSON thân thiện với kịch bản cho waybar, polybar và các tích hợp khác:

```bash
temperlux list --json
```

```json
[
  {"id": "ddc:1", "name": "Left Monitor", "brightness": 75, "type": "ddc"},
  {"id": "ddc:2", "name": "Right Monitor", "brightness": 60, "type": "ddc"},
  {"id": "backlight:intel_backlight", "name": "Built-in", "brightness": 100, "type": "backlight"}
]
```

### Tự động khởi động

Nút "Khởi động khi đăng nhập" tùy chọn trong Tùy chọn. Cài đặt tệp `.desktop` trong `~/.config/autostart/`.

### Xử lý lỗi

Thông báo lỗi tự động hết hạn sau 5 giây — không cần bỏ qua thủ công.

## Chủ đề

Temperlux bao gồm 16 chủ đề màu với bộ chọn chế độ sáng và tối độc lập. Chọn bảng màu riêng cho từng chế độ trong Tùy chọn — chủ đề chuyển đổi ngay lập tức mà không cần khởi động lại.

### Chủ đề có sẵn

| Chủ đề | Biến thể sáng | Biến thể tối | Màu nhấn |
|-------|:---:|:---:|--------|
| **Angus (thương hiệu)** | Angus (light) | Angus (dark) | Teal `#006A6A` |
| **Catppuccin** | Latte | Frappe, Macchiato, Mocha | Mauve `#8839EF` |
| **Nord** | Nord Polar | Nord | Frost blue `#81A1C1` |
| **Gruvbox** | Gruvbox Light | Gruvbox Dark | Yellow `#D79921` |
| **Solarized** | Solarized Light | Solarized Dark | Blue `#268BD2` |
| **Dracula** | — | Dracula | Purple `#BD93F9` |
| **Rose Pine** | Rose Pine Dawn | Rose Pine, Rose Pine Moon | Pine `#31748F` |

### Ảnh chụp màn hình

| Dracula (dark) | Catppuccin Latte (light) |
|:---:|:---:|
| ![Dracula](docs/screenshot-dracula.png) | ![Latte](docs/screenshot-latte.png) |

| Catppuccin Mocha (dark) | Nord (dark) |
|:---:|:---:|
| ![Mocha](docs/screenshot-mocha.png) | ![Nord](docs/screenshot-nord.png) |

| Gruvbox Dark | Angus (brand, dark) |
|:---:|:---:|
| ![Gruvbox](docs/screenshot-gruvbox.png) | ![Angus](docs/screenshot-angus.png) |

## Cài đặt

### Từ mã nguồn (khuyến nghị cho GUI)

```bash
# Install dependencies
sudo apt install ddcutil libddcutil-dev libgtk-4-dev libadwaita-1-dev pkg-config

# Build and install (CLI + GUI)
make && sudo make install
```

Cài đặt:
- `temperlux` (CLI) → `/usr/local/bin/`
- `temperlux-gui` (GUI) → `/usr/local/bin/`
- Desktop entry → `/usr/local/share/applications/`
- App icon → `/usr/local/share/icons/hicolor/`

### Từ crates.io

```bash
# CLI only (no GUI)
cargo install temperlux

# With GUI
cargo install temperlux --features gui
```

### Gỡ cài đặt

```bash
sudo make uninstall
```

## Sử dụng

### GUI

```bash
temperlux-gui
```

GUI cung cấp:
- Thanh trượt độ sáng cho từng màn hình với điều khiển phần cứng trực tiếp
- Hộp thoại Tùy chọn cho chế độ đồng bộ, giới hạn, tên màn hình, thứ tự và chủ đề
- Trình chỉnh sửa lịch để tạo và quản lý hồ sơ độ sáng
- Làm mới một cú nhấp cho thay đổi cắm màn hình nóng

### CLI

```bash
# List all displays
temperlux list

# JSON output for scripting
temperlux list --json

# Get brightness of display 1
temperlux get 1

# Set display 1 to 75%
temperlux set 1 --percent 75

# Set all displays to 50%
temperlux set --percent 50

# Increase all displays by 10%
temperlux increase --percent 10

# Decrease display 2 by 5%
temperlux decrease 2 --percent 5

# Rename a display
temperlux rename 1 "Left Monitor"

# Set brightness caps
temperlux caps 1 --min 20 --max 80

# Set sync mode
temperlux sync proportional

# Reorder displays
temperlux order 1 2    # swap positions of display 1 and 2

# Toggle autostart
temperlux autostart enable
```

### Lập lịch (CLI)

```bash
# List schedule profiles
temperlux schedule list

# Create a profile
temperlux schedule add --name "Evening" --after-sunset 0 --monitors "all=30"

# Edit a profile
temperlux schedule edit --name "Evening" --time "20:00"

# Delete a profile
temperlux schedule delete "Evening"

# Apply schedules now (checks if any are due)
temperlux schedule apply

# Set location for sunrise/sunset
temperlux schedule location --lat 41.88 --lon -87.63
temperlux schedule detect-location

# Generate systemd user timers
temperlux schedule generate-timers
```

### Tự động hoàn thành shell

```bash
# Bash
temperlux completions bash > ~/.local/share/bash-completion/completions/temperlux

# Zsh
temperlux completions zsh > ~/.zfunc/_temperlux

# Fish
temperlux completions fish > ~/.config/fish/completions/temperlux.fish

# Elvish
temperlux completions elvish > ~/.config/elvish/completions/temperlux
```

## Quốc tế hóa

Temperlux hỗ trợ 25 ngôn ngữ ngay từ hộp, bao phủ ~78% dân số thế giới và ~97%+ người dùng desktop Linux. GUI và CLI tự động phát hiện ngôn ngữ hệ thống từ `LANG`/`LC_ALL`.

### Thử nghiệm ngôn ngữ

```bash
# German GUI
LANG=de_DE.UTF-8 temperlux-gui

# Japanese CLI help
LANG=ja_JP.UTF-8 temperlux --help
```

Hoặc thay đổi ngôn ngữ hệ thống trong Cài đặt GNOME → Khu vực & Ngôn ngữ.

### Thêm ngôn ngữ mới

1. Sao chép `locales/en.yml` thành `locales/<lang>.yml`
2. Dịch các giá trị (giữ khóa giống nhau)
3. Xây dựng lại — bản dịch được nhúng tại thời điểm biên dịch
4. Chạy `cargo test -- --test-threads=1` — bộ kiểm tra xác minh mọi khóa được giải quyết trong mọi ngôn ngữ

Hệ thống i18n sử dụng [`rust-i18n`](https://github.com/longbridge/rust-i18n) — Rust thuần, không phụ thuộc hệ thống.

## Xây dựng

```bash
# CLI only (default)
cargo build --release

# With GUI
cargo build --release --features gui

# Run tests
cargo test

# Lint
cargo clippy -- -D warnings
```

### Yêu cầu

- Rust 1.82+
- `libddcutil` 2.0+ and development headers
- GTK4 + Libadwaita 1.2+ (for GUI feature)
- `pkg-config`

### Install dependencies (Debian/Ubuntu)

```bash
sudo apt install ddcutil libddcutil-dev libgtk-4-dev libadwaita-1-dev pkg-config
```

### Install dependencies (Fedora)

```bash
sudo dnf install ddcutil ddcutil-devel gtk4-devel libadwaita-devel pkg-config
```

### Install dependencies (Arch)

```bash
sudo pacman -S ddcutil gtk4 libadwaita pkgconf
```

## Kiến trúc

```
src/
  main.rs            CLI entry point (dispatches to subcommands)
  cli.rs             clap argument definitions + shell completions
  i18n.rs            Internationalization (tr/tr_args, locale normalization)
  autostart.rs       Autostart .desktop file management
  settings.rs        JSON config (~/.config/temperlux/settings.json)
  sync.rs            Sync mode math (proportional map, delta apply)
  caps.rs            Min/max brightness clamping
  schedule.rs        Schedule profile definitions + sunrise/sunset calc
  display/
    ddc_ffi.rs       DdcService (FFI libddcutil, parallel writes, command coalescing)
    backlight.rs     RealBacklightProvider (/sys/class/backlight)
    manager.rs       DisplayManager (unified display operations)
    provider.rs      BacklightProvider trait
  gui/
    window.rs        Main window, display rows, preferences, schedule editor
    viewmodel.rs     DisplayRow data model
    debounce.rs      Slider debouncing + worker pool
    schedule.rs      Schedule UI (profile editor, time pickers)
    theme.rs         Color theme system (brand CSS, community themes, live switching)
    themes/          14 embedded community theme CSS files
    widgets/         Custom GTK4 widgets
locales/             Translation files (en, de, es, fr, pt, ru, zh, it, pl, nl, ja, ko, tr, uk, id, hi, ar, bn, ur, fa, vi, th, ms, cs, hu, ro)
```

Cả CLI và GUI đều sử dụng `DdcService` (FFI libddcutil) để phát hiện màn hình đáng tin cậy và ghi DDC song song nhanh với gộp lệnh. Truy cập phần cứng nằm sau các trait nhà cung cấp với triển khai giả lập để kiểm tra.

### Kiểm tra

Cơ sở mã có 185 bài kiểm tra với kiến trúc dựa trên giả lập — tất cả truy cập phần cứng nằm sau các trait (`DdcProvider`, `BacklightProvider`), cho phép kiểm tra đơn vị đầy đủ mà không cần màn hình vật lý. Bộ kiểm tra i18n xác minh mọi khóa dịch thuật được giải quyết trong tất cả 25 ngôn ngữ.

```bash
cargo test                           # run all tests
cargo test --features gui            # include GUI tests
cargo test -- --test-threads=1       # serial (required for locale-switching tests)
cargo test -- --nocapture sync_test  # verbose specific test
```

## Cấu hình

Tệp cấu hình: `~/.config/temperlux/settings.json`

```json
{
  "sync_mode": "proportional",
  "show_display_numbers": true,
  "use_24h_time": true,
  "show_range_labels": true,
  "autostart": false,
  "theme_mode": "system",
  "light_theme": "angus_light",
  "dark_theme": "angus_dark",
  "display_order": ["ddc:2", "ddc:1", "ddc:3"],
  "displays": {
    "ddc:1": {
      "min_brightness": 20.0,
      "max_brightness": 80.0,
      "custom_name": "Left Monitor"
    },
    "ddc:2": {
      "min_brightness": 0.0,
      "max_brightness": 100.0,
      "custom_name": "Right Monitor"
    }
  }
}
```

### Tham chiếu cài đặt

| Trường | Kiểu | Mặc định | Mô tả |
|-------|------|---------|-------------|
| `sync_mode` | `"off"` \| `"same"` \| `"proportional"` | `"off"` | Đồng bộ độ sáng giữa các màn hình |
| `show_display_numbers` | bool | `true` | Hiển thị số chỉ mục trong tên màn hình |
| `use_24h_time` | bool | `true` | Định dạng 24 giờ trong trình chỉnh sửa lịch |
| `show_range_labels` | bool | `true` | Hiển thị nhãn phạm vi tối thiểu/tối đa trên thanh trượt |
| `autostart` | bool | `false` | Khởi động khi đăng nhập |
| `theme_mode` | `"system"` \| `"light"` \| `"dark"` | `"system"` | Chế độ màu giao diện |
| `light_theme` | string | `"angus_light"` | Bảng màu cho chế độ sáng |
| `dark_theme` | string | `"angus_dark"` | Bảng màu cho chế độ tối |
| `display_order` | string[] | — | Thứ tự màn hình |
| `displays` | object | — | Cấu hình từng màn hình (giới hạn, tên) |

## CI/CD

- **Xây dựng + Kiểm tra** — mỗi push lên master
- **Clippy** — lint với `-D warnings`
- **Cổng phủ** — yêu cầu 80% độ phủ dòng
- **Phủ diff** — mã mới phải đạt ngưỡng độ phủ
- **Phát hành** — push tag kích hoạt Phát hành GitHub (tarball nhị phân) + xuất bản crates.io

## Chẩn đoán

```bash
# Run the diagnostic binary to troubleshoot display detection
ddc-diag
```

Kiểm tra phiên bản libddcutil, quyền thiết bị I2C và khả năng DDC/CI cho mỗi màn hình được phát hiện.

## Giấy phép

GPL-3.0-or-later. See [LICENSE](LICENSE) and [NOTICE](NOTICE).

Dự án này là bản viết lại của [Luminance](https://github.com/sidevesh/Luminance) bởi sidevesh, cũng được cấp phép theo GPL-3.0-or-later.

Chủ đề cộng đồng được cấp phép riêng theo MIT bởi các tác giả tương ứng:
- [Catppuccin](https://github.com/catppuccin/catppuccin) · [Nord](https://github.com/nordtheme/nord) · [Gruvbox](https://github.com/morhetz/gruvbox) · [Solarized](https://github.com/altercation/solarized) · [Dracula](https://github.com/dracula/dracula-theme) · [Rose Pine](https://github.com/rose-pine/palette)

---

Full documentation: [English](README.md)
