#include "ExportStrings.h"
#include "LocalizedStrings.h"
#include "Map Screen Interface.h"
#include "personnel.h"
#include "soldier profile type.h"
#include "interface.h"
#include "Keys.h"
#include "Merc Contract.h"
#include "Campaign Types.h"
#include "Finances.h"
#include "Laptop.h"

#include <vfs/Core/vfs_string.h>
#include <vfs/Tools/vfs_tools.h>
#include <vfs/Tools/vfs_parser_tools.h>
#include <vfs/Tools/vfs_property_container.h>

namespace Loc
{
	bool Translate(vfs::String::char_t* str, int len, Language lang);

	void ExportMercBio();
	void ExportAIMHistory();
	void ExportAIMPolicy();
	void ExportAlumniName();
	void ExportDialogues();
	void ExportNPCDialogues();
};

//////////////////////////////////////////////////////////

//#define GERMAN
#include "Text.h"
namespace Loc
{
#ifdef CHINESE
#	include "_ChineseText.cpp"
	static Loc::Language gs_Lang = Loc::Chinese;
#endif
#ifdef DUTCH
#	include "_DutchText.cpp"
	static Loc::Language gs_Lang = Loc::Dutch;
#endif
#ifdef ENGLISH
#	include "_EnglishText.cpp"
	static Loc::Language gs_Lang = Loc::English;
#endif
#ifdef FRENCH
#	include "_FrenchText.cpp"
	static Loc::Language gs_Lang = Loc::French;
#endif
#ifdef GERMAN
#	include "_GermanText.cpp"
	static Loc::Language gs_Lang = Loc::German;
#endif
#ifdef ITALIAN
#	include "_ItalianText.cpp"
	static Loc::Language gs_Lang = Loc::Italian;
#endif
#ifdef POLISH
#	include "_PolishText.cpp"
	static Loc::Language gs_Lang = Loc::Polish;
#endif
#ifdef RUSSIAN
#	include "_RussianText.cpp"
	static Loc::Language gs_Lang = Loc::Russian;
#endif
}

#include "Assignments.h"
#include "History.h"

template<typename T>
void ExportSection(vfs::PropertyContainer& props, const vfs::String::char_t* section_name, T* strings, int min, int max)
{
	for(int i = min; i < max; ++i)
	{
		vfs::String str(strings[i]);
		//Loc::Translate(&str.r_wcs()[0],str.length(), gs_Lang);
		if(!str.empty())
		{
			props.setStringProperty(section_name, vfs::toString<wchar_t>(i), str);
		}
	}
}

template<>
void ExportSection<wchar_t>(vfs::PropertyContainer& props, const vfs::String::char_t* section_name, wchar_t* strings, int min, int max)
{
	ExportSection(props,section_name, &strings, min, max);
}


