cs/config/
patterns.rs

1use regex::Regex;
2
3/// Default i18n patterns for various frameworks
4pub fn default_patterns() -> Vec<Regex> {
5    vec![
6        // Ruby patterns
7        Regex::new(r#"I18n\.t\(['"]([^'"]+)['"]\)"#).unwrap(),
8        Regex::new(r#"\bt\(['"]([^'"]+)['"]\)"#).unwrap(),
9        // JavaScript/TypeScript patterns
10        Regex::new(r#"i18n\.t\(['"]([^'"]+)['"]\)"#).unwrap(),
11        // Vue patterns
12        Regex::new(r#"\$t\(['"]([^'"]+)['"]\)"#).unwrap(),
13        // React patterns (will be added in Task 4.1)
14        // Regex::new(r#"useTranslation\(\)\.t\(['"]([^'"]+)['"]\)"#).unwrap(),
15        // Regex::new(r#"<Trans\s+i18nKey=['"]([^'"]+)['"]"#).unwrap(),
16    ]
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22
23    #[test]
24    fn test_patterns_compile() {
25        let patterns = default_patterns();
26        assert!(!patterns.is_empty());
27        assert_eq!(patterns.len(), 4);
28    }
29
30    #[test]
31    fn test_ruby_i18n_pattern() {
32        let patterns = default_patterns();
33        let ruby_pattern = &patterns[0];
34
35        assert!(ruby_pattern.is_match(r#"I18n.t('invoice.labels.add_new')"#));
36        assert!(ruby_pattern.is_match(r#"I18n.t("invoice.labels.add_new")"#));
37        assert!(!ruby_pattern.is_match(r#"t('invoice.labels.add_new')"#));
38    }
39
40    #[test]
41    fn test_ruby_t_pattern() {
42        let patterns = default_patterns();
43        let t_pattern = &patterns[1];
44
45        assert!(t_pattern.is_match(r#"t('invoice.labels.add_new')"#));
46        assert!(t_pattern.is_match(r#"t("invoice.labels.add_new")"#));
47        // Should match word boundary
48        assert!(t_pattern.is_match(r#" t('key')"#));
49    }
50
51    #[test]
52    fn test_js_i18n_pattern() {
53        let patterns = default_patterns();
54        let js_pattern = &patterns[2];
55
56        assert!(js_pattern.is_match(r#"i18n.t('invoice.labels.add_new')"#));
57        assert!(js_pattern.is_match(r#"i18n.t("invoice.labels.add_new")"#));
58    }
59
60    #[test]
61    fn test_vue_pattern() {
62        let patterns = default_patterns();
63        let vue_pattern = &patterns[3];
64
65        assert!(vue_pattern.is_match(r#"$t('invoice.labels.add_new')"#));
66        assert!(vue_pattern.is_match(r#"$t("invoice.labels.add_new")"#));
67    }
68}