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 Intl patterns
14        Regex::new(r#"id:\s*['"]([^'"]+)['"]"#).unwrap(), // defineMessages
15        Regex::new(r#"id=\s*['"]([^'"]+)['"]"#).unwrap(), // FormattedMessage props
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        // Updated to reflect added React Intl patterns
28        assert_eq!(patterns.len(), 6);
29    }
30
31    #[test]
32    fn test_ruby_i18n_pattern() {
33        let patterns = default_patterns();
34        let ruby_pattern = &patterns[0];
35
36        assert!(ruby_pattern.is_match(r#"I18n.t('invoice.labels.add_new')"#));
37        assert!(ruby_pattern.is_match(r#"I18n.t("invoice.labels.add_new")"#));
38        assert!(!ruby_pattern.is_match(r#"t('invoice.labels.add_new')"#));
39    }
40
41    #[test]
42    fn test_ruby_t_pattern() {
43        let patterns = default_patterns();
44        let t_pattern = &patterns[1];
45
46        assert!(t_pattern.is_match(r#"t('invoice.labels.add_new')"#));
47        assert!(t_pattern.is_match(r#"t("invoice.labels.add_new")"#));
48        // Should match word boundary
49        assert!(t_pattern.is_match(r#" t('key')"#));
50    }
51
52    #[test]
53    fn test_js_i18n_pattern() {
54        let patterns = default_patterns();
55        let js_pattern = &patterns[2];
56
57        assert!(js_pattern.is_match(r#"i18n.t('invoice.labels.add_new')"#));
58        assert!(js_pattern.is_match(r#"i18n.t("invoice.labels.add_new")"#));
59    }
60
61    #[test]
62    fn test_vue_pattern() {
63        let patterns = default_patterns();
64        let vue_pattern = &patterns[3];
65
66        assert!(vue_pattern.is_match(r#"$t('invoice.labels.add_new')"#));
67        assert!(vue_pattern.is_match(r#"$t("invoice.labels.add_new")"#));
68    }
69}