Merge branch 'master' of github.com:ewhal/nyaa into api
Cette révision appartient à :
révision
51c5f198b4
16 fichiers modifiés avec 334 ajouts et 173 suppressions
12
README.md
12
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
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -377,4 +377,9 @@ footer {
|
|||
position: relative;
|
||||
top: -0.5rem;
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
.comment-date {
|
||||
font-size: smaller;
|
||||
width: auto; /* Undo bootstrap's fixed width */
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
},
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{ if not (HasAdmin .)}}
|
||||
{{ if not (HasAdmin $.User)}}
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">{{ T "current_password"}}:</label>
|
||||
<div class="col-md-8">
|
||||
|
@ -63,7 +63,7 @@
|
|||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{ if HasAdmin .}}
|
||||
{{ if HasAdmin $.User}}
|
||||
<h3>{{ T "moderation"}}</h3>
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label">{{ T "username"}}:</label>
|
||||
|
@ -82,7 +82,7 @@
|
|||
<option value="-1" {{ if eq .Status -1 }}selected{{end}}>{{ T "banned"}}</option>
|
||||
<option value="0" {{ if eq .Status 0 }}selected{{end}}>{{ T "member"}} ({{ T "default" }})</option>
|
||||
<option value="1" {{ if eq .Status 1 }}selected{{end}}>{{ T "trusted_member"}} </option>
|
||||
<option value="2" {{ if eq .Status 2 }}selected{{end}}>{{ T "moderator"}} </option>
|
||||
<!-- <option value="2" {{ if eq .Status 2 }}selected{{end}}>{{ T "moderator"}} </option> -->
|
||||
</select>
|
||||
</div>
|
||||
{{ range (index $.FormErrors "status")}}
|
||||
|
|
|
@ -93,8 +93,11 @@
|
|||
<a href="{{$.URL.Parse (printf "/user/%d/-" .UserID ) }}">{{.Username}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
{{.Date.Year}}/{{.Date.Month}}/{{.Date.Day}}
|
||||
<div class="col-md-1 date-short comment-date">
|
||||
{{ .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. */}}
|
||||
</div>
|
||||
<div class="col-md-8">
|
||||
{{.Content}}
|
||||
|
|
|
@ -602,5 +602,9 @@
|
|||
{
|
||||
"id": "profile_edit_page",
|
||||
"translation": "Edit %s's profile"
|
||||
},
|
||||
{
|
||||
"id":"date_format",
|
||||
"translation": "2006-01-02 15:04"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -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": "サインアップしてください。<small>いつまでも無料だ</small>"
|
||||
"translation": "登録しましょう。<small>ずっと無料です</small>"
|
||||
},
|
||||
{
|
||||
"id":"username",
|
||||
|
@ -53,15 +53,15 @@
|
|||
},
|
||||
{
|
||||
"id":"terms_conditions_confirm",
|
||||
"translation": "<strong class=\"label label-primary\">登録する</strong> をクリックすることにより、Cookieの使用を含む、本サイトで規定されている <a href=\"#\" data-toggle=\"modal\" data-target=\"#t_and_c_m\"> 利用規約</a>に同意するものとします。"
|
||||
"translation": "<strong class=\"label label-primary\">登録する</strong> をクリックすることにより、Cookie の使用を含む、本サイトで規定されている <a href=\"#\" data-toggle=\"modal\" data-target=\"#t_and_c_m\"> 利用規約</a> に同意するものとします。"
|
||||
},
|
||||
{
|
||||
"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": "<i style=\"color:limegreen\" class=\"glyphicon glyphicon-ok-circle\"></i>アカウントは有効になっています!"
|
||||
"translation": "<i style=\"color:limegreen\" class=\"glyphicon glyphicon-ok-circle\"></i>アカウントは有効になっています。"
|
||||
},
|
||||
{
|
||||
"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": "我々は<s>4月5日</s>5月1日までニャーの急流のデータベースがあります。ほとんど何も失われないことを意味します。"
|
||||
"translation": "<s>4月5日</s> 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": "<b>マグネットリンク</b> を使って。トレントクライアントがDHTネットワーク上のファイルを見つけるためにマグネットリンクを使います。正しくダウンロードするはずです。"
|
||||
"translation": "<b>magnet リンク</b> をご利用ください。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のデータベース、<b>それらをアップロードしろ。</b>"
|
||||
"translation": "ウェブ開発の経験があるのであれば、irc.rizon.net の #nyaapantsu IRC チャンネルに参加することができますよ。現在のデータベースがあるのなら、特に sukebei の方ですが、<b>ぜひともアップロードしていただきたいです。</b>"
|
||||
},
|
||||
{
|
||||
"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": "アカウントが削除されました。"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": "<i style=\"color:limegreen\" class=\"glyphicon glyphicon-ok-circle\"></i>Теперь ваша учетная запись активирована!"
|
||||
"translation": "<i style=\"color:limegreen\" class=\"glyphicon glyphicon-ok-circle\"></i>Теперь ваш аккаунт активирован!"
|
||||
},
|
||||
{
|
||||
"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"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Référencer dans un nouveau ticket