bool Loc::ExportStrings()
{
	vfs::PropertyContainer::TagMap tmap;
	//tmap.Container(L"LocalizedStrings");
	//tmap.Section(L"Topic");
	//tmap.SectionID(L"name");
	//tmap.Key(L"msg");
	//tmap.KeyID(L"index");

	vfs::PropertyContainer props;

	//not_required ExportSection(props, L"Ja2Credits", Loc::pCreditsJA2113, 0, 7);
	ExportSection(props, L"WeaponType",					Loc::WeaponType,					0,	MAXITEMS);
	ExportSection(props, L"TeamTurn",					Loc::TeamTurnString,				0,	10);
	ExportSection(props, L"Message",					Loc::Message,						0,	TEXT_NUM_STR_MESSAGE);
	ExportSection(props, L"TownNames",					Loc::pTownNames,					0,	MAX_TOWNS);
	ExportSection(props, L"Time",						Loc::sTimeStrings,					0,	6);
	ExportSection(props, L"Assignment",					Loc::pAssignmentStrings,			0,	NUM_ASSIGNMENTS);
	ExportSection(props, L"PersonnelAssignment",		Loc::pPersonnelAssignmentStrings,	0,	NUM_ASSIGNMENTS);
	ExportSection(props, L"LongAssignment",				Loc::pLongAssignmentStrings,		0,	NUM_ASSIGNMENTS);
	ExportSection(props, L"Militia",					Loc::pMilitiaString,				0,	3);

	ExportSection(props, L"MilitiaButton",				Loc::pMilitiaButtonString,			0,	2);
	ExportSection(props, L"Condition",					Loc::pConditionStrings,				0,	9);
	ExportSection(props, L"EpcMenu",					Loc::pEpcMenuStrings,				0,	MAX_EPC_MENU_STRING_COUNT);
	ExportSection(props, L"Contract",					Loc::pContractStrings,				0,	MAX_CONTRACT_MENU_STRING_COUNT);
	ExportSection(props, L"POW",						Loc::pPOWStrings,					0,	2);
	ExportSection(props, L"InvPanelTitle",				Loc::pInvPanelTitleStrings,			0,	5);
	ExportSection(props, L"LongAttribute",				Loc::pLongAttributeStrings,			0,	10);
	ExportSection(props, L"ShortAttribute",				Loc::pShortAttributeStrings,		0,	10);
	ExportSection(props, L"UpperLeftMapScreen",			Loc::pUpperLeftMapScreenStrings,	0,	6);
	ExportSection(props, L"Training",					Loc::pTrainingStrings,				0,	4);

	ExportSection(props, L"GuardMenu",					Loc::pGuardMenuStrings,				0,	10);
	ExportSection(props, L"OtherGuardMenu",				Loc::pOtherGuardMenuStrings,		0,	10);
	ExportSection(props, L"AssignMenu",					Loc::pAssignMenuStrings,			0,	MAX_ASSIGN_STRING_COUNT);
	ExportSection(props, L"MilitiaControlMenu",			Loc::pMilitiaControlMenuStrings,	0,	MAX_MILCON_STRING_COUNT);
	ExportSection(props, L"RemoveMerc",					Loc::pRemoveMercStrings,			0,	MAX_REMOVE_MERC_COUNT);
	ExportSection(props, L"AttributeMenu",				Loc::pAttributeMenuStrings,			0,	MAX_ATTRIBUTE_STRING_COUNT);
	ExportSection(props, L"TrainingMenu",				Loc::pTrainingMenuStrings,			0,	MAX_TRAIN_STRING_COUNT);
	ExportSection(props, L"SquadMenu",					Loc::pSquadMenuStrings,				0,	MAX_SQUAD_MENU_STRING_COUNT);

	ExportSection(props, L"SnitchMenu",					Loc::pSnitchMenuStrings,			0,	MAX_SNITCH_MENU_STRING_COUNT);
	ExportSection(props, L"SnitchMenuDesc",				Loc::pSnitchMenuDescStrings,		0,	MAX_SNITCH_MENU_STRING_COUNT-1);
	ExportSection(props, L"SnitchToggleMenu",			Loc::pSnitchToggleMenuStrings,		0,	MAX_SNITCH_TOGGLE_MENU_STRING_COUNT);
	ExportSection(props, L"SnitchToggleMenuDesc",		Loc::pSnitchToggleMenuDescStrings,	0,	MAX_SNITCH_TOGGLE_MENU_STRING_COUNT-1);
	ExportSection(props, L"SnitchSectorMenu",			Loc::pSnitchSectorMenuStrings,		0,	MAX_SNITCH_SECTOR_MENU_STRING_COUNT);
	ExportSection(props, L"SnitchSectorMenuDesc",		Loc::pSnitchSectorMenuDescStrings,	0,	MAX_SNITCH_SECTOR_MENU_STRING_COUNT-1);
	ExportSection(props, L"PrisonerMenu",				Loc::pPrisonerMenuStrings,			0,  MAX_PRISONER_MENU_STRING_COUNT );
	ExportSection(props, L"PrisonerMenuDesc",			Loc::pPrisonerMenuDescStrings,		0,  MAX_PRISONER_MENU_STRING_COUNT - 1 );
	ExportSection(props, L"SnitchPrisonExposed",		Loc::pSnitchPrisonExposedStrings,	0,	NUM_SNITCH_PRISON_EXPOSED);
	ExportSection(props, L"SnitchGatheringRumoursResult",	Loc::pSnitchGatheringRumoursResultStrings,	0,	NUM_SNITCH_GATHERING_RUMOURS_RESULT);

	ExportSection(props, L"PersonnelTitle",				Loc::pPersonnelTitle,				0,	1);
	ExportSection(props, L"PersonnelScreen",			Loc::pPersonnelScreenStrings,		0,	TEXT_NUM_PRSNL);

	ExportSection(props, L"MercSkill",					Loc::gzMercSkillText,				0,	NUM_SKILLTRAITS_OT);
	ExportSection(props, L"TacticalPopupButton",		Loc::pTacticalPopupButtonStrings,	0,	NUM_ICONS);
	ExportSection(props, L"DoorTrap",					Loc::pDoorTrapStrings,				0,	NUM_DOOR_TRAPS);
	ExportSection(props, L"ContractExtend",				Loc::pContractExtendStrings,		0,	NUM_CONTRACT_EXTEND);
	ExportSection(props, L"MapScreenMouseRegionHelp",	Loc::pMapScreenMouseRegionHelpText,	0,	6);
	ExportSection(props, L"NoiseVol",					Loc::pNoiseVolStr,					0,	4);
	ExportSection(props, L"NoiseType",					Loc::pNoiseTypeStr,					0,	12);
	ExportSection(props, L"Direction",					Loc::pDirectionStr,					0,	8);
	ExportSection(props, L"LandType",					Loc::pLandTypeStrings,				0,	NUM_TRAVTERRAIN_TYPES);
	ExportSection(props, L"Strategic",					Loc::gpStrategicString,				0,	TEXT_NUM_STRATEGIC_TEXT);

	ExportSection(props, L"GameClock",					Loc::gpGameClockString,				0,	TEXT_NUM_GAMECLOCK);
	ExportSection(props, L"KeyDescription",				Loc::sKeyDescriptionStrings,		0,	2);
	ExportSection(props, L"WeaponStatsDesc",			Loc::gWeaponStatsDesc,				0,	17);	
	ExportSection(props, L"WeaponStatsFasthelpTactical",Loc::gzWeaponStatsFasthelpTactical, 0,	29);
	ExportSection(props, L"MiscItemStatsFasthelp",		Loc::gzMiscItemStatsFasthelp,		0,	34);
	ExportSection(props, L"MoneyStatsDesc",				Loc::gMoneyStatsDesc,				0,	TEXT_NUM_MONEY_DESC);

	ExportSection(props, L"Health",						Loc::zHealthStr,					0,	7);
	ExportSection(props, L"MoneyAmounts",				Loc::gzMoneyAmounts,				0,	6);
	ExportSection(props, L"ProsLabel",					Loc::gzProsLabel,					0,	1);
	ExportSection(props, L"ConsLabel",					Loc::gzConsLabel,					0,	1);
	ExportSection(props, L"TalkMenu",					Loc::zTalkMenuStrings,				0,	6);
	ExportSection(props, L"Dealer",						Loc::zDealerStrings,				0,	4);
	ExportSection(props, L"DialogActions",				Loc::zDialogActions,				0,	1);
	ExportSection(props, L"Vehicle",					Loc::pVehicleStrings,				0,	6);
	ExportSection(props, L"ShortVehicle",				Loc::pShortVehicleStrings,			0,	6);
	ExportSection(props, L"VehicleName",				Loc::zVehicleName,					0,	6);
	ExportSection(props, L"VehicleSeatsStrings",		Loc::pVehicleSeatsStrings,			0,	2);

	ExportSection(props, L"Tactical",					Loc::TacticalStr,					0,	TEXT_NUM_TACTICAL_STR);
	ExportSection(props, L"ExitingSectorHelp",			Loc::pExitingSectorHelpText,		0,	TEXT_NUM_EXIT_GUI);
	ExportSection(props, L"Repair",						Loc::pRepairStrings,				0,	4);
	ExportSection(props, L"PreStatBuild",				Loc::sPreStatBuildString,			0,	6);
	ExportSection(props, L"StatGain",					Loc::sStatGainStrings,				0,	11);
	ExportSection(props, L"HelicopterEta",				Loc::pHelicopterEtaStrings,			0,	TEXT_NUM_STR_HELI_ETA);
	ExportSection(props, L"HelicopterRepair",			Loc::pHelicopterRepairRefuelStrings,		0,	TEXT_NUM_STR_HELI_REPAIRS);
	ExportSection(props, L"MapLevel",					Loc::sMapLevelString,				0,	1);
	ExportSection(props, L"Loyal",						Loc::gsLoyalString,					0,	1);
	ExportSection(props, L"Underground",				Loc::gsUndergroundString,			0,	1);
	ExportSection(props, L"TimeStings",					Loc::gsTimeStrings,					0,	1);

	ExportSection(props, L"Facilities",					Loc::sFacilitiesStrings,			0,	7);
	ExportSection(props, L"MapPopUpInventory",			Loc::pMapPopUpInventoryText,		0,	2);
	ExportSection(props, L"TownInfo",					Loc::pwTownInfoStrings,				0,	12);
	ExportSection(props, L"Mine",						Loc::pwMineStrings,					0,	14);
	ExportSection(props, L"MiscSector",					Loc::pwMiscSectorStrings,			0,	7);
	ExportSection(props, L"MapInventoryError",			Loc::pMapInventoryErrorString,		0,	7);
	ExportSection(props, L"MapInventory",				Loc::pMapInventoryStrings,			0,	2);
	ExportSection(props, L"MapScreenFastHelp",			Loc::pMapScreenFastHelpTextList,	0,	10);
	ExportSection(props, L"MovementMenu",				Loc::pMovementMenuStrings,			0,	4);
	ExportSection(props, L"UpdateMerc",					Loc::pUpdateMercStrings,			0,	6);

	ExportSection(props, L"MapScreenBorderButtonHelp",	Loc::pMapScreenBorderButtonHelpText,0,	6);
	ExportSection(props, L"MapScreenBottomFastHelp",	Loc::pMapScreenBottomFastHelp,		0,	8);
	ExportSection(props, L"MapScreenBottom",			Loc::pMapScreenBottomText,			0,	1);
	ExportSection(props, L"MercDead",					Loc::pMercDeadString,				0,	1);
	ExportSection(props, L"Day",						Loc::pDayStrings,					0,	1);
	ExportSection(props, L"SenderName",					Loc::pSenderNameList,				0,	51);
	ExportSection(props, L"Traverse",					Loc::pTraverseStrings,				0,	2);
	ExportSection(props, L"NewMail",					Loc::pNewMailStrings,				0,	1);
	ExportSection(props, L"DeleteMail",					Loc::pDeleteMailStrings,			0,	2);
	ExportSection(props, L"EmailHeader",				Loc::pEmailHeaders,					0,	3);

	ExportSection(props, L"EmailTitle",					Loc::pEmailTitleText,				0,	1);
	ExportSection(props, L"FinanceTitle",				Loc::pFinanceTitle,					0,	1);
	ExportSection(props, L"FinanceSummary",				Loc::pFinanceSummary,				0,	12);
	ExportSection(props, L"FinanceHeader",				Loc::pFinanceHeaders,				0,	7);
	ExportSection(props, L"Transaction",				Loc::pTransactionText,				0,	TEXT_NUM_FINCANCES);
	ExportSection(props, L"TransactionAlternate",		Loc::pTransactionAlternateText,		0,	4);
	ExportSection(props, L"Skyrider",					Loc::pSkyriderText,					0,	7);
	ExportSection(props, L"Moral",						Loc::pMoralStrings,					0,	6);
	ExportSection(props, L"LeftEquipment",				Loc::pLeftEquipmentString,			0,	2);
	ExportSection(props, L"MapScreenStatus",			Loc::pMapScreenStatusStrings,		0,	5);

	ExportSection(props, L"MapScreenPrevNextCharButtonHelp",	Loc::pMapScreenPrevNextCharButtonHelpText,	0,	2);
	ExportSection(props, L"Eta",								Loc::pEtaString,							0,	1);
	ExportSection(props, L"TrashItem",							Loc::pTrashItemText,						0,	2);
	ExportSection(props, L"MapError",							Loc::pMapErrorString,						0,	50);
	ExportSection(props, L"MapPlot",							Loc::pMapPlotStrings,						0,	5);
	ExportSection(props, L"Bullseye",							Loc::pBullseyeStrings,						0,	5);
	ExportSection(props, L"MiscMapScreenMouseRegionHelp",		Loc::pMiscMapScreenMouseRegionHelpText,		0,	3);
	ExportSection(props, L"MercHeLeave",						Loc::pMercHeLeaveString,					0,	5);
	ExportSection(props, L"MercSheLeave",						Loc::pMercSheLeaveString,					0,	5);
	ExportSection(props, L"MercContractOver",					Loc::pMercContractOverStrings,				0,	5);

	ExportSection(props, L"ImpPopUp",					Loc::pImpPopUpStrings,				0,	12);
	ExportSection(props, L"ImpButton",					Loc::pImpButtonText,				0,	26);
	ExportSection(props, L"ExtraIMP",					Loc::pExtraIMPStrings,				0,	4);
	ExportSection(props, L"FilesTitle",					Loc::pFilesTitle,					0,	1);
	ExportSection(props, L"FilesSender",				Loc::pFilesSenderList,				0,	7);
	ExportSection(props, L"HistoryTitle",				Loc::pHistoryTitle,					0,	1);
	ExportSection(props, L"HistoryHeader",				Loc::pHistoryHeaders,				0,	5);
	//ExportSection(props, L"History",					Loc::pHistoryStrings,				0,	TEXT_NUM_HISTORY);
	ExportSection(props, L"HistoryLocation",			Loc::pHistoryLocations,				0,	1);
	ExportSection(props, L"LaptopIcon",					Loc::pLaptopIcons,					0,	8);

	ExportSection(props, L"BookMark",					Loc::pBookMarkStrings,				0,	TEXT_NUM_LAPTOP_BOOKMARKS);
	ExportSection(props, L"BookmarkTitle",				Loc::pBookmarkTitle,				0,	2);
	ExportSection(props, L"Download",					Loc::pDownloadString,				0,	2);
	ExportSection(props, L"AtmSideButton",				Loc::gsAtmSideButtonText,			0,	5);
	ExportSection(props, L"AtmStartButton",				Loc::gsAtmStartButtonText,			0,	4);
	ExportSection(props, L"ATM",						Loc::sATMText,						0,	6);
	ExportSection(props, L"Error",						Loc::pErrorStrings,					0,	5);
	ExportSection(props, L"Personnel",					Loc::pPersonnelString,				0,	1);
	ExportSection(props, L"WebTitle",					Loc::pWebTitle,						0,	1);
	ExportSection(props, L"WebPagesTitle",				Loc::pWebPagesTitles,				0,	36);

	ExportSection(props, L"ShowBookmark",				Loc::pShowBookmarkString,				0,	2);
	ExportSection(props, L"LaptopTitle",				Loc::pLaptopTitles,						0,	5);
	ExportSection(props, L"PersonnelDepartedState",		Loc::pPersonnelDepartedStateStrings,	0,	TEXT_NUM_DEPARTED);
	ExportSection(props, L"PersonelTeam",				Loc::pPersonelTeamStrings,				0,	8);
	ExportSection(props, L"PersonnelCurrentTeamStats",	Loc::pPersonnelCurrentTeamStatsStrings, 0,	3);
	ExportSection(props, L"PersonnelTeamStats",			Loc::pPersonnelTeamStatsStrings,		0,	11);
	ExportSection(props, L"MapVertIndex",				Loc::pMapVertIndex,						0,	17);
	ExportSection(props, L"MapHortIndex",				Loc::pMapHortIndex,						0,	17);
	ExportSection(props, L"MapDepthIndex",				Loc::pMapDepthIndex,					0,	4);
	ExportSection(props, L"ContractButton",				Loc::pContractButtonString,				0,	1);

	ExportSection(props, L"UpdatePanelButton",			Loc::pUpdatePanelButtons,			0,	2);
	ExportSection(props, L"LargeTactical",				Loc::LargeTacticalStr,				0,	TEXT_NUM_LARGESTR);
	ExportSection(props, L"InsContract",				Loc::InsContractText,				0,	TEXT_NUM_INS_CONTRACT);
	ExportSection(props, L"InsInfo",					Loc::InsInfoText,					0,	TEXT_NUM_INS_INFO);
	ExportSection(props, L"MercAccount",				Loc::MercAccountText,				0,	TEXT_NUM_MERC_ACCOUNT);
	ExportSection(props, L"MercAccountPage",			Loc::MercAccountPageText,			0,	2);
	ExportSection(props, L"MercInfo",					Loc::MercInfo,						0,	TEXT_NUM_MERC_FILES);
	ExportSection(props, L"MercNoAccount",				Loc::MercNoAccountText,				0,	TEXT_NUM_MERC_NO_ACC);
	ExportSection(props, L"MercHomePage",				Loc::MercHomePageText,				0,	TEXT_NUM_MERC);
	ExportSection(props, L"Funeral",					Loc::sFuneralString,				0,	TEXT_NUM_FUNERAL);

	ExportSection(props, L"Florist",					Loc::sFloristText,					0,	TEXT_NUM_FLORIST);
	ExportSection(props, L"OrderForm",					Loc::sOrderFormText,				0,	TEXT_NUM_FLORIST_ORDER);
	ExportSection(props, L"FloristGallery",				Loc::sFloristGalleryText,			0,	TEXT_NUM_FLORIST_GALLERY);
	ExportSection(props, L"FloristCards",				Loc::sFloristCards,					0,	TEXT_NUM_FLORIST_CARDS);
	ExportSection(props, L"BobbyROrderForm",			Loc::BobbyROrderFormText,			0,	TEXT_NUM_BOBBYR_MAILORDER);
	ExportSection(props, L"BobbyRFilter",				Loc::BobbyRFilter,					0,	TEXT_NUM_BOBBYR_FILTER);
	ExportSection(props, L"BobbyR",						Loc::BobbyRText,					0,	TEXT_NUM_BOBBYR_GUNS);
	ExportSection(props, L"BobbyRaysFront",				Loc::BobbyRaysFrontText,			0,	TEXT_NUM_BOBBYR);
	ExportSection(props, L"AimSort", Loc::AimSortText, 0, TEXT_NUM_AIM_SORT);
	ExportSection(props, L"AimPolicy", Loc::AimPolicyText, 0, TEXT_NUM_AIM_POLICIES);

	ExportSection(props, L"AimMember",					Loc::AimMemberText,					0,	4);
	ExportSection(props, L"CharacterInfo",				Loc::CharacterInfo,					0,	TEXT_NUM_AIM_MEMBER_CHARINFO);
	ExportSection(props, L"VideoConfercing",			Loc::VideoConfercingText,			0,	TEXT_NUM_AIM_MEMBER_VCONF);
	ExportSection(props, L"AimPopUp",					Loc::AimPopUpText,					0,	TEXT_NUM_AIM_MEMBER_POPUP);
	ExportSection(props, L"AimLink",					Loc::AimLinkText,					0,	TEXM_NUM_AIM_LINK);
	ExportSection(props, L"AimHistory",					Loc::AimHistoryText,				0,	TEXT_NUM_AIM_HISTORY);
	ExportSection(props, L"AimFi",						Loc::AimFiText,						0,	TEXT_NUM_AIM_FI);
	ExportSection(props, L"AimAlumni",					Loc::AimAlumniText,					0,	TEXT_NUM_AIM_ALUMNI);
	ExportSection(props, L"AimScreen",					Loc::AimScreenText,					0,	TEXT_NUM_AIM_SCREEN);
	ExportSection(props, L"AimBottomMenu",				Loc::AimBottomMenuText,				0,	TEXT_NUM_AIM_MENU);

	ExportSection(props, L"SKI",						Loc::SKI_Text,						0, TEXT_NUM_SKI_TEXT);
	ExportSection(props, L"SkiAtm",						Loc::SkiAtmText,					0, NUM_SKI_ATM_BUTTONS);
	ExportSection(props, L"SkiAtmText",					Loc::gzSkiAtmText,					0, TEXT_NUM_SKI_ATM_MODE_TEXT);
	ExportSection(props, L"SkiMessageBox",				Loc::SkiMessageBoxText,				0, TEXT_NUM_SKI_MBOX_TEXT);
	ExportSection(props, L"Options",					Loc::zOptionsText,					0, TEXT_NUM_OPT_TEXT);
	ExportSection(props, L"SaveLoad",					Loc::zSaveLoadText,					0, TEXT_NUM_SLG_TEXT);
	ExportSection(props, L"MarksMapScreen",				Loc::zMarksMapScreenText,			0, 25);
	ExportSection(props, L"LandMarkInSector",			Loc::pLandMarkInSectorString,		0, 1);
	ExportSection(props, L"MilitiaConfirm",				Loc::pMilitiaConfirmStrings,		0, 11);
	ExportSection(props, L"MoneyWithdrawMessage",		Loc::gzMoneyWithdrawMessageText,	0, TEXT_NUM_MONEY_WITHDRAW);

	ExportSection(props, L"Copyright",					Loc::gzCopyrightText,				0,	1);
	ExportSection(props, L"OptionsToggle",				Loc::zOptionsToggleText,			0,	49);
	ExportSection(props, L"OptionsScreenHelp",			Loc::zOptionsScreenHelpText,		0,	49);
	ExportSection(props, L"GIOScreen",					Loc::gzGIOScreenText,				0,	TEXT_NUM_GIO_TEXT);
	ExportSection(props, L"MPJScreen",					Loc::gzMPJScreenText,				0,	TEXT_NUM_MPJ_TEXT);
	ExportSection(props, L"MPJHelpText",				Loc::gzMPJHelpText,					0,	10);
	ExportSection(props, L"MPHScreen",					Loc::gzMPHScreenText,				0,	TEXT_NUM_MPH_TEXT);	
	ExportSection(props, L"DeliveryLocation",			Loc::pDeliveryLocationStrings,		0,	17);
	ExportSection(props, L"SkillAtZeroWarning",			Loc::pSkillAtZeroWarning,			0,	1);
	ExportSection(props, L"IMPBeginScreen",				Loc::pIMPBeginScreenStrings,		0,	1);
	ExportSection(props, L"IMPFinishButton",			Loc::pIMPFinishButtonText,			0,	1);

	ExportSection(props, L"IMPFinish",					Loc::pIMPFinishStrings,				0,	1);
	ExportSection(props, L"IMPVoices",					Loc::pIMPVoicesStrings,				0,	1);
	ExportSection(props, L"DepartedMercPortrait",		Loc::pDepartedMercPortraitStrings,	0,	3);
	ExportSection(props, L"PersTitle",					Loc::pPersTitleText,				0,	1);
	ExportSection(props, L"PausedGame",					Loc::pPausedGameText,				0,	3);
	ExportSection(props, L"MessageStrings",				Loc::pMessageStrings,				0,	TEXT_NUM_MSG);
	ExportSection(props, L"ItemPickupHelpPopup",		Loc::ItemPickupHelpPopup,			0,	5);
	ExportSection(props, L"DoctorWarning",				Loc::pDoctorWarningString,			0,	2);
	ExportSection(props, L"MilitiaButtonsHelp",			Loc::pMilitiaButtonsHelpText,		0,	4);
	ExportSection(props, L"MapScreenJustStartedHelp",	Loc::pMapScreenJustStartedHelpText,	0,	2);

	ExportSection(props, L"AntiHacker",					Loc::pAntiHackerString,				0,	TEXT_NUM_ANTIHACKERSTR);
	ExportSection(props, L"LaptopHelp",					Loc::gzLaptopHelpText,				0,	TEXT_NUM_LAPTOP_BN_BOOKMARK_TEXT);
	ExportSection(props, L"HelpScreen",					Loc::gzHelpScreenText,				0,	TEXT_NUM_HLP);
	ExportSection(props, L"NonPersistantPBI",			Loc::gzNonPersistantPBIText,		0,	10);
	ExportSection(props, L"MiscString",					Loc::gzMiscString,					0,	5);
	ExportSection(props, L"IntroScreen",				Loc::gzIntroScreen,					0,	1);
	ExportSection(props, L"NewNoise",					Loc::pNewNoiseStr,					0,	11/*MAX_NOISES*/);
	ExportSection(props, L"MapScreenSortButtonHelp",	Loc::wMapScreenSortButtonHelpText,	0,	6);
	ExportSection(props, L"BrokenLink",					Loc::BrokenLinkText,				0,	TEXT_NUM_BROKEN_LINK);
	ExportSection(props, L"BobbyRShipment",				Loc::gzBobbyRShipmentText,			0,	TEXT_NUM_BOBBYR_SHIPMENT);

	ExportSection(props, L"CreditNames",				Loc::gzCreditNames,					0,	15);
	ExportSection(props, L"CreditNameTitle",			Loc::gzCreditNameTitle,				0,	15);
	ExportSection(props, L"CreditNameFunny",			Loc::gzCreditNameFunny,				0,	15);
	ExportSection(props, L"RepairsDone",				Loc::sRepairsDoneString,			0,	7);
	ExportSection(props, L"GioDifConfirm",				Loc::zGioDifConfirmText,			0,	TEXT_NUM_GIO_CFS);
	ExportSection(props, L"LateLocalized",				Loc::gzLateLocalizedString,			0,	64);
	ExportSection(props, L"CWStrings",					Loc::gzCWStrings,					0,	1);
	ExportSection(props, L"TooltipStrings",				Loc::gzTooltipStrings,				0,	TEXT_NUM_STR_TT);
	ExportSection(props, L"New113Message",				Loc::New113Message,					0,	TEXT_NUM_MSG113);

	ExportSection(props, L"New113HAMMessage",			Loc::New113HAMMessage,				0,	25);
	ExportSection(props, L"New113MERCMercMail",			Loc::New113MERCMercMailTexts,		0,	4);
	ExportSection(props, L"New113AIMMercMail",			Loc::New113AIMMercMailTexts,		0,	16);
	ExportSection(props, L"MissingIMPSkills",			Loc::MissingIMPSkillsDescriptions,	0,	2);
	ExportSection(props, L"NewInvMessage",				Loc::NewInvMessage,					0,	TEXT_NUM_NIV);
	ExportSection(props, L"MPServerMessage",			Loc::MPServerMessage,				0,	13);
	ExportSection(props, L"MPClientMessage",			Loc::MPClientMessage,				0,	69);	
	ExportSection(props, L"MPEdges",					Loc::gszMPEdgesText,				0,	5);
	ExportSection(props, L"MPTeamName",					Loc::gszMPTeamNames,				0,	5);
	ExportSection(props, L"MPMapscreen",				Loc::gszMPMapscreenText,			0,	9);

	ExportSection(props, L"MPSScreen",					Loc::gzMPSScreenText,				0,	TEXT_NUM_MPS_TEXT);
	ExportSection(props, L"MPCScreen",					Loc::gzMPCScreenText,				0,	TEXT_NUM_MPC_TEXT);
	ExportSection(props, L"MPChatToggle",				Loc::gzMPChatToggleText,			0,	2);
	ExportSection(props, L"MPChatbox",					Loc::gzMPChatboxText,				0,	2);

	props.writeToXMLFile(L"Localization/GameStrings.xml",tmap);
	props.writeToIniFile(L"Localization/GameStrings.ini",true);

	Loc::ExportMercBio();
	Loc::ExportAIMHistory();
	Loc::ExportAIMPolicy();
	Loc::ExportAlumniName();
	Loc::ExportDialogues();
	Loc::ExportNPCDialogues();

	return true;
}

