Rust编程语言标识符解析库isolang的使用,isolang提供高效国际语言代码识别与分类功能
ISO 639语言代码
介绍
在处理不同语言输入和API时,会使用不同的标准来识别语言。以自动化方式在这些标准之间进行转换可能很繁琐。这个crate提供了一个枚举,支持从639-1和639-3转换,也可以转换为这些格式,以及转换为英文名称或本地名称(autonyms)。
这个crate在静态嵌入的表中包含ISO 639表。这会增加二进制大小,但如果性能很重要,允许非常高效的查找。如果大小是一个问题,英文名称和本地名称可以单独启用或禁用。
这个crate根据Apache 2.0许可证授权,详情请参阅LICENSE.md。
用法
Cargo.toml
:
[dependencies]
isolang = "2.0"
示例
use isolang::Language;
assert_eq!(Language::from_639_1(“de”).unwrap().to_name(), “German”);
assert_eq!(Language::from_639_3(“spa”).unwrap().to_639_1(), Some(“es”));
// 未定义语言(ISO代码und)
assert_eq!(Language::default(), Language::Und);
use isolang::Language;
// `to_name()`在编译时启用`english_names`特性时可用。
assert_eq!(Language::from_str("es").unwrap().to_name(), "Spanish");
assert_eq!(Language::from_str("spa").unwrap().to_name(), "Spanish");
// `from_str(lowercase_name)`在编译时启用`english_names`和`lowercase_names`特性时可用。
assert_eq!(Language::from_str("spanish").unwrap().to_name(), "Spanish");
// `from_str(local_name)`在编译时启用`english_names`、`lowercase_names`和`local_names`特性时可用。
assert_eq!(Language::from_str("español").unwrap().to_name(), "Spanish");
支持的Cargo特性
请查看注释的Cargo.toml文件以获取支持的特性列表。
Serde支持
这个crate还支持序列化Language
枚举。要启用此功能,请将以下行添加到您的Cargo.toml
中(替换上面的代码):
[dependencies.isolang]
features = ["serde"]
version = "2.0"
数据源
数据从下载。
完整示例代码
// 引入isolang库
use isolang::Language;
fn main() {
// 示例1: 从ISO 639-1代码获取语言名称
let german = Language::from_639_1(“de”).unwrap();
println!(“德语: {}”, german.to_name());
<span class="hljs-comment">// 示例2: 从ISO 639-3代码获取ISO 639-1代码</span>
<span class="hljs-keyword">let</span> <span class="hljs-variable">spanish</span> = Language::<span class="hljs-title function_ invoke__">from_639_3</span>(<span class="hljs-string">"spa"</span>).<span class="hljs-title function_ invoke__">unwrap</span>();
<span class="hljs-built_in">println!</span>(<span class="hljs-string">"西班牙语ISO 639-1代码: {}"</span>, spanish.<span class="hljs-title function_ invoke__">to_639_1</span>().<span class="hljs-title function_ invoke__">unwrap</span>());
<span class="hljs-comment">// 示例3: 处理未定义语言</span>
<span class="hljs-keyword">let</span> <span class="hljs-variable">undefined</span> = Language::<span class="hljs-title function_ invoke__">default</span>();
<span class="hljs-built_in">println!</span>(<span class="hljs-string">"默认语言: {:?}"</span>, undefined);
<span class="hljs-comment">// 示例4: 从字符串解析语言(需要相应特性)</span>
<span class="hljs-keyword">if</span> <span class="hljs-keyword">let</span> <span class="hljs-variable">Ok</span>(lang) = Language::<span class="hljs-title function_ invoke__">from_str</span>(<span class="hljs-string">"es"</span>) {
<span class="hljs-built_in">println!</span>(<span class="hljs-string">"从字符串'es'解析的语言: {}"</span>, lang.<span class="hljs-title function_ invoke__">to_name</span>());
}
}
isolang:Rust语言标识符解析库
概述
isolang是一个高效的Rust库,专门用于国际标准语言代码(ISO 639)的识别、解析和分类。该库支持ISO 639-1(双字母代码)、ISO 639-2/T(三字母术语代码)和ISO 639-2/B(三字母书目代码)标准,能够准确识别和转换不同格式的语言标识符。
主要特性
- 完整支持ISO 639标准的所有语言代码格式
- 零成本抽象和高性能解析
- 支持语言名称的本地化显示
- 提供错误处理和边界情况处理
- 无依赖的轻量级实现
安装方法
在Cargo.toml中添加依赖:
[dependencies]
isolang = "2.0"
基本使用方法
1. 语言代码解析
use isolang::Language;
fn main() {
// 从ISO 639-1代码解析
let lang = Language::from_639_1("fr").unwrap();
println!("法语: {}", lang.to_name());
// 从ISO 639-2/T代码解析
let lang = Language::from_639_2("deu").unwrap();
println!("德语: {}", lang.to_name());
}
2. 语言代码转换
use isolang::Language;
fn convert_language_codes() {
let english = Language::from_639_1("en").unwrap();
println!("ISO 639-1: {}", english.to_639_1().unwrap());
println!("ISO 639-2/T: {}", english.to_639_2());
println!("ISO 639-2/B: {}", english.to_639_3());
}
3. 批量语言识别
use isolang::Language;
fn identify_multiple_languages() {
let codes = vec!["es", "zh", "ja", "ru"];
for code in codes {
if let Ok(lang) = Language::from_639_1(code) {
println!("{} -> {}", code, lang.to_name());
}
}
}
4. 错误处理示例
use isolang::Language;
fn handle_errors() {
match Language::from_639_1("xx") {
Ok(lang) => println!("找到语言: {}", lang.to_name()),
Err(_) => println!("无效的语言代码"),
}
}
高级用法
自定义语言映射
use isolang::Language;
fn custom_language_processing() {
let languages = vec![
Language::from_639_1("fr").unwrap(),
Language::from_639_1("de").unwrap(),
Language::from_639_1("it").unwrap(),
];
for lang in languages {
println!(
"{}: {} ({})",
lang.to_name(),
lang.to_639_1().unwrap(),
lang.to_639_2()
);
}
}
语言分类和过滤
use isolang::Language;
fn filter_languages() {
let all_languages = Language::all();
// 过滤出主要欧洲语言
let european_languages = all_languages
.filter(|lang| {
let code = lang.to_639_1().unwrap();
matches!(code, "en" | "fr" | "de" | "es" | "it" | "ru")
});
for lang in european_languages {
println!("{}", lang.to_name());
}
}
完整示例demo
// 完整示例:展示isolang库的完整功能使用
use isolang::Language;
fn main() {
println!("=== isolang库完整功能演示 ===");
// 1. 基本语言代码解析
println!("\n1. 基本语言代码解析:");
let french = Language::from_639_1("fr").unwrap();
let german = Language::from_639_2("deu").unwrap();
println!("法语: {} (ISO 639-1: {:?})", french.to_name(), french.to_639_1());
println!("德语: {} (ISO 639-2: {})", german.to_name(), german.to_639_2());
// 2. 语言代码转换
println!("\n2. 语言代码转换:");
let english = Language::from_639_1("en").unwrap();
println!("英语转换:");
println!(" ISO 639-1: {}", english.to_639_1().unwrap());
println!(" ISO 639-2/T: {}", english.to_639_2());
println!(" ISO 639-3: {}", english.to_639_3());
// 3. 批量处理多种语言
println!("\n3. 批量语言识别:");
let language_codes = vec!["es", "zh", "ja", "ru", "ar", "hi"];
for code in language_codes {
match Language::from_639_1(code) {
Ok(lang) => println!(" {} -> {}", code, lang.to_name()),
Err(_) => println!(" {} -> 无效代码", code),
}
}
// 4. 错误处理演示
println!("\n4. 错误处理演示:");
let invalid_codes = vec!["xx", "xyz", "123"];
for code in invalid_codes {
match Language::from_639_1(code) {
Ok(lang) => println!(" {} -> {}", code, lang.to_name()),
Err(_) => println!(" {} -> 无效的语言代码", code),
}
}
// 5. 高级功能:语言过滤和分类
println!("\n5. 语言分类和过滤:");
println!("主要欧洲语言:");
Language::all()
.filter(|lang| {
if let Some(code) = lang.to_639_1() {
matches!(code.as_str(), "en" | "fr" | "de" | "es" | "it" | "ru" | "pt" | "nl")
} else {
false
}
})
.for_each(|lang| {
println!(" - {} ({})", lang.to_name(), lang.to_639_1().unwrap());
});
// 6. 多标准代码支持演示
println!("\n6. 多标准代码支持:");
let test_cases = vec![
("fr", "fra", "fre"), // 法语
("de", "deu", "ger"), // 德语
("zh", "zho", "chi"), // 中文
];
for (code_1, code_2t, code_2b) in test_cases {
let from_1 = Language::from_639_1(code_1).unwrap();
let from_2t = Language::from_639_2(code_2t).unwrap();
let from_2b = Language::from_639_2(code_2b).unwrap();
println!(" {}: {} | {}: {} | {}: {}",
code_1, from_1.to_name(),
code_2t, from_2t.to_name(),
code_2b, from_2b.to_name());
}
println!("\n=== 演示结束 ===");
}
性能提示
- isolang使用静态数据表,所有查找操作都是O(1)时间复杂度
- 适合高频次的语言代码解析场景
- 内存占用极小,适合嵌入式环境
注意事项
- 确保输入的语言代码符合ISO 639标准格式
- 无效代码会返回Option::None或Result::Err
- 支持的语言列表基于最新的ISO 639标准
这个库特别适合需要处理多语言标识符的应用程序,如国际化软件、本地化工具、内容管理系统等。