การสร้างฐานข้อมูลการแปลสตริงสำหรับโครงการ (ในบ้าน) หลายโครงการ


9

ที่ บริษัท ของเราเรามีการแปล ms-sql table ที่เก็บสตริงเช่นนี้:

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

มี 3 ภาษาในระบบและฉันคาดหวังว่าสิ่งนี้จะเติบโตสูงสุดประมาณ 10 ในอนาคต

ตารางนี้ถูกอ่านโดยหลายโครงการที่แตกต่างกันมาก (ประมาณ 60 โครงการส่วนใหญ่เป็นเว็บไซต์ / เว็บแอปพลิเคชันและบริการบนเว็บบางอย่าง) ที่แต่ละเปิดการเชื่อมต่อฐานข้อมูลไปยังฐานข้อมูลการแปลแคชแปล

ข้อเสนอแนะจาก front-end devs คือ UI ของเราที่จะใส่หรือแก้ไขข้อเสียที่ใหญ่ที่สุดของการแปลคือพวกเขาไม่สามารถรู้ว่าโครงการใดใช้สตริงอะไร

บางครั้งพวกเขาปรับเปลี่ยนสตริงที่ไม่ทราบว่าพวกเขากำลังทำลาย 7 โครงการด้วย

ตอนนี้พวกเขาแค่ต้องพิมพ์สิ่งที่ชอบthis.Translate("Hello World")และระบบจะดูแลส่วนที่เหลือ

ฉันสามารถบังคับให้พวกเขามีลักษณะเช่นนี้ได้this.Translate("Hello World","AwesomeApplication1")แต่ดูเหมือนว่าจะต้องมีการปรับโครงสร้างใหม่หลายครั้งในหลาย ๆ โครงการ

คุณจะนำเสนอโซลูชั่นนี้อย่างไร? ในฐานะผู้พัฒนาระบบจะให้ "ชื่อโครงการ" แก่การแปลอย่างไร คุณจะเก็บมันไว้ในฐานข้อมูลอย่างไร?

หมายเหตุสำคัญ: การใช้การแปลซ้ำเป็นจุดรวมของฐานข้อมูลส่วนกลางดังนั้นการกำหนดขอบเขตการแปลให้เป็นหนึ่งโครงการโดยไปที่

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

ไม่ใช่ตัวเลือกที่ต้องการจริงๆ

ฉันต้องการของที่ชอบ:

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

หรือคีย์ต่างประเทศเทียบเท่าเพียงแค่ใส่ชื่อในตาราง

UPDATE

จากคำแนะนำในการทำให้ฐานข้อมูลเป็นมาตรฐานฉันได้พบกับสิ่งนี้:

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

UPDATE2:เพิ่ม edmx แทนข้อความ หากผู้คนสนใจฉันสามารถรวบรวมโครงการ WCF ฉันกำลังสรุปแนวคิดนี้เพื่อให้ผู้อื่นสามารถทดสอบและใช้งานได้


Ty สำหรับการทำให้เป็นมาตรฐาน โหวต q และ a. ฉันเชื่อว่า github ฤดูใบไม้ผลิ java จะช่วย
tgkprog

คำตอบ:


5

ข้อมูลเบื้องต้น # 1: คุณไม่ได้บอกเราว่าการแปลนั้นได้รับการปรับปรุงอย่างไรในขณะนี้

หมายเหตุเบื้องต้น # 2: ฐานข้อมูลของคุณไม่ได้ถูกทำให้เป็นมาตรฐาน ไม่ว่าวิธีการแก้ปัญหาที่คุณจะทำคืออะไรให้ปรับฐานข้อมูลของคุณให้เป็นมาตรฐานก่อน คุณพบปัญหาการบำรุงรักษาแย่มากในภายหลังหากคุณไม่ทำเช่นนั้น

นี่คือสิ่งที่ฉันจะทำ

  1. เขียนสายการแปลของคุณใหม่เพื่อให้มีรหัสโปรแกรมกลับไปที่เซิร์ฟเวอร์

  2. นักแปลส่วนหลังจะใส่สตริงลงในตารางฐานข้อมูลหากยังไม่มีอยู่และจะติดแท็กด้วยรหัสโปรแกรม

  3. หากสตริงมีอยู่แล้วจะมีการอัปเดตก็ต่อเมื่อรหัสโปรแกรมตรงกับรหัสโปรแกรมดั้งเดิมที่สร้างสตริงนั้น หากไม่ใช่ให้ส่งคืนการแจ้งเตือนความขัดแย้ง

รูปแบบ:

  • คุณสามารถใช้ 'รหัสนักพัฒนา / นักแปลรหัส' แทนรหัสโปรแกรม ฉันคิดว่าดีกว่าเพราะมีคนที่รู้จักภาษาต่างประเทศและคนที่คิดว่ารู้ เฉพาะกลุ่มแรกเท่านั้นที่มีสิทธิ์แก้ไข

  • คุณอาจต้องการจัดเก็บ ID ของโปรแกรมทั้งหมดที่ใช้สตริงใน DB เพื่อให้คุณทราบว่าโปรแกรมใดขัดแย้งกัน

  • คุณสามารถขยายความคิด 'ความเป็นเจ้าของ' นี้ไปยังแต่ละภาษาได้: คน ๆ หนึ่งสามารถทำภาษาอังกฤษได้

  • เมื่อฐานข้อมูลของคุณเป็นมาตรฐานคุณเพิ่มความซับซ้อนของการสร้างเช่น "โปรแกรม A เป็นภาษา 1,2,3; B อยู่ใน 3 และ 5"

ฉันขอแนะนำให้คุณเขียนโปรแกรม 'การบำรุงรักษาการแปล' แยกต่างหากที่จะแสดงการแปลที่หายไปและอื่น ๆ ฉันเคยทำเช่นนั้นด้วยการให้สิทธิ์ 2 ระดับ: การแปลแต่ละครั้งจะต้องได้รับการตรวจสอบโดยบุคคลที่สอง


1
ฉันอัปเดตคำถามตามความคิดของคุณแล้ว
Mvision

5

เนื่องจากพวกเขากำลังอ้างถึง 'นี้' ... คุณสามารถกำหนดชื่อโครงการหนึ่งครั้งให้กับ 'this' (ผ่าน Constructor เป็นต้น) และอินเทอร์เฟซสำหรับฟังก์ชั่นการแปลจะไม่เปลี่ยนแปลงสำหรับโคเดอร์ ภายใต้ประทุนมันเพิ่งเพิ่มชื่อโครงการไปยังแบบสอบถามฐานข้อมูล หรือคุณสามารถระบุ 'this' เพื่อทราบชื่อโครงการด้วยตัวเอง มันขึ้นอยู่กับว่าคุณมีโครงสร้างห้องเรียนอย่างไร

สำหรับการจัดเก็บคุณสามารถทำสิ่งต่อไปนี้:

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

ใช้ wild card เพื่อใช้การแปลทั่วไปกับแอพทั้งหมด แต่ชื่อแอพเฉพาะเมื่อคุณต้องการแทนที่การแปลสำหรับแอพใดแอพหนึ่ง การทำเช่นนี้จะช่วยลดความซ้ำซ้อนให้น้อยที่สุด

หากต้องการดูว่าโปรแกรมใช้งานการแปลแบบใดตอนนี้คุณรู้เรื่องนี้แล้ว - หากคุณไม่ต้องการอ่านและรวบรวมข้อมูลด้วยตนเองคุณสามารถบันทึกคำขอการแปลได้


แนวคิดของการย้ายไปยังคลาส 'this' นั้นดีสำหรับฉันฉันคิดว่าฉันจะย้ายชื่อโครงการไปยังไฟล์ web / app.config และอ่านจากที่นั่น คุณคิดว่าแนวคิด wild card / ชื่อโครงการสามารถปรับขนาดได้เช่นการแปล 4000 ครั้งหรือไม่?
Mvision