#include <vfs/Core/vfs_file_raii.h>
#include "Encrypted File.h"

namespace Loc
{
	wchar_t ToPolish(wchar_t siChar)
	{
		switch( siChar )
		{
			case 165:          siChar = 260;          break;
			case 198:          siChar = 262;          break;
			case 202:          siChar = 280;          break;
			case 163:          siChar = 321;          break;
			case 209:          siChar = 323;          break;
			case 211:          siChar = 211;          break;

			case 140:          siChar = 346;          break;
			case 175:          siChar = 379;          break;
			case 143:          siChar = 377;          break;
			case 185:          siChar = 261;          break;
			case 230:          siChar = 263;          break;
			case 234:          siChar = 281;          break;

			case 179:          siChar = 322;          break;
			case 241:          siChar = 324;          break;
			case 243:          siChar = 243;          break;
			case 156:          siChar = 347;          break;
			case 191:          siChar = 380;          break;
			case 159:          siChar = 378;          break;
		}
		return siChar;
	}

	wchar_t ToRussian(wchar_t siChar)
	{
		switch( siChar )
		{
			//capital letters
			case 168:          siChar = 1025;  break;	//U+0401		   d0 81     CYRILLIC CAPITAL LETTER IO
			case 192:          siChar = 1040;  break; //U+0410     A     d0 90     CYRILLIC CAPITAL LETTER A
			case 193:          siChar = 1041;  break;
			case 194:          siChar = 1042;  break;
			case 195:          siChar = 1043;  break;
			case 196:          siChar = 1044;  break;
			case 197:          siChar = 1045;  break;
			case 198:          siChar = 1046;  break;
			case 199:          siChar = 1047;  break;
			case 200:          siChar = 1048;  break;
			case 201:          siChar = 1049;  break;
			case 202:          siChar = 1050;  break;
			case 203:          siChar = 1051;  break;
			case 204:          siChar = 1052;  break;
			case 205:          siChar = 1053;  break;
			case 206:          siChar = 1054;  break;
			case 207:          siChar = 1055;  break;
			case 208:          siChar = 1056;  break;
			case 209:          siChar = 1057;  break;
			case 210:          siChar = 1058;  break;
			case 211:          siChar = 1059;  break;
			case 212:          siChar = 1060;  break;
			case 213:          siChar = 1061;  break;
			case 214:          siChar = 1062;  break;
			case 215:          siChar = 1063;  break;
			case 216:          siChar = 1064;  break;
			case 217:          siChar = 1065;  break;
			case 218:          siChar = 1066;  break;
			case 219:          siChar = 1067;  break;
			case 220:          siChar = 1068;  break;
			case 221:          siChar = 1069;  break;
			case 222:          siChar = 1070;  break;
			case 223:          siChar = 1071;  break; //U+042F           d0 af     CYRILLIC CAPITAL LETTER YA

			//small letters
			case 185:          siChar = 8470;  break;		// ¹
			case 178:          siChar = 1030;  break;		// ²
			case 161:          siChar = 1038;  break;		// ¡
			case 179:          siChar = 1110;  break;		// ³
			case 162:          siChar = 1118;  break;		// ¢
			case 165:          siChar = 1168;  break;		// ¥
			case 170:          siChar = 1028;  break;		// ª
			case 175:          siChar = 1031;  break;		// ¯
			case 180:          siChar = 1169;  break;		// ´
			case 186:          siChar = 1108;  break;		// º
			case 191:          siChar = 1111;  break;		// ¿

			case 184:          siChar = 1105;  break; //U+0451           d1 91     CYRILLIC SMALL LETTER IO
			case 224:          siChar = 1072;  break; //U+0430     a     d0 b0     CYRILLIC SMALL LETTER A
			case 225:          siChar = 1073;  break;
			case 226:          siChar = 1074;  break;
			case 227:          siChar = 1075;  break;
			case 228:          siChar = 1076;  break;
			case 229:          siChar = 1077;  break;
			case 230:          siChar = 1078;  break;
			case 231:          siChar = 1079;  break;
			case 232:          siChar = 1080;  break;
			case 233:          siChar = 1081;  break;
			case 234:          siChar = 1082;  break;
			case 235:          siChar = 1083;  break;
			case 236:          siChar = 1084;  break;
			case 237:          siChar = 1085;  break;
			case 238:          siChar = 1086;  break;
			case 239:          siChar = 1087;  break; //U+043F           d0 bf     CYRILLIC SMALL LETTER PE
			case 240:          siChar = 1088;  break; //U+0440     p     d1 80     CYRILLIC SMALL LETTER ER
			case 241:          siChar = 1089;  break;
			case 242:          siChar = 1090;  break;
			case 243:          siChar = 1091;  break;
			case 244:          siChar = 1092;  break;
			case 245:          siChar = 1093;  break;
			case 246:          siChar = 1094;  break;
			case 247:          siChar = 1095;  break;
			case 248:          siChar = 1096;  break;
			case 249:          siChar = 1097;  break;
			case 250:          siChar = 1098;  break;
			case 251:          siChar = 1099;  break;
			case 252:          siChar = 1100;  break;
			case 253:          siChar = 1101;  break;
			case 254:          siChar = 1102;  break;
			case 255:          siChar = 1103;  break; //U+044F           d1 8f     CYRILLIC SMALL LETTER YA                
		}
		return siChar;
	}
	bool Translate(vfs::String::char_t* str, int len, Language lang)
	{
		if(lang == English || lang == German)
		{
			return true;
		}
		else if(lang == Russian)
		{
			for(int i=0; i<len; i++) str[i] = ToRussian(str[i]);
			return true;
		}
		else if(lang == Polish)
		{
			for(int i=0; i<len; i++) str[i] = ToPolish(str[i]);
			return true;
		}
		return false;
	}
}; // namespace Loc

void Loc::ExportMercBio()
{
	Loc::Language lang = gs_Lang;
	#define	SIZE_MERC_BIO_INFO				400	* 2
	#define SIZE_MERC_ADDITIONAL_INFO		160 * 2

	vfs::String::char_t pInfoString[SIZE_MERC_BIO_INFO];
	vfs::String::char_t pAddInfo[SIZE_MERC_ADDITIONAL_INFO];
	vfs::COpenReadFile rfile("BINARYDATA\\aimbios.edt");
	vfs::tReadableFile& file = rfile.file();

	vfs::PropertyContainer props; 
	for(int i=0; i<40; ++i)
	{
		memset(pInfoString,0,SIZE_MERC_BIO_INFO*sizeof(wchar_t));
		memset(pAddInfo,0,SIZE_MERC_ADDITIONAL_INFO*sizeof(wchar_t));
		//
		file.read((vfs::Byte*)pInfoString, SIZE_MERC_BIO_INFO);
		DecodeString(pInfoString,SIZE_MERC_BIO_INFO);
		Loc::Translate(pInfoString, SIZE_MERC_BIO_INFO, lang);
		props.setStringProperty(L"Bio", vfs::toString<wchar_t>(i), pInfoString);
		
		file.read((vfs::Byte*)pAddInfo, SIZE_MERC_ADDITIONAL_INFO);
		DecodeString(pAddInfo, SIZE_MERC_ADDITIONAL_INFO);
		Loc::Translate(pAddInfo, SIZE_MERC_ADDITIONAL_INFO, lang);
		props.setStringProperty(L"Add", vfs::toString<wchar_t>(i), pAddInfo);
	}
	props.writeToXMLFile(L"Localization/AimBiographies.xml", vfs::PropertyContainer::TagMap());
}

