Exemple #1
0
        public static string toString(LocaleID id)
        {
            switch (id)
            {
            case LocaleID.English:
                return("English");


            case LocaleID.French:
                return("French");


            case LocaleID.German:
                return("German");


            case LocaleID.Italian:
                return("Italian");


            case LocaleID.Spanish:
                return("Spanish");


            case LocaleID.Japanese:
                return("Japanese");


            case LocaleID.Portugese:
                return("Portugese");


            case LocaleID.Polish:
                return("Polish");


            case LocaleID.EnglishUK:
                return("EnglishUK");


            case LocaleID.Russian:
                return("Russian");


            case LocaleID.Czech:
                return("Czech");


            case LocaleID.Dutch:
                return("Dutch");

            case LocaleID.Hungarian:
                return("Hungarian");

            default:
                return("Default");
            }
        }
Exemple #2
0
        public HashTableEntry([NotNull] byte[] data)
        {
            using var ms   = new MemoryStream(data);
            using var br   = new BinaryReader(ms);
            _filePathHashA = br.ReadUInt32();
            _filePathHashB = br.ReadUInt32();
            _localization  = (LocaleID)br.ReadUInt16();

            // Read the platform as an int8 and skip the next byte
            _platform = br.ReadByte();
            br.BaseStream.Position += 1;

            _fileBlockIndex = br.ReadUInt32();
        }
Exemple #3
0
        public HashTableEntry(byte[] data)
        {
            using (MemoryStream ms = new MemoryStream(data))
            {
                using (BinaryReader br = new BinaryReader(ms))
                {
                    this.FilePathHashA = br.ReadUInt32();
                    this.FilePathHashB = br.ReadUInt32();
                    this.Localization = (LocaleID)br.ReadUInt16();

                    // Read the platform as an int8 and skip the next byte
                    this.Platform = br.ReadByte();
                    br.BaseStream.Position += 1;

                    this.FileBlockIndex = br.ReadUInt32();
                }
            }
        }
Exemple #4
0
        /// <summary>
        /// Deserializes a new hash table entry from provided data.
        /// </summary>
        /// <param name="data">The serialized hash table data.</param>
        public HashTableEntry(byte[] data)
        {
            using (MemoryStream ms = new MemoryStream(data))
            {
                using (BinaryReader br = new BinaryReader(ms))
                {
                    this.FilePathHashA = br.ReadUInt32();
                    this.FilePathHashB = br.ReadUInt32();
                    this.Localization  = (LocaleID)br.ReadUInt16();

                    // Read the platform as an int8 and skip the next byte
                    this.Platform           = br.ReadByte();
                    br.BaseStream.Position += 1;

                    this.FileBlockIndex = br.ReadUInt32();
                }
            }
        }
