int32 UGenerateGatherManifestCommandlet::Main( const FString& Params ) { // Parse command line - we're interested in the param vals TArray<FString> Tokens; TArray<FString> Switches; TMap<FString, FString> ParamVals; UCommandlet::ParseCommandLine( *Params, Tokens, Switches, ParamVals ); // Set config file. const FString* ParamVal = ParamVals.Find( FString( TEXT("Config") ) ); FString GatherTextConfigPath; if ( ParamVal ) { GatherTextConfigPath = *ParamVal; } else { UE_LOG( LogGenerateManifestCommandlet, Error, TEXT("No config specified.") ); return -1; } // Set config section. ParamVal = ParamVals.Find( FString( TEXT("Section") ) ); FString SectionName; if ( ParamVal ) { SectionName = *ParamVal; } else { UE_LOG( LogGenerateManifestCommandlet, Error, TEXT("No config section specified.") ); return -1; } // Get destination path. FString DestinationPath; if( !GetPathFromConfig( *SectionName, TEXT("DestinationPath"), DestinationPath, GatherTextConfigPath ) ) { UE_LOG( LogGenerateManifestCommandlet, Error, TEXT("No destination path specified.") ); return -1; } // Get manifest name. FString ManifestName; if( !GetStringFromConfig( *SectionName, TEXT("ManifestName"), ManifestName, GatherTextConfigPath ) ) { UE_LOG( LogGenerateManifestCommandlet, Error, TEXT("No manifest name specified.") ); return -1; } //Grab any manifest dependencies TArray<FString> ManifestDependenciesList; GetPathArrayFromConfig(*SectionName, TEXT("ManifestDependencies"), ManifestDependenciesList, GatherTextConfigPath); if( ManifestDependenciesList.Num() > 0 ) { if( !ManifestInfo->AddManifestDependencies( ManifestDependenciesList ) ) { UE_LOG(LogGenerateManifestCommandlet, Error, TEXT("The GenerateGatherManifest commandlet couldn't find all the specified manifest dependencies.")); return -1; } ManifestInfo->ApplyManifestDependencies(); } if( !WriteManifest( ManifestInfo->GetManifest(), DestinationPath / ManifestName ) ) { UE_LOG( LogGenerateManifestCommandlet, Error,TEXT("Failed to write manifest to %s."), *DestinationPath ); return -1; } return 0; }
int32 UInternationalizationExportCommandlet::Main( const FString& Params ) { TArray<FString> Tokens; TArray<FString> Switches; TMap<FString, FString> ParamVals; UCommandlet::ParseCommandLine(*Params, Tokens, Switches, ParamVals); const FString* ParamVal = ParamVals.Find(FString(TEXT("Config"))); if ( ParamVal ) { ConfigPath = *ParamVal; } else { UE_LOG(LogInternationalizationExportCommandlet, Error, TEXT("No config specified.")); return -1; } //Set config section ParamVal = ParamVals.Find(FString(TEXT("Section"))); if ( ParamVal ) { SectionName = *ParamVal; } else { UE_LOG(LogInternationalizationExportCommandlet, Error, TEXT("No config section specified.")); return -1; } FString SourcePath; // Source path to the root folder that manifest/archive files live in. if( !GetPathFromConfig( *SectionName, TEXT("SourcePath"), SourcePath, ConfigPath ) ) { UE_LOG( LogInternationalizationExportCommandlet, Error, TEXT("No source path specified.") ); return -1; } FString DestinationPath; // Destination path that we will write files to. if( !GetPathFromConfig( *SectionName, TEXT("DestinationPath"), DestinationPath, ConfigPath ) ) { UE_LOG( LogInternationalizationExportCommandlet, Error, TEXT("No destination path specified.") ); return -1; } FString Filename; // Name of the file to read or write from if (!GetStringFromConfig(*SectionName, TEXT("PortableObjectName"), Filename, ConfigPath)) { UE_LOG(LogInternationalizationExportCommandlet, Error, TEXT("No portable object name specified.")); return -1; } // Get cultures to generate. if( GetStringArrayFromConfig(*SectionName, TEXT("CulturesToGenerate"), CulturesToGenerate, ConfigPath) == 0 ) { UE_LOG(LogInternationalizationExportCommandlet, Error, TEXT("No cultures specified for generation.")); return -1; } bool bDoExport = false; bool bDoImport = false; ShouldPersistComments = false; GetBoolFromConfig( *SectionName, TEXT("bImportLoc"), bDoImport, ConfigPath ); GetBoolFromConfig( *SectionName, TEXT("bExportLoc"), bDoExport, ConfigPath ); GetBoolFromConfig(*SectionName, TEXT("ShouldPersistComments"), ShouldPersistComments, ConfigPath); // Reject the ShouldPersistComments flag and warn if not exporting - we're not writing to anything, so we can't persist. if (ShouldPersistComments && !bDoExport) { UE_LOG(LogInternationalizationExportCommandlet, Warning, TEXT("ShouldPersistComments is true, but bExportLoc is false - can't persist comments if not writing PO files.")); ShouldPersistComments = false; } if( !bDoImport && !bDoExport ) { UE_LOG(LogInternationalizationExportCommandlet, Error, TEXT("Import/Export operation not detected. Use bExportLoc or bImportLoc in config section.")); return -1; } if( bDoImport ) { if (!DoImport(SourcePath, DestinationPath, Filename)) { UE_LOG(LogInternationalizationExportCommandlet, Error, TEXT("Failed to import localization files.")); return -1; } } if( bDoExport ) { if (!DoExport(SourcePath, DestinationPath, Filename)) { UE_LOG(LogInternationalizationExportCommandlet, Error, TEXT("Failed to export localization files.")); return -1; } } return 0; }
int32 UGenerateGatherManifestCommandlet::Main( const FString& Params ) { // Parse command line - we're interested in the param vals TArray<FString> Tokens; TArray<FString> Switches; TMap<FString, FString> ParamVals; UCommandlet::ParseCommandLine( *Params, Tokens, Switches, ParamVals ); // Set config file. const FString* ParamVal = ParamVals.Find( FString( TEXT("Config") ) ); FString GatherTextConfigPath; if ( ParamVal ) { GatherTextConfigPath = *ParamVal; } else { UE_LOG( LogGenerateManifestCommandlet, Error, TEXT("No config specified.") ); return -1; } // Set config section. ParamVal = ParamVals.Find( FString( TEXT("Section") ) ); FString SectionName; if ( ParamVal ) { SectionName = *ParamVal; } else { UE_LOG( LogGenerateManifestCommandlet, Error, TEXT("No config section specified.") ); return -1; } // Get destination path. FString DestinationPath; if( !GetPathFromConfig( *SectionName, TEXT("DestinationPath"), DestinationPath, GatherTextConfigPath ) ) { UE_LOG( LogGenerateManifestCommandlet, Error, TEXT("No destination path specified.") ); return -1; } // Get manifest name. FString ManifestName; if( !GetStringFromConfig( *SectionName, TEXT("ManifestName"), ManifestName, GatherTextConfigPath ) ) { UE_LOG( LogGenerateManifestCommandlet, Error, TEXT("No manifest name specified.") ); return -1; } //Grab any manifest dependencies TArray<FString> ManifestDependenciesList; GetPathArrayFromConfig(*SectionName, TEXT("ManifestDependencies"), ManifestDependenciesList, GatherTextConfigPath); for (const FString& ManifestDependency : ManifestDependenciesList) { FText OutError; if (!GatherManifestHelper->AddDependency(ManifestDependency, &OutError)) { UE_LOG(LogGenerateManifestCommandlet, Error, TEXT("The GenerateGatherManifest commandlet couldn't load the specified manifest dependency: '%'. %s"), *ManifestDependency, *OutError.ToString()); return -1; } } // Trim the manifest to remove any entries that came from a dependency GatherManifestHelper->TrimManifest(); const FString ManifestPath = FPaths::ConvertRelativePathToFull(DestinationPath) / ManifestName; FText ManifestSaveError; if (!GatherManifestHelper->SaveManifest(ManifestPath, &ManifestSaveError)) { UE_LOG(LogGenerateManifestCommandlet, Error,TEXT("Failed to write manifest to %s. %s."), *ManifestPath, *ManifestSaveError.ToString()); return -1; } return 0; }
int32 URepairLocalizationDataCommandlet::Main(const FString& Params) { FInternationalization& I18N = FInternationalization::Get(); // Parse command line. TArray<FString> Tokens; TArray<FString> Switches; TMap<FString, FString> ParamVals; UCommandlet::ParseCommandLine(*Params, Tokens, Switches, ParamVals); //Set config file const FString* ParamVal = ParamVals.Find(FString(TEXT("Config"))); FString GatherTextConfigPath; if ( ParamVal ) { GatherTextConfigPath = *ParamVal; } else { UE_LOG(LogRepairLocalizationDataCommandlet, Error, TEXT("No config specified.")); return -1; } //Set config section ParamVal = ParamVals.Find(FString(TEXT("Section"))); FString SectionName; if ( ParamVal ) { SectionName = *ParamVal; } else { UE_LOG(LogRepairLocalizationDataCommandlet, Error, TEXT("No config section specified.")); return -1; } // Get destination path. FString DestinationPath; if( !GetPathFromConfig( *SectionName, TEXT("DestinationPath"), DestinationPath, GatherTextConfigPath ) ) { UE_LOG( LogRepairLocalizationDataCommandlet, Error, TEXT("No destination path specified.") ); return -1; } // Get manifest name. FString ManifestName; if( !GetStringFromConfig( *SectionName, TEXT("ManifestName"), ManifestName, GatherTextConfigPath ) ) { UE_LOG( LogRepairLocalizationDataCommandlet, Error, TEXT("No manifest name specified.") ); return -1; } // Get archive name. FString ArchiveName; if( !( GetStringFromConfig(* SectionName, TEXT("ArchiveName"), ArchiveName, GatherTextConfigPath ) ) ) { UE_LOG(LogRepairLocalizationDataCommandlet, Error, TEXT("No archive name specified.")); return -1; } // Get cultures to generate. TArray<FString> CulturesToGenerate; GetStringArrayFromConfig(*SectionName, TEXT("CulturesToGenerate"), CulturesToGenerate, GatherTextConfigPath); if( CulturesToGenerate.Num() == 0 ) { UE_LOG(LogRepairLocalizationDataCommandlet, Error, TEXT("No cultures specified for generation.")); return -1; } for(int32 i = 0; i < CulturesToGenerate.Num(); ++i) { if( I18N.GetCulture( CulturesToGenerate[i] ).IsValid() ) { UE_LOG(LogRepairLocalizationDataCommandlet, Verbose, TEXT("Specified culture is not a valid runtime culture, but may be a valid base language: %s"), *(CulturesToGenerate[i]) ); } } ////////////////////////////////////////////////////////////////////////// // Read the damaged manifest. const FString ManifestFilePath = DestinationPath / ManifestName; const TSharedPtr<FJsonObject> ManifestJsonObject = ReadJSONTextFile( ManifestFilePath ); if( !ManifestJsonObject.IsValid() ) { UE_LOG(LogRepairLocalizationDataCommandlet, Error, TEXT("Could not read manifest file %s."), *ManifestFilePath); return -1; } FJsonInternationalizationManifestSerializer ManifestSerializer; const TSharedRef< FInternationalizationManifest > InternationalizationManifest = MakeShareable( new FInternationalizationManifest ); ManifestSerializer.DeserializeManifest( ManifestJsonObject.ToSharedRef(), InternationalizationManifest ); // Read the damaged archives. TArray< TSharedRef<FInternationalizationArchive> > InternationalizationArchives; TArray<FString> ArchiveCultures; for(int32 Culture = 0; Culture < CulturesToGenerate.Num(); Culture++) { // Read in any existing archive for this culture. const FString CulturePath = DestinationPath / CulturesToGenerate[Culture]; const FString ArchiveFilePath = CulturePath / ArchiveName; if( FPaths::FileExists(ArchiveFilePath) ) { TSharedPtr< FJsonObject > ArchiveJsonObject = ReadJSONTextFile( ArchiveFilePath ); if( !ArchiveJsonObject.IsValid() ) { UE_LOG(LogRepairLocalizationDataCommandlet, Error, TEXT("Could not read archive file %s."), *ArchiveFilePath); return -1; } FJsonInternationalizationArchiveSerializer ArchiveSerializer; const TSharedRef< FInternationalizationArchive > InternationalizationArchive = MakeShareable( new FInternationalizationArchive ); ArchiveSerializer.DeserializeArchive( ArchiveJsonObject.ToSharedRef(), InternationalizationArchive ); InternationalizationArchives.Add(InternationalizationArchive); ArchiveCultures.Add(CulturesToGenerate[Culture]); } } // Repair. RepairManifestAndArchives(InternationalizationManifest, InternationalizationArchives); // Write the repaired manifests. TSharedRef< FJsonObject > OutputManifestJsonObj = MakeShareable( new FJsonObject ); ManifestSerializer.SerializeManifest( InternationalizationManifest, OutputManifestJsonObj ); if (!WriteJSONToTextFile( OutputManifestJsonObj, DestinationPath / ManifestName, SourceControlInfo )) { UE_LOG( LogRepairLocalizationDataCommandlet, Error,TEXT("Failed to write manifest to %s."), *DestinationPath ); return -1; } // Write the repaired archives. { int Index = 0; for (const TSharedRef<FInternationalizationArchive>& InternationalizationArchive : InternationalizationArchives) { TSharedRef< FJsonObject > OutputArchiveJsonObj = MakeShareable( new FJsonObject ); FJsonInternationalizationArchiveSerializer ArchiveSerializer; ArchiveSerializer.SerializeArchive( InternationalizationArchive, OutputArchiveJsonObj ); int32 Culture = 0; if (!WriteJSONToTextFile( OutputArchiveJsonObj, (DestinationPath / *ArchiveCultures[Index] / ArchiveName), SourceControlInfo )) { UE_LOG( LogRepairLocalizationDataCommandlet, Error,TEXT("Failed to write archive to %s."), *DestinationPath ); return -1; } ++Index; } } return 0; }