Birden çok (kurum içi) proje için dize çeviri veritabanı oluşturma


9

Şirketimizde şu gibi dizeleri saklayan mevcut bir çeviri ms-sql tablosu var:

Id |     Key     | Language | Value 
 1 | hello-world |  nl-BE   | Hallo Wereld
 2 | hello-world |  en-GB   | Hello World

Sistemde 3 dil var ve bunun gelecekte maksimum 10'a çıkmasını bekliyorum

Bu tablo, her biri çeviri veritabanına bir veritabanı bağlantısı açan, çevirileri önbelleğe alan çok sayıda farklı proje (çoğunlukla web siteleri / web uygulamaları ve bazı web hizmetleri) tarafından okunur.

Ön uç geliştiricilerden gelen geri bildirimler, çevirimizin en büyük dezavantajını UIto'ya girmek veya değiştirmek, hangi projenin hangi dizeleri kullandığını bilememesidir.

Bazen 7 projeyi bozduğunu bilmeden dizeleri değiştirirler.

Şimdi sadece böyle bir şey yazmak zorundalar this.Translate("Hello World") ve sistem gerisini halleder.

Elbette onları böyle bir şeye zorlayabilirdim, this.Translate("Hello World","AwesomeApplication1")ancak bu birçok proje arasında oldukça fazla yeniden düzenleme gerektirecek gibi görünüyor.

Bu çözümü nasıl sağlıyorsunuz? Bir geliştirici olarak çeviriye "proje adı" nı nasıl sağlarsınız? Bunu veritabanında nasıl saklarsınız?

Önemli not: çeviri yeniden kullanımı merkezi veritabanının bütün noktasıdır, bu yüzden bir projeye çevirileri gidip

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1
5|hello-world|nl-BE|Hallo Wereld!|MyAwesomeApplicatoin2

gerçekten aranan bir seçenek değil.

Şöyle bir şey tercih ederim:

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1,MyAwesomeApplicatoin2

ya da isimleri masaya koymanın bir yabancı anahtar karşılığı.

GÜNCELLEME

Veritabanı normalleştirmek için tavsiye dayanarak ben şimdiye kadar böyle bir şey ile geldim:

//this allows me to distinquish if translations where added by developer or by translator

UPDATE2: metin yerine edmx eklendi. Eğer insanlar ilgileniyorsa ben WCF projesini github olabilir diğer insanlar test ve kullanmak böylece bu kavram sarıyorum.


Normalizasyon için ty. q ve a. Bir bahar java github yardımcı olacağını düşünüyorum.
tgkprog

Yanıtlar:


5

Ön not # 1: Çevirilerin şu anda nasıl yapıldığını bize söylemiyorsunuz

Ön not # 2: Veritabanınız normalleştirilmemiş. Hangi çözümü alacak olursanız olun, önce veritabanınızı normalleştirin . Şimdi yapmazsanız daha sonra korkunç bakım sorunlarıyla karşılaşıyorsunuz

Ben de öyle yapardım.

  1. Çeviri çağrınızı bir program kimliğini sunucuya geri taşıyacak şekilde yeniden yazın

  2. Arka uç çevirmeni dizeyi henüz yoksa veritabanı tablosuna koyar ve program kimliğiyle etiketler

  3. Dize zaten varsa, yalnızca program kimliği dizenin oluşturulduğu orijinal program kimliğiyle eşleşirse güncellenir. Değilse, bir çakışma bildirimi döndürün.

Varyasyonlar:

  • Program kimliği yerine 'geliştirici kimliği / çevirmen kimliği' kullanabilirsiniz. Bunu daha iyi düşünüyorum çünkü yabancı bir dil bilen ve bildiklerini düşünen insanlar var. Yalnızca ilk grubun değişiklik hakları vardır.

  • DB'de dizeyi kullanan tüm programların kimliklerini saklamak isteyebilirsiniz, böylece hangi programların çakıştığını bilirsiniz.

  • Bu 'sahiplik' düşüncesini her bir dile genişletebilirsiniz: bir kişi İngilizce, diğeri Hollandaca yapabilir.

  • Veritabanınız normalleştirildikten sonra, "Program A, Diller 1,2,3'te; B, 3 ve 5'te" gibi karmaşıklık ekleyin.