void Loc::ExportAIMHistory()
{
	Loc::Language lang = gs_Lang;
	#define AIM_HISTORY_LINE_SIZE 400 * 2
	vfs::String::char_t pHistLine[AIM_HISTORY_LINE_SIZE];
	vfs::COpenReadFile rfile("BINARYDATA\\AimHist.edt");
	vfs::tReadableFile& file = rfile.file();

	vfs::PropertyContainer props; 
	for(int i=0; i<23; ++i)
	{
		memset(pHistLine,0,AIM_HISTORY_LINE_SIZE*sizeof(wchar_t));
		//
		file.read((vfs::Byte*)pHistLine, AIM_HISTORY_LINE_SIZE);
		DecodeString(pHistLine,AIM_HISTORY_LINE_SIZE);
		Loc::Translate(pHistLine, AIM_HISTORY_LINE_SIZE, lang);
		props.setStringProperty(L"Line", vfs::toString<wchar_t>(i), pHistLine);
	}
	props.writeToXMLFile(L"Localization/AimHistory.xml", vfs::PropertyContainer::TagMap());
}
	
	
void Loc::ExportAIMPolicy()
{
	Loc::Language lang = gs_Lang;
	#define AIM_HISTORY_LINE_SIZE 400 * 2
	vfs::String::char_t pPolLine[AIM_HISTORY_LINE_SIZE];
	vfs::COpenReadFile rfile("BINARYDATA\\AimPol.edt");
	vfs::tReadableFile& file = rfile.file();

	vfs::PropertyContainer props; 
	for(int i=0; i<46; ++i)
	{
		memset(pPolLine,0,400*sizeof(wchar_t));
		//
		file.read((vfs::Byte*)pPolLine, AIM_HISTORY_LINE_SIZE);
		DecodeString(pPolLine,AIM_HISTORY_LINE_SIZE);
		Loc::Translate(pPolLine, AIM_HISTORY_LINE_SIZE, lang);
		props.setStringProperty(L"Line", vfs::toString<wchar_t>(i), pPolLine);
	}
	props.writeToXMLFile(L"Localization/AimPolicy.xml", vfs::PropertyContainer::TagMap());
}

