154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "SourcePos.h" 254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "ValuesFile.h" 354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "XLIFFFile.h" 454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "Perforce.h" 554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "merge_res_and_xliff.h" 654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "localize.h" 754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "file_utils.h" 854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "res_check.h" 954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include "xmb.h" 1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <host/pseudolocalize.h> 1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 13b798689749c64baba81f02e10cf2157c747d6b46The Android Open Source Project#include <stdlib.h> 1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdarg.h> 1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <sstream> 1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <stdio.h> 1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project#include <string.h> 18862bfdba159580f825af563b8e283842e28d140cAlexey Zaytsev#include <stdlib.h> 1954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectusing namespace std; 2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectFILE* g_logFile = NULL; 2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint test(); 2554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint 2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectread_settings(const string& filename, map<string,Settings>* result, const string& rootDir) 2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 2954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project XMLNode* root = NodeHandler::ParseFile(filename, XMLNode::PRETTY); 3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (root == NULL) { 3154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project SourcePos(filename, -1).Error("Error reading file."); 3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 3354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 3454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 3554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // <configuration> 3654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<XMLNode*> configNodes = root->GetElementsByName("", "configuration"); 3754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t I = configNodes.size(); 3854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0; i<I; i++) { 3954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const XMLNode* configNode = configNodes[i]; 4054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Settings settings; 4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project settings.id = configNode->GetAttribute("", "id", ""); 4354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (settings.id == "") { 4454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project configNode->Position().Error("<configuration> needs an id attribute."); 4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete root; 4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project settings.oldVersion = configNode->GetAttribute("", "old-cl", ""); 5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project settings.currentVersion = configNode->GetAttribute("", "new-cl", ""); 5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (settings.currentVersion == "") { 5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project configNode->Position().Error("<configuration> needs a new-cl attribute."); 5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete root; 5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 5654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 5754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // <app> 5954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<XMLNode*> appNodes = configNode->GetElementsByName("", "app"); 6054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t J = appNodes.size(); 6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t j=0; j<J; j++) { 6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const XMLNode* appNode = appNodes[j]; 6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string dir = appNode->GetAttribute("", "dir", ""); 6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (dir == "") { 6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project appNode->Position().Error("<app> needs a dir attribute."); 6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete root; 6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project settings.apps.push_back(dir); 7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // <reject> 7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<XMLNode*> rejectNodes = configNode->GetElementsByName("", "reject"); 7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t K = rejectNodes.size(); 7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t k=0; k<K; k++) { 8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const XMLNode* rejectNode = rejectNodes[k]; 8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Reject reject; 8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reject.file = rejectNode->GetAttribute("", "file", ""); 8554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (reject.file == "") { 8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project rejectNode->Position().Error("<reject> needs a file attribute."); 8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete root; 8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string f = reject.file; 9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reject.file = rootDir; 9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reject.file += '/'; 9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reject.file += f; 9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reject.name = rejectNode->GetAttribute("", "name", ""); 9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (reject.name == "") { 9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project rejectNode->Position().Error("<reject> needs a name attribute."); 9854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete root; 9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 10254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reject.comment = trim_string(rejectNode->CollapseTextContents()); 10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project settings.reject.push_back(reject); 10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 10654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project (*result)[settings.id] = settings; 10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete root; 11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 11354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 11554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic void 11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source ProjectValuesFile_to_XLIFFFile(const ValuesFile* values, XLIFFFile* xliff, const string& englishFilename) 11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const set<StringResource>& strings = values->GetStrings(); 11954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (set<StringResource>::const_iterator it=strings.begin(); it!=strings.end(); it++) { 12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project StringResource res = *it; 12154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project res.file = englishFilename; 12254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project xliff->AddStringResource(res); 12354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic bool 12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectcontains_reject(const Settings& settings, const string& file, const TransUnit& tu) 12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 12954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const string name = tu.id; 13054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const vector<Reject>& reject = settings.reject; 13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t I = reject.size(); 13254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0; i<I; i++) { 13354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Reject& r = reject[i]; 13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (r.file == file && r.name == name) { 13554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 13654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 13754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 13854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return false; 13954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 14154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/** 14254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * If it's been rejected, then we keep whatever info we have. 14354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 14454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Implements this truth table: 14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 14654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * S AT AS Keep 14754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * ----------------------- 14854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 0 0 0 0 (this case can't happen) 14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 0 0 1 0 (it was there, never translated, and removed) 15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 0 1 0 0 (somehow it got translated, but it was removed) 15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 0 1 1 0 (it was removed after having been translated) 15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1 0 0 1 (it was just added) 15454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1 0 1 1 (it was added, has been changed, but it never got translated) 15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1 1 0 1 (somehow it got translated, but we don't know based on what) 15654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1 1 1 0/1 (it's in both. 0 if S=AS b/c there's no need to retranslate if they're 15754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the same. 1 if S!=AS because S changed, so it should be retranslated) 15854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 15954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The first four are cases where, whatever happened in the past, the string isn't there 16054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * now, so it shouldn't be in the XLIFF file. 16154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 16254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * For cases 4 and 5, the string has never been translated, so get it translated. 16354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 16454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * For case 6, it's unclear where the translated version came from, so we're conservative 16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * and send it back for them to have another shot at. 16654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 16754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * For case 7, we have some data. We have two choices. We could rely on the translator's 16854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * translation memory or tools to notice that the strings haven't changed, and populate the 16954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * <target> field themselves. Or if the string hasn't changed since last time, we can just 17054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * not even tell them about it. As the project nears the end, it will be convenient to see 17154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the xliff files reducing in size, so we pick the latter. Obviously, if the string has 17254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * changed, then we need to get it retranslated. 17354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 17454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectbool 17554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectkeep_this_trans_unit(const string& file, const TransUnit& unit, void* cookie) 17654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 17754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Settings* settings = reinterpret_cast<const Settings*>(cookie); 17854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 17954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (contains_reject(*settings, file, unit)) { 18054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 18154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 18254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (unit.source.id == "") { 18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return false; 18554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 18654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (unit.altTarget.id == "" || unit.altSource.id == "") { 18754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return true; 18854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 18954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return unit.source.value->ContentsToString(XLIFF_NAMESPACES) 19054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project != unit.altSource.value->ContentsToString(XLIFF_NAMESPACES); 19154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 19254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 19354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint 19454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvalidate_config(const string& settingsFile, const map<string,Settings>& settings, 19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const string& config) 19654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (settings.find(config) == settings.end()) { 19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project SourcePos(settingsFile, -1).Error("settings file does not contain setting: %s\n", 19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project config.c_str()); 20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 20154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 20454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 20554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint 20654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvalidate_configs(const string& settingsFile, const map<string,Settings>& settings, 20754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const vector<string>& configs) 20854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 20954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int err = 0; 21054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0; i<configs.size(); i++) { 21154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string config = configs[i]; 21254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project err |= validate_config(settingsFile, settings, config); 21354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 21454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return err; 21554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 21654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 21754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint 21854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectselect_files(vector<string> *resFiles, const string& config, 21954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const map<string,Settings>& settings, const string& rootDir) 22054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 22154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int err; 22254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<vector<string> > allResFiles; 22354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<string> configs; 22454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project configs.push_back(config); 22554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project err = select_files(&allResFiles, configs, settings, rootDir); 22654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (err == 0) { 22754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *resFiles = allResFiles[0]; 22854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 22954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return err; 23054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 23154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 23254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint 23354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectselect_files(vector<vector<string> > *allResFiles, const vector<string>& configs, 23454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const map<string,Settings>& settings, const string& rootDir) 23554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 23654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int err; 23754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project printf("Selecting files..."); 23854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fflush(stdout); 23954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 24054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0; i<configs.size(); i++) { 24154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const string& config = configs[i]; 24254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Settings& setting = settings.find(config)->second; 24354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 24454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<string> resFiles; 24554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project err = Perforce::GetResourceFileNames(setting.currentVersion, rootDir, 24654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setting.apps, &resFiles, true); 24754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (err != 0) { 24854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, "error with perforce. bailing\n"); 24954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return err; 25054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 25154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 25254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project allResFiles->push_back(resFiles); 25354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 25454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 25554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 25654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 25754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic int 25854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectdo_export(const string& settingsFile, const string& rootDir, const string& outDir, 25954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const string& targetLocale, const vector<string>& configs) 26054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 26154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project bool success = true; 26254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int err; 26354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 26454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (false) { 26554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project printf("settingsFile=%s\n", settingsFile.c_str()); 26654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project printf("rootDir=%s\n", rootDir.c_str()); 26754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project printf("outDir=%s\n", outDir.c_str()); 26854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0; i<configs.size(); i++) { 26954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project printf("config[%zd]=%s\n", i, configs[i].c_str()); 27054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 27154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 27254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 27354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project map<string,Settings> settings; 27454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project err = read_settings(settingsFile, &settings, rootDir); 27554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (err != 0) { 27654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return err; 27754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 27854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 27954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project err = validate_configs(settingsFile, settings, configs); 28054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (err != 0) { 28154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return err; 28254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 28354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 28454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<vector<string> > allResFiles; 28554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project err = select_files(&allResFiles, configs, settings, rootDir); 28654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (err != 0) { 28754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return err; 28854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 28954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 29054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t totalFileCount = 0; 29154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0; i<allResFiles.size(); i++) { 29254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totalFileCount += allResFiles[i].size(); 29354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 29454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totalFileCount *= 3; // we try all 3 versions of the file 29554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 29654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project size_t fileProgress = 0; 29754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<Stats> stats; 29854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<pair<string,XLIFFFile*> > xliffs; 29954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 30054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0; i<configs.size(); i++) { 30154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const string& config = configs[i]; 30254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const Settings& setting = settings[config]; 30354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 30454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (false) { 30554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, "Configuration: %s (%zd of %zd)\n", config.c_str(), i+1, 30654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project configs.size()); 30754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, " Old CL: %s\n", setting.oldVersion.c_str()); 30854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, " Current CL: %s\n", setting.currentVersion.c_str()); 30954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 31054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 31154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Configuration english; 31254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project english.locale = "en_US"; 31354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Configuration translated; 31454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project translated.locale = targetLocale; 31554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project XLIFFFile* xliff = XLIFFFile::Create(english, translated, setting.currentVersion); 31654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 31754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const vector<string>& resFiles = allResFiles[i]; 31854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t J = resFiles.size(); 31954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t j=0; j<J; j++) { 32054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string resFile = resFiles[j]; 32154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 32254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // parse the files into a ValuesFile 32354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // pull out the strings and add them to the XLIFFFile 32454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 32554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // current file 32654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project print_file_status(++fileProgress, totalFileCount); 32754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ValuesFile* currentFile = get_values_file(resFile, english, CURRENT_VERSION, 32854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setting.currentVersion, true); 32954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (currentFile != NULL) { 33054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ValuesFile_to_XLIFFFile(currentFile, xliff, resFile); 33154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project //printf("currentFile=[%s]\n", currentFile->ToString().c_str()); 33254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 33354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, "error reading file %s@%s\n", resFile.c_str(), 33454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setting.currentVersion.c_str()); 33554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project success = false; 33654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 33754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 33854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // old file 33954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project print_file_status(++fileProgress, totalFileCount); 34054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ValuesFile* oldFile = get_values_file(resFile, english, OLD_VERSION, 34154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setting.oldVersion, false); 34254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (oldFile != NULL) { 34354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ValuesFile_to_XLIFFFile(oldFile, xliff, resFile); 34454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project //printf("oldFile=[%s]\n", oldFile->ToString().c_str()); 34554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 34654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 34754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // translated version 34854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // (get the head of the tree for the most recent translation, but it's considered 34954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the old one because the "current" one hasn't been made yet, and this goes into 35054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the <alt-trans> tag if necessary 35154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project print_file_status(++fileProgress, totalFileCount); 35254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string transFilename = translated_file_name(resFile, targetLocale); 35354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ValuesFile* transFile = get_values_file(transFilename, translated, OLD_VERSION, 35454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setting.currentVersion, false); 35554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (transFile != NULL) { 35654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ValuesFile_to_XLIFFFile(transFile, xliff, resFile); 35754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 35854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 35954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete currentFile; 36054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete oldFile; 36154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete transFile; 36254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 36354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 36454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Stats beforeFilterStats = xliff->GetStats(config); 36554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 36654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // run through the XLIFFFile and strip out TransUnits that have identical 36754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // old and current source values and are not in the reject list, or just 36854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // old values and no source values 36954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project xliff->Filter(keep_this_trans_unit, (void*)&setting); 37054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 37154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Stats afterFilterStats = xliff->GetStats(config); 37254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project afterFilterStats.totalStrings = beforeFilterStats.totalStrings; 37354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 37454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // add the reject comments 37554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (vector<Reject>::const_iterator reject = setting.reject.begin(); 37654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reject != setting.reject.end(); reject++) { 37754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project TransUnit* tu = xliff->EditTransUnit(reject->file, reject->name); 37854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tu->rejectComment = reject->comment; 37954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 38054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 38154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // config-locale-current_cl.xliff 38254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project stringstream filename; 38354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (outDir != "") { 38454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project filename << outDir << '/'; 38554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 38654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project filename << config << '-' << targetLocale << '-' << setting.currentVersion << ".xliff"; 38754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project xliffs.push_back(pair<string,XLIFFFile*>(filename.str(), xliff)); 38854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 38954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project stats.push_back(afterFilterStats); 39054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 39154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 39254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // today is a good day to die 39354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!success || SourcePos::HasErrors()) { 39454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 39554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 39654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 39754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // write the XLIFF files 39854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project printf("\nWriting %zd file%s...\n", xliffs.size(), xliffs.size() == 1 ? "" : "s"); 39954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (vector<pair<string,XLIFFFile*> >::iterator it = xliffs.begin(); it != xliffs.end(); it++) { 40054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const string& filename = it->first; 40154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project XLIFFFile* xliff = it->second; 40254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string text = xliff->ToString(); 40354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project write_to_file(filename, text); 40454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 40554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 40654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // the stats 40754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project printf("\n" 40854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " to without total\n" 40954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " config files translate comments strings\n" 41054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "-----------------------------------------------------------------------\n"); 41154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project Stats totals; 41254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totals.config = "total"; 41354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totals.files = 0; 41454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totals.toBeTranslated = 0; 41554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totals.noComments = 0; 41654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totals.totalStrings = 0; 41754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (vector<Stats>::iterator it=stats.begin(); it!=stats.end(); it++) { 41854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string cfg = it->config; 41954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (cfg.length() > 20) { 42054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project cfg.resize(20); 42154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 42254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project printf(" %-20s %-9zd %-9zd %-9zd %-19zd\n", cfg.c_str(), it->files, 42354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project it->toBeTranslated, it->noComments, it->totalStrings); 42454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totals.files += it->files; 42554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totals.toBeTranslated += it->toBeTranslated; 42654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totals.noComments += it->noComments; 42754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totals.totalStrings += it->totalStrings; 42854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 42954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (stats.size() > 1) { 43054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project printf("-----------------------------------------------------------------------\n" 43154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " %-20s %-9zd %-9zd %-9zd %-19zd\n", totals.config.c_str(), totals.files, 43254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project totals.toBeTranslated, totals.noComments, totals.totalStrings); 43354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 43454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project printf("\n"); 43554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 43654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 43754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 43854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstruct PseudolocalizeSettings { 43954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project XLIFFFile* xliff; 44054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project bool expand; 44154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project}; 44254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 44354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 44454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstring 44554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpseudolocalize_string(const string& source, const PseudolocalizeSettings* settings) 44654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 44754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return pseudolocalize_string(source); 44854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 44954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 45054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic XMLNode* 45154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpseudolocalize_xml_node(const XMLNode* source, const PseudolocalizeSettings* settings) 45254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 45354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (source->Type() == XMLNode::TEXT) { 45454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return XMLNode::NewText(source->Position(), pseudolocalize_string(source->Text(), settings), 45554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project source->Pretty()); 45654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 45754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project XMLNode* target; 45854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (source->Namespace() == XLIFF_XMLNS && source->Name() == "g") { 45954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // XXX don't translate these 46054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project target = XMLNode::NewElement(source->Position(), source->Namespace(), 46154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project source->Name(), source->Attributes(), source->Pretty()); 46254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } else { 46354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project target = XMLNode::NewElement(source->Position(), source->Namespace(), 46454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project source->Name(), source->Attributes(), source->Pretty()); 46554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 46654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 46754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const vector<XMLNode*>& children = source->Children(); 46854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const size_t I = children.size(); 46954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (size_t i=0; i<I; i++) { 47054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project target->EditChildren().push_back(pseudolocalize_xml_node(children[i], settings)); 47154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 47254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 47354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return target; 47454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 47554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 47654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 47754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid 47854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpseudolocalize_trans_unit(const string&file, TransUnit* unit, void* cookie) 47954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 48054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const PseudolocalizeSettings* settings = (PseudolocalizeSettings*)cookie; 48154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 48254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project const StringResource& source = unit->source; 48354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project StringResource* target = &unit->target; 48454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project *target = source; 48554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 48654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project target->config = settings->xliff->TargetConfig(); 48754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 48854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete target->value; 48954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project target->value = pseudolocalize_xml_node(source.value, settings); 49054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 49154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 49254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint 49354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpseudolocalize_xliff(XLIFFFile* xliff, bool expand) 49454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 49554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project PseudolocalizeSettings settings; 49654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 49754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project settings.xliff = xliff; 49854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project settings.expand = expand; 49954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project xliff->Map(pseudolocalize_trans_unit, &settings); 50054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 50154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 50254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 50354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic int 50454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectdo_pseudo(const string& infile, const string& outfile, bool expand) 50554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 50654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int err; 50754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 50854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project XLIFFFile* xliff = XLIFFFile::Parse(infile); 50954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (xliff == NULL) { 51054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 51154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 51254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 51354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project pseudolocalize_xliff(xliff, expand); 51454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 51554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project err = write_to_file(outfile, xliff->ToString()); 51654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 51754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project delete xliff; 51854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 51954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return err; 52054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 52154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 52254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid 52354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectlog_printf(const char *fmt, ...) 52454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 52554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int ret; 52654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project va_list ap; 52754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 52854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (g_logFile != NULL) { 52954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project va_start(ap, fmt); 53054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project ret = vfprintf(g_logFile, fmt, ap); 53154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project va_end(ap); 53254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fflush(g_logFile); 53354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 53454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 53554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 53654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid 53754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectclose_log_file() 53854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 53954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (g_logFile != NULL) { 54054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fclose(g_logFile); 54154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 54254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 54354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 54454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectvoid 54554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectopen_log_file(const char* file) 54654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 54754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project g_logFile = fopen(file, "w"); 54854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project printf("log file: %s -- %p\n", file, g_logFile); 54954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project atexit(close_log_file); 55054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 55154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 55254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectstatic int 55354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectusage() 55454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 55554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, 55654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "usage: localize export OPTIONS CONFIGS...\n" 55754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " REQUIRED OPTIONS\n" 55854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " --settings SETTINGS The settings file to use. See CONFIGS below.\n" 55954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " --root TREE_ROOT The location in Perforce of the files. e.g. //device\n" 56054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " --target LOCALE The target locale. See LOCALES below.\n" 56154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 56254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " OPTIONAL OPTIONS\n" 56354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " --out DIR Directory to put the output files. Defaults to the\n" 56454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " current directory if not supplied. Files are\n" 56554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " named as follows:\n" 56654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " CONFIG-LOCALE-CURRENT_CL.xliff\n" 56754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 56854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 56954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "usage: localize import XLIFF_FILE...\n" 57054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 57154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "Import a translated XLIFF file back into the tree.\n" 57254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 57354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 57454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "usage: localize xlb XMB_FILE VALUES_FILES...\n" 57554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 57654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "Read resource files from the tree file and write the corresponding XLB file\n" 57754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 57854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "Supply all of the android resource files (values files) to export after that.\n" 57954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 58054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 58154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 58254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "CONFIGS\n" 58354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 58454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "LOCALES\n" 58554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "Locales are specified in the form en_US They will be processed correctly\n" 58654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "to locate the resouce files in the tree.\n" 58754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 58854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 58954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "usage: localize pseudo OPTIONS INFILE [OUTFILE]\n" 59054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " OPTIONAL OPTIONS\n" 59154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project " --big Pad strings so they get longer.\n" 59254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 59354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "Read INFILE, an XLIFF file, and output a pseudotranslated version of that file. If\n" 59454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "OUTFILE is specified, the results are written there; otherwise, the results are\n" 59554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "written back to INFILE.\n" 59654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 59754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 59854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "usage: localize rescheck FILES...\n" 59954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n" 60054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "Reads the base strings and prints warnings about bad resources from the given files.\n" 60154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project "\n"); 60254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 60354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 60454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 60554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectint 60654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectmain(int argc, const char** argv) 60754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project{ 60854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project //open_log_file("log.txt"); 60954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project //g_logFile = stdout; 61054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 61154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (argc == 2 && 0 == strcmp(argv[1], "--test")) { 61254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return test(); 61354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 61454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 61554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (argc < 2) { 61654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return usage(); 61754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 61854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 61954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int index = 1; 62054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 62154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (0 == strcmp("export", argv[index])) { 62254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string settingsFile; 62354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string rootDir; 62454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string outDir; 62554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string baseLocale = "en"; 62654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string targetLocale; 62754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string language, region; 62854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<string> configs; 62954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 63054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index++; 63154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (index < argc) { 63254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (0 == strcmp("--settings", argv[index])) { 63354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project settingsFile = argv[index+1]; 63454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index += 2; 63554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 63654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (0 == strcmp("--root", argv[index])) { 63754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project rootDir = argv[index+1]; 63854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index += 2; 63954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 64054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (0 == strcmp("--out", argv[index])) { 64154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project outDir = argv[index+1]; 64254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index += 2; 64354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 64454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (0 == strcmp("--target", argv[index])) { 64554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project targetLocale = argv[index+1]; 64654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index += 2; 64754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 64854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (argv[index][0] == '-') { 64954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, "unknown argument %s\n", argv[index]); 65054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return usage(); 65154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 65254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else { 65354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 65454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 65554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 65654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (; index<argc; index++) { 65754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project configs.push_back(argv[index]); 65854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 65954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 66054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (settingsFile == "" || rootDir == "" || configs.size() == 0 || targetLocale == "") { 66154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return usage(); 66254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 66354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (!split_locale(targetLocale, &language, ®ion)) { 66454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, "illegal --target locale: '%s'\n", targetLocale.c_str()); 66554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return usage(); 66654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 66754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 66854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 66954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return do_export(settingsFile, rootDir, outDir, targetLocale, configs); 67054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 67154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (0 == strcmp("import", argv[index])) { 67254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<string> xliffFilenames; 67354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 67454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index++; 67554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (; index<argc; index++) { 67654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project xliffFilenames.push_back(argv[index]); 67754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 67854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 67954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return do_merge(xliffFilenames); 68054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 68154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (0 == strcmp("xlb", argv[index])) { 68254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string outfile; 68354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<string> resFiles; 68454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 68554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index++; 68654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (argc < index+1) { 68754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return usage(); 68854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 68954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 69054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project outfile = argv[index]; 69154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 69254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index++; 69354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (; index<argc; index++) { 69454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project resFiles.push_back(argv[index]); 69554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 69654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 69754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return do_xlb_export(outfile, resFiles); 69854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 69954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (0 == strcmp("pseudo", argv[index])) { 70054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string infile; 70154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project string outfile; 70254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project bool big = false; 70354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 70454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index++; 70554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (index < argc) { 70654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (0 == strcmp("--big", argv[index])) { 70754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project big = true; 70854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index += 1; 70954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 71054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (argv[index][0] == '-') { 71154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, "unknown argument %s\n", argv[index]); 71254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return usage(); 71354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 71454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else { 71554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 71654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 71754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 71854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 71954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (index == argc-1) { 72054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project infile = argv[index]; 72154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project outfile = argv[index]; 72254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 72354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (index == argc-2) { 72454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project infile = argv[index]; 72554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project outfile = argv[index+1]; 72654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 72754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else { 72854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, "unknown argument %s\n", argv[index]); 72954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return usage(); 73054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 73154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 73254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return do_pseudo(infile, outfile, big); 73354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 73454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else if (0 == strcmp("rescheck", argv[index])) { 73554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project vector<string> files; 73654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 73754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project index++; 73854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project while (index < argc) { 73954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (argv[index][0] == '-') { 74054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project fprintf(stderr, "unknown argument %s\n", argv[index]); 74154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return usage(); 74254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 74354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else { 74454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 74554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 74654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 74754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (; index<argc; index++) { 74854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project files.push_back(argv[index]); 74954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 75054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 75154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (files.size() == 0) { 75254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return usage(); 75354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 75454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 75554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return do_rescheck(files); 75654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 75754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else { 75854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return usage(); 75954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 76054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 76154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (SourcePos::HasErrors()) { 76254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project SourcePos::PrintErrors(stderr); 76354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 1; 76454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 76554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 76654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project return 0; 76754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 76854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 769