1
0
mirror of https://github.com/azure-rtos/guix.git synced 2025-02-04 07:13:17 +08:00
guix/guix_studio/xliff_read_write.cpp

273 lines
9.3 KiB
C++

#include "studiox_includes.h"
#include "xml_writer.h"
#include "xml_reader.h"
#include "xliff_read_write.h"
#include "config_languages_dlg.h"
///////////////////////////////////////////////////////////////////////////////
xliff_read_write::xliff_read_write()
{
}
///////////////////////////////////////////////////////////////////////////////
BOOL xliff_read_write::ExportLanguage(studiox_project *project)
{
int index;
int src_language = project->mHeader.string_export_src;
int target_language = project->mHeader.string_export_target;
CString tag_data;
CString src_data;
CString pathname = project->mHeader.string_export_path;
pathname += "\\";
pathname += project->mHeader.string_export_filename;
xml_writer *writer = new xml_writer();
GotoProjectDirectory();
if (!writer->OpenFile(CString(pathname)))
{
delete writer;
return FALSE;
}
writer->WriteHeader(NULL);
int display = GetProjectView()->GetActiveDisplay();
string_table *table = project->mDisplays[display].stable;
if (project->mHeader.string_export_version >= 2)
{
tag_data.Format(_T("xmlns=\"urn:oasis:names:tc:xliff:document:2.0\" version=\"2.0\"\n srcLang =\"%s\" trgLang=\"%s\""),
config_languages_dlg::GetLanguageId(src_language),
config_languages_dlg::GetLanguageId(target_language));
writer->OpenTag("xliff", tag_data);
tag_data.Format(_T("id=\"f1\" original=\"%s\\%s.gxp\""),
project->mHeader.project_path,
project->mHeader.project_name);
// KGM FIXME: Are we going to keep one string table or one
// table for each display? Currently we are keeping a table for each display
// int the project.... not sure but I'm not consistent about this currently.
writer->OpenTag("file", tag_data);
src_language = config_languages_dlg::GetStringTableIndexFromLanguageIndex(project, src_language);
target_language = config_languages_dlg::GetStringTableIndexFromLanguageIndex(project, target_language);
if (src_language == -1)
{
delete writer;
return FALSE;
}
for (index = 0; index < table->CountStrings(); index++)
{
src_data = table->GetString(index, src_language);
if (!src_data.IsEmpty())
{
tag_data.Format(_T("id=\"%d\" name=\"%s\""), index, table->GetStringId(index));
writer->OpenTag("unit", tag_data);
if (!(table->GetNotes(index).IsEmpty()))
{
//write notes
writer->OpenTag("notes");
writer->WriteString("note", table->GetNotes(index));
writer->CloseTag("notes");
}
writer->OpenTag("segment");
writer->WriteString("source", src_data);
if (target_language >= 0)
{
writer->WriteString("target", table->GetString(index, target_language));
}
writer->CloseTag("segment");
writer->CloseTag("unit");
}
}
}
else
{
tag_data = "version=\"1.2\" xmlns=\"urn:oasis:names:tc:xliff:document:1.2\"";
writer->OpenTag("xliff", tag_data);
tag_data.Format(_T("original=\"%s\\%s.gxp\" source-language=\"%s\" target-language=\"%s\" datatype=\"plaintext\""),
project->mHeader.project_path,
project->mHeader.project_name,
config_languages_dlg::GetLanguageId(src_language),
config_languages_dlg::GetLanguageId(target_language));
writer->OpenTag("file", tag_data);
writer->OpenTag("body");
src_language = config_languages_dlg::GetStringTableIndexFromLanguageIndex(project, src_language);
target_language = config_languages_dlg::GetStringTableIndexFromLanguageIndex(project, target_language);
for (index = 0; index < table->CountStrings(); index++)
{
src_data = table->GetString(index, src_language);
if (!src_data.IsEmpty())
{
tag_data.Format(_T("id=\"%s\""), table->GetStringId(index));
writer->OpenTag("trans-unit", tag_data);
writer->WriteString("source", src_data);
if (target_language >= 0)
{
writer->WriteString("target", table->GetString(index, target_language));
}
if (!(table->GetNotes(index).IsEmpty()))
{
//write notes
writer->WriteString("note", table->GetNotes(index));
}
writer->CloseTag("trans-unit");
}
}
writer->CloseTag("body");
}
writer->CloseTag("file");
writer->CloseTag("xliff");
writer->CloseFile();
delete writer;
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
BOOL xliff_read_write::ImportXliffFile(studiox_project *project, CString &pathname)
{
CString src_language;
CString target_language;
CString string_id;
CString src_string;
CString target_string;
CString notes;
xml_reader reader;
int language_index;
int target_table_column;
int src_table_column;
GotoProjectDirectory();
if (!reader.ReadFile(pathname))
{
return FALSE;
}
int display = GetProjectView()->GetActiveDisplay();
string_table *table = project->mDisplays[display].stable;
// Get the version information
if (!reader.EnterSection("xliff"))
{
return FALSE;
}
double version = reader.GetTagValueFloat("version", -1.0);
if (version < 0)
{
return false;
}
if (version >= 2.0)
{
if (!reader.GetTagString("srcLang", src_language) ||
!reader.GetTagString("trgLang", target_language))
{
return FALSE;
}
language_index = config_languages_dlg::GetLanguageIdIndex(src_language);
src_table_column = config_languages_dlg::GetStringTableIndexFromLanguageIndex(project, language_index);
language_index = config_languages_dlg::GetLanguageIdIndex(target_language);
target_table_column = config_languages_dlg::GetStringTableIndexFromLanguageIndex(project, language_index);
if (src_table_column == -1)
{
return FALSE;
}
if (target_table_column == -1)
{
// the translation language doesn't exist in our project, so add it
//target_table_column = AddNewLanguage(language_index);
target_table_column = project->AddLanguage(language_index);
}
if (reader.EnterSection("file"))
{
while(reader.EnterSection("unit"))
{
reader.GetTagString("name", string_id);
if (reader.EnterSection("notes"))
{
reader.ReadString("note", notes);
reader.CloseSection(TRUE, TRUE);
}
else
{
notes = "";
}
while (reader.EnterSection("segment"))
{
reader.ReadString("source", src_string);
reader.ReadString("target", target_string);
table->ImportString(string_id, src_string, target_string, notes, src_table_column, target_table_column);
reader.CloseSection(TRUE, TRUE);
}
reader.CloseSection(TRUE, TRUE);
}
reader.CloseSection();
}
}
else
{
// version 1.2- The file tag contains language info, and the body contains trans-unit tags:
if (reader.EnterSection("file"))
{
reader.GetTagString("source-language", src_language);
reader.GetTagString("target-language", target_language);
language_index = config_languages_dlg::GetLanguageIdIndex(src_language);
src_table_column = config_languages_dlg::GetStringTableIndexFromLanguageIndex(project, language_index);
language_index = config_languages_dlg::GetLanguageIdIndex(target_language);
target_table_column = config_languages_dlg::GetStringTableIndexFromLanguageIndex(project, language_index);
if (src_table_column == -1)
{
return FALSE;
}
if (target_table_column == -1)
{
target_table_column = project->AddLanguage(language_index);
}
if (reader.EnterSection("body"))
{
while (reader.EnterSection("trans-unit"))
{
reader.GetTagString("id", string_id);
reader.ReadString("source", src_string);
reader.ReadString("target", target_string);
reader.ReadString("note", notes);
table->ImportString(string_id, src_string, target_string, notes, src_table_column, target_table_column);
reader.CloseSection(TRUE, TRUE);
}
reader.CloseSection();
}
reader.CloseSection();
}
}
reader.CloseSection();
table->Sort();
table->UpdateGuixLanguageTable();
return TRUE;
}