Çoklu Dil İçin Regex

regexÜzerinde çalıştığım proje bir çok farklı dille aynı anda çalışması ve kullanıcılar kendi istekleri doğrultusunda değiştirmeleri gerekiyor. İşin kötü tarafı bir süre geliştirdikten sonra çoklu dil desteğini oturtmak gerçektende zor ve sıkıntılı bir süreç. Böyle durumlarla daha öncede bir çok kez yüzleştim. Kodların tamamını yayınlayamasamda yapı hakkında bir kaç satır bilgi vermemde bir sıkıntı yok.

1- Çoklu dil desteği için Resource yapısını kullandım. Oluşturduğunuz dil dosyasının sonuna dil için TR, AZ, RU, EN gibi uzantasına ek yaparak bunu sağlamak kolay. Yani Proje.resx için Proje.RU.resx şeklinde resource oluşturunca Keyler aynı olduğu süreçe başınız öne eğilmez :)

2- Projeyi taratıp cs, cshtml, html gibi dosyaların içerisinde ki cümleler tespit edilip otomatik olarak resource’nin içerisine ekleyecek bir uygulama yaptım.

İşte asıl olay 2. madde de ortaya çıkıyor. Kelimeleri, cümleleri dosyaların içerisinden belirlemek.

Benim bu iş yazdığım regex aşağıda.

((alert|confirm|prompt)[\t\r\n ]{0,}\([\t\r\n ]{0,}[‘”]+(?[^@].*?)[‘”]+[\t\r\n ]{0,},[\t\r\n ]{0,}[‘”]+(?.*?)[‘”]+)|(Message|Text)[\r\n ]{0,}=[\t\r\n ]{0,}(“(?[^”]+)”)|X.Msg.Alert\([\t\r\n ]{0,}(?“(?[^”]+)”)[\t\r\n ]{0,},|(((Exception|Messages\.Add)|[\t\r\n ]{0,}\.[\t\r\n ]{0,}(FieldLabel|Title|AppendLine|Text|GetText))\([\t\r\n ]{0,}(?“(?[^”]+)”)[\t\r\n ]{0,}\))|(?“(?Aktif|Pasif|Evet|Hayır)”)|((ShowErrorMessage|AddAlertMessage|AddNotification|AddAlertMessage)\([\t\r\n ]{0,}(?“(?[^”]+)”)[\t\r\n ]{0,},[\t\r\n ]{0,}(?“(?[^”]+)”)[\t\r\n ]{0,}\))|ListItem\([\t\r\n ]{0,}(?“(?[^”]+)”)[\t\r\n ]{0,}|((title|msg)[\t\r\n ]{0,}:[\t\r\n ]{0,}(?[‘”])(?.*?)[‘”])

Birazcık uzun gibi oldu :) Bu regex özel olarak üzerinde çalıştığım proje için yazıldığından dolayı genel kullanıma fazla açık değil. Ama parçalara ayırdığınız zaman kendinize göre eklemeler yada çıkartmalar yapabilirsiniz. Aslında regex bir çok regex sorgusundan oluşuyor. 

  1. ((alert|confirm|prompt)[\t\r\n ]{0,}\([\t\r\n ]{0,}[‘”]+(?[^@].*?)[‘”]+[\t\r\n ]{0,},[\t\r\n ]{0,}[‘”]+(?.*?)[‘”]+)
  2. (Message|Text)[\r\n ]{0,}=[\t\r\n ]{0,}(“(?[^”]+)”)
  3. X.Msg.Alert\([\t\r\n ]{0,}(?“(?[^”]+)”)[\t\r\n ]{0,},
  4. (((Exception|Messages\.Add)|[\t\r\n ]{0,}\.[\t\r\n ]{0,}(FieldLabel|Title|AppendLine|Text|GetText))\([\t\r\n ]{0,}(?“(?[^”]+)”)[\t\r\n ]{0,}\))
  5. (?“(?Aktif|Pasif|Evet|Hayır)”)
  6. ((ShowErrorMessage|AddAlertMessage|AddNotification|AddAlertMessage)\([\t\r\n ]{0,}(?“(?[^”]+)”)[\t\r\n ]{0,},[\t\r\n ]{0,}(?“(?[^”]+)”)[\t\r\n ]{0,}\))
  7. ListItem\([\t\r\n ]{0,}(?“(?[^”]+)”)[\t\r\n ]{0,}|((title|msg)[\t\r\n ]{0,}:[\t\r\n ]{0,}(?[‘”])(?.*?)[‘”])

1. kısım da JS kısmında ki çevrimler için kullanıldı.

2.kısım da Razor kımda ki Text = “Deneme” şeklinde ki kısımlar eşleştirildi.

3., 4. ve 6. kısım da kısım da CS kısmında ki yazılar için kullandım.

Geriye kalan kısımlarda da Razor içerisinde ki bilgiler için kullandım.

Bütün kısımları tek tek açıklamayacağım

Bir işinize yaramaz belki ama genede paylaşmak istiyorum :)

Facebook Comments

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir