// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "UObject/ObjectMacros.h" #include "Misc/Paths.h" #include "Misc/ConfigCacheIni.h" #include "Commandlets/GatherTextCommandletBase.h" #include "InternationalizationConditioningCommandlet.generated.h" /** * UInternationalizationConditioningCommandlet: Commandlet that contains various misc functionality to prepare, modify, and condition Internationalization manifest * and archive data. */ UCLASS() class UInternationalizationConditioningCommandlet : public UGatherTextCommandletBase { GENERATED_UCLASS_BODY() /** * Contains all the info we need to create archive/manifest entries from. */ struct FLocalizationFileEntry { public: FLocalizationFileEntry( const FString& InFile, const FString& InNamespace, const FString& InKey, const FString& InSourceText, const FString& InTranslatedText ) : File( InFile ) , Namespace( InNamespace ) , Key ( InKey ) , SourceText( InSourceText ) , TranslatedText( InTranslatedText ) { } FString File; FString Namespace; FString Key; FString SourceText; FString TranslatedText; }; /** * Contains information about a single localization file, any language. */ struct FLocalizationFile { private: /** * The filename for the FConfigFile this FLocalizationFile represents. */ FString LocFilename; /** sections that do not exist in the counterpart file. */ TArray UnmatchedSections; /** properties that are missing from the corresponding section in the other file */ TArray UnmatchedProperties; /** properties that have identical values in the other file */ TArray IdenticalProperties; /** Info about translated properties that will be added to the Archive */ TArray TranslatedProperties; /** the FConfigFile which contains the data for this loc file */ FConfigFile* LocFile; public: /** * Standard constructor */ FLocalizationFile( const FString& InPath, FConfigFile* const InConfigFile ); /** Copy ctor */ FLocalizationFile( const TSharedRef Other ); /** Dtor */ ~FLocalizationFile(); /** * Compares the data in this loc file against the data in the specified counterpart file, placing the results in the various tracking arrays. */ void CompareToCounterpart( TSharedPtr Other ); /** Accessors */ const FString GetFullName() const { return LocFilename; } const FString GetDirectoryName() const { return FPaths::GetPath(LocFilename); } const FString GetFilename() const { return FPaths::GetBaseFilename(LocFilename); } const FString GetExtension() const { return FPaths::GetExtension(LocFilename); } class FConfigFile* GetFile() const { return LocFile; } /** * Appends all the entries that have matching primary language and translated text to the passed in array. */ void GetIdenticalProperties( TArray& OutProperties ) const; /** * Appends all the entries that have non-empty translated text to the passed in array. Note this will not get entries where the primary language text is the same as the translated text, use GetIdenticalProperties() instead. */ void GetTranslatedProperties( TArray& OutProperties ) const; }; /** * Contains information about a localization file and its native counterpart. */ struct FLocalizationFilePair { TSharedPtr NativeFile; TSharedPtr ForeignFile; /** Default ctor */ FLocalizationFilePair() : NativeFile(NULL), ForeignFile(NULL) {} ~FLocalizationFilePair(); /** * Compares the two loc files against each other. */ void CompareFiles(); /** * Adds any identical entries to an array. */ void GetIdenticalProperties( TArray& Properties ); /** * Adds entries that differ and are non-empty to an array. */ void GetTranslatedProperties( TArray& Properties ); /** * Assigns the native version of the loc file pair. */ bool SetNativeFile( const FString& NativeFilename, FConfigFile* const NativeConfigFile ); /** * Assigns the foreign version of this loc file pair. */ bool SetForeignFile( const FString& ForeignFilename, FConfigFile* const ForeignConfigFile ); /** returns the filename (without path or extension info) for this file pair */ const FString GetFilename(); bool HasNativeFile(); bool HasForeignFile(); bool HasNativeFile( const FString& Filename ); bool HasForeignFile( const FString& Filename ); }; TArray LocPairs; /** * Returns the index of the loc file pair that contains the native version of the specified filename, or INDEX_NONE if it isn't found */ int32 FindNativeIndex( const FString& Filename ); /** * Returns the index of the loc file pair that contains the native version of the specified filename, or INDEX_NONE if it isn't found */ int32 FindForeignIndex( const FString& Filename ); /** * Adds the specified file as the native version for a loc file pair */ void AddNativeFile( const FString& Filename ); /** * Adds the specified file as the foreign version for a loc file pair */ void AddForeignFile( const FString& Filename ); /** * Initializes the LocPairs arrays using the list of filenames provided. */ void ReadLocFiles( const TArray& NativeFilenames, const TArray& ForeignFilenames ); bool ProcessManifest( const FString& PrimaryLangExt, const FString& SourcePath, const FString& DestinationPath ); bool ProcessArchive( const FString& PrimaryLangExt, const FString& SourcePath, const FString& DestinationPath ); void LoadLegacyLocalizationFiles( const FString& SourcePath, const FString& NativeLanguage, const TArray& LanguagesToProcess ); public: //~ Begin UCommandlet Interface virtual int32 Main(const FString& Params) override; //~ End UCommandlet Interface private: FString GatherTextConfigPath; FString SectionName; FConfigCacheIni LegacyLocalizationCacheIni; };