mirror of
https://github.com/azure-rtos/guix.git
synced 2025-02-04 07:13:17 +08:00
273 lines
9.3 KiB
C++
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;
|
|
} |