# anLocales
`anLocales` — a cross-platform Rust library for working with locales, similar to `glibc-locales`, but simpler and with C API support.
* Supports **LC\_TIME, LC\_NUMERIC, LC\_MONETARY, LC\_COLLATE, plural rules**
* Date/number formats in `data_format.json`
* Interface strings in `locale.toml`
* Caching in `temp/`
* C API compatible (`.so`/`.dll`)
---
## 📁 Locale Directory Structure
**Linux/macOS:**
```
/usr/share/anlocales/
├─ locales/
│ ├─ ru_RU/
│ │ ├─ data_format.json
│ │ └─ locale.toml
│ └─ en_US/
├─ temp/ # cache
└─ settings.json # default_locale, fallback_locale
```
**Windows:**
```
C:\ProgramData\anlocales\
├─ locales\
│ ├─ ru_RU\
│ │ ├─ data_format.json
│ │ └─ locale.toml
│ └─ en_US\
├─ temp\ # cache
└─ settings.json # default_locale, fallback_locale
```
**Example `data_format.json`:**
```json
{
"LC_TIME": {
"days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
"months": ["January", "February", "..."],
"date_fmt": "%Y-%m-%d"
},
"LC_NUMERIC": {
"decimal_point": ".",
"thousands_sep": ",",
"grouping": [3]
},
"LC_MONETARY": {
"currency_symbol": "$",
"int_curr_symbol": "USD",
"mon_decimal_point": ".",
"mon_thousands_sep": ",",
"positive_sign": "",
"negative_sign": "-",
"frac_digits": 2
},
"LC_COLLATE": {
"sort_order": "unicode"
},
"PLURAL_RULES": "n != 1"
}
```
**Example `locale.toml`:**
```toml
settings = "Settings"
exit = "Exit"
hello = "Hello"
```
---
## ⚡ Quick Start (Rust)
```rust
use anlocales::AnLocales;
use chrono::NaiveDate;
fn main() {
let mut anlocales = AnLocales::new();
let ru = anlocales.load_locale("ru_RU");
println!("{}", ru.t("settings")); // Settings in Russian
let today = NaiveDate::from_ymd(2025, 9, 21);
println!("{}", ru.format_date(today)); // 21.09.2025
println!("{}", ru.format_money(1234.56)); // ₽1234.56
}
```
---
## 🔗 Using from C
```c
#include "anlocales.h"
#include <stdio.h>
int main() {
AnLocales* al = anlocales_new();
Locale* ru = locale_load(al, "ru_RU");
const char* s = locale_t(ru, "settings");
printf("%s\n", s);
locale_free_str((char*)s);
const char* date = locale_format_date(ru, 2025, 9, 21);
printf("%s\n", date);
locale_free_str((char*)date);
const char* money = locale_format_money(ru, 1234.56);
printf("%s\n", money);
locale_free_str((char*)money);
locale_free(ru);
anlocales_free(al);
}
```
---
## 🛠 Building
### *nix
```bash
make
# Outputs:
# dist/libanLocales.so # Linux
# dist/libanLocales.dylib # macOS
```
### Windows
```bash
rustup target add x86_64-pc-windows-gnu
cargo build --release --target x86_64-pc-windows-gnu
# Outputs:
# target/x86_64-pc-windows-gnu/release/anLocales.dll
# you can run "make" but if its not working use this method
```
### Linking in C
```bash
# Linux
gcc main.c -L. -lanLocales -o main
# Windows
cl main.c anLocales.dll
```
---
## 💡 Features
* Caching loaded locales in `temp/` for fast startup
* Fallback locale if a key is missing
* Extendable LC\_\* structure (add LC\_MESSAGES, LC\_MONETARY, etc.)
* Cross-platform (`.so`/`.dll`)
* Full C API compatible (`anlocales.h`)