Rust编程语言标识符解析库isolang的使用,isolang提供高效国际语言代码识别与分类功能

ISO 639语言代码

构建状态 Crates.io 文档 许可证:Apache 2.0

介绍

在处理不同语言输入和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>());
}

}


1 回复

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标准

这个库特别适合需要处理多语言标识符的应用程序,如国际化软件、本地化工具、内容管理系统等。

回到顶部