summaryrefslogtreecommitdiff
path: root/Data/BuiltIn/Libraries/lua-addons/addons/translate
diff options
context:
space:
mode:
Diffstat (limited to 'Data/BuiltIn/Libraries/lua-addons/addons/translate')
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/translate/ReadMe.txt13
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/translate/dicts/bgthread_guide.lua169
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/translate/dicts/captainhowdy_guide.lua352
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/translate/katakana_to_romanji.lua116
-rw-r--r--Data/BuiltIn/Libraries/lua-addons/addons/translate/translate.lua398
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