diff options
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/translate')
5 files changed, 1048 insertions, 0 deletions
diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/translate/ReadMe.txt b/Data/BuiltIn/Libraries/lua-addons/addons/translate/ReadMe.txt new file mode 100644 index 0000000..d6eab5e --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/translate/ReadMe.txt @@ -0,0 +1,13 @@ +Last Updated: 01/02/15 + +Description: +Translate is an addon designed to automatically translate chat text and search comments from JP to EN. It creates a dictionary using the windower resources and custom-made dictionaries (../windower/addons/translate/dicts/), and replaces incoming chat lines with the matching translation in order of longest JP phrase to shortest. + +This approach is not without its problems, and occasionally phrases will be translated that do not mean anything obvious. Short job names are particularly common offenders, and here is a brief guide to interpreting them: +* WAR - Also used to indicate the number of fights that will be done. +* ka - Also the abbreviation for PUP +* GEO - Can also mean winds. + +Commands: //trans + +* show original - Displays the original text. Known to double-up autotranslated phrases sometimes in search comments. Reason unclear.
\ No newline at end of file diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/translate/dicts/bgthread_guide.lua b/Data/BuiltIn/Libraries/lua-addons/addons/translate/dicts/bgthread_guide.lua new file mode 100644 index 0000000..f49fa12 --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/translate/dicts/bgthread_guide.lua @@ -0,0 +1,169 @@ +-- Dictionary of terms collected from the BG translate addon thread: +-- http://www.bluegartr.com/threads/123229-Translate-Addon + +local dict = { + {en="Normal",ja="ふつう"}, + {en="Normal",ja="普通"}, + {en="Difficult",ja="むず"}, + {en="Very Difficult",ja="とてもむず"}, + + {en="Menace",ja="メナス"}, + {en="Voidwatch",ja="ヴォッチ"}, + {en="Burrows",ja="バローズ"}, + {en="Alluvion",ja="アルビオン"}, + {en="Ra'Kaznar Skirmish",ja="カザスカ"}, + {en="Ra'Kaznar Skirmish",ja="スカカザ"}, + {en="Ra'Kaznar Skirmish",ja="かざすか"}, + + {en="Leveling",ja="レベリング"}, + {en="Aby",ja="アビ"}, + {en="Altepa",ja="アルテパ"}, + {en="Misareaux",ja="セア ミザレオ"}, + {en="Doll",ja="ド-ル"}, + + {en="Recruiting",ja="募集"}, + {en="Check seacom for jobs",ja="サチコ参照ジョブを添えてテルください"}, + {en="Search Comment",ja="サチコ"}, + {en="Job doesn't matter",ja="ジョブ不問"}, + {en="currently",ja="現在"}, + + + {en="Hennetiel",ja="NTL"}, + {en="Morimar",ja="モリマ"}, + {en="Kamihr",ja="カミール"}, + {en="Marjami",ja="マリアミ"}, + {en="Rala",ja="ララ"}, + {en="Yorcia",ja="ヨル"}, + {en="Foret",ja="水林"}, + {en="Ceizak",ja="ケイザ"}, + {en="Cirdas",ja="シルダス"}, + + {en="Trial by Fire",ja="火の試練"}, + {en="Trial by Lightning",ja="雷の試練"}, + {en="Trial by Earth",ja="土の試練"}, + {en="Trial by Water",ja="水の試練"}, + {en="Trial by Ice",ja="氷の試練"}, + {en="Trial by Wind",ja="風の試練"}, + {en="Leviathan",ja="リヴァイアサン"}, + {en="Levi",ja="リヴァ"}, + + {en="Tenzen",ja="てんぜん"}, + {en="Tenzen",ja="テンゼン"}, + {en="Warrior's Path",ja="武士道とは"}, + + {en="Return to Delkfutt's Tower",ja="デルクフの塔 再び"}, + {en="Return to Delkfutt's Tower",ja="テルクフの塔再び"}, + {en="Eald'narche",ja="エルド"}, + {en="Kam'lanaut",ja="カムラ"}, + {en="Stellar Fulcrum",ja="天輪"}, + {en="Celestial Nexus",ja="宿星"}, + + {en="BRD",ja="吟"}, + {en="GEO",ja="風"}, + + {en="Wanted (Battle)",ja="ウォンテッド"}, + {en="Dragonfly",ja="トンボ"}, + {en="Cost",ja="コスト"}, + + {en="Incursion",ja="インカ"}, + {en="Tryl",ja="トリル"}, + + {en="*waves*",ja="ノシ"}, + {en="Full Alliance",ja="フルアラ"}, + + {en="EIN",ja="エイン"}, + {en="Ampuole",ja="アンプル"}, + + -- These are from wiki.ffo.jp: + {en="Hugemaw Harold",ja="ひゅーじまうへらるど"}, + {en="Bouncing Bertha",ja="ばうんしんぐばーさ"}, + {en="Prickly Pitriv",ja="ぷりっくりーぴとりう゛"}, + {en="Ironhorn Balduro",ja="あいあんほーんばるだーの"}, + {en="Sleepy Mabel",ja="すりーぴーめーぶる"}, + {en="Valkurm Imperiator",ja="ばるくるむいんぴらとあ"}, + {en="Serpopard Ninlil",ja="さーぽぱーどにんりる"}, + {en="Abyssdiver",ja="あびすだいばー"}, + {en="Intuila",ja="いんつりあ"}, + {en="Emperor Arthro",ja="えんぺらーあーすろ"}, + {en="Orcfeltrap",ja="おーくふぇるとらっぷ"}, + {en="Lumber Jill",ja="らんばーじる"}, + {en="Joyous Green",ja="じょいあすぐりーん"}, + {en="Strix",ja="すとりくす"}, + {en="Warblade Beak",ja="うぉーぶれいどびーく"}, + {en="Arke",ja="あるけ"}, + {en="Largantua",ja="らがんちゅあ"}, + {en="Largantua",ja="ラガンチュア"}, + {en="Beist",ja="ばいすと"}, + {en="Jester Malatrix",ja="じぇすたーまらとりくす"}, + {en="Cactrot Veloz",ja="かくとろっとべろす"}, + {en="Woodland Mender",ja="うっどらんどめんだー"}, + {en="Sybaritic Samantha",ja="しばりちっくさまんさ"}, + {en="Keeper of Heiligtum",ja="きーぱーおぶはいりぐたむ"}, + {en="Douma Weapon",ja="どうまうぇぽん"}, + {en="King Ugoprygid",ja="きんぐうるぴじっど"}, + {en="Vedrfolnir",ja="う゛ぇどるふぉるにる"}, + + + {en="Ark Angel",ja="あーくえんじぇる"}, + {en="Hume",ja="ひゅーむ"}, + {en="Tarutaru",ja="たるたる"}, + {en="Mithra",ja="みすら"}, + {en="Elvaan",ja="えるう゛ぁーん"}, + {en="Galka",ja="がるか"}, + {en="Eald'narche",ja="えるどなーしゅ"}, + {en="Kam'lanaut",ja="かむらなーと"}, + {en="Ouryu",ja="おうりゅう"}, + {en="Lancelord Gaheel Ja",ja="らんすろーど・がひーじゃ"}, + {en="Gessho",ja="げっしょー"}, + {en="Shadow Lord",ja="しゃどうろーど"}, + {en="Head Wind",ja="むかいかぜ"}, + {en="Shadow Lord Fight",ja="らんくごみっしょん"}, + {en="Legacy of the Lost",ja="ぼうこくのいさん"}, + {en="Legacy of the Lost",ja="亡国の遺産"}, + {en="Warrior's Path",ja="ぶしどうとは"}, + {en="Puppet in Peril",ja="少女の傀儡"}, + {en="Puppet in Peril",ja="しょうじょのくぐつ"}, + {en="Puppet in Peril",ja="しょうじょのかいらい"}, + {en="The Savage",ja="たけきものたちよ"}, + {en="The Savage",ja="猛き者たちよ"}, + {en="The Celestial Nexus",ja="しゅくせいのざ"}, + {en="The Celestial Nexus",ja="宿星の座"}, + {en="Return to Delfutt's Tower",ja="デルクフの塔再び"}, + {en="Divine Might",ja="しんい"}, + {en="Divine Might",ja="神威"}, + {en="Trial by Fire",ja="ひのしれん"}, + {en="Trial by Lightning",ja="かみなりのしれん"}, + {en="Trial by Earth",ja="つちのしれん"}, + {en="Trial by Water",ja="みずのしれん"}, + {en="Trial by Ice",ja="こおりのしれん"}, + {en="Trial by Wind",ja="かぜのしれん"}, + {en="Leviathan",ja="りう゛ぁいあさん"}, + {en="Ramuh",ja="らむう"}, + {en="Titan",ja="たいたん"}, + {en="Garuda",ja="がるーだ"}, + {en="Shiva",ja="しう゛ぁ"}, + {en="Ifrit",ja="いふりーと"}, + {en="Fenrir",ja="ふぇんりる"}, + {en="Carbuncle",ja="かーばんくる"}, + {en="Diabolos",ja="でぃあぼろす"}, + {en="Cait Sith",ja="けっとしー"}, + {en="Atomos",ja="あともす"}, + + + {en="Vagary",ja="ベガリ"}, + {en="Vagary",ja="ベガリーインスペクター"}, + {en="Balamor",ja="バラモア"}, + {en="Dhokmak",ja="ドクマク"}, + {en="Ashrakk",ja="アシュラック"}, + {en="Plouton",ja="上位 ハデス"}, + {en="Perfidien",ja="下位 ハデス"}, + {en="Plouton",ja="上位ハデス"}, + {en="Perfidien",ja="下位ハデス"}, + {en="Hades",ja="ハデス"}, + {en="upper",ja="上位"}, + {en="lower",ja="下位"}, + + {en="Sinister Reign",ja="シニスターレイン"}, +} + +return dict
\ No newline at end of file diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/translate/dicts/captainhowdy_guide.lua b/Data/BuiltIn/Libraries/lua-addons/addons/translate/dicts/captainhowdy_guide.lua new file mode 100644 index 0000000..60d3ca8 --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/translate/dicts/captainhowdy_guide.lua @@ -0,0 +1,352 @@ +-- Default custom dictionary, taken from: +-- http://wipe.guildwork.com/forum/threads/5039eb67205cb26e261f6988-japaneseenglish-guide-ffxi + +local dict = { + -- Party Chat section + {en="BRB",ja="りせき"}, + {en="Congratulations",ja="おめでとうー"}, + --Excuse Me, WC for 2 Minutes || sumimasen, 2 pun hodo toile ittekimasu || すみません、2分ほどトイレ行ってきます + {en="Gather for buffs",ja="プロテアとシェルかけるのであつまってください"}, + {en="I messed up",ja="しまった"}, + {en="Sorry, I'm back",ja="ごめんただいまですー"}, + {en="job okay?",ja="でいいかね"}, + {en="It can't be helped",ja="仕方がない "}, + {en="Let's go",ja="行きましょ"}, + --"Mary", Please go to "John's" Party || Mary wa John no patei ni itte kudasai || MaryはJohnのパーティーに行って下さい + {en="Nice to meet you",ja="よろしくですー"}, + {en="Oh, that's good!",ja="それはいいですね"}, + {en="One moment please",ja="ちょっと待って下さい"}, + {en="Relogging, BRB",ja="コンピューターをさいきどうして、すぐもどります"}, + {en="Sorry, can you invite me again?",ja="ごめんね、またさそって下さい"}, + {en="Sorry, I disconnected",ja="私は接続を失いましたごめんなさい"}, + {en="Thank you",ja="ありがとうですー"}, + {en="They are already there",ja="もおむこおにいっています"}, + {en="Welcome back",ja="お帰りー"}, + {en="What job?",ja="すみません、私のジョブなんですか?"}, + + -- During an event section + {en="pop",ja="わかす"}, + {en="Go ahead",ja="先にどうぞ"}, + {en="How many left?",ja="あとなんかいでおわりますか"}, + {en="Hurry up",ja="急いで"}, + {en="I have to go",ja="行かなくてはなりません"}, + {en="I understand",ja="わかった"}, -- Informal + {en="I understand",ja="わかりました"}, -- Formal + {en="I will be right back",ja="すぐ戻ります"}, + {en="I will take it",ja="それ下さい"}, + {en="If we trigger weakness, defeat it quickly",ja="弱点ついたら早めに倒しましょう"}, + {en="Ignore weaknesses and defeat it quickly",ja="弱点を無視して早めに倒しましょう "}, + {en="Mission accomplished, see you!",ja="またあとで会いましょう"}, + {en="I'm going to use my merits",ja="メリポ振ってきます"}, + {en="next",ja="次"}, + {en="Roger that",ja="りょうかい"}, + {en="Run/Fight",ja="にげて"}, + {en="See you later",ja="またあとで会いましょう"}, + {en="Take it easy",ja="むりしないで"}, + {en="Thanks for the hard work",ja="お疲れ様でしたー"}, + {en="That was fun",ja="たのしい。。"}, + {en="Puller",ja="つりやく"}, + --We'll Be Done In About 2 More Pulls || Ato 2 webu kurai de owarimasuka || あと2ウェーブくらいで終わりますか + {en="What an idiot",ja="ばかやろう。。"}, + {en="When is the ending?",ja="おわりますか"}, + {en="You can pop next",ja="つぎわかせていいよ"}, + --(You Find Nothing In The Riftworn Pyxis) || Tanakasan wa daikirai desuyo! || (ノ ゜Д゜)ノ三┸┸ + + -- Coming and Going + {en="Bad",ja="だめ"}, + {en="Cheap",ja="やすい"}, + {en="Come with me",ja="私といっしょに来て下さい。"}, + {en="Done",ja="それできまった"}, + {en="Don't touch me",ja="らないで"}, + --Excuse Me, Mind if I Join You? || sumimasen, akiwa arimasu ka? ikitai desu || すみません、あきはありますか?いきたいですー + --Go Straight, Then Turn Left/ Right! || massugu itte kudasai, Soshite, hidari / migi ni magatte kudasai || まっすぐ行って下さい。そして、 左/右にまがって下さい。 + {en="Good luck",ja="がんばってね"}, + {en="I almost gave up",ja="あきらめてました"}, + {en="I feel sick",ja="調子が悪いです"}, + {en="I'm fine",ja="大丈夫です"}, + {en="I'm leaving",ja="行ってきます"}, + {en="I'm locked out",ja="しめだされました"}, + {en="I'm lost",ja="迷ってしまいました"}, + {en="I'm not going",ja="行きません"}, + {en="Shall we go?",ja="行きませんか"}, + {en="I need your help",ja="たすけて下さい"}, + {en="It's an emergency",ja="きんきゅです"}, + {en="Just a little",ja="少しだけ"}, + {en="Look out",ja="あぶない"}, + {en="No problem",ja="大丈夫です"}, + {en="Nothing",ja="べつに"}, + {en="Nothing much",ja="変わりないです"}, + {en="Please",ja="どぞ"}, -- Offer + {en="Please",ja="お願します"}, -- Request + {en="Please write it",ja="かいて下さい"}, + {en="Really sorry",ja="もうしわけございません"}, + {en="Listen",ja="あのね"}, + {en="Stop fooling around",ja="もうやめたら"}, + {en="Take care of yourself",ja="おだいじに"}, + {en="Take your time",ja="ゆっくりしなさい"}, + {en="Team up?",ja="一緒にやりませんか"}, + {en="This sucks",ja="サイアクだ"}, + {en="This way, please",ja="こちらえどうぞ"}, + {en="Time is up",ja="もう時間よ"}, + {en="Troublesome",ja="めんどくさい。。。"}, + {en="What happened?",ja="何かあった"}, + {en="Yes, I'm coming",ja="はい行きます"}, + {en="Yes, that's right",ja="はいそうです"}, + + {en="Brb, I'm going to the store",ja="りせき、コンビニで行きます"}, + {en="Dont be late",ja="ちこくしないで"}, + {en="Don't lie",ja="うそつかないで"}, + {en="Don't worry",ja="ご心配なく"}, + {en="Excuse me",ja="すみません"}, + {en="Good night",ja="おやすみなさい"}, + {en="Have fun",ja="たのしんで"}, + {en="I agree",ja="まったくだ"}, + {en="I don't know",ja="知りません"}, + {en="I don't speak Japanese, but I'm using an online translator",ja="私は日本語を話しませんでもオンラ イン訳者を使用しています"}, + {en="I guess",ja="そうおもいます"}, + {en="I'm bored",ja="たいくつしてる"}, + {en="I'm confused",ja="まよってる、こんんわくしてる"}, + {en="I'm hungry",ja="おなかがすいた"}, + {en="I'm sleepy",ja="ねむたい"}, + {en="I'm sorry",ja="ごめんなさい"}, + {en="I'm sorry (Sympathy)",ja="ざんねんです"}, + {en="I'm sorry, I'm still studying Japanese",ja="ごめん、日本語勉強しますー"}, + {en="I'm sorry I understand now",ja="ごめんわかった"}, + {en="I really like it!",ja="ほんとに好きです"}, + {en="It's freezing",ja="こごえそうにさむいです"}, + {en="It's not fair",ja="ふこうへいだ"}, + {en="Just kidding",ja="冗談だよ"}, + {en="lol",ja="www"}, + {en="Leave me alone",ja="ほっといて"}, + {en="Me too",ja="私も"}, + {en="No thanks",ja="いいえけっこです"}, + {en="Not bad",ja="まあ々"}, + {en="Okay",ja="いいよ"}, + {en="Of course",ja="もちろん"}, + {en="Oh, I see",ja="なるほんど"}, + {en="One moment please",ja="ちょっと待って下さい"}, + {en="Probably",ja="たぶん"}, + {en="Sleeping",ja="ねている"}, + {en="Wake up",ja="おきて"}, + {en="What's up?",ja="最近どうですか"}, + {en="Whoops",ja="あら々"}, + {en="Yes",ja="はいー"}, + {en="You're welcome",ja="どういたしまして"}, + + {en="Any ideas?",ja="あなたがどんな考えを持っていますか"}, + {en="Are you okay?",ja="大丈夫ですか"}, + {en="Can I help you?",ja="お手伝いしましょうか"}, + {en="Can you help me?",ja="手伝ってくれますか"}, + {en="Can you say it again?",ja="もういちど言ってくれますか"}, + {en="Can you type Roman letters?",ja="ロマジでうってもらえますか"}, + {en="Do you need it?",ja="いりませんか"}, + {en="Do you understand?",ja="わかりますか"}, + {en="Do you want to party?",ja="パーティーをくみませんか"}, + {en="Does anyone speak English?",ja="だれが英語を話しますか"}, + {en="Don’t be surprised if mistakes are made",ja="まちがいごあってもおどろかないで下さい"}, + {en="Give me a minute to look that up",ja="どういういみかしらべるからちょっとまって下さい"}, + {en="How?",ja="ほのように"}, + {en="How are you?",ja="お元気ですか"}, +--How Do You Say ___ in JP || ___wa nihongo de nan to iimasuka || __ は日本語で何と言いますか"}, + {en="How much is this",ja="これはいくらですか"}, + {en="How soon?",ja="どのくらいすぐに"}, + {en="I don’t understand Japanese characters",ja="日本語のもじはわかりません"}, + {en="I need to practice my Japanese",ja="日本語を練習する必要があります"}, + {en="Linkshell",ja="リンクシェル"}, + {en="Look For a replacement?",ja="ぬけたいのでほじゅうをさがして下さい"}, + {en="My Japanese is not good",ja="私の日本語はよくないです"}, + {en="My Japanese is bad",ja="私の日本語はへたです"}, + {en="Shall we go?",ja="行きましょか"}, + {en="What?",ja="何"}, +-- {en="What is ___? || ___ wa nandesu ka? || ___はなんですか"}, + {en="What's next?",ja="つぎわなんですか"}, + {en="What's that called in Japanese?",ja="あれは日本語で何といいますか"}, + {en="What's your job?",ja="どんなジョブをしているの"}, + {en="Where?",ja="どこ"}, + {en="Where are you?",ja="どこにいますか"}, + {en="When?",ja="いつ"}, + {en="Which?",ja="どんな"}, + {en="Who?",ja="だれ"}, + {en="Why?",ja="なぜ"}, + +--Common Areas/NMs & Events: + {en="Promathia",ja="プロマシア"}, + {en="Ronfaure",ja="ロンフォール"}, + {en="Gustaberg",ja="グスタベルグ"}, + {en="Sarutabaruta",ja="サルタバルタ"}, + {en="Hahava",ja="ハハヴァ"}, + {en="Celaeno",ja="セラエノ"}, + {en="Voidwrought",ja="ヴォイドロート"}, + {en="Kaggen",ja="カッゲン"}, + {en="Akvan",ja="アクヴァン"}, + {en="Pil",ja="フィル"}, + {en="Qilin",ja="ちーりん"}, + {en="Uptala",ja="ウプタラ"}, + {en="Aello",ja="アイエロ"}, + {en="Gaunab",ja="ガウナブ"}, + {en="Ocythoe",ja="オシトエ"}, + {en="Kalasutrax",ja="カラストラクス"}, + {en="Ig-Alima",ja="イッグアリマ"}, + {en="Botulus Rex",ja="ボチュルス・レックス"}, + {en="Morta",ja="モルタ"}, + {en="Bismarck",ja="ビスマルク"}, + {en="Provenance Fights",ja="真界"}, + {en="Provenance Watcher",ja="水晶龍"}, + {en="Colkhab",ja="コルカブ"}, + {en="Muyingwa",ja="ムイングワ"}, + {en="Tchakka",ja="チャッカ"}, + {en="Dakuwaqa",ja="ダクワカ"}, + {en="Achuka",ja="アチュカ"}, + {en="Tojil",ja="トヒル"}, + {en="Hurkan",ja="フルカン"}, + {en="Yumcax",ja="ユムカクス"}, + {en="Kumhau",ja="クムハウ"}, +-- Kazanaru Palace – カザナル宮外郭 --? + {en="Abyssea",ja="アビセア"}, + {en="Caturae",ja="カトゥラエ"}, + {en="Legion",ja="レギオン"}, + {en="Nyzul",ja="ナイズル"}, + {en="Maze Mongers",ja="モブリンズメイズモンガー"}, + {en="Dynamis",ja="デュナミス"}, + {en="Einherjar",ja="エインヘリヤル"}, + {en="Salvage",ja="サルベージ"}, + {en="Walk of Echoes",ja="ウォークオブエコーズ"}, + {en="Meeble Burrows",ja="ミーブルバローズ"}, + {en="Assaults",ja="アサルト"}, + {en="Limbus",ja="リンバス"}, + {en="Garrison",ja="ガリスン"}, + {en="Grounds of Valor",ja="グラウンドオブヴァラー"}, + {en="Fields of Valor",ja="フィールドオブヴァラー"}, + {en="Brenner",ja="ブレンナー"}, + {en="Ballista",ja="バリスタ"}, + {en="Colonization",ja="コロナイズ"}, + {en="Lair Reive",ja="レイアレイヴ"}, + {en="Wildskeeper Reive",ja="ワイルドキーパーレイヴ"}, + {en="Skirmish",ja="スカーム"}, + {en="Delve",ja="メナス"}, + {en="Ark Angel",ja="アークガーディアン"}, + {en="Divine Might",ja="神威"}, + {en="North",ja="北"}, + {en="East",ja="東"}, + {en="South",ja="南"}, + {en="West",ja="西"}, + + -- Things you should know + {en="Polearm",ja="やり"}, + {en="Automaton",ja="オートマトン"}, + {en="Instrument",ja="楽器"}, + {en="Ability",ja="アビリティ"}, + {en="Wyvern",ja="飛竜"}, + {en="Pet",ja="ペット"}, + {en="Pet",ja="よぶだす"}, + + + -- Useful words + {en="Synergy",ja="相乗効果"}, + {en="Carbuncle",ja="カーバンクル"}, + {en="Fenrir",ja="フェンリル"}, + {en="Ifrit",ja="イフリート"}, + {en="Titan",ja="タイタン"}, + {en="Leviathan",ja="リヴァイアサン"}, + {en="Garuda",ja="ガルーダ"}, + {en="Shiva",ja="シヴァ"}, + {en="Ramuh",ja="ラムウ"}, + {en="Diabolos",ja="ディアボロス"}, + {en="Odin",ja="オーディン"}, + {en="Alexander",ja="アレキサンダー"}, + {en="Cait Sith",ja="ケット・シー"}, + + + {en="Weakness",ja="弱点"}, + {en="Trigger",ja="狙って"}, + {en="Blue",ja="青"}, + {en="Red",ja="赤"}, + {en="Yellow",ja="黄"}, + {en="White",ja="白"}, + {en="Black",ja="黒"}, + {en="Silver",ja="銀"}, + {en="Gold",ja="金"}, + {en="Armor",ja="装束"}, + {en="Chest",ja="宝箱"}, + {en="Body",ja="胴"}, + {en="Hands",ja="両手"}, + {en="Legs",ja="両足"}, + {en="Head",ja="頭"}, + {en="Feet",ja="両足"}, + {en="Ring",ja="指"}, + {en="Ear",ja="耳"}, + {en="Back",ja="背"}, + {en="Waist",ja="腰"}, + {en="Lucky Roll",ja="ラッキーロール"}, + {en="Wide Scan",ja="広域スキャン"}, + {en="Charm",ja="あやつる"}, + {en="Snapshot",ja="スナップショット"}, + {en="Double Attack",ja="ダブルアタック"}, + {en="Artifact",ja="アーティファクト"}, + {en="Records of Eminence",ja="エミネンスレコード"}, + {en="Monstrosity",ja="モンストロス"}, + {en="Trust",ja="フェイス"}, + {en="Very Easy",ja="とてもやさしい"}, + {en="Easy",ja="やさしい"}, + {en="Normal",ja="ふつう"}, + {en="Difficult",ja="むずかしい"}, + {en="Very Difficult",ja="とてもむずかしい"}, + {en="Hume",ja="ヒュム"}, + {en="Tarutaru",ja="タルタル"}, + {en="Elvaan",ja="エルヴァーン"}, + {en="Teleport",ja="テレポ"}, + {en="Byne Bill",ja="バイン紙幣"}, + {en="Bronzepiece",ja="オルデール銅貨"}, + {en="Whiteshell",ja="トゥクク白貝貨"}, + {en="Alexandrite",ja="アレキサンドライト"}, + {en="Ancient Beastcoins",ja="獣人古銭"}, + {en="Relic",ja="レリック"}, + {en="Mythic",ja="ミシック"}, + {en="Empyrean",ja="エンピリアン"}, + {en="Sneak and Invisible",ja="インスニ"}, + {en="Aegis and Ochain",ja="イーハン"}, + {en="Overkilled",ja="オーバーキル"}, + {en="Overfished",ja="乱獲"}, + {en="Carby pull",ja="カーバンクルマラソン"}, + {en="set up a Magic Burst",ja="マジックバースト"}, + {en="Skill-up party",ja="スキル上げパーティ"}, + {en="zombie it",ja="ゾンビアタック"}, + {en="Plasm farming",ja="メナポ"}, + {en="Falling asleep",ja="寝落ち"}, + {en="losing claim",ja="横取り"}, + + + -- 10/4/14 update + {en="Dismemberment Brigade",ja="八つ裂き旅団"}, + {en="The Worm's Turn",ja="地竜大王"}, + {en="Grimshell Shocktroopers",ja="鉄甲突撃隊"}, + {en="Steamed Sprouts",ja="居候妖精"}, + {en="Divine Punishers",ja="天誅六人衆"}, + {en="Brothers D'Aurphe",ja="ドーフェ兄弟"}, + {en="Legion XI Comitatensis",ja="第11軍団独立支隊"}, + {en="Amphibian Assault",ja="潜行特務隊"}, + {en="Jungle Boogymen",ja="特命介錯人"}, + {en="Shadow Lord",ja="闇王"}, + {en="Kindred Spirits",ja="蒼の血族"}, + {en="Kam'lanaut",ja="カムラナート"}, + {en="Eald'narche",ja="エルドナーシュ"}, + {en="Ouryu",ja="オウリュウ"}, + {en="Tenzen",ja="テンゼン"}, + {en="Shikaree",ja="シカレー"}, + {en="Puppet in Peril",ja="ランスロード"}, + {en="Gessho",ja="ゲッショー"}, + {en="Incursion",ja="インカージョン"}, + {en="Ymmr",ja="イムル"}, + {en="Ignor",ja="イグノア"}, + {en="Durs",ja="ダルス"}, + {en="Tryl",ja="ダルス"}, + {en="Liij",ja="リッジ"}, + {en="Gramk",ja="グラムク"}, + {en="Utkux",ja="アットクックス"}, + {en="Wopket",ja="ウォップケット"}, + {en="Cailimh",ja="カイルイム"}, + {en="Surge",ja="サージ"}, + {en="Endowed",ja="エンダウ"}, +} + +return dict
\ No newline at end of file diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/translate/katakana_to_romanji.lua b/Data/BuiltIn/Libraries/lua-addons/addons/translate/katakana_to_romanji.lua new file mode 100644 index 0000000..40fcd83 --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/translate/katakana_to_romanji.lua @@ -0,0 +1,116 @@ + +katakana_to_romanji = { + {en="a",ja="ア"}, + {en="i",ja="イ"}, + {en="u",ja="ウ"}, + {en="e",ja="エ"}, + {en="o",ja="オ"}, + {en="ka",ja="カ"}, + {en="ki",ja="キ"}, + {en="ku",ja="ク"}, + {en="ke",ja="ケ"}, + {en="ko",ja="コ"}, + {en="sa",ja="サ"}, + {en="si",ja="シ"}, + {en="su",ja="ス"}, + {en="se",ja="セ"}, + {en="so",ja="ソ"}, + {en="ta",ja="タ"}, + {en="ti",ja="チ"}, + {en="tu",ja="ツ"}, + {en="te",ja="テ"}, + {en="to",ja="ト"}, + {en="na",ja="ナ"}, + {en="ni",ja="ニ"}, + {en="nu",ja="ヌ"}, + {en="ne",ja="ネ"}, + {en="no",ja="ノ"}, + {en="ha",ja="ハ"}, + {en="hi",ja="ヒ"}, + {en="hu",ja="フ"}, + {en="he",ja="ヘ"}, + {en="ho",ja="ホ"}, + {en="ma",ja="マ"}, + {en="mi",ja="ミ"}, + {en="mu",ja="ム"}, + {en="me",ja="メ"}, + {en="mo",ja="モ"}, + {en="ya",ja="ヤ"}, + {en="yu",ja="ユ"}, + {en="yo",ja="ヨ"}, + {en="ra",ja="ラ"}, + {en="ri",ja="リ"}, + {en="ru",ja="ル"}, + {en="re",ja="レ"}, + {en="ro",ja="ロ"}, + {en="wa",ja="ワ"}, + {en="wi",ja="ヰ"}, + {en="we",ja="ヱ"}, + {en="wo",ja="ヲ"}, + + {en="ga",ja="ガ"}, + {en="gi",ja="ギ"}, + {en="gu",ja="グ"}, + {en="ge",ja="ゲ"}, + {en="go",ja="ゴ"}, + {en="za",ja="ザ"}, + {en="ji",ja="ジ"}, + {en="zu",ja="ズ"}, + {en="ze",ja="ゼ"}, + {en="zo",ja="ゾ"}, + {en="da",ja="ダ"}, + {en="ji",ja="ヂ"}, + {en="zu",ja="ヅ"}, + {en="de",ja="デ"}, + {en="do",ja="ド"}, + {en="ba",ja="バ"}, + {en="bi",ja="ビ"}, + {en="bu",ja="ブ"}, + {en="be",ja="ベ"}, + {en="bo",ja="ボ"}, + {en="pa",ja="パ"}, + {en="pi",ja="ピ"}, + {en="pu",ja="プ"}, + {en="pe",ja="ペ"}, + {en="po",ja="ポ"}, + + {en="n",ja="ン"}, + + {en="kya",ja="キャ"}, + {en="kyu",ja="キュ"}, + {en="kyo",ja="キョ"}, + {en="sha",ja="シャ"}, + {en="shu",ja="シュ"}, + {en="sho",ja="ショ"}, + {en="cha",ja="チャ"}, + {en="chu",ja="チュ"}, + {en="cho",ja="チョ"}, + {en="nya",ja="ニャ"}, + {en="nyu",ja="ニュ"}, + {en="nyo",ja="ニョ"}, + {en="hya",ja="ヒャ"}, + {en="hyu",ja="ヒュ"}, + {en="hyo",ja="ヒョ"}, + {en="mya",ja="ミャ"}, + {en="myu",ja="ミュ"}, + {en="myo",ja="ミョ"}, + {en="rya",ja="リャ"}, + {en="ryu",ja="リュ"}, + {en="ryo",ja="リョ"}, + + {en="gya",ja="ギャ"}, + {en="gyu",ja="ギュ"}, + {en="gyo",ja="ギョ"}, + {en="ja",ja="ジャ"}, + {en="ju",ja="ジュ"}, + {en="jo",ja="ジョ"}, + {en="ja",ja="ヂャ"}, + {en="ju",ja="ヂュ"}, + {en="jo",ja="ヂョ"}, + {en="bya",ja="ビャ"}, + {en="byu",ja="ビュ"}, + {en="byo",ja="ビョ"}, + {en="pya",ja="ピャ"}, + {en="pyu",ja="ピュ"}, + {en="pyo",ja="ピョ"}, +}
\ No newline at end of file diff --git a/Data/BuiltIn/Libraries/lua-addons/addons/translate/translate.lua b/Data/BuiltIn/Libraries/lua-addons/addons/translate/translate.lua new file mode 100644 index 0000000..a33bbda --- /dev/null +++ b/Data/BuiltIn/Libraries/lua-addons/addons/translate/translate.lua @@ -0,0 +1,398 @@ +--Copyright (c) 2014~2020, Byrthnoth +--All rights reserved. + +--Redistribution and use in source and binary forms, with or without +--modification, are permitted provided that the following conditions are met: + +-- * Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- * Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- * Neither the name of <addon name> nor the +-- names of its contributors may be used to endorse or promote products +-- derived from this software without specific prior written permission. + +--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +--ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +--WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +--DISCLAIMED. IN NO EVENT SHALL <your name> BE LIABLE FOR ANY +--DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +--(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +--LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +--ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +--(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +_addon.name = 'Translate' +_addon.version = '2.0.0.0' +_addon.author = 'Byrth' +_addon.commands = {'trans','translate'} + + +language = 'english' +trans_list = {} +res = require 'resources' +require 'sets' +require 'lists' +require 'pack' +require 'strings' +require 'katakana_to_romanji' +search_comment = {ts = 0, reg = L{}, translated = false} + +handled_resources = S{ + 'ability_recasts', + 'auto_translates', + 'buffs', + 'days', + 'elements', + 'items', + 'job_abilities', + 'job_traits', + 'jobs', + 'key_items', + 'monster_abilities', + 'monstrosity', + 'moon_phases', + 'races', + 'regions', + 'skills', + 'spells', + 'titles', + 'weapon_skills', + 'weather', + 'zones' + } + +green_open = string.char(0xEF,0x27) +red_close = string.char(0xEF,0x28) + +green_col = ''--string.char(0x1E,2) +rcol = ''--string.char(0x1E,1) + +local temp_str + +function to_a_code(num) + local first_byte,second_byte = math.floor(num/256),num%256 + if first_byte == 0 or second_byte == 0 then return nil end + return string.char(0xFD,2,2,first_byte,second_byte,0xFD):escape() + -- 0xFD,2,2,8,37,0xFD :: 37 = % +end + +function to_item_code(id) + local first_byte,second_byte = math.floor(id/256),id%256 + local t = 0x07 + if first_byte == 0 then + t = 0x09 + first_byte = 0xFF + elseif second_byte == 0 then + t = 0x0A + second_byte = 0xFF + end + return string.char(0xFD,t,2,first_byte,second_byte,0xFD):escape() +end + +function to_ki_code(id) + local first_byte,second_byte = math.floor(id/256),id%256 + local t = 0x13 + if first_byte == 0 then + t = 0x15 + first_byte = 0xFF + elseif second_byte == 0 then + t = 0x16 + second_byte = 0xFF + end + return string.char(0xFD,t,2,first_byte,second_byte,0xFD):escape() +end + +function sanity_check(ja) + return (ja and string.len(ja) > 0 and ja ~= '%.') +end + +function load_dict(dict) + for _,res_line in pairs(dict) do + local jp = windower.to_shift_jis(res_line.ja or ''):escape() + local jps = windower.to_shift_jis(res_line.jas or ''):escape() + if sanity_check(jp) and sanity_check(res_line.en) and jp~= res_line.en:escape() then + trans_list[jp] = green_col..res_line.en..rcol + end + if sanity_check(jps) and sanity_check(res_line.ens) and jps ~= res_line.ens:escape() then + trans_list[jps] = green_col..res_line.ens..rcol + end + end +end + +load_dict(katakana_to_romanji) + +for res_name in pairs(handled_resources) do + local resource = res[res_name] or {} + if res_name == 'auto_translates' then + for autotranslate_code,res_line in pairs(resource) do + local jp = windower.to_shift_jis(res_line.ja or ''):escape() + if sanity_check(jp) and not trans_list[jp] and jp ~= res_line.en:escape() then + trans_list[jp] = to_a_code(autotranslate_code) + end + end + elseif res_name == 'items' then + for id,res_line in pairs(resource) do + local jp = windower.to_shift_jis(res_line.ja or ''):escape() + if sanity_check(jp) and not trans_list[jp] and jp ~= res_line.en:escape() then + trans_list[jp] = to_item_code(id) + end + end + elseif res_name == 'key_items' then + for id,res_line in pairs(resource) do + local jp = windower.to_shift_jis(res_line.ja or ''):escape() + if sanity_check(jp) and not trans_list[jp] and jp ~= res_line.en:escape() then + trans_list[jp] = to_ki_code(id) + end + end + elseif res_name == 'jobs' then + for _,res_line in pairs(resource) do + local jp = windower.to_shift_jis(res_line.ja or ''):escape() + local jps = windower.to_shift_jis(res_line.jas or ''):escape() + if sanity_check(jp) and sanity_check(res_line.en) and jp ~= res_line.en:escape() then + trans_list[jp] = green_col..res_line.en..rcol:escape() + end + if sanity_check(jps) and sanity_check(res_line.ens) and jp ~= res_line.en:escape() and jps ~= res_line.ens:escape() and res_line.ens ~= 'PUP' then + trans_list[jps] = green_col..res_line.ens..rcol:escape() + end + end + else + for _,res_line in pairs(resource) do + local jp = windower.to_shift_jis(res_line.ja or ''):escape() + local jps = windower.to_shift_jis(res_line.jas or ''):escape() + if sanity_check(jp) and not trans_list[jp] and sanity_check(res_line.en) and jp ~= res_line.en:escape() then + trans_list[jp] = green_col..res_line.en..rcol:escape() + end + if sanity_check(jps) and not trans_list[jps] and sanity_check(res_line.ens) and jp ~= res_line.en:escape() and jps ~= res_line.ens:escape() then + trans_list[jps] = green_col..res_line.ens..rcol:escape() + end + end + end +end + +local custom_dict_names = S(windower.get_dir(windower.addon_path..'dicts/')):filter(string.endswith-{'.lua'}):map(string.sub-{1, -5}) +for dict_name in pairs(custom_dict_names) do + local dict = dofile(windower.addon_path..'dicts/'..dict_name..'.lua') + if dict then + load_dict(dict) + end +end + +function print_bytes(str) + local c = '' + local i = 1 + while i <= #str do + c = c..' '..str:byte(i) + i = i + 1 + end + return c +end + +trans_list[string.char(0x46)] = nil +trans_list['\.'] = nil + + +windower.register_event('incoming chunk',function(id,orgi,modi,is_injected,is_blocked) + if id == 0x17 and not is_injected and not is_blocked then + local out_text = modi:unpack('z',0x18) + + out_text = translate_phrase(out_text) + + if not out_text then return end + + if show_original then windower.add_to_chat(8,modi:sub(9,0x17):unpack('z',1)..'[Original]: '..modi:unpack('z',0x18)) end + while #out_text > 0 do + local boundary = get_boundary_length(out_text,151) + local len = math.ceil((boundary+1+23)/2) -- Make sure there is at least one nul after the string + local out_pack = string.char(0x17,len)..modi:sub(3,0x17)..out_text:sub(1,boundary) + + -- zero pad it + while #out_pack < len*2 do + out_pack = out_pack..string.char(0) + end + windower.packets.inject_incoming(0x17,out_pack) + out_text = out_text:sub(boundary+1) + end + return true + end +end) + +function translate_phrase(out_text) + local matches,match_bool = {},false + local function make_matches(catch) + -- build a table of matches indexed by their length + local esc = catch:escape() + if not sanity_check(esc) then return end + + + + if not matches[#catch] then + matches[#catch] = {} + end + matches[#catch][#matches[#catch]+1] = esc + match_bool = true + end + for jp,en in pairs(trans_list) do + out_text:gsub(jp,make_matches) + end + + if not match_bool then return end + + local order = {} + for len,_ in pairs(matches) do + local c,found = 1,false + while c <= #order do + if len > order[c] then + table.insert(order,c,len) + found = true + break + end + c = c + 1 + end + if c > #order then order[c] = len end + end + + for _,ind in ipairs(order) do + for _,option in ipairs(matches[ind]) do + out_text = sjis_gsub(out_text,unescape(option),unescape(trans_list[option])) + end + end + return out_text +end + +function get_boundary_length(str,limit) + -- If it is already short enough, return it + if #str <= limit then return #str end + + local lim = 0 + for i= 1,#str do + local c_byte = str:byte(i) + if c_byte == 0xFD then + i = i + 6 + elseif ( (c_byte > 0x7F and c_byte <= 0xA0) or c_byte >= 0xE0) then + i = i + 2 + else + i = i + 1 + end + if i > limit then + return lim + else + lim = i + end + end + + -- Otherwise, try to pick a spot to split that will not interfere with command codes and such +--[[ local boundary = limit + for i=limit-5,limit do + local c_byte = str:byte(i) + if c_byte ==0xFD then + -- 0xFD: Autotranslate code, 6 bytes + boundary = i-1 + break + elseif c_byte == 0xEF and str:byte(i+1) == 0x27 then + -- Opening green ( + boundary = i-1 + break + elseif i == limit and ( (c_byte > 0x7F and c_byte <= 0xA0) or c_byte >= 0xE0) then + -- Double-byte shift_JIS character + boundary = i-1 + break + end + end + return boundary]] +end + +windower.register_event('addon command', function(...) + local commands = {...} + if not commands[1] then return end + if commands[1]:lower() == 'show' then + if commands[2] and commands[2]:lower() == 'original' then + show_original=not show_original + if show_original then + print('Translate: Showing the original text line.') + else + print('Translate: Hiding the original text line.') + end + end + elseif commands[1]:lower() == 'eval' and commands[2] then + table.remove(commands,1) + assert(loadstring(table.concat(commands, ' ')))() + end +end) + +windower.register_event('incoming text',function(org,mod,ocol,mcol,blk) + if not blk and ocol == 204 then + local ret = translate_phrase(mod) + temp_str = ret or org + if ret then + if show_original then + windower.add_to_chat:schedule(0.3, 8,'[Original]: '..org) + end + mod = ret + if org == temp_str then + blk = true + temp_str = '' + end + return blk and blk or mod + end + end +end) + +function unescape(str) + return (str:gsub('%%([%%%%^%$%*%(%)%.%+%?%-%]%[])','%1')) +end + + +-- Two problems with how I currently do this: +-- 1: It is possible to have something like 0x94, (0x92, 0x8B,) 0xE1, which are two JP characters that contain a third. +-- 2: It is possible to have a gsub replace something with an autotranslate code, which then causes a later dictionary +-- option to match part of the replacement. +-- If I solve #1, will #2 be an issue? No, it should not be. + +function sjis_gsub(str,pattern,rep) + if not (type(rep) == 'function' or type(rep) == 'string') then return str end + local str_len,pat_len,ret_str = string.len(str),string.len(pattern),str + local i = 1 + while i<=str_len-pat_len+1 do + local c_byte = str:byte(i) + if str:sub(i,i+pat_len-1) == pattern then + if type(rep) == 'function' then + ret_str = rep(pattern) or str + -- No recursion for functions at the moment, because this addon doesn't need it + return + elseif type(rep) == 'string' then + if i ~= 1 then + -- Not the beginning + ret_str = str:sub(1,i-1)..rep + else + -- The beginning + ret_str = rep + end + if i+pat_len <= str_len-pat_len+1 then + -- i == 13, pat_len == 2, str_len == 16 + -- Match is characters 13 and 14. Could conceivably match again to characters 15 and 16. + + -- Send the remainder of the string back through recursively. + return ret_str..sjis_gsub(str:sub(i+pat_len),pattern,rep) + elseif i+pat_len <= str_len then + -- i == 14, pat_len == 2, str_len == 16 + -- Match is characters 14 and 15, so 16 can't possibly be a match but needs to be stuck on there + return ret_str..str:sub(i+pat_len) + else + -- i == 15, pat_len == 2, str_len == 16 + -- Match is characters 15 and 16, so no further addition is necessary + return ret_str + end + end + elseif c_byte == 0xFD then + i = i + 6 + elseif ( (c_byte > 0x7F and c_byte <= 0xA0) or c_byte >= 0xE0) then + i = i + 2 + else + i = i + 1 + end + end + return ret_str +end |