void Loc::ExportAlumniName()
{
	Loc::Language lang = gs_Lang;
	#define AIM_ALUMNI_NAME_SIZE 80 * 2
	vfs::String::char_t pAlumniName[AIM_ALUMNI_NAME_SIZE];
	vfs::COpenReadFile rfile("BINARYDATA\\AlumName.edt");
	vfs::tReadableFile& file = rfile.file();

	vfs::PropertyContainer props; 
	for(int i=0; i<51; ++i)
	{
		memset(pAlumniName,0,AIM_ALUMNI_NAME_SIZE*sizeof(wchar_t));
		//
		file.read((vfs::Byte*)pAlumniName, AIM_ALUMNI_NAME_SIZE);
		DecodeString(pAlumniName,AIM_ALUMNI_NAME_SIZE);
		Loc::Translate(pAlumniName, AIM_ALUMNI_NAME_SIZE, lang);
		props.setStringProperty(L"Line", vfs::toString<wchar_t>(i), pAlumniName);
	}
	props.writeToXMLFile(L"Localization/AlumniName.xml", vfs::PropertyContainer::TagMap());
}

#include <vfs/Core/vfs.h>

void Loc::ExportDialogues()
{
	Loc::Language lang = gs_Lang;
	#define DIALOGUESIZE		480
	vfs::String::char_t pDiagLine[DIALOGUESIZE];

	vfs::CVirtualFileSystem::Iterator it = getVFS()->begin(L"MercEdt/*.edt");
	for(; !it.end(); it.next())
	{
		vfs::PropertyContainer props;
		vfs::COpenReadFile rfile(it.value());
		vfs::tReadableFile& file = rfile.file();

		std::wstringstream wss;
		wss.str(file.getName().c_str());
		int id=0;
		wss >> id;

		for(int i=0; i<200; ++i)
		{
			memset(pDiagLine,0,DIALOGUESIZE*sizeof(wchar_t));
			//
			if(file.read((vfs::Byte*)pDiagLine, DIALOGUESIZE) > 0)
			{
				DecodeString(pDiagLine,DIALOGUESIZE);
				Loc::Translate(pDiagLine, DIALOGUESIZE, lang);
				if(wcslen(pDiagLine))
				{
					props.setStringProperty(vfs::toString<wchar_t>(id),vfs::toString<wchar_t>(i), pDiagLine);
				}
			}
		}
		vfs::Path x(L"Localization/Dialogue");
		x += vfs::Path(file.getName().c_wcs() + L".xml");
		props.writeToXMLFile(x, vfs::PropertyContainer::TagMap());
	}
}