Exemple #5
0
        public static void doExtract(string[] args)
        {
            bool     isBigEndian = false;
            LocaleID lang        = LocaleID.Default;
            String   bigfilePath = String.Empty;
            String   patchPath   = String.Empty;

            if (args.Length < 2)
            {
                Console.WriteLine("Error! Not enough arguments passed to program.");
                Console.WriteLine("");
                showHelpAndQuit();
            }
            else
            {
                if (args[1] == "help")
                {
                    showHelpAndQuit();
                }
                else if (args.Length < 3)
                {
                    Console.WriteLine("Error! Not enough arguments passed to program.");
                    Console.WriteLine("");
                    showHelpAndQuit();
                }
                else if (args.Length > 5)
                {
                    Console.WriteLine("Error! Too many arguments passed to program.");
                    Console.WriteLine("");
                    showHelpAndQuit();
                }
                else
                {
                    lang = Locale.getFromString(args[1]);
                    if (lang == LocaleID.Default)
                    {
                        Console.WriteLine("Error! Unknown language {0}", args[1]);
                        Console.WriteLine("");
                        showHelpAndQuit();
                    }

                    bigfilePath = args[2];
                    if (args.Length > 3)
                    {
                        if (args[3] == "be")
                        {
                            isBigEndian = true;
                            if (args.Length > 4)
                            {
                                patchPath = args[4];
                            }
                        }
                        else
                        {
                            patchPath = args[3];
                        }
                    }
                }
            }

            // Remove trailing backslash on paths
            if (bigfilePath.EndsWith("\\"))
            {
                bigfilePath = bigfilePath.Remove(bigfilePath.Length - 1);
            }

            if (patchPath.EndsWith("\\"))
            {
                patchPath = patchPath.Remove(patchPath.Length - 1);
            }

            // Get locale mask
            uint mask;

            if (patchPath != "")
            {
                uint mask2 = Locale.getLocaleMask(bigfilePath);
                mask = Locale.getLocaleMask(patchPath);

                if (mask2 != mask)
                {
                    throw new Exception("Patch and bigfile locale mask different");
                }
            }
            else
            {
                mask = Locale.getLocaleMask(bigfilePath);
            }

            if (mask == uint.MaxValue)
            {
                throw new Exception("Error finding localisation database (\"locals.bin\"). Make sure the game files are properly unpacked.");
            }
            else if (mask == (uint.MaxValue - 1))
            {
                Console.WriteLine("");
                Console.WriteLine("Unable to determine language of game files.");
                Console.WriteLine("Please confirm that the language {0} is supported by your game.", Locale.toString(lang));
                Console.WriteLine("NOTE: If the language is not supported by the game, you won't see any changes!");
                Console.Write("Confirm? (y/n)");

                var yes = new ConsoleKeyInfo('y', ConsoleKey.Y, false, false, false);
                var no  = new ConsoleKeyInfo('n', ConsoleKey.N, false, false, false);
                while (true)
                {
                    var key = Console.ReadKey(true);
                    if (key == no)
                    {
                        System.Environment.Exit(0);
                    }
                    else if (key == yes)
                    {
                        break;
                    }
                }

                Console.WriteLine("");
            }
            //Check if lang is present in files
            else if ((mask & (1 << (int)lang)) == 0)
            {
                Console.WriteLine("");
                Console.WriteLine("Error! Language {0} not found in game files.", Locale.toString(lang));
                Console.WriteLine("");
                Console.WriteLine("Detected languages:");

                for (int i = 0; i < 16; i++)
                {
                    if ((mask & (1 << i)) != 0)
                    {
                        Console.WriteLine(Locale.toString((LocaleID)i));
                    }
                }
                System.Environment.Exit(0);
            }

            TransFile tf = new TransFile(bigfilePath, patchPath, isBigEndian);

            var files = getFilelist(bigfilePath, patchPath, (int)lang, mask);

            System.Console.WriteLine("Searching following files for translatable text:");

            int f = 0;

            foreach (string file in files)
            {
                System.Console.WriteLine("{0} of {1} - {2}", ++f, files.Count, Path.GetFileName(file));

                if (file.EndsWith("locals.bin"))
                {
                    LocalsFile lf = new LocalsFile(isBigEndian);
                    lf.parse(file);

                    string basep;
                    string name;
                    if (file.StartsWith(bigfilePath))
                    {
                        basep = bigfilePath;
                        name  = file.Substring(bigfilePath.Length);
                    }
                    else
                    {
                        basep = patchPath;
                        name  = file.Substring(patchPath.Length);
                    }

                    tf.AddLocalsFile(lf, basep, name);
                }
                else
                {
                    CineFile cf = new CineFile(isBigEndian);
                    cf.parse(file);

                    if (cf.isSubs())
                    {
                        string basep;
                        string name;
                        if (file.StartsWith(bigfilePath))
                        {
                            basep = bigfilePath;
                            name  = file.Substring(bigfilePath.Length);
                        }
                        else
                        {
                            basep = patchPath;
                            name  = file.Substring(patchPath.Length);
                        }
                        tf.AddFile(basep, name);

                        List <SubtitleEntry> entries = cf.getSubtitles();

                        foreach (SubtitleEntry e in entries)
                        {
                            if (e.lang == lang)
                            {
                                tf.AddEntry(e.text, e.lang.ToString(), e.blockNumber.ToString());
                            }
                        }
                    }
                }
            }

            tf.Close();
            System.Console.WriteLine("Translatable text saved to file \"translations.xml\"");
        }
Exemple #6
0
        public static string toString(LocaleID id)
        {
            switch (id)
            {
                case LocaleID.English:
                    return "English";

                case LocaleID.French:
                    return "French";

                case LocaleID.German:
                    return "German";

                case LocaleID.Italian:
                    return "Italian";

                case LocaleID.Spanish:
                    return "Spanish";

                case LocaleID.Japanese:
                    return "Japanese";

                case LocaleID.Portugese:
                    return "Portugese";

                case LocaleID.Polish:
                    return "Polish";

                case LocaleID.EnglishUK:
                    return "EnglishUK";

                case LocaleID.Russian:
                    return "Russian";

                case LocaleID.Czech:
                    return "Czech";

                case LocaleID.Dutch:
                    return "Dutch";

                case LocaleID.Hungarian:
                    return "Hungarian";

                default:
                    return "Default";
            }
        }
Exemple #7
0
        public static LocaleID getFromString(String s)
        {
            LocaleID id = LocaleID.Default;

            s = s.ToLower();

            switch (s)
            {
            case "english":
            case "en":
                id = LocaleID.English;
                break;

            case "french":
            case "fr":
                id = LocaleID.French;
                break;

            case "german":
            case "de":
                id = LocaleID.German;
                break;

            case "italian":
            case "it":
                id = LocaleID.Italian;
                break;

            case "spanish":
            case "es":
                id = LocaleID.Spanish;
                break;

            case "japanese":
            case "ja":
                id = LocaleID.Japanese;
                break;

            case "portugese":
            case "pt":
                id = LocaleID.Portugese;
                break;

            case "polish":
            case "pl":
                id = LocaleID.Polish;
                break;

            case "englishUK":
            case "uk":
                id = LocaleID.EnglishUK;
                break;

            case "russian":
            case "ru":
                id = LocaleID.Russian;
                break;

            case "czech":
            case "cs":
                id = LocaleID.Czech;
                break;

            case "dutch":
            case "nl":
                id = LocaleID.Dutch;
                break;

            case "hungarian":
            case "hu":
                id = LocaleID.Hungarian;
                break;
            }

            return(id);
        }