Ayrıca, size eksik çevirileri vb. Gösterecek ayrı bir 'çeviri bakımı' programı yazmanızı öneririm. Bunu bir kez 2 seviyeli yetkilendirme ile yaptım: her çeviri ikinci bir kişi (genellikle anadili konuşmacı) tarafından incelenmelidir.


1

5

Bir "this" e atıfta bulundukları için ... proje adını bir kez "this" e atayabilirsiniz (örneğin kurucu aracılığıyla) ve çeviri işlevlerinin arabirimi kodlayıcılar için değişmez. Kaputun altında, proje adını veritabanı sorgusuna ekler. Alternatif olarak, 'bu' proje adını kendi başına bilmenin bir yolunu da sağlayabilirsiniz. Gerçekten sınıflarınızı nasıl yapılandırdığınıza bağlı olacaktır.

Depolama için aşağıdaki gibi bir şey yapabilirsiniz:

1 ! hello-world ! nl-EN ! Hello World  ! *
2 ! hello-world ! nl-EN ! Howdy, World ! CowboyApp
3 ! hello-world ! nl-EN ! Arrgh        ! PirateApp

Tüm uygulamalara genel bir çeviri uygulamak için bir joker karakter kullanın, ancak belirli bir uygulama için çeviriyi geçersiz kılmak istediğinizde belirli uygulama adını kullanın. Bu, kopyaları minimumda tutar.

Hangi programın hangi çevirileri kullandığını görmek için artık bunu biliyorsunuz - bu bilgileri gözden geçirmek ve manuel olarak toplamak istemiyorsanız, çeviri isteklerini günlüğe kaydedebilirsiniz.


'Bu' sınıfa taşıma fikri bana iyi geliyor, proje adını web / app.config dosyasına taşıyacağım ve oradan okuyacağım. Joker / proje-isimleri fikrinin 4000 çeviri gibi bir şeyle ölçeklendirilebileceğini düşünüyor musunuz?
Mvision

3
Bir geliştirme olarak, çevrilmiş bir sözcük okunduğunda veritabanına veya DBAL'a "abone olunan programlar" sütununu güncelleyen bir tetikleyici eklenebilir.

Veritabanı tetikleyicisi proje adını nasıl bilebilir? (Varlık çerçevesi 4'ü kullanıyoruz)
Mvision

@Mvision Neden görmüyorum - hacim çok fazla sorun olmamalı. Uygulamaya özel çevirilerin çoğu yalnızca uygulama adını ekliyorsa, yinelemeleri azaltmak için sabitleri de kullanabilirsiniz.
GrandmasterB

yanlış anladım. evet bir tetik yapabilirdi ve okuma ve EF üzerinde yalak bu şeyler kontrol ve güncelleme karşılaştırıldığında şeyler hızlandırmak .... iyi çağrı
Mvision

1

Tüm projeleriniz C # ile yazılmışsa ve tüm çevirmen çağrıları şöyle görünürse

this.Translate("hello-world")

Burada "merhaba dünyası" çeviri tablonuzun anahtarıdır, tüm çevirmen çağrılarını bulmak ve anahtar kelimelere karşılık gelen proje adlarını atamak için düzenli ifadeler kullanarak küçük bir kaynak kod tarayıcı yazmak çok zor olmamalıdır. Bu şekilde, mevcut kodunuzu veya çevirmen arabirimlerinizi değiştirmek zorunda kalmazsınız.

Programınızın gerçek yapısına bağlı olarak, alternatif olarak bu bilgileri derlemelerinizin IL kodundan çıkarmak daha kolay olabilir. Bir süre önce çok benzer bir şey yaptım, çeviri amacıyla da, montajları ayrıştırmak için bu örnek kodu kullanarak .


Bu tür bir çözümü severdim. Ancak bu yeni sistemle üretime başlamadan önce 60 projenin (bazıları benim bile değil) tamamen test edilmesini gerektirecektir. Proje adını arama koduna taşımak için önerilen çözüm iyi çalışıyor ve çok daha az güçlük yaratacak, yine de teşekkürler!
Mvision

1
@Mvision: Bence tam tersi geçerli. Çeviriler için proje adını çalışma zamanında belirlerseniz, 60 projenizin tümü için her çeviriye sahip her web sayfasının bir kez çağrıldığından emin olmalısınız. Bununla birlikte, kaynağı veya montajları statik olarak taramak, herhangi bir test gerektirmeden veya tüm sistemi çalıştırmadan size tam bir liste verir.
Doc Brown
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.