void Loc::ExportNPCDialogues()
{
	Loc::Language lang = gs_Lang;
	#define DIALOGUESIZE		480
	#define CIVQUOTESIZE		320
	vfs::String::char_t pDiagLine[DIALOGUESIZE];

	vfs::CVirtualFileSystem::Iterator it = getVFS()->begin(L"npcdata/*.edt");
	for(; !it.end(); it.next())
	{
		vfs::PropertyContainer props;
		vfs::COpenReadFile rfile(it.value());
		vfs::tReadableFile& file = rfile.file();

		vfs::String::str_t const& ws = file.getName().c_wcs();
		vfs::String::str_t::size_type pos = ws.find_first_of(L".");
		vfs::String id = ws.substr(0,pos);

		int SIZE;
		if(vfs::matchPattern(L"civ*", id))
		{
			SIZE = CIVQUOTESIZE;
		}
		else
		{
			SIZE = DIALOGUESIZE;
		}

		for(int i=0; i<200; ++i)
		{
			memset(pDiagLine,0,DIALOGUESIZE*sizeof(wchar_t));
			//
			if(file.read((vfs::Byte*)pDiagLine, SIZE) > 0)
			{
				DecodeString(pDiagLine,SIZE);
				Loc::Translate(pDiagLine, SIZE, lang);
				if(wcslen(pDiagLine))
				{
					props.setStringProperty(id,vfs::toString<wchar_t>(i), pDiagLine);
				}
			}
		}
		vfs::Path x(L"Localization/NpcDialogue");
		x += vfs::Path(file.getName().c_wcs() + L".xml");
		props.writeToXMLFile(x, vfs::PropertyContainer::TagMap());
	}
}