3
ในฐานะที่เป็นการเพิ่มประสิทธิภาพทริกเกอร์สามารถเพิ่มลงในฐานข้อมูลหรือ DBAL ที่อัปเดตคอลัมน์ "สมัครสมาชิกโปรแกรม" ทุกครั้งที่อ่านคำแปล

ฐานข้อมูลทริกเกอร์รู้จักชื่อโครงการได้อย่างไร (เรากำลังใช้กรอบงานเอนทิตี 4)
Mvision

@ วิสัยทัศน์ฉันไม่เห็นว่าทำไมไม่ - ปริมาณไม่ควรมีปัญหามาก หากการแปลเฉพาะแอปจำนวนมากใส่ชื่อแอพเพียงอย่างเดียวคุณสามารถใช้ค่าคงที่เพื่อลดค่าซ้ำได้เช่นกัน
GrandmasterB

nvm ฉันเข้าใจผิด ใช่ทริกเกอร์สามารถทำได้และจะเพิ่มความเร็วของสิ่งต่าง ๆ เมื่อเทียบกับการตรวจสอบและปรับปรุงสิ่งที่ราง EF เมื่ออ่าน .... โทรดี
Mvision

1

หากโครงการทั้งหมดของคุณเขียนด้วยภาษา C # และการโทรหานักแปลทุกคนจะมีลักษณะเช่นนี้

this.Translate("hello-world")

โดยที่ "hello-world" เป็นกุญแจสำคัญในตารางการแปลของคุณคุณไม่ควรเขียนโค้ดสแกนเนอร์ขนาดเล็กเกินไปโดยใช้นิพจน์ทั่วไปเพื่อค้นหานักแปลทั้งหมดและกำหนดคำสำคัญให้กับชื่อโครงการที่เกี่ยวข้อง ด้วยวิธีนี้คุณไม่จำเป็นต้องเปลี่ยนรหัสหรืออินเทอร์เฟซตัวแปลที่มีอยู่

ขึ้นอยู่กับโครงสร้างที่แท้จริงของโปรแกรมของคุณหรืออาจแยกข้อมูลจากรหัส IL ของแอสเซมบลีของคุณได้ง่ายขึ้น ฉันทำสิ่งที่คล้ายกันมากในช่วงเวลาที่ผ่านมาเพื่อวัตถุประสงค์ในการแปลโดยใช้รหัสตัวอย่างนี้ในการแยกวิเคราะห์ชุดประกอบ


ฉันเคยชอบวิธีแก้ปัญหาแบบนี้ แต่จะต้องมีการทดสอบทั้งหมด 60 โครงการ (บางอันไม่ใช่ของฉัน) ก่อนที่จะทำการผลิตด้วยระบบใหม่นี้ วิธีแก้ปัญหาที่แนะนำเพื่อย้ายชื่อโครงการไปยังรหัสการโทรทำงานได้ดีและจะทำให้เกิดความยุ่งยากน้อยลงขอบคุณมาก!
Mvision

1
@ วิสัยทัศน์: ฉันคิดว่าตรงข้ามเป็นจริง หากคุณกำหนดชื่อโครงการสำหรับการแปล ณ รันไทม์คุณต้องแน่ใจว่าทุกหน้าเว็บที่มีการแปลทั้งหมดสำหรับโครงการ 60 ทั้งหมดของคุณจะต้องถูกเรียกหนึ่งครั้งเพื่อให้แน่ใจว่าคุณได้บันทึกไว้ทั้งหมด การสแกนแหล่งที่มาหรือชุดประกอบแบบคงที่ให้รายการที่สมบูรณ์โดยไม่ต้องทดสอบหรือใช้งานระบบทั้งหมด
Doc Brown
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.