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