mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-10-01 01:36:12 -04:00
Adding back end translations.
This commit is contained in:
parent
9f73a79b33
commit
e702618e25
@ -53,7 +53,7 @@ impl Perform<CommentResponse> for Oper<CreateComment> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -62,12 +62,12 @@ impl Perform<CommentResponse> for Oper<CreateComment> {
|
||||
// Check for a community ban
|
||||
let post = Post::read(&conn, data.post_id)?;
|
||||
if CommunityUserBanView::get(&conn, user_id, post.community_id).is_ok() {
|
||||
return Err(APIError::err(&self.op, "You have been banned from this community"))?
|
||||
return Err(APIError::err(&self.op, "community_ban"))?
|
||||
}
|
||||
|
||||
// Check for a site ban
|
||||
if UserView::read(&conn, user_id)?.banned {
|
||||
return Err(APIError::err(&self.op, "You have been banned from the site"))?
|
||||
return Err(APIError::err(&self.op, "site_ban"))?
|
||||
}
|
||||
|
||||
let content_slurs_removed = remove_slurs(&data.content.to_owned());
|
||||
@ -86,7 +86,7 @@ impl Perform<CommentResponse> for Oper<CreateComment> {
|
||||
let inserted_comment = match Comment::create(&conn, &comment_form) {
|
||||
Ok(comment) => comment,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't create Comment"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_create_comment"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -101,7 +101,7 @@ impl Perform<CommentResponse> for Oper<CreateComment> {
|
||||
let _inserted_like = match CommentLike::like(&conn, &like_form) {
|
||||
Ok(like) => like,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't like comment."))?
|
||||
return Err(APIError::err(&self.op, ""))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -124,7 +124,7 @@ impl Perform<CommentResponse> for Oper<EditComment> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -153,17 +153,17 @@ impl Perform<CommentResponse> for Oper<EditComment> {
|
||||
);
|
||||
|
||||
if !editors.contains(&user_id) {
|
||||
return Err(APIError::err(&self.op, "Not allowed to edit comment."))?
|
||||
return Err(APIError::err(&self.op, "no_comment_edit_allowed"))?
|
||||
}
|
||||
|
||||
// Check for a community ban
|
||||
if CommunityUserBanView::get(&conn, user_id, orig_comment.community_id).is_ok() {
|
||||
return Err(APIError::err(&self.op, "You have been banned from this community"))?
|
||||
return Err(APIError::err(&self.op, "community_ban"))?
|
||||
}
|
||||
|
||||
// Check for a site ban
|
||||
if UserView::read(&conn, user_id)?.banned {
|
||||
return Err(APIError::err(&self.op, "You have been banned from the site"))?
|
||||
return Err(APIError::err(&self.op, "site_ban"))?
|
||||
}
|
||||
|
||||
}
|
||||
@ -184,7 +184,7 @@ impl Perform<CommentResponse> for Oper<EditComment> {
|
||||
let _updated_comment = match Comment::update(&conn, data.edit_id, &comment_form) {
|
||||
Ok(comment) => comment,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't update Comment"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_update_comment"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -220,7 +220,7 @@ impl Perform<CommentResponse> for Oper<SaveComment> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -235,14 +235,14 @@ impl Perform<CommentResponse> for Oper<SaveComment> {
|
||||
match CommentSaved::save(&conn, &comment_saved_form) {
|
||||
Ok(comment) => comment,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldnt do comment save"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_save_comment"))?
|
||||
}
|
||||
};
|
||||
} else {
|
||||
match CommentSaved::unsave(&conn, &comment_saved_form) {
|
||||
Ok(comment) => comment,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldnt do comment save"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_save_comment"))?
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -266,7 +266,7 @@ impl Perform<CommentResponse> for Oper<CreateCommentLike> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -275,12 +275,12 @@ impl Perform<CommentResponse> for Oper<CreateCommentLike> {
|
||||
// Check for a community ban
|
||||
let post = Post::read(&conn, data.post_id)?;
|
||||
if CommunityUserBanView::get(&conn, user_id, post.community_id).is_ok() {
|
||||
return Err(APIError::err(&self.op, "You have been banned from this community"))?
|
||||
return Err(APIError::err(&self.op, "community_ban"))?
|
||||
}
|
||||
|
||||
// Check for a site ban
|
||||
if UserView::read(&conn, user_id)?.banned {
|
||||
return Err(APIError::err(&self.op, "You have been banned from the site"))?
|
||||
return Err(APIError::err(&self.op, "site_ban"))?
|
||||
}
|
||||
|
||||
let like_form = CommentLikeForm {
|
||||
@ -299,7 +299,7 @@ impl Perform<CommentResponse> for Oper<CreateCommentLike> {
|
||||
let _inserted_like = match CommentLike::like(&conn, &like_form) {
|
||||
Ok(like) => like,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't like comment."))?
|
||||
return Err(APIError::err(&self.op, "couldnt_like_comment"))?
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -135,14 +135,14 @@ impl Perform<GetCommunityResponse> for Oper<GetCommunity> {
|
||||
let community_view = match CommunityView::read(&conn, community_id, user_id) {
|
||||
Ok(community) => community,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't find Community"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_find_community"))?
|
||||
}
|
||||
};
|
||||
|
||||
let moderators = match CommunityModeratorView::for_community(&conn, community_id) {
|
||||
Ok(moderators) => moderators,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't find Community"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_find_community"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -168,21 +168,21 @@ impl Perform<CommunityResponse> for Oper<CreateCommunity> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
if has_slurs(&data.name) ||
|
||||
has_slurs(&data.title) ||
|
||||
(data.description.is_some() && has_slurs(&data.description.to_owned().unwrap())) {
|
||||
return Err(APIError::err(&self.op, "No slurs"))?
|
||||
return Err(APIError::err(&self.op, "no_slurs"))?
|
||||
}
|
||||
|
||||
let user_id = claims.id;
|
||||
|
||||
// Check for a site ban
|
||||
if UserView::read(&conn, user_id)?.banned {
|
||||
return Err(APIError::err(&self.op, "You have been banned from the site"))?
|
||||
return Err(APIError::err(&self.op, "site_ban"))?
|
||||
}
|
||||
|
||||
// When you create a community, make sure the user becomes a moderator and a follower
|
||||
@ -200,7 +200,7 @@ impl Perform<CommunityResponse> for Oper<CreateCommunity> {
|
||||
let inserted_community = match Community::create(&conn, &community_form) {
|
||||
Ok(community) => community,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Community already exists."))?
|
||||
return Err(APIError::err(&self.op, "community_already_exists"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -212,7 +212,7 @@ impl Perform<CommunityResponse> for Oper<CreateCommunity> {
|
||||
let _inserted_community_moderator = match CommunityModerator::join(&conn, &community_moderator_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Community moderator already exists."))?
|
||||
return Err(APIError::err(&self.op, "community_moderator_already_exists"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -224,7 +224,7 @@ impl Perform<CommunityResponse> for Oper<CreateCommunity> {
|
||||
let _inserted_community_follower = match CommunityFollower::follow(&conn, &community_follower_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Community follower already exists."))?
|
||||
return Err(APIError::err(&self.op, "community_follower_already_exists"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -244,7 +244,7 @@ impl Perform<CommunityResponse> for Oper<EditCommunity> {
|
||||
let data: &EditCommunity = &self.data;
|
||||
|
||||
if has_slurs(&data.name) || has_slurs(&data.title) {
|
||||
return Err(APIError::err(&self.op, "No slurs"))?
|
||||
return Err(APIError::err(&self.op, "no_slurs"))?
|
||||
}
|
||||
|
||||
let conn = establish_connection();
|
||||
@ -252,7 +252,7 @@ impl Perform<CommunityResponse> for Oper<EditCommunity> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -260,7 +260,7 @@ impl Perform<CommunityResponse> for Oper<EditCommunity> {
|
||||
|
||||
// Check for a site ban
|
||||
if UserView::read(&conn, user_id)?.banned {
|
||||
return Err(APIError::err(&self.op, "You have been banned from the site"))?
|
||||
return Err(APIError::err(&self.op, "site_ban"))?
|
||||
}
|
||||
|
||||
// Verify its a mod
|
||||
@ -280,7 +280,7 @@ impl Perform<CommunityResponse> for Oper<EditCommunity> {
|
||||
.collect()
|
||||
);
|
||||
if !editors.contains(&user_id) {
|
||||
return Err(APIError::err(&self.op, "Not allowed to edit community"))?
|
||||
return Err(APIError::err(&self.op, "no_community_edit_allowed"))?
|
||||
}
|
||||
|
||||
let community_form = CommunityForm {
|
||||
@ -297,7 +297,7 @@ impl Perform<CommunityResponse> for Oper<EditCommunity> {
|
||||
let _updated_community = match Community::update(&conn, data.edit_id, &community_form) {
|
||||
Ok(community) => community,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't update Community"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_update_community"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -369,7 +369,7 @@ impl Perform<CommunityResponse> for Oper<FollowCommunity> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -384,14 +384,14 @@ impl Perform<CommunityResponse> for Oper<FollowCommunity> {
|
||||
match CommunityFollower::follow(&conn, &community_follower_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Community follower already exists."))?
|
||||
return Err(APIError::err(&self.op, "community_follower_already_exists"))?
|
||||
}
|
||||
};
|
||||
} else {
|
||||
match CommunityFollower::ignore(&conn, &community_follower_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Community follower already exists."))?
|
||||
return Err(APIError::err(&self.op, "community_follower_already_exists"))?
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -416,7 +416,7 @@ impl Perform<GetFollowedCommunitiesResponse> for Oper<GetFollowedCommunities> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -425,7 +425,7 @@ impl Perform<GetFollowedCommunitiesResponse> for Oper<GetFollowedCommunities> {
|
||||
let communities: Vec<CommunityFollowerView> = match CommunityFollowerView::for_user(&conn, user_id) {
|
||||
Ok(communities) => communities,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "System error, try logging out and back in."))?
|
||||
return Err(APIError::err(&self.op, "system_err_login"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -448,7 +448,7 @@ impl Perform<BanFromCommunityResponse> for Oper<BanFromCommunity> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -463,14 +463,14 @@ impl Perform<BanFromCommunityResponse> for Oper<BanFromCommunity> {
|
||||
match CommunityUserBan::ban(&conn, &community_user_ban_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Community user ban already exists"))?
|
||||
return Err(APIError::err(&self.op, "community_user_already_banned"))?
|
||||
}
|
||||
};
|
||||
} else {
|
||||
match CommunityUserBan::unban(&conn, &community_user_ban_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Community user ban already exists"))?
|
||||
return Err(APIError::err(&self.op, "community_user_already_banned"))?
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -511,7 +511,7 @@ impl Perform<AddModToCommunityResponse> for Oper<AddModToCommunity> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -526,14 +526,14 @@ impl Perform<AddModToCommunityResponse> for Oper<AddModToCommunity> {
|
||||
match CommunityModerator::join(&conn, &community_moderator_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Community moderator already exists."))?
|
||||
return Err(APIError::err(&self.op, "community_moderator_already_exists"))?
|
||||
}
|
||||
};
|
||||
} else {
|
||||
match CommunityModerator::leave(&conn, &community_moderator_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Community moderator already exists."))?
|
||||
return Err(APIError::err(&self.op, "community_moderator_already_exists"))?
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -94,25 +94,25 @@ impl Perform<PostResponse> for Oper<CreatePost> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
if has_slurs(&data.name) ||
|
||||
(data.body.is_some() && has_slurs(&data.body.to_owned().unwrap())) {
|
||||
return Err(APIError::err(&self.op, "No slurs"))?
|
||||
return Err(APIError::err(&self.op, "no_slurs"))?
|
||||
}
|
||||
|
||||
let user_id = claims.id;
|
||||
|
||||
// Check for a community ban
|
||||
if CommunityUserBanView::get(&conn, user_id, data.community_id).is_ok() {
|
||||
return Err(APIError::err(&self.op, "You have been banned from this community"))?
|
||||
return Err(APIError::err(&self.op, "community_ban"))?
|
||||
}
|
||||
|
||||
// Check for a site ban
|
||||
if UserView::read(&conn, user_id)?.banned {
|
||||
return Err(APIError::err(&self.op, "You have been banned from the site"))?
|
||||
return Err(APIError::err(&self.op, "site_ban"))?
|
||||
}
|
||||
|
||||
let post_form = PostForm {
|
||||
@ -130,7 +130,7 @@ impl Perform<PostResponse> for Oper<CreatePost> {
|
||||
let inserted_post = match Post::create(&conn, &post_form) {
|
||||
Ok(post) => post,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't create Post"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_create_post"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -145,7 +145,7 @@ impl Perform<PostResponse> for Oper<CreatePost> {
|
||||
let _inserted_like = match PostLike::like(&conn, &like_form) {
|
||||
Ok(like) => like,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't like post."))?
|
||||
return Err(APIError::err(&self.op, "couldnt_like_post"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -153,7 +153,7 @@ impl Perform<PostResponse> for Oper<CreatePost> {
|
||||
let post_view = match PostView::read(&conn, inserted_post.id, Some(user_id)) {
|
||||
Ok(post) => post,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't find Post"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_find_post"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -187,7 +187,7 @@ impl Perform<GetPostResponse> for Oper<GetPost> {
|
||||
let post_view = match PostView::read(&conn, data.id, user_id) {
|
||||
Ok(post) => post,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't find Post"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_find_post"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -248,7 +248,7 @@ impl Perform<GetPostsResponse> for Oper<GetPosts> {
|
||||
data.limit) {
|
||||
Ok(posts) => posts,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't get posts"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_get_posts"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -270,7 +270,7 @@ impl Perform<CreatePostLikeResponse> for Oper<CreatePostLike> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -279,12 +279,12 @@ impl Perform<CreatePostLikeResponse> for Oper<CreatePostLike> {
|
||||
// Check for a community ban
|
||||
let post = Post::read(&conn, data.post_id)?;
|
||||
if CommunityUserBanView::get(&conn, user_id, post.community_id).is_ok() {
|
||||
return Err(APIError::err(&self.op, "You have been banned from this community"))?
|
||||
return Err(APIError::err(&self.op, "community_ban"))?
|
||||
}
|
||||
|
||||
// Check for a site ban
|
||||
if UserView::read(&conn, user_id)?.banned {
|
||||
return Err(APIError::err(&self.op, "You have been banned from the site"))?
|
||||
return Err(APIError::err(&self.op, "site_ban"))?
|
||||
}
|
||||
|
||||
let like_form = PostLikeForm {
|
||||
@ -302,7 +302,7 @@ impl Perform<CreatePostLikeResponse> for Oper<CreatePostLike> {
|
||||
let _inserted_like = match PostLike::like(&conn, &like_form) {
|
||||
Ok(like) => like,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't like post."))?
|
||||
return Err(APIError::err(&self.op, "couldnt_like_post"))?
|
||||
}
|
||||
};
|
||||
}
|
||||
@ -310,7 +310,7 @@ impl Perform<CreatePostLikeResponse> for Oper<CreatePostLike> {
|
||||
let post_view = match PostView::read(&conn, data.post_id, Some(user_id)) {
|
||||
Ok(post) => post,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't find Post"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_find_post"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -329,7 +329,7 @@ impl Perform<PostResponse> for Oper<EditPost> {
|
||||
let data: &EditPost = &self.data;
|
||||
if has_slurs(&data.name) ||
|
||||
(data.body.is_some() && has_slurs(&data.body.to_owned().unwrap())) {
|
||||
return Err(APIError::err(&self.op, "No slurs"))?
|
||||
return Err(APIError::err(&self.op, "no_slurs"))?
|
||||
}
|
||||
|
||||
let conn = establish_connection();
|
||||
@ -337,7 +337,7 @@ impl Perform<PostResponse> for Oper<EditPost> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -360,17 +360,17 @@ impl Perform<PostResponse> for Oper<EditPost> {
|
||||
.collect()
|
||||
);
|
||||
if !editors.contains(&user_id) {
|
||||
return Err(APIError::err(&self.op, "Not allowed to edit post."))?
|
||||
return Err(APIError::err(&self.op, "no_post_edit_allowed"))?
|
||||
}
|
||||
|
||||
// Check for a community ban
|
||||
if CommunityUserBanView::get(&conn, user_id, data.community_id).is_ok() {
|
||||
return Err(APIError::err(&self.op, "You have been banned from this community"))?
|
||||
return Err(APIError::err(&self.op, "community_ban"))?
|
||||
}
|
||||
|
||||
// Check for a site ban
|
||||
if UserView::read(&conn, user_id)?.banned {
|
||||
return Err(APIError::err(&self.op, "You have been banned from the site"))?
|
||||
return Err(APIError::err(&self.op, "site_ban"))?
|
||||
}
|
||||
|
||||
let post_form = PostForm {
|
||||
@ -388,7 +388,7 @@ impl Perform<PostResponse> for Oper<EditPost> {
|
||||
let _updated_post = match Post::update(&conn, data.edit_id, &post_form) {
|
||||
Ok(post) => post,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't update Post"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_update_post"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -431,7 +431,7 @@ impl Perform<PostResponse> for Oper<SavePost> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -446,14 +446,14 @@ impl Perform<PostResponse> for Oper<SavePost> {
|
||||
match PostSaved::save(&conn, &post_saved_form) {
|
||||
Ok(post) => post,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldnt do post save"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_save_post"))?
|
||||
}
|
||||
};
|
||||
} else {
|
||||
match PostSaved::unsave(&conn, &post_saved_form) {
|
||||
Ok(post) => post,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldnt do post save"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_save_post"))?
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -144,20 +144,20 @@ impl Perform<SiteResponse> for Oper<CreateSite> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
if has_slurs(&data.name) ||
|
||||
(data.description.is_some() && has_slurs(&data.description.to_owned().unwrap())) {
|
||||
return Err(APIError::err(&self.op, "No slurs"))?
|
||||
return Err(APIError::err(&self.op, "no_slurs"))?
|
||||
}
|
||||
|
||||
let user_id = claims.id;
|
||||
|
||||
// Make sure user is an admin
|
||||
if !UserView::read(&conn, user_id)?.admin {
|
||||
return Err(APIError::err(&self.op, "Not an admin."))?
|
||||
return Err(APIError::err(&self.op, "not_an_admin"))?
|
||||
}
|
||||
|
||||
let site_form = SiteForm {
|
||||
@ -170,7 +170,7 @@ impl Perform<SiteResponse> for Oper<CreateSite> {
|
||||
match Site::create(&conn, &site_form) {
|
||||
Ok(site) => site,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Site exists already"))?
|
||||
return Err(APIError::err(&self.op, "site_already_exists"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -194,20 +194,20 @@ impl Perform<SiteResponse> for Oper<EditSite> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
if has_slurs(&data.name) ||
|
||||
(data.description.is_some() && has_slurs(&data.description.to_owned().unwrap())) {
|
||||
return Err(APIError::err(&self.op, "No slurs"))?
|
||||
return Err(APIError::err(&self.op, "no_slurs"))?
|
||||
}
|
||||
|
||||
let user_id = claims.id;
|
||||
|
||||
// Make sure user is an admin
|
||||
if UserView::read(&conn, user_id)?.admin == false {
|
||||
return Err(APIError::err(&self.op, "Not an admin."))?
|
||||
return Err(APIError::err(&self.op, "not_an_admin"))?
|
||||
}
|
||||
|
||||
let found_site = Site::read(&conn, 1)?;
|
||||
@ -222,7 +222,7 @@ impl Perform<SiteResponse> for Oper<EditSite> {
|
||||
match Site::update(&conn, 1, &site_form) {
|
||||
Ok(site) => site,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't update site."))?
|
||||
return Err(APIError::err(&self.op, "couldnt_update_site"))?
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -102,13 +102,13 @@ impl Perform<LoginResponse> for Oper<Login> {
|
||||
// Fetch that username / email
|
||||
let user: User_ = match User_::find_by_email_or_username(&conn, &data.username_or_email) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => return Err(APIError::err(&self.op, "Couldn't find that username or email"))?
|
||||
Err(_e) => return Err(APIError::err(&self.op, "couldnt_find_that_username_or_email"))?
|
||||
};
|
||||
|
||||
// Verify the password
|
||||
let valid: bool = verify(&data.password, &user.password_encrypted).unwrap_or(false);
|
||||
if !valid {
|
||||
return Err(APIError::err(&self.op, "Password incorrect"))?
|
||||
return Err(APIError::err(&self.op, "password_incorrect"))?
|
||||
}
|
||||
|
||||
// Return the jwt
|
||||
@ -129,16 +129,16 @@ impl Perform<LoginResponse> for Oper<Register> {
|
||||
|
||||
// Make sure passwords match
|
||||
if &data.password != &data.password_verify {
|
||||
return Err(APIError::err(&self.op, "Passwords do not match."))?
|
||||
return Err(APIError::err(&self.op, "passwords_dont_match"))?
|
||||
}
|
||||
|
||||
if has_slurs(&data.username) {
|
||||
return Err(APIError::err(&self.op, "No slurs"))?
|
||||
return Err(APIError::err(&self.op, "no_slurs"))?
|
||||
}
|
||||
|
||||
// Make sure there are no admins
|
||||
if data.admin && UserView::admins(&conn)?.len() > 0 {
|
||||
return Err(APIError::err(&self.op, "Sorry, there's already an admin."))?
|
||||
return Err(APIError::err(&self.op, "admin_already_created"))?
|
||||
}
|
||||
|
||||
// Register the new user
|
||||
@ -157,7 +157,7 @@ impl Perform<LoginResponse> for Oper<Register> {
|
||||
let inserted_user = match User_::register(&conn, &user_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "User already exists."))?
|
||||
return Err(APIError::err(&self.op, "user_already_exists"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -188,7 +188,7 @@ impl Perform<LoginResponse> for Oper<Register> {
|
||||
let _inserted_community_follower = match CommunityFollower::follow(&conn, &community_follower_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Community follower already exists."))?
|
||||
return Err(APIError::err(&self.op, "community_follower_already_exists"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -202,7 +202,7 @@ impl Perform<LoginResponse> for Oper<Register> {
|
||||
let _inserted_community_moderator = match CommunityModerator::join(&conn, &community_moderator_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Community moderator already exists."))?
|
||||
return Err(APIError::err(&self.op, "community_moderator_already_exists"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -321,7 +321,7 @@ impl Perform<AddAdminResponse> for Oper<AddAdmin> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -329,7 +329,7 @@ impl Perform<AddAdminResponse> for Oper<AddAdmin> {
|
||||
|
||||
// Make sure user is an admin
|
||||
if UserView::read(&conn, user_id)?.admin == false {
|
||||
return Err(APIError::err(&self.op, "Not an admin."))?
|
||||
return Err(APIError::err(&self.op, "not_an_admin"))?
|
||||
}
|
||||
|
||||
let read_user = User_::read(&conn, data.user_id)?;
|
||||
@ -348,7 +348,7 @@ impl Perform<AddAdminResponse> for Oper<AddAdmin> {
|
||||
match User_::update(&conn, data.user_id, &user_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't update user"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_update_user"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -380,7 +380,7 @@ impl Perform<BanUserResponse> for Oper<BanUser> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -388,7 +388,7 @@ impl Perform<BanUserResponse> for Oper<BanUser> {
|
||||
|
||||
// Make sure user is an admin
|
||||
if UserView::read(&conn, user_id)?.admin == false {
|
||||
return Err(APIError::err(&self.op, "Not an admin."))?
|
||||
return Err(APIError::err(&self.op, "not_an_admin"))?
|
||||
}
|
||||
|
||||
let read_user = User_::read(&conn, data.user_id)?;
|
||||
@ -407,7 +407,7 @@ impl Perform<BanUserResponse> for Oper<BanUser> {
|
||||
match User_::update(&conn, data.user_id, &user_form) {
|
||||
Ok(user) => user,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't update user"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_update_user"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -448,7 +448,7 @@ impl Perform<GetRepliesResponse> for Oper<GetReplies> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -476,7 +476,7 @@ impl Perform<GetRepliesResponse> for Oper<MarkAllAsRead> {
|
||||
let claims = match Claims::decode(&data.auth) {
|
||||
Ok(claims) => claims.claims,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Not logged in."))?
|
||||
return Err(APIError::err(&self.op, "not_logged_in"))?
|
||||
}
|
||||
};
|
||||
|
||||
@ -499,7 +499,7 @@ impl Perform<GetRepliesResponse> for Oper<MarkAllAsRead> {
|
||||
let _updated_comment = match Comment::update(&conn, reply.id, &comment_form) {
|
||||
Ok(comment) => comment,
|
||||
Err(_e) => {
|
||||
return Err(APIError::err(&self.op, "Couldn't update Comment"))?
|
||||
return Err(APIError::err(&self.op, "couldnt_update_comment"))?
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -167,7 +167,7 @@ export class Communities extends Component<any, CommunitiesState> {
|
||||
console.log(msg);
|
||||
let op: UserOperation = msgOp(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
return;
|
||||
} else if (op == UserOperation.ListCommunities) {
|
||||
let res: ListCommunitiesResponse = msg;
|
||||
|
@ -155,7 +155,7 @@ export class CommunityForm extends Component<CommunityFormProps, CommunityFormSt
|
||||
let op: UserOperation = msgOp(msg);
|
||||
console.log(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
this.state.loading = false;
|
||||
this.setState(this.state);
|
||||
return;
|
||||
|
@ -194,7 +194,7 @@ export class Community extends Component<any, State> {
|
||||
console.log(msg);
|
||||
let op: UserOperation = msgOp(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
return;
|
||||
} else if (op == UserOperation.GetCommunity) {
|
||||
let res: GetCommunityResponse = msg;
|
||||
|
@ -166,7 +166,7 @@ export class Inbox extends Component<any, InboxState> {
|
||||
console.log(msg);
|
||||
let op: UserOperation = msgOp(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
return;
|
||||
} else if (op == UserOperation.GetReplies || op == UserOperation.MarkAllAsRead) {
|
||||
let res: GetRepliesResponse = msg;
|
||||
|
@ -184,7 +184,7 @@ export class Login extends Component<any, State> {
|
||||
parseMessage(msg: any) {
|
||||
let op: UserOperation = msgOp(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
this.state = this.emptyState;
|
||||
this.setState(this.state);
|
||||
return;
|
||||
|
@ -382,7 +382,7 @@ export class Main extends Component<any, MainState> {
|
||||
console.log(msg);
|
||||
let op: UserOperation = msgOp(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
return;
|
||||
} else if (op == UserOperation.GetFollowedCommunities) {
|
||||
let res: GetFollowedCommunitiesResponse = msg;
|
||||
|
@ -223,7 +223,7 @@ export class Modlog extends Component<any, ModlogState> {
|
||||
console.log(msg);
|
||||
let op: UserOperation = msgOp(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
return;
|
||||
} else if (op == UserOperation.GetModlog) {
|
||||
let res: GetModlogResponse = msg;
|
||||
|
@ -203,7 +203,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
|
||||
parseMessage(msg: any) {
|
||||
let op: UserOperation = msgOp(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
this.state.loading = false;
|
||||
this.setState(this.state);
|
||||
return;
|
||||
|
@ -244,7 +244,7 @@ export class Post extends Component<any, PostState> {
|
||||
console.log(msg);
|
||||
let op: UserOperation = msgOp(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
return;
|
||||
} else if (op == UserOperation.GetPost) {
|
||||
let res: GetPostResponse = msg;
|
||||
|
@ -246,7 +246,7 @@ export class Search extends Component<any, SearchState> {
|
||||
console.log(msg);
|
||||
let op: UserOperation = msgOp(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
return;
|
||||
} else if (op == UserOperation.Search) {
|
||||
let res: SearchResponse = msg;
|
||||
|
@ -135,7 +135,7 @@ export class Setup extends Component<any, State> {
|
||||
parseMessage(msg: any) {
|
||||
let op: UserOperation = msgOp(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
this.state.userLoading = false;
|
||||
this.setState(this.state);
|
||||
return;
|
||||
|
@ -333,7 +333,7 @@ export class User extends Component<any, UserState> {
|
||||
console.log(msg);
|
||||
let op: UserOperation = msgOp(msg);
|
||||
if (msg.error) {
|
||||
alert(msg.error);
|
||||
alert(i18n.t(msg.error));
|
||||
return;
|
||||
} else if (op == UserOperation.GetUserDetails) {
|
||||
let res: UserDetailsResponse = msg;
|
||||
|
@ -4,6 +4,7 @@ import { webSocket } from 'rxjs/webSocket';
|
||||
import { Subject } from 'rxjs';
|
||||
import { retryWhen, delay, take } from 'rxjs/operators';
|
||||
import { UserService } from './';
|
||||
import { i18n } from '../i18next';
|
||||
|
||||
export class WebSocketService {
|
||||
private static _instance: WebSocketService;
|
||||
@ -192,7 +193,7 @@ export class WebSocketService {
|
||||
private setAuth(obj: any, throwErr: boolean = true) {
|
||||
obj.auth = UserService.Instance.auth;
|
||||
if (obj.auth == null && throwErr) {
|
||||
alert("Not logged in.");
|
||||
alert(i18n.t('not_logged_in'));
|
||||
throw "Not logged in";
|
||||
}
|
||||
}
|
||||
|
@ -122,6 +122,39 @@ export const en = {
|
||||
joined: 'Joined',
|
||||
powered_by: 'Powered by',
|
||||
landing_0: 'Lemmy is a <1>link aggregator</1> / reddit alternative, intended to work in the <2>fediverse</2>.<3></3>Its self-hostable, has live-updating comment threads, and is tiny (<4>~80kB</4>). Federation into the ActivityPub network is on the roadmap. <5></5>This is a <6>very early beta version</6>, and a lot of features are currently broken or missing. <7></7>Suggest new features or report bugs <8>here.</8><9></9>Made with <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.',
|
||||
not_logged_in: 'Not logged in.',
|
||||
community_ban: 'You have been banned from this community.',
|
||||
site_ban: 'You have been banned from the site',
|
||||
couldnt_create_comment: 'Couldn\'t create comment.',
|
||||
couldnt_like_comment: 'Couldn\'t like comment.',
|
||||
couldnt_update_comment: 'Couldn\'t update comment.',
|
||||
couldnt_save_comment: 'Couldn\'t save comment.',
|
||||
no_comment_edit_allowed: 'Not allowed to edit comment.',
|
||||
no_post_edit_allowed: 'Not allowed to edit post.',
|
||||
no_community_edit_allowed: 'Not allowed to edit community.',
|
||||
couldnt_find_community: 'Couldn\'t find community.',
|
||||
couldnt_update_community: 'Couldn\'t update Community.',
|
||||
community_already_exists: 'Community already exists.',
|
||||
community_moderator_already_exists: 'Community moderator already exists.',
|
||||
community_follower_already_exists: 'Community follower already exists.',
|
||||
community_user_already_banned: 'Community user already banned.',
|
||||
couldnt_create_post: 'Couldn\'t create post.',
|
||||
couldnt_like_post: 'Couldn\'t like post.',
|
||||
couldnt_find_post: 'Couldn\'t find post.',
|
||||
couldnt_get_posts: 'Couldn\'t get posts',
|
||||
couldnt_update_post: 'Couldn\'t update post',
|
||||
couldnt_save_post: 'Couldn\'t save post.',
|
||||
no_slurs: 'No slurs.',
|
||||
not_an_admin: 'Not an admin.',
|
||||
site_already_exists: 'Site already exists.',
|
||||
couldnt_update_site: 'Couldn\'t update site.',
|
||||
couldnt_find_that_username_or_email: 'Couldn\'t find that username or email.',
|
||||
password_incorrect: 'Password incorrect.',
|
||||
passwords_dont_match: 'Passwords do not match.',
|
||||
admin_already_created: 'Sorry, there\'s already an admin.',
|
||||
user_already_exists: 'User already exists.',
|
||||
couldnt_update_user: 'Couldn\'t update user.',
|
||||
system_err_login: 'System error. Try logging out and back in.',
|
||||
},
|
||||
}
|
||||
|
||||
|
14
ui/yarn.lock
14
ui/yarn.lock
@ -2,7 +2,7 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5":
|
||||
"@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1":
|
||||
version "7.5.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
|
||||
integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==
|
||||
@ -1212,18 +1212,6 @@ http-signature@~1.2.0:
|
||||
jsprim "^1.2.2"
|
||||
sshpk "^1.7.0"
|
||||
|
||||
i18next-browser-languagedetector@^3.0.3:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-3.0.3.tgz#879ebe421685c70cc5cfa96191364a35ea7da742"
|
||||
integrity sha512-1YuAogyQap0J6N4kM+6gAjZ6T7QWrp3xZCmSs0QedkNmgAKhj7FiQlCviHKl3IwbM6zJNgft4D7UDPWb1dTCMQ==
|
||||
|
||||
i18next-xhr-backend@^3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/i18next-xhr-backend/-/i18next-xhr-backend-3.1.1.tgz#9221ba6911d466c38693fd43eb8ff10b48d3438a"
|
||||
integrity sha512-Fui5puKb1pD+Z1+biwzA9jPQTvwOgz8SOkwu7yGRorCQraOgKxp86T310HoUM2CR9VV0MM2pJdntEQrgC45+RA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.5.5"
|
||||
|
||||
i18next@^17.0.9:
|
||||
version "17.0.9"
|
||||
resolved "https://registry.yarnpkg.com/i18next/-/i18next-17.0.9.tgz#5f835e91a34fa5e7da1e5ae4c4586c81d7c4b17f"
|
||||
|
Loading…
Reference in New Issue
Block a user