diff --git a/README.md b/README.md index 9437bc2a..ced9ed42 100644 --- a/README.md +++ b/README.md @@ -64,15 +64,9 @@ Access the website by going to [localhost:9999](http://localhost:9999). > nyaa_psql.backup. ## TODO -## High priority -* Torrent data scraping from definable tracker (We have a tracker that the owner is ok for us to scrape from) - * seeds/leeachers - * file lists - * Downloads -* Accounts and Registration System(WIP) - * blocking upload of torrent hashes - -## Lower priority + * improve scraping + * fix up cache bug + * import sukebei torrents into db/work on sukebei * Get code up to standard of go lint recommendations * Write tests * fix sukebei categories diff --git a/model/torrent.go b/model/torrent.go index d3fca060..4db568d3 100644 --- a/model/torrent.go +++ b/model/torrent.go @@ -117,10 +117,10 @@ func (t *Torrent) ToJSON() TorrentJSON { magnet := util.InfoHashToMagnet(strings.TrimSpace(t.Hash), t.Name, config.Trackers...) commentsJSON := make([]CommentJSON, 0, len(t.OldComments)+len(t.Comments)) for _, c := range t.OldComments { - commentsJSON = append(commentsJSON, CommentJSON{Username: c.Username, UserID: -1, Content: template.HTML(c.Content), Date: c.Date}) + commentsJSON = append(commentsJSON, CommentJSON{Username: c.Username, UserID: -1, Content: template.HTML(c.Content), Date: c.Date.UTC()}) } for _, c := range t.Comments { - commentsJSON = append(commentsJSON, CommentJSON{Username: c.User.Username, UserID: int(c.User.ID), Content: util.MarkdownToHTML(c.Content), Date: c.CreatedAt}) + commentsJSON = append(commentsJSON, CommentJSON{Username: c.User.Username, UserID: int(c.User.ID), Content: util.MarkdownToHTML(c.Content), Date: c.CreatedAt.UTC()}) } uploader := "" if t.Uploader != nil { @@ -130,7 +130,8 @@ func (t *Torrent) ToJSON() TorrentJSON { if t.ID <= config.LastOldTorrentID && len(config.TorrentCacheLink) > 0 { torrentlink = fmt.Sprintf(config.TorrentCacheLink, t.Hash) } else if t.ID > config.LastOldTorrentID && len(config.TorrentStorageLink) > 0 { - torrentlink = fmt.Sprintf(config.TorrentStorageLink, t.Hash) // TODO: Fix as part of configuration changes + // TODO: Fix as part of configuration changes (fix what?) + torrentlink = fmt.Sprintf(config.TorrentStorageLink, t.Hash) } res := TorrentJSON{ ID: strconv.FormatUint(uint64(t.ID), 10), diff --git a/public/css/style.css b/public/css/style.css index e66e1a65..db605fde 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -377,4 +377,9 @@ footer { position: relative; top: -0.5rem; float: right; -} \ No newline at end of file +} + +.comment-date { + font-size: smaller; + width: auto; /* Undo bootstrap's fixed width */ +} diff --git a/router/templateFunctions.go b/router/templateFunctions.go index 2ce1c799..2750248b 100644 --- a/router/templateFunctions.go +++ b/router/templateFunctions.go @@ -62,6 +62,7 @@ var FuncMap = template.FuncMap{ return template.HTML(ret) }, "T": i18n.IdentityTfunc, + "Ts": i18n.IdentityTfunc, "getAvatar": func(hash string, size int) string { return "https://www.gravatar.com/avatar/" + hash + "?s=" + strconv.Itoa(size) }, diff --git a/router/userHandler.go b/router/userHandler.go index e90ca472..e534edb4 100755 --- a/router/userHandler.go +++ b/router/userHandler.go @@ -157,6 +157,11 @@ func UserProfileFormHandler(w http.ResponseWriter, r *http.Request) { modelHelper.BindValueForm(&b, r) if !userPermission.HasAdmin(currentUser) { b.Username = currentUser.Username + b.Status = currentUser.Status + } else { + if b.Status == 2 { + err["errors"] = append(err["errors"], "Elevating status to moderator is prohibited") + } } err = modelHelper.ValidateForm(&b, err) if len(err) == 0 { diff --git a/service/user/cookieHelper.go b/service/user/cookieHelper.go index cd32b7b6..b28e5a98 100644 --- a/service/user/cookieHelper.go +++ b/service/user/cookieHelper.go @@ -16,24 +16,6 @@ var cookieHandler = securecookie.New( securecookie.GenerateRandomKey(64), securecookie.GenerateRandomKey(32)) -// TODO: Figure out what this is about before I delete it -// // UserName get username from a cookie. -// func UserName(c *gin.Context) (string, error) { -// var userName string -// request := c.Request -// cookie, err := request.Cookie("session") -// if err != nil { -// return userName, err -// } -// cookieValue := make(map[string]string) -// err = cookieHandler.Decode("session", cookie.Value, &cookieValue) -// if err != nil { -// return userName, err -// } -// userName = cookieValue["name"] -// return userName, nil -// } - func Token(r *http.Request) (string, error) { var token string cookie, err := r.Cookie("session") @@ -90,17 +72,20 @@ func SetCookieHandler(w http.ResponseWriter, email string, pass string) (int, er if isValidEmail { log.Debug("User entered valid email.") if db.ORM.Where("email = ?", email).First(&user).RecordNotFound() { - return http.StatusNotFound, errors.New("user not found") + return http.StatusNotFound, errors.New("User not found") } } else { log.Debug("User entered username.") if db.ORM.Where("username = ?", email).First(&user).RecordNotFound() { - return http.StatusNotFound, errors.New("user not found") + return http.StatusNotFound, errors.New("User not found") } } err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(pass)) if err != nil { - return http.StatusUnauthorized, errors.New("password incorrect") + return http.StatusUnauthorized, errors.New("Password incorrect") + } + if user.Status == -1 { + return http.StatusUnauthorized, errors.New("Account banned") } status, err := SetCookie(w, user.Token) if err != nil { diff --git a/templates/_profile_edit.html b/templates/_profile_edit.html index c5198f00..d549fd80 100644 --- a/templates/_profile_edit.html +++ b/templates/_profile_edit.html @@ -34,7 +34,7 @@ {{end}} - {{ if not (HasAdmin .)}} + {{ if not (HasAdmin $.User)}}
@@ -63,7 +63,7 @@ {{end}}
- {{ if HasAdmin .}} + {{ if HasAdmin $.User}}

{{ T "moderation"}}

@@ -82,7 +82,7 @@ - +
{{ range (index $.FormErrors "status")}} diff --git a/templates/view.html b/templates/view.html index 6de44deb..bc21d0c3 100644 --- a/templates/view.html +++ b/templates/view.html @@ -93,8 +93,11 @@ {{.Username}} {{end}} -
- {{.Date.Year}}/{{.Date.Month}}/{{.Date.Day}} +
+ {{ .Date.Format ( Ts "date_format" ) }} + {{/* output: "2017-05-01 15:30" + Went with "Year-Month-Day" because it's the most unambiguous. + If you want it to be determined by where you're from, be my guest. */}}
{{.Content}} diff --git a/translations/en-us.all.json b/translations/en-us.all.json index b74cbf82..6c94d757 100644 --- a/translations/en-us.all.json +++ b/translations/en-us.all.json @@ -602,5 +602,9 @@ { "id": "profile_edit_page", "translation": "Edit %s's profile" + }, + { + "id":"date_format", + "translation": "2006-01-02 15:04" } ] diff --git a/translations/fr-fr.all.json b/translations/fr-fr.all.json index 29b9da17..5bdc20d1 100644 --- a/translations/fr-fr.all.json +++ b/translations/fr-fr.all.json @@ -586,5 +586,25 @@ { "id": "email_changed", "translation": "L'adresse email a été modifiée avec succès ! Confirmez le changement en cliquant sur le lien envoyé à : %s" + }, + { + "id": "torrent_status", + "translation": "Statut du torrent" + }, + { + "id": "torrent_status_hidden", + "translation": "Invisible" + }, + { + "id": "torrent_status_normal", + "translation": "Normal" + }, + { + "id": "torrent_status_remake", + "translation": "Remake" + }, + { + "id": "profile_edit_page", + "translation": "Éditer le profil de %s" } ] diff --git a/translations/it-it.all.json b/translations/it-it.all.json index 87a1a0b1..40232b8f 100644 --- a/translations/it-it.all.json +++ b/translations/it-it.all.json @@ -578,5 +578,29 @@ { "id": "mark_as_remake", "translation": "Segnala come remake" -} +}, + { + "id": "email_changed", + "translation": "Email cambiata con successo! Dovrai, tuttavia, per confermare cliccare il link mandato a: %s" + }, + { + "id": "torrent_status", + "translation": "Torrent status" + }, + { + "id": "torrent_status_hidden", + "translation": "Nascosto" + }, + { + "id": "torrent_status_normal", + "translation": "Normale" + }, + { + "id": "torrent_status_remake", + "translation": "Remake" + }, + { + "id": "profile_edit_page", + "translation": "Modifica il profilo di %s" + } ] diff --git a/translations/ja-jp.all.json b/translations/ja-jp.all.json index e1878908..415f7000 100644 --- a/translations/ja-jp.all.json +++ b/translations/ja-jp.all.json @@ -5,27 +5,27 @@ }, { "id": "verify_email_title", - "translation": "Nyaapantsuのメールアドレスを確認してください。" + "translation": "【Nyaapantsu】メールアドレスの認証" }, { "id": "verify_email_content", - "translation": "あなたのメールアドレスを確認するため、下のリンクにクリックしてください。" + "translation": "あなたのメールアドレスを認証するには、以下のリンクをクリックします。" }, { "id": "reset_password_title", - "translation": "Nyaapantsuのパスワードを再設定する" + "translation": "【Nyaapantsu】パスワードのリセット" }, { "id": "reset_password_content", - "translation": "パスワードを再設定するため、下のリンクにクリックしてください。" + "translation": "パスワードをリセットするには、以下のリンクをクリックします。" }, { "id":"register_title", - "translation": "新しいアカウントを作成している" + "translation": "新しいアカウントの作成" }, { "id":"signup_box_title", - "translation": "サインアップしてください。いつまでも無料だ" + "translation": "登録しましょう。ずっと無料です" }, { "id":"username", @@ -53,15 +53,15 @@ }, { "id":"terms_conditions_confirm", - "translation": "登録する をクリックすることにより、Cookieの使用を含む、本サイトで規定されている 利用規約に同意するものとします。" + "translation": "登録する をクリックすることにより、Cookie の使用を含む、本サイトで規定されている 利用規約 に同意するものとします。" }, { "id":"signin", - "translation": "サインイン" + "translation": "ログイン" }, { "id":"register", - "translation": "登録する" + "translation": "登録" }, { "id":"terms_conditions", @@ -69,43 +69,43 @@ }, { "id":"terms_conditions_full", - "translation": "いくらかのゴミ" + "translation": "ダミー" }, { "id":"remember_me", - "translation": "俺を覚え" + "translation": "ログイン情報を記憶" }, { "id":"forgot_password", - "translation": "パスワードを忘れた?" + "translation": "パスワードをお忘れですか?" }, { "id":"sign_in_box_title", - "translation": "サインインしてください" + "translation": "ログインします" }, { "id":"sign_in_title", - "translation": "サインイン" + "translation": "ログイン" }, { "id":"register_success_title", - "translation": "サインアップは成功" + "translation": "登録完了" }, { "id":"sign_up_success", - "translation": "登録ありがとうございました!" + "translation": "ご登録いただきありがとうございます。" }, { "id":"verify_success", - "translation": "アカウントは有効になっています!" + "translation": "アカウントは有効になっています。" }, { "id":"signup_verification_email", - "translation": "最後に、メールインボックスと迷惑メールに確認メールをチェックしてください。" + "translation": "認証メールを送信しました。メールボックスを確認してください。迷惑メールフォルダーの確認もお忘れずに。" }, { "id":"signup_verification_noemail", - "translation": "登録は成功でした。今、あなたのアカウントを使うことができます。" + "translation": "認証が完了しました。今からこのアカウントを使うことができます。" }, { "id":"settings", @@ -113,11 +113,11 @@ }, { "id":"torrents", - "translation": "トレント" + "translation": "Torrent" }, { "id":"follow", - "translation": "フォローする" + "translation": "フォロー" }, { "id":"profile_page", @@ -125,7 +125,7 @@ }, { "id":"see_more_torrents_from", - "translation": "%s からもっとトレントを見る" + "translation": "%s の Torrent をもっと見る" }, { "id":"category", @@ -149,15 +149,15 @@ }, { "id": "home", - "translation": "ホームページ" + "translation": "ホーム" }, { "id": "error_404", - "translation": "エラー404" + "translation": "404 エラー" }, { "id": "toggle_navigation", - "translation": "ナビをトグルする" + "translation": "ナビゲーションの切り替え" }, { "id": "upload", @@ -169,23 +169,23 @@ }, { "id": "fap", - "translation": "オナニー" + "translation": "えっち" }, { "id": "advanced_search", - "translation": "高度なサーチ" + "translation": "高度な検索" }, { "id": "nothing_here", - "translation": "ここには何もない。" + "translation": "何もありません" }, { "id": "404_not_found", - "translation": "404見つかりません" + "translation": "404 見つかりません" }, { "id": "no_torrents_uploaded", - "translation": "トレントはまだアップロードされていません!" + "translation": "まだ Torrent がアップロードされていません。" }, { "id": "profile", @@ -193,7 +193,7 @@ }, { "id": "sign_out", - "translation": "サインアウト" + "translation": "ログアウト" }, { "id": "member", @@ -201,147 +201,147 @@ }, { "id": "sign_in", - "translation": "サインイン" + "translation": "ログイン" }, { "id": "sign_up", - "translation": "サインアップ" + "translation": "登録" }, { "id": "no_results_found", - "translation": "結果が見つかれません" + "translation": "結果が見つかりませんでした" }, { "id": "notice_keep_seeding", - "translation": "掲示:シードするを続けるやDHTを可能にする、馬鹿野郎" + "translation": "お願い:DHT 機能を有効にし、なるべくシードを継続してください" }, { "id": "official_nyaapocalipse_faq", - "translation": "公式のニャーポカリプスのよくある質問" + "translation": "nyaa.se の閉鎖についてよくある質問" }, { "id": "links_replacement_mirror", - "translation": "置換/ミラーへのリンク" + "translation": "nyaa.se のミラーリンク" }, { "id": "what_happened", - "translation": "置換/ミラーへのリンク" + "translation": "なにが起こったの?" }, { "id": "nyaa_se_went_offline", - "translation": "nyaa.seと関連ドメイン(nyaatorrents.infoなど)は2017年5月1日にオフラインになりました。" + "translation": "nyaa.se とその関連ドメイン (nyaatorrents.infoなど) は 2017年5月1日 にオフラインになった。" }, { "id": "its_not_a_ddos", - "translation": "それは非アクティブ化されたので、それは通常のようにDDoS攻撃ではありません。" + "translation": "以前のような DDoS 攻撃ではなく、ドメインが利用停止になった。" }, { "id": "future_not_looking_good", - "translation": "ニャーの将来の見通しは良くないそうです。(それは死んでいる)" + "translation": "nyaa.se の将来が危うい。(現に死んでるし)" }, { "id": "recovery_effort", - "translation": "回復努力がしている。" + "translation": "復旧に努力を注いでいるところ。" }, { "id": "is_everything_lost", - "translation": "すべてが失われていますか?" + "translation": "nyaa.se のすべてが失われてしまったの?" }, { "id": "in_short_no", - "translation": "要するに、いいえ。" + "translation": "いいえ。" }, { "id": "are_some_things_lost", - "translation": "何かが失われていますか?" + "translation": "でも、いくつか失われた?" }, { "id": "answer_is_nyaa_db_lost", - "translation": "我々は4月5日5月1日までニャーの急流のデータベースがあります。ほとんど何も失われないことを意味します。" + "translation": "4月5日 5月1日までの nyaa.se のデータベースはあります。要するに、ほとんど失われていません。" }, { "id": "answer_is_sukebei_db_lost", - "translation": "しかし、スケベイの調子が悪いかもしれません。今、我々は2016年までのスケベイデータベースしかありませんが、より新しいデータベースが利用可能かもしれません。" + "translation": "ただし sukebei は別です。sukebei に至っては 2016年までのデータベースしか手元にありません。ただ、今後新しいデータベースが使える可能性はあります。" }, { "id": "how_are_we_recovering", - "translation": "起死回生するために我々は何していますか?" + "translation": "どのように復旧させるの?" }, { "id": "answer_how_are_we_recovering", - "translation": "データベースはnyaa.pantsu.catとsukebei.pantsu.catでホストされています。検索機能があります。(ほとんど)完全なニャー機能性はカミングスーンはずです、乞うご期待。シード/リーチャー統計は掻き取りによって可能であり、将来いつか復元される可能性があります。他の機能は現在優先されています。" + "translation": "上述のデータベースは nyaa.pantsu.cat と sukebei.pantsu.cat にホストされています。検索機能はすでにあり、nyaa.se にあったほぼすべての機能が近いうちに利用可能になるでしょう。また、Seeder / Leecher 統計はスクレイピングによって収集可能ですが、今は他に優先すべきことがあるため後回しにされます。" }, { "id": "are_the_trackers_working", - "translation": "トレントはまだ機能していますか?" + "translation": "Torrent ファイルはまだ利用できる?" }, { "id": "answer_are_the_trackers_working", - "translation": "トラッカーがダウンしていても、シーダーはまだ分散型DHTネットワークに接続されています。ファイルがDHTネットワーク上にリストされている限り、すべてが正常はずです。" + "translation": "トラッカーがダウンしたとしても、シーダーはまだ DHT ネットワークに接続しているはずです。ファイルが DHT ネットワーク上にリスティングされてさえいれば、いつも通り利用できます。" }, { "id": "how_do_i_download_the_torrents", - "translation": "どのように俺はトレントをダウンロードするのですか?" + "translation": "どうやって Torrent ファイルをダウンロードすればいいの?" }, { "id": "answer_how_do_i_download_the_torrents", - "translation": "マグネットリンク を使って。トレントクライアントがDHTネットワーク上のファイルを見つけるためにマグネットリンクを使います。正しくダウンロードするはずです。" + "translation": "magnet リンク をご利用ください。magnet リンクは BitTorrent クライアントが DHT ネットワーク上のファイルを見つけるのに利用されます。もちろんいつも通りダウンロードすることができます。" }, { "id": "magnet_link_should_look_like", - "translation": "マグネットリンクはこのように見えるはずです:" + "translation": "magnet リンクは次のようになっているはずです:" }, { "id": "which_trackers_do_you_recommend", - "translation": "どのトラッカーがすすめですか?" + "translation": "どのトラッカーがおすすめ?" }, { "id": "answer_which_trackers_do_you_recommend", - "translation": "トレントアップロードがトラッカーのために拒否されたなら、これらのいくつかを追加する必要があります:" + "translation": "トラッカーに Torrent のアップロードを拒否された場合は、この中のいくつかを追加する必要があります:" }, { "id": "how_can_i_help", - "translation": "手伝いしましょうか?" + "translation": "なにか手伝えることはある?" }, { "id": "answer_how_can_i_help", - "translation": "Webプログラミングの専門知識があれば、irc.rizon.netの#nyaapantsu IRCチャンネルに参加できます。現在のデータベースがあれば、特にsukebeiのデータベース、それらをアップロードしろ。" + "translation": "ウェブ開発の経験があるのであれば、irc.rizon.net の #nyaapantsu IRC チャンネルに参加することができますよ。現在のデータベースがあるのなら、特に sukebei の方ですが、ぜひともアップロードしていただきたいです。" }, { "id": "your_design_sucks_found_a_bug", - "translation": "貴様のでサインはくそ/バグを見つけた" + "translation": "なんだこのサイトデザイン!? / バグを見つけたよ" }, { "id": "why_written_in_go", - "translation": "なぜすべてが Goで書かれているの?" + "translation": "なんで Go で書いてるの?" }, { "id": "authors_favorite_language", - "translation": "作者の一番好きなプログラミング言語です。" + "translation": "作者の一番好きなプログラミング言語だからです。" }, { "id": "nyaa_pantsu_dont_host_files", - "translation": " nyaa.pantsu.catとsukebei.pantsu.catはファイルをホストしません。" + "translation": " nyaa.pantsu.cat と sukebei.pantsu.cat はいかなるファイルもホストしていません。" }, { "id": "upload_magnet", - "translation": "マグネットをアップロードする" + "translation": "magnet リンクのアップロード" }, { "id": "torrent_file", - "translation": "トレントファイル" + "translation": "Torrent ファイル" }, { "id": "uploading_file_prefills_fields", - "translation": "トレントをアップロードするといくつかのフィールドを事前に入力できます。そうすることをすすめします。" + "translation": "Torrent ファイルをアップロードしている間にいくつかの項目を入力できます。そうすることをおすすめします。" }, { "id": "magnet_link", - "translation": "マグネットリンク" + "translation": "magnet リンク" }, { "id": "all_categories", - "translation": "すべてのカテゴリ" + "translation": "すべてのカテゴリー" }, { "id": "anime", @@ -349,19 +349,19 @@ }, { "id": "anime_amv", - "translation": "アニメ ‐ アニメミュジックビデオ(AMV)" + "translation": "アニメ ‐ AMV" }, { "id": "anime_english_translated", - "translation": "アニメ ‐ 英語に訳した" + "translation": "アニメ ‐ 英訳済み" }, { "id": "anime_non_english_translated", - "translation": "アニメ ‐ 非英語に訳した" + "translation": "アニメ ‐ 非英訳" }, { "id": "anime_raw", - "translation": "アニメ ‐ 生(raw)" + "translation": "アニメ ‐ RAW" }, { "id": "audio", @@ -369,27 +369,27 @@ }, { "id": "audio_lossless", - "translation": "オーディオ ‐ 可逆圧縮" + "translation": "オーディオ ‐ 可逆圧縮方式 (flacなど)" }, { "id": "audio_lossy", - "translation": "オーディオ ‐ 損失圧縮" + "translation": "オーディオ ‐ 非可逆圧縮方式 (mp3など)" }, { "id": "literature", - "translation": "文献" + "translation": "本" }, { "id": "literature_english_translated", - "translation": "文献 ‐  英語に訳した" + "translation": "本 ‐ 英訳済み" }, { "id": "literature_raw", - "translation": "文献 ‐ 生(raw)" + "translation": "本 ‐ RAW" }, { "id": "literature_non_english_translated", - "translation": "文献 ‐ 非英語に訳した" + "translation": "本 ‐ 非英訳" }, { "id": "live_action", @@ -397,31 +397,31 @@ }, { "id": "live_action_english_translated", - "translation": "実写 ‐ 英語に訳した" + "translation": "実写 ‐ 英訳済み" }, { "id": "live_action_idol_pv", - "translation": "実写 ‐ アイドル/PV" + "translation": "実写 ‐ アイドル / PV" }, { "id": "live_action_non_english_translated", - "translation": "実写 ‐ 非英語に訳した" + "translation": "実写 ‐ 非英訳" }, { "id": "live_action_raw", - "translation": "実写 ‐ 生(raw)" + "translation": "実写 ‐ RAW" }, { "id": "pictures", - "translation": "ピクチャー" + "translation": "画像" }, { "id": "pictures_graphics", - "translation": "ピクチャー ‐ グラフィックス" + "translation": "画像 ‐ グラフィック" }, { "id": "pictures_photos", - "translation": "ピクチャー ‐ 写真" + "translation": "画像 ‐ 写真" }, { "id": "software", @@ -429,31 +429,31 @@ }, { "id": "software_applications", - "translation": "ソフトウェア ‐ アプリケーション" + "translation": "ソフトウェア ‐ アプリ" }, { "id": "software_games", - "translation": "ソフトウェア ‐ ゲーム" + "translation": "ソフトウェア ‐ ゲーム" }, { "id": "torrent_description", - "translation": "トレントの説明" + "translation": "Torrent の説明" }, { "id": "description_markdown_notice", - "translation": "説明に、マークダウンを使えます。" + "translation": "説明文には MarkDown 記法が使えます。" }, { "id": "show_all", - "translation": "すべて見せる" + "translation": "すべて表示" }, { "id": "filter_remakes", - "translation": "リメークを濾す" + "translation": "リメイクされたフィルター" }, { "id": "trusted", - "translation": "信頼できる" + "translation": "信頼されたもの" }, { "id": "id", @@ -469,11 +469,11 @@ }, { "id": "ascending", - "translation": "上昇" + "translation": "昇順" }, { "id": "search", - "translation": "サーチ" + "translation": "検索" }, { "id": "hash", @@ -481,7 +481,7 @@ }, { "id": "description", - "translation": "記述" + "translation": "説明" }, { "id": "comments", @@ -489,15 +489,15 @@ }, { "id": "submit_a_comment_as_username", - "translation": "%s としてカキコする" + "translation": "%s でコメントを残す" }, { "id": "submit_a_comment_as_anonymous", - "translation": "匿名ユーザーとしてカキコする" + "translation": "匿名ユーザーでコメントを残す" }, { "id": "submit", - "translation": "カキコする" + "translation": "送信" }, { "id": "personal_info", @@ -517,7 +517,7 @@ }, { "id": "banned", - "translation": "アク禁" + "translation": "BAN" }, { "id": "default", @@ -525,30 +525,30 @@ }, { "id": "trusted_member", - "translation": "信頼できるメンバー" + "translation": "信頼されたメンバー" }, { "id": "moderator", - "translation": "モデレータ" + "translation": "モデレーター" }, { "id": "save_changes", - "translation": "変更をセーブ" + "translation": "変更を保存" }, { "id": "profile_updated", - "translation": "あなたのプロフィールは正しく更新されました!" + "translation": "プロフィールが更新されました。" }, { "id": "delete_account", - "translation": "アカウントを削除する" + "translation": "アカウントの削除" }, { "id": "delete_account_confirm", - "translation": "このアカウントを削除してもよろしいですか?" + "translation": "このアカウントを削除してもよろしいですか。" }, { "id": "delete_success", - "translation": "このアカウントが削除されました。" + "translation": "アカウントが削除されました。" } ] diff --git a/translations/ko-kr.all.json b/translations/ko-kr.all.json index 37abe729..df3a1082 100644 --- a/translations/ko-kr.all.json +++ b/translations/ko-kr.all.json @@ -49,7 +49,7 @@ }, { "id":"i_agree", - "translation": "동의합니다" + "translation": "동의" }, { "id":"terms_conditions_confirm", @@ -65,11 +65,11 @@ }, { "id":"terms_conditions", - "translation": "약관" + "translation": "이용약관" }, { "id":"terms_conditions_full", - "translation": "블라블라" + "translation": "ㅅㅂ" }, { "id":"remember_me", @@ -115,6 +115,10 @@ "id":"follow", "translation": "팔로우" }, + { + "id":"unfollow", + "translation": "언팔로우" + }, { "id":"profile_page", "translation": "%s 프로필 페이지" @@ -165,7 +169,7 @@ }, { "id": "fap", - "translation": "딸" + "translation": "자위" }, { "id": "advanced_search", @@ -201,11 +205,11 @@ }, { "id": "sign_up", - "translation": "가입" + "translation": "회원가입" }, { "id": "no_results_found", - "translation": "결과 없음" + "translation": "검색결과가 없습니다" }, { "id": "notice_keep_seeding", @@ -221,7 +225,7 @@ }, { "id": "what_happened", - "translation": "무슨 일이 있었던거야?" + "translation": "무슨 일입니까?" }, { "id": "nyaa_se_went_offline", @@ -341,23 +345,23 @@ }, { "id": "anime", - "translation": "Anime" + "translation": "애니" }, { "id": "anime_amv", - "translation": "Anime - 애니메이션 뮤직 비디오" + "translation": "애니 - 애니메이션 뮤직 비디오" }, { "id": "anime_english_translated", - "translation": "Anime - 영문 번역" + "translation": "애니 - 영문 번역" }, { "id": "anime_non_english_translated", - "translation": "Anime - 비-영문 번역" + "translation": "애니 - 비-영문 번역" }, { "id": "anime_raw", - "translation": "Anime - Raw" + "translation": "애니 - Raw" }, { "id": "audio", @@ -409,27 +413,27 @@ }, { "id": "pictures", - "translation": "Pictures" + "translation": "사진" }, { "id": "pictures_graphics", - "translation": "Pictures - 그래픽" + "translation": "사진 - 그래픽" }, { "id": "pictures_photos", - "translation": "Pictures - 사진" + "translation": "사진 - 사진" }, { "id": "software", - "translation": "Software" + "translation": "소프트웨어" }, { "id": "software_applications", - "translation": "Software - 응용프로그램" + "translation": "소프트웨어 - 응용프로그램" }, { "id": "software_games", - "translation": "Software - 게임" + "translation": "소프트웨어 - 게임" }, { "id": "torrent_description", @@ -453,7 +457,7 @@ }, { "id": "id", - "translation": "ID" + "translation": "아이디" }, { "id": "downloads", diff --git a/translations/ru-ru.all.json b/translations/ru-ru.all.json index 3df622dc..5d992480 100644 --- a/translations/ru-ru.all.json +++ b/translations/ru-ru.all.json @@ -21,7 +21,7 @@ }, { "id":"register_title", - "translation": "Создание новой учетной записи" + "translation": "Создание нового аккаунта" }, { "id":"signup_box_title", @@ -45,7 +45,7 @@ }, { "id":"confirm_password", - "translation": "Подтвердите Пароль" + "translation": "Подтвердите пароль" }, { "id":"i_agree", @@ -57,7 +57,7 @@ }, { "id":"signin", - "translation": "Вход" + "translation": "Войти" }, { "id":"register", @@ -97,15 +97,19 @@ }, { "id":"verify_success", - "translation": "Теперь ваша учетная запись активирована!" + "translation": "Теперь ваш аккаунт активирован!" }, { "id":"signup_verification_email", - "translation": "Теперь, в качестве последнего шага регистрации, проверьте свой почтовый ящик (или папку спам) и нажмите ссылку для активации вашей учетной записи!" + "translation": "Теперь, в качестве последнего шага регистрации, проверьте свой почтовый ящик (или папку спам) и нажмите ссылку для активации вашего аккаунта!" + }, + { + "id":"signup_verification_noemail", + "translation": "Регистрация прошла успешно, теперь вы можете использовать свой аккаунт." }, { "id":"settings", - "translation": "Настройки учетной записи" + "translation": "Настройки аккаунта" }, { "id":"torrents", @@ -115,6 +119,18 @@ "id":"follow", "translation": "Следить" }, + { + "id":"unfollow", + "translation": "Отписаться" + }, + { + "id":"user_followed_msg", + "translation": "Вы отслеживаете %s!" + }, + { + "id":"user_unfollowed_msg", + "translation": "Вы отписаны от %s!" + }, { "id":"profile_page", "translation": "Страница профиля %s" @@ -445,7 +461,7 @@ }, { "id": "filter_remakes", - "translation": "Фильтрация римейков" + "translation": "Фильтрация повторов" }, { "id": "trusted", @@ -494,5 +510,97 @@ { "id": "submit", "translation": "Отправить" + }, + { + "id": "personal_info", + "translation": "Личная информация" + }, + { + "id": "language", + "translation": "Язык" + }, + { + "id": "current_password", + "translation": "Текущий пароль" + }, + { + "id": "role", + "translation": "Роль" + }, + { + "id": "banned", + "translation": "Banned" + }, + { + "id": "default", + "translation": "По умолчанию" + }, + { + "id": "trusted_member", + "translation": "Надежный пользователь" + }, + { + "id": "moderator", + "translation": "Модератор" + }, + { + "id": "save_changes", + "translation": "Сохранить изменения" + }, + { + "id": "profile_updated", + "translation": "Ваш профиль был успешно обновлен!" + }, + { + "id": "delete_account", + "translation": "Удалить аккаунт" + }, + { + "id": "delete_account_confirm", + "translation": "Вы уверены, что хотите удалить этот аккаунт?" + }, + { + "id": "delete_success", + "translation": "Аккаунт успешно удален!" + }, + { + "id": "moderation", + "translation": "На модерации" + }, + { + "id": "who_is_renchon", + "translation": "Кто, черт побери, такой れんちょん?" + }, + { + "id": "renchon_anon_explanation", + "translation": "れんちょん Это имя пользователя, назначенное для загрузок и комментариев, сделанных анонимно. Он также используется для торрентов, импортированных из оригинального nyaa, хотя оригинальный загрузчик может отображаться рядом." + }, + { + "id": "mark_as_remake", + "translation": "Отметить как повтор" + }, + { + "id": "email_changed", + "translation": "Email адрес успешно изменен! Однако вам нужно будет подтвердить это, нажав на ссылку, присланную на Email адрес: %s" + }, + { + "id": "torrent_status", + "translation": "Статус торрента" + }, + { + "id": "torrent_status_hidden", + "translation": "Скрытый" + }, + { + "id": "torrent_status_normal", + "translation": "Обычный" + }, + { + "id": "torrent_status_remake", + "translation": "Повтор" + }, + { + "id": "profile_edit_page", + "translation": "Изменение профиля %s's" } ] diff --git a/translations/th-th.all.json b/translations/th-th.all.json index 3853cb95..a932b009 100644 --- a/translations/th-th.all.json +++ b/translations/th-th.all.json @@ -581,7 +581,7 @@ }, { "id": "email_changed", - "translation": "เปลี่ยนอีเมลเรียบร้อย! แต่คุณยังต้องยันยันด้วยลิงค์ที่ส่งไปยัง: %s" + "translation": "เปลี่ยนอีเมลเรียบร้อย! แต่คุณยังต้องยืนยันด้วยลิงค์ที่ส่งไปยัง: %s" }, { "id": "torrent_status", @@ -598,5 +598,9 @@ { "id": "torrent_status_remake", "translation": "งานทำซ้ำ" -} + }, + { + "id": "profile_edit_page", + "translation": "แก้ไขโปรไฟล์ของ %s" + } ] diff --git a/util/languages/translation.go b/util/languages/translation.go index aa25588d..7b45a7e9 100644 --- a/util/languages/translation.go +++ b/util/languages/translation.go @@ -56,6 +56,9 @@ func SetTranslation(tmpl *template.Template, language string, languages ...strin "T": func(str string, args ...interface{}) template.HTML { return template.HTML(fmt.Sprintf(T(str), args...)) }, + "Ts": func(str string, args ...interface{}) string { + return fmt.Sprintf(T(str), args...) + }, }) return T }