Как грубо и автоматично да се преведе съдържанието на база данни веднъж?

Да кажем, че има много голяма SQL база данни - стотици таблици, хиляди полета, милиони записи. Тази база данни е на холандски. Бих искал да преведа всички стойности на определени полета за тестови цели на английски. Не е задължително да е напълно коректен, трябва да е четим за тестерите.

Знам, че повечето от текстовете се съхраняват в полета, наречени "име" и "описание" в цялата база данни. Или по същество всички полета с тип NVARCHAR (всяка дължина) във всички таблици биха били кандидатите за превод. Изброяването на всички таблици и полета наистина е твърде много работа и бих искал да го избегна, така че преводът само на тези полета би бил достатъчен.

Има ли начин да преминете през всички таблици и за всички записи да извлечете стойностите от конкретните полета и да ги замените с техните английски преводи? Може ли това да стане само с SQL?

db сървърът няма значение - мога да монтирам базата данни на MSSQL, Oracle или който и да е сървър по избор. Преводът на текстовете с помощта на google или друг автоматичен инструмент е достатъчно добър за целта. Разбира се, този инструмент трябва да има API, за да се използва автоматично.

Някой има ли опит с подобни операции?


person m_pGladiator    schedule 27.12.2010    source източник
comment
Имахте ли предвид услуга за превод, която да използвате, или търсите предложения и за това? Не мисля, че можете да правите RAW sql, тъй като трябва да имате скрипт за достъп до вашата услуга за превод, което предполагам, че ще бъде нещо като API за превод на Google.   -  person meder omuraliev    schedule 27.12.2010
comment
Не съм запознат и с преводаческите услуги. Знам, че Google има API за превод. Вероятно има още услуги, които трябва да намеря и да видя коя е най-подходяща.   -  person m_pGladiator    schedule 28.12.2010
comment
Всъщност опитах с API на Microsoft и работи перфектно.   -  person m_pGladiator    schedule 03.01.2011


Отговори (1)


В Pseudocode ето какво бих направил, използвайки Oracle:

Query AllFieldsQuery = new Query(connection,"Select table_name, column_name 
from user_tab_columns where column_name='name' OR column_name='description'");

AllFieldsQuery.ExecuteReader();

Дава ви нещо като това:

TABLE_NAME | COLUMN_NAME

Таблица1 | Име

Таблица2 | Име

Таблица2 | Описание

........... | ...........

Foreach TableColumnLine

Query FieldQuery = new Query("Select DISTINCT "+COLUMN_NAME+" AS ToTranslate 
from +"TABLE_NAME);

Create a new parametrized query :
MyParamQuery = new ParamQuery(connection, UPDATE TABLE_NAME SET COLUMN_NAME =
@Translated WHERE COLUMN_NAME = @ToTranslate);

Foreach ToTranslateLine

@Translated = GetTranslationFromGoogle(@ToTranslate);

MyParamQuery.Execute(ToTranslate = @ToTranslate, Translated = @Translated);

End Foreach ToTranslateLine

End Foreach TableColumnLine

AllFieldsQuery ви дава всички полета във всички таблици, които трябва да актуализирате.

FieldQuery ви дава всички текстове, които трябва да преведете.

MyParamQuery актуализира всеки един от тези текстове.

Това може да е много дълъг процес, зависи и от времето, което отделяте, за да получите превода. Това, което бих препоръчал, е да направите поне ангажимент по таблица и да отпечатате отчет, който да ви каже за всяка таблица дали всичко е минало добре, защото бихте могли във вашия API да имате функция за изключване, която изключва файлове и/или таблици от първата заявка тъй като вече са преведени преди.

.

Подобрение: Записване на файл и изпълнението му в края на превода, вместо изпълнение на sql актуализации.

Ако е твърде дълго, а вероятно ще бъде твърде дълго, вместо да изпълнявате директно sql АКТУАЛИЗАЦИИТЕ, предпочитате да напишете файл с всичките си актуализации и след като foreach отидете да вземете файла и да го използвате в SQL.

.

Подобрение: Многонишкова версия

Многопоточна версия на вашия API може да ви позволи да спечелите малко време за превод, поставяте всичките си резултати за превод в синхронизирана опашка и използвате набор от нишки, за да превеждате опашката и поставяте всички преведени съобщения в друга синхронизирана опашка, който се използва за запис на SQL изходния файл или за стартиране на актуализациите.

person LaGrandMere    schedule 27.12.2010
comment
Добре, така че в Oracle трябва да е възможно. Не съм експерт по Oracle, но това е наистина интересно и ще се опитам да създам истински скрипт от псевдо кода по-горе. Благодаря! - person m_pGladiator; 28.12.2010
comment
@m_pGladiator : Бихте могли да го направите и в MSSQL/Sybase без никакъв проблем, само заявките се променят. Ако предпочитате, мога да намеря добрите заявки с тези бази данни. - person LaGrandMere; 28.12.2010
comment
Всъщност открих, че имаме вътрешен инструмент, който прави точно това, което описахте. Затова го промених, за да направи частта GetTranslationFromGoogle(). Като цяло алгоритъмът работи, но частта от google е проблем, тъй като услугата има лимит от 100 000 символа на ден и това е твърде малко за цялата база данни. Все пак приемам отговора, тъй като това е правилният начин. Само услугата ще е различна от гугъл. Благодаря! - person m_pGladiator; 29.12.2010