From 7789424a08f8910d0501ed41c86816a7731e0fc2 Mon Sep 17 00:00:00 2001 From: wish Date: Mon, 7 Nov 2022 00:35:45 +1100 Subject: [PATCH 1/9] initial multi-language concept --- patch-schema/language.sql | 6 ++++++ server/channelserver/handlers.go | 2 ++ server/channelserver/handlers_cafe.go | 3 ++- server/channelserver/handlers_lang.go | 21 +++++++++++++++++++++ server/channelserver/sys_session.go | 2 ++ 5 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 patch-schema/language.sql create mode 100644 server/channelserver/handlers_lang.go diff --git a/patch-schema/language.sql b/patch-schema/language.sql new file mode 100644 index 000000000..d3440d6e1 --- /dev/null +++ b/patch-schema/language.sql @@ -0,0 +1,6 @@ +BEGIN; + +ALTER TABLE IF EXISTS public.users + ADD COLUMN IF NOT EXISTS language text NOT NULL DEFAULT 'en'; + +END; \ No newline at end of file diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index b1af93beb..462a3318e 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -141,6 +141,8 @@ func handleMsgSysLogin(s *Session, p mhfpacket.MHFPacket) { s.charID = pkt.CharID0 s.token = pkt.LoginTokenString s.Unlock() + + s.dict = getLangStrings(s) updateRights(s) bf := byteframe.NewByteFrame() bf.WriteUint32(uint32(Time_Current_Adjusted().Unix())) // Unix timestamp diff --git a/server/channelserver/handlers_cafe.go b/server/channelserver/handlers_cafe.go index d91806a93..e0d967d2a 100644 --- a/server/channelserver/handlers_cafe.go +++ b/server/channelserver/handlers_cafe.go @@ -89,7 +89,8 @@ func handleMsgMhfGetCafeDuration(s *Session, p mhfpacket.MHFPacket) { } bf.WriteUint32(cafeTime) // Total cafe time bf.WriteUint16(0) - ps.Uint16(bf, fmt.Sprintf("Resets on %s %d", cafeReset.Month().String(), cafeReset.Day()), true) + ps.Uint16(bf, fmt.Sprintf(s.dict["cafeReset"], int(cafeReset.Month()), cafeReset.Day()), true) + doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } diff --git a/server/channelserver/handlers_lang.go b/server/channelserver/handlers_lang.go new file mode 100644 index 000000000..5d413ac85 --- /dev/null +++ b/server/channelserver/handlers_lang.go @@ -0,0 +1,21 @@ +package channelserver + +import "go.uber.org/zap" + +func getLangStrings(s *Session) map[string]string { + var lang string + strings := make(map[string]string) + err := s.server.db.QueryRow(`SELECT language FROM users, characters WHERE characters.id = $1 AND users.id = characters.user_id`, s.charID).Scan(&lang) + if err != nil { + s.logger.Warn("No language set for user", zap.Uint32("CID", s.charID)) + } + switch lang { + case "jp": + strings["language"] = "日本語" + strings["cafeReset"] = "%d/%dにリセット" + default: + strings["language"] = "English" + strings["cafeReset"] = "Resets on %d/%d" + } + return strings +} diff --git a/server/channelserver/sys_session.go b/server/channelserver/sys_session.go index 39a96f40f..669f820c1 100644 --- a/server/channelserver/sys_session.go +++ b/server/channelserver/sys_session.go @@ -47,6 +47,8 @@ type Session struct { kqf []byte kqfOverride bool + dict map[string]string + semaphore *Semaphore // Required for the stateful MsgSysUnreserveStage packet. // A stack containing the stage movement history (push on enter/move, pop on back) From 10b2ddcfd722f606b1634f00e8f1aa1dd8c6beef Mon Sep 17 00:00:00 2001 From: wish Date: Wed, 9 Nov 2022 23:50:40 +1100 Subject: [PATCH 2/9] map language to server instead of session --- config/config.go | 1 + patch-schema/language.sql | 6 ------ server/channelserver/handlers.go | 1 - server/channelserver/handlers_cafe.go | 2 +- server/channelserver/handlers_lang.go | 11 ++--------- server/channelserver/sys_channel_server.go | 5 +++++ server/channelserver/sys_session.go | 2 -- 7 files changed, 9 insertions(+), 19 deletions(-) delete mode 100644 patch-schema/language.sql diff --git a/config/config.go b/config/config.go index bfe11032e..202af3543 100644 --- a/config/config.go +++ b/config/config.go @@ -14,6 +14,7 @@ import ( type Config struct { Host string `mapstructure:"Host"` BinPath string `mapstructure:"BinPath"` + Language string DisableSoftCrash bool // Disables the 'Press Return to exit' dialog allowing scripts to reboot the server automatically FeaturedWeapons int // Number of Active Feature weapons to generate daily HideLoginNotice bool // Hide the Erupe notice on login diff --git a/patch-schema/language.sql b/patch-schema/language.sql deleted file mode 100644 index d3440d6e1..000000000 --- a/patch-schema/language.sql +++ /dev/null @@ -1,6 +0,0 @@ -BEGIN; - -ALTER TABLE IF EXISTS public.users - ADD COLUMN IF NOT EXISTS language text NOT NULL DEFAULT 'en'; - -END; \ No newline at end of file diff --git a/server/channelserver/handlers.go b/server/channelserver/handlers.go index 462a3318e..50039b27c 100644 --- a/server/channelserver/handlers.go +++ b/server/channelserver/handlers.go @@ -142,7 +142,6 @@ func handleMsgSysLogin(s *Session, p mhfpacket.MHFPacket) { s.token = pkt.LoginTokenString s.Unlock() - s.dict = getLangStrings(s) updateRights(s) bf := byteframe.NewByteFrame() bf.WriteUint32(uint32(Time_Current_Adjusted().Unix())) // Unix timestamp diff --git a/server/channelserver/handlers_cafe.go b/server/channelserver/handlers_cafe.go index e0d967d2a..e1d005840 100644 --- a/server/channelserver/handlers_cafe.go +++ b/server/channelserver/handlers_cafe.go @@ -89,7 +89,7 @@ func handleMsgMhfGetCafeDuration(s *Session, p mhfpacket.MHFPacket) { } bf.WriteUint32(cafeTime) // Total cafe time bf.WriteUint16(0) - ps.Uint16(bf, fmt.Sprintf(s.dict["cafeReset"], int(cafeReset.Month()), cafeReset.Day()), true) + ps.Uint16(bf, fmt.Sprintf(s.server.dict["cafeReset"], int(cafeReset.Month()), cafeReset.Day()), true) doAckBufSucceed(s, pkt.AckHandle, bf.Data()) } diff --git a/server/channelserver/handlers_lang.go b/server/channelserver/handlers_lang.go index 5d413ac85..3409225ca 100644 --- a/server/channelserver/handlers_lang.go +++ b/server/channelserver/handlers_lang.go @@ -1,15 +1,8 @@ package channelserver -import "go.uber.org/zap" - -func getLangStrings(s *Session) map[string]string { - var lang string +func getLangStrings(s *Server) map[string]string { strings := make(map[string]string) - err := s.server.db.QueryRow(`SELECT language FROM users, characters WHERE characters.id = $1 AND users.id = characters.user_id`, s.charID).Scan(&lang) - if err != nil { - s.logger.Warn("No language set for user", zap.Uint32("CID", s.charID)) - } - switch lang { + switch s.erupeConfig.Language { case "jp": strings["language"] = "日本語" strings["cafeReset"] = "%d/%dにリセット" diff --git a/server/channelserver/sys_channel_server.go b/server/channelserver/sys_channel_server.go index 82f29d03a..3fdcc4861 100644 --- a/server/channelserver/sys_channel_server.go +++ b/server/channelserver/sys_channel_server.go @@ -52,6 +52,9 @@ type Server struct { stagesLock sync.RWMutex stages map[string]*Stage + // Used to map different languages + dict map[string]string + // UserBinary userBinaryPartsLock sync.RWMutex userBinaryParts map[userBinaryPartID][]byte @@ -164,6 +167,8 @@ func NewServer(config *Config) *Server { // MezFes s.stages["sl1Ns462p0a0u0"] = NewStage("sl1Ns462p0a0u0") + s.dict = getLangStrings(s) + return s } diff --git a/server/channelserver/sys_session.go b/server/channelserver/sys_session.go index 669f820c1..39a96f40f 100644 --- a/server/channelserver/sys_session.go +++ b/server/channelserver/sys_session.go @@ -47,8 +47,6 @@ type Session struct { kqf []byte kqfOverride bool - dict map[string]string - semaphore *Semaphore // Required for the stateful MsgSysUnreserveStage packet. // A stack containing the stage movement history (push on enter/move, pop on back) From 94c729a2123b6f7172e660571a6aa90fe30f2ea4 Mon Sep 17 00:00:00 2001 From: wish Date: Wed, 9 Nov 2022 23:51:24 +1100 Subject: [PATCH 3/9] add support for guild scout languages --- config.json | 1 + server/channelserver/handlers_guild_scout.go | 5 ++--- server/channelserver/handlers_lang.go | 4 ++++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/config.json b/config.json index df09b1ceb..af3a0c44f 100644 --- a/config.json +++ b/config.json @@ -1,6 +1,7 @@ { "Host": "127.0.0.1", "BinPath": "bin", + "Language": "en", "DisableSoftCrash": false, "FeaturedWeapons": 1, "HideLoginNotice": true, diff --git a/server/channelserver/handlers_guild_scout.go b/server/channelserver/handlers_guild_scout.go index f47c28bc6..7c7709ec7 100644 --- a/server/channelserver/handlers_guild_scout.go +++ b/server/channelserver/handlers_guild_scout.go @@ -62,10 +62,9 @@ func handleMsgMhfPostGuildScout(s *Session, p mhfpacket.MHFPacket) { mail := &Mail{ SenderID: s.charID, RecipientID: pkt.CharID, - Subject: "Invitation!", + Subject: s.server.dict["guildInviteName"], Body: fmt.Sprintf( - "%s has invited you to join 「%s」\nDo you want to accept?", - getCharacterName(s, s.charID), + s.server.dict["guildInvite"], guildInfo.Name, ), IsGuildInvite: true, diff --git a/server/channelserver/handlers_lang.go b/server/channelserver/handlers_lang.go index 3409225ca..639f8d451 100644 --- a/server/channelserver/handlers_lang.go +++ b/server/channelserver/handlers_lang.go @@ -6,9 +6,13 @@ func getLangStrings(s *Server) map[string]string { case "jp": strings["language"] = "日本語" strings["cafeReset"] = "%d/%dにリセット" + strings["guildInviteName"] = "猟団勧誘のご案内" + strings["guildInvite"] = "猟団「%s」からの勧誘通知です。\n「勧誘に返答」より、返答を行ってください。" default: strings["language"] = "English" strings["cafeReset"] = "Resets on %d/%d" + strings["guildInviteName"] = "Invitation!" + strings["guildInvite"] = "You have been invited to join\n「%s」\nDo you want to accept?" } return strings } From b717aeb9a609d6e6bf2344143fe2548abfc668e2 Mon Sep 17 00:00:00 2001 From: wish Date: Thu, 10 Nov 2022 14:42:29 +1100 Subject: [PATCH 4/9] add support for more strings --- server/channelserver/handlers_guild_scout.go | 16 ++++++------ server/channelserver/handlers_lang.go | 26 ++++++++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/server/channelserver/handlers_guild_scout.go b/server/channelserver/handlers_guild_scout.go index 7c7709ec7..4b45cc93b 100644 --- a/server/channelserver/handlers_guild_scout.go +++ b/server/channelserver/handlers_guild_scout.go @@ -148,30 +148,30 @@ func handleMsgMhfAnswerGuildScout(s *Session, p mhfpacket.MHFPacket) { err = guild.AcceptApplication(s, s.charID) mail = append(mail, Mail{ RecipientID: s.charID, - Subject: "Success!", - Body: fmt.Sprintf("You successfully joined 「%s」.", guild.Name), + Subject: s.server.dict["guildInviteSuccessName"], + Body: fmt.Sprintf(s.server.dict["guildInviteSuccess"], guild.Name), IsSystemMessage: true, }) mail = append(mail, Mail{ SenderID: s.charID, RecipientID: pkt.LeaderID, - Subject: "Accepted", - Body: fmt.Sprintf("%s accepted your invitation to join 「%s」.", s.Name, guild.Name), + Subject: s.server.dict["guildInviteAcceptedName"], + Body: fmt.Sprintf(s.server.dict["guildInviteAccepted"], guild.Name), IsSystemMessage: true, }) } else { err = guild.RejectApplication(s, s.charID) mail = append(mail, Mail{ RecipientID: s.charID, - Subject: "Declined", - Body: fmt.Sprintf("You declined the invitation to join 「%s」.", guild.Name), + Subject: s.server.dict["guildInviteRejectName"], + Body: fmt.Sprintf(s.server.dict["guildInviteReject"], guild.Name), IsSystemMessage: true, }) mail = append(mail, Mail{ SenderID: s.charID, RecipientID: pkt.LeaderID, - Subject: "Declined", - Body: fmt.Sprintf("%s declined your invitation to join 「%s」.", s.Name, guild.Name), + Subject: s.server.dict["guildInviteDeclined"], + Body: fmt.Sprintf(s.server.dict["guildInviteDeclined"], guild.Name), IsSystemMessage: true, }) } diff --git a/server/channelserver/handlers_lang.go b/server/channelserver/handlers_lang.go index 639f8d451..49dec4817 100644 --- a/server/channelserver/handlers_lang.go +++ b/server/channelserver/handlers_lang.go @@ -6,13 +6,39 @@ func getLangStrings(s *Server) map[string]string { case "jp": strings["language"] = "日本語" strings["cafeReset"] = "%d/%dにリセット" + strings["guildInviteName"] = "猟団勧誘のご案内" strings["guildInvite"] = "猟団「%s」からの勧誘通知です。\n「勧誘に返答」より、返答を行ってください。" + + strings["guildInviteSuccessName"] = "" + strings["guildInviteSuccess"] = "" + + strings["guildInviteAcceptedName"] = "" + strings["guildInviteAccepted"] = "" + + strings["guildInviteRejectName"] = "" + strings["guildInviteReject"] = "" + + strings["guildInviteDeclinedName"] = "" + strings["guildInviteDeclined"] = "" default: strings["language"] = "English" strings["cafeReset"] = "Resets on %d/%d" + strings["guildInviteName"] = "Invitation!" strings["guildInvite"] = "You have been invited to join\n「%s」\nDo you want to accept?" + + strings["guildInviteSuccessName"] = "Success!" + strings["guildInviteSuccess"] = "You have successfully joined\n「%s」." + + strings["guildInviteAcceptedName"] = "Accepted" + strings["guildInviteAccepted"] = "The recipient accepted your invitation to join\n「%s」." + + strings["guildInviteRejectName"] = "Rejected" + strings["guildInviteReject"] = "You rejected the invitation to join\n「%s」." + + strings["guildInviteDeclinedName"] = "Declined" + strings["guildInviteDeclined"] = "The recipient declined your invitation to join\n「%s」." } return strings } From 77b907910406fe96092f37fbae06f5c5794d57c0 Mon Sep 17 00:00:00 2001 From: wish Date: Fri, 11 Nov 2022 15:04:08 +1100 Subject: [PATCH 5/9] add JP strings for guild mail --- server/channelserver/handlers_lang.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/channelserver/handlers_lang.go b/server/channelserver/handlers_lang.go index 49dec4817..d34091fd6 100644 --- a/server/channelserver/handlers_lang.go +++ b/server/channelserver/handlers_lang.go @@ -10,17 +10,17 @@ func getLangStrings(s *Server) map[string]string { strings["guildInviteName"] = "猟団勧誘のご案内" strings["guildInvite"] = "猟団「%s」からの勧誘通知です。\n「勧誘に返答」より、返答を行ってください。" - strings["guildInviteSuccessName"] = "" - strings["guildInviteSuccess"] = "" + strings["guildInviteSuccessName"] = "成功" + strings["guildInviteSuccess"] = "あなたは「%s」に参加できました。" - strings["guildInviteAcceptedName"] = "" - strings["guildInviteAccepted"] = "" + strings["guildInviteAcceptedName"] = "承諾されました" + strings["guildInviteAccepted"] = "招待した狩人が「%s」への招待を承諾しました。" - strings["guildInviteRejectName"] = "" - strings["guildInviteReject"] = "" + strings["guildInviteRejectName"] = "却下しました" + strings["guildInviteReject"] = "あなたは「%s」への参加を却下しました" - strings["guildInviteDeclinedName"] = "" - strings["guildInviteDeclined"] = "" + strings["guildInviteDeclinedName"] = "辞退しました" + strings["guildInviteDeclined"] = "招待した狩人が「%s」への招待を辞退しました。" default: strings["language"] = "English" strings["cafeReset"] = "Resets on %d/%d" From a9c1ab80b8b37e3d68c2464765b14742dd8c16c4 Mon Sep 17 00:00:00 2001 From: wish Date: Fri, 11 Nov 2022 18:38:51 +1100 Subject: [PATCH 6/9] add missing period --- server/channelserver/handlers_lang.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/channelserver/handlers_lang.go b/server/channelserver/handlers_lang.go index d34091fd6..c720222b6 100644 --- a/server/channelserver/handlers_lang.go +++ b/server/channelserver/handlers_lang.go @@ -17,7 +17,7 @@ func getLangStrings(s *Server) map[string]string { strings["guildInviteAccepted"] = "招待した狩人が「%s」への招待を承諾しました。" strings["guildInviteRejectName"] = "却下しました" - strings["guildInviteReject"] = "あなたは「%s」への参加を却下しました" + strings["guildInviteReject"] = "あなたは「%s」への参加を却下しました。" strings["guildInviteDeclinedName"] = "辞退しました" strings["guildInviteDeclined"] = "招待した狩人が「%s」への招待を辞退しました。" From 624fc709109408c6cc8bb8e867eadc40c481a7c9 Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 12 Nov 2022 10:43:53 +1100 Subject: [PATCH 7/9] add raviente broadcast translations --- server/channelserver/sys_channel_server.go | 6 +++--- server/channelserver/{handlers_lang.go => sys_language.go} | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) rename server/channelserver/{handlers_lang.go => sys_language.go} (78%) diff --git a/server/channelserver/sys_channel_server.go b/server/channelserver/sys_channel_server.go index 3fdcc4861..233c49a7a 100644 --- a/server/channelserver/sys_channel_server.go +++ b/server/channelserver/sys_channel_server.go @@ -318,11 +318,11 @@ func (s *Server) BroadcastRaviente(ip uint32, port uint16, stage []byte, _type u var text string switch _type { case 2: - text = " is being held!" + text = s.dict["ravienteBerserk"] case 4: - text = " is being held!" + text = s.dict["ravienteExtreme"] case 5: - text = " is being held!" + text = s.dict["ravienteBerserkSmall"] default: s.logger.Error("Unk raviente type", zap.Uint8("_type", _type)) } diff --git a/server/channelserver/handlers_lang.go b/server/channelserver/sys_language.go similarity index 78% rename from server/channelserver/handlers_lang.go rename to server/channelserver/sys_language.go index c720222b6..9ce39c15d 100644 --- a/server/channelserver/handlers_lang.go +++ b/server/channelserver/sys_language.go @@ -6,6 +6,9 @@ func getLangStrings(s *Server) map[string]string { case "jp": strings["language"] = "日本語" strings["cafeReset"] = "%d/%dにリセット" + strings["ravienteBerserk"] = "<大討伐:猛狂期>が開催されました!" + strings["ravienteExtreme"] = "<大討伐:猛狂期【極】>が開催されました!" + strings["ravienteBerserkSmall"] = "<大討伐:猛狂期(小数)>が開催されました!" strings["guildInviteName"] = "猟団勧誘のご案内" strings["guildInvite"] = "猟団「%s」からの勧誘通知です。\n「勧誘に返答」より、返答を行ってください。" @@ -24,6 +27,9 @@ func getLangStrings(s *Server) map[string]string { default: strings["language"] = "English" strings["cafeReset"] = "Resets on %d/%d" + strings["ravienteBerserk"] = " is being held!" + strings["ravienteExtreme"] = " is being held!" + strings["ravienteBerserkSmall"] = " is being held!" strings["guildInviteName"] = "Invitation!" strings["guildInvite"] = "You have been invited to join\n「%s」\nDo you want to accept?" From 5ecaa81b526190bba0c2ed94d9213fb543896a10 Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 12 Nov 2022 12:56:40 +1100 Subject: [PATCH 8/9] raviente string adjustments --- server/channelserver/sys_language.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/channelserver/sys_language.go b/server/channelserver/sys_language.go index 9ce39c15d..28f91c7d3 100644 --- a/server/channelserver/sys_language.go +++ b/server/channelserver/sys_language.go @@ -8,7 +8,7 @@ func getLangStrings(s *Server) map[string]string { strings["cafeReset"] = "%d/%dにリセット" strings["ravienteBerserk"] = "<大討伐:猛狂期>が開催されました!" strings["ravienteExtreme"] = "<大討伐:猛狂期【極】>が開催されました!" - strings["ravienteBerserkSmall"] = "<大討伐:猛狂期(小数)>が開催されました!" + strings["ravienteBerserkSmall"] = "<大討伐:猛狂期(小数)>が開催されました!" strings["guildInviteName"] = "猟団勧誘のご案内" strings["guildInvite"] = "猟団「%s」からの勧誘通知です。\n「勧誘に返答」より、返答を行ってください。" @@ -29,7 +29,7 @@ func getLangStrings(s *Server) map[string]string { strings["cafeReset"] = "Resets on %d/%d" strings["ravienteBerserk"] = " is being held!" strings["ravienteExtreme"] = " is being held!" - strings["ravienteBerserkSmall"] = " is being held!" + strings["ravienteBerserkSmall"] = " is being held!" strings["guildInviteName"] = "Invitation!" strings["guildInvite"] = "You have been invited to join\n「%s」\nDo you want to accept?" From 85bff0cb199441456012857c1af3eb83ac6e999d Mon Sep 17 00:00:00 2001 From: wish Date: Sat, 12 Nov 2022 13:09:59 +1100 Subject: [PATCH 9/9] raviente broadcast fixes --- server/channelserver/sys_channel_server.go | 7 +++++-- server/channelserver/sys_language.go | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/server/channelserver/sys_channel_server.go b/server/channelserver/sys_channel_server.go index 233c49a7a..7c7447dfa 100644 --- a/server/channelserver/sys_channel_server.go +++ b/server/channelserver/sys_channel_server.go @@ -284,6 +284,7 @@ func (s *Server) WorldcastMHF(pkt mhfpacket.MHFPacket, ignoredSession *Session, bf := byteframe.NewByteFrame() bf.WriteUint16(uint16(pkt.Opcode())) pkt.Build(bf, session.clientContext) + bf.WriteUint16(0x0010) session.QueueSendNonBlocking(bf.Data()) } } @@ -319,14 +320,16 @@ func (s *Server) BroadcastRaviente(ip uint32, port uint16, stage []byte, _type u switch _type { case 2: text = s.dict["ravienteBerserk"] - case 4: + case 3: text = s.dict["ravienteExtreme"] + case 4: + text = s.dict["ravienteExtremeLimited"] case 5: text = s.dict["ravienteBerserkSmall"] default: s.logger.Error("Unk raviente type", zap.Uint8("_type", _type)) } - ps.Uint16(bf, text, false) + ps.Uint16(bf, text, true) bf.WriteBytes([]byte{0x5F, 0x53, 0x00}) bf.WriteUint32(ip) // IP address bf.WriteUint16(port) // Port diff --git a/server/channelserver/sys_language.go b/server/channelserver/sys_language.go index 28f91c7d3..1dc917559 100644 --- a/server/channelserver/sys_language.go +++ b/server/channelserver/sys_language.go @@ -8,6 +8,7 @@ func getLangStrings(s *Server) map[string]string { strings["cafeReset"] = "%d/%dにリセット" strings["ravienteBerserk"] = "<大討伐:猛狂期>が開催されました!" strings["ravienteExtreme"] = "<大討伐:猛狂期【極】>が開催されました!" + strings["ravienteExtremeLimited"] = "<大討伐:猛狂期【極】(制限付)>が開催されました!" strings["ravienteBerserkSmall"] = "<大討伐:猛狂期(小数)>が開催されました!" strings["guildInviteName"] = "猟団勧誘のご案内" @@ -29,6 +30,7 @@ func getLangStrings(s *Server) map[string]string { strings["cafeReset"] = "Resets on %d/%d" strings["ravienteBerserk"] = " is being held!" strings["ravienteExtreme"] = " is being held!" + strings["ravienteExtremeLimited"] = " is being held!" strings["ravienteBerserkSmall"] = " is being held!" strings["guildInviteName"] = "Invitation!"