mirror of
https://github.com/wassname/talk.git
synced 2026-07-08 04:03:09 +08:00
Merge branch 'master' into auth-token-via-config
This commit is contained in:
@@ -6,6 +6,7 @@ const helmet = require('helmet');
|
||||
const authentication = require('./middleware/authentication');
|
||||
const {passport} = require('./services/passport');
|
||||
const plugins = require('./services/plugins');
|
||||
const i18n = require('./services/i18n');
|
||||
const enabled = require('debug').enabled;
|
||||
const errors = require('./errors');
|
||||
const {createGraphOptions} = require('./graph');
|
||||
@@ -157,6 +158,8 @@ app.use('/', (err, req, res, next) => {
|
||||
console.error(err);
|
||||
}
|
||||
|
||||
i18n.init(req);
|
||||
|
||||
if (err instanceof errors.APIError) {
|
||||
res.status(err.status);
|
||||
res.render('error', {
|
||||
|
||||
@@ -33,3 +33,12 @@ export const setSortOrder = (order) => ({
|
||||
order
|
||||
});
|
||||
|
||||
export const changeUserDetailStatuses = (tab) => {
|
||||
let statuses;
|
||||
if (tab === 'all') {
|
||||
statuses = ['NONE', 'ACCEPTED', 'REJECTED', 'PREMOD'];
|
||||
} else if (tab === 'rejected') {
|
||||
statuses = ['REJECTED'];
|
||||
}
|
||||
return {type: actions.CHANGE_USER_DETAIL_STATUSES, tab, statuses};
|
||||
};
|
||||
|
||||
@@ -17,11 +17,11 @@ const ActionButton = ({type = '', active, ...props}) => {
|
||||
|
||||
return (
|
||||
<Button
|
||||
className={`${typeName} ${styles.actionButton} ${active ? styles[`${typeName}__active`] : ''}`}
|
||||
className={`${typeName} ${styles.actionButton} ${props.minimal ? styles.minimal : ''} ${active ? styles[`${typeName}__active`] : ''}`}
|
||||
cStyle={typeName}
|
||||
icon={menuActionsMap[type].icon}
|
||||
onClick={type === 'APPROVE' ? props.acceptComment : props.rejectComment}
|
||||
>{t(`modqueue.${text}`)}</Button>
|
||||
>{props.minimal ? '' : t(`modqueue.${text}`)}</Button>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@@ -189,6 +189,12 @@
|
||||
width: 140px;
|
||||
}
|
||||
|
||||
.minimal {
|
||||
width: 45px;
|
||||
min-width: 0;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.approve__active {
|
||||
box-shadow: none;
|
||||
color: white;
|
||||
|
||||
@@ -8,3 +8,4 @@ export const HIDE_SUSPEND_USER_DIALOG = 'HIDE_SUSPEND_USER_DIALOG';
|
||||
export const VIEW_USER_DETAIL = 'VIEW_USER_DETAIL';
|
||||
export const HIDE_USER_DETAIL = 'HIDE_USER_DETAIL';
|
||||
export const SET_SORT_ORDER = 'MODERATION_SET_SORT_ORDER';
|
||||
export const CHANGE_USER_DETAIL_STATUSES = 'CHANGE_USER_DETAIL_STATUSES';
|
||||
|
||||
@@ -8,6 +8,8 @@ const initialState = fromJS({
|
||||
commentId: null,
|
||||
commentStatus: null,
|
||||
userDetailId: null,
|
||||
userDetailActiveTab: 'all',
|
||||
userDetailStatuses: ['NONE', 'ACCEPTED', 'REJECTED', 'PREMOD'],
|
||||
banDialog: false,
|
||||
shortcutsNoteVisible: window.localStorage.getItem('coral:shortcutsNote') || 'show',
|
||||
sortOrder: 'REVERSE_CHRONOLOGICAL',
|
||||
@@ -65,6 +67,10 @@ export default function moderation (state = initialState, action) {
|
||||
return state.set('userDetailId', action.userId);
|
||||
case actions.HIDE_USER_DETAIL:
|
||||
return state.set('userDetailId', null);
|
||||
case actions.CHANGE_USER_DETAIL_STATUSES:
|
||||
return state
|
||||
.set('userDetailActiveTab', action.tab)
|
||||
.set('userDetailStatuses', action.statuses);
|
||||
case actions.SET_SORT_ORDER:
|
||||
return state.set('sortOrder', action.order);
|
||||
default :
|
||||
|
||||
@@ -23,6 +23,7 @@ const Comment = ({
|
||||
viewUserDetail,
|
||||
suspectWords,
|
||||
bannedWords,
|
||||
minimal,
|
||||
...props
|
||||
}) => {
|
||||
const links = linkify.getMatches(comment.body);
|
||||
@@ -55,9 +56,13 @@ const Comment = ({
|
||||
<div className={styles.container}>
|
||||
<div className={styles.itemHeader}>
|
||||
<div className={styles.author}>
|
||||
<span className={styles.username} onClick={() => viewUserDetail(comment.user.id)}>
|
||||
{comment.user.name}
|
||||
</span>
|
||||
{
|
||||
!minimal && (
|
||||
<span className={styles.username} onClick={() => viewUserDetail(comment.user.id)}>
|
||||
{comment.user.name}
|
||||
</span>
|
||||
)
|
||||
}
|
||||
<span className={styles.created}>
|
||||
{timeago(comment.created_at || Date.now() - props.index * 60 * 1000)}
|
||||
</span>
|
||||
@@ -128,6 +133,7 @@ const Comment = ({
|
||||
(action === 'APPROVE' && comment.status === 'ACCEPTED');
|
||||
return (
|
||||
<ActionButton
|
||||
minimal={minimal}
|
||||
key={i}
|
||||
type={action}
|
||||
user={comment.user}
|
||||
@@ -154,14 +160,12 @@ const Comment = ({
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<Slot
|
||||
data={props.data}
|
||||
root={props.root}
|
||||
fill="adminCommentDetailArea"
|
||||
comment={comment}
|
||||
/>
|
||||
</div>
|
||||
<Slot
|
||||
data={props.data}
|
||||
root={props.root}
|
||||
fill="adminCommentDetailArea"
|
||||
comment={comment}
|
||||
/>
|
||||
{flagActions && flagActions.length
|
||||
? <FlagBox
|
||||
actions={flagActions}
|
||||
@@ -173,6 +177,7 @@ const Comment = ({
|
||||
};
|
||||
|
||||
Comment.propTypes = {
|
||||
minimal: PropTypes.bool,
|
||||
viewUserDetail: PropTypes.func.isRequired,
|
||||
acceptComment: PropTypes.func.isRequired,
|
||||
rejectComment: PropTypes.func.isRequired,
|
||||
|
||||
@@ -187,10 +187,15 @@ export default class Moderation extends Component {
|
||||
{moderation.userDetailId && (
|
||||
<UserDetail
|
||||
id={moderation.userDetailId}
|
||||
hideUserDetail={hideUserDetail} />
|
||||
hideUserDetail={hideUserDetail}
|
||||
bannedWords={settings.wordlist.banned}
|
||||
suspectWords={settings.wordlist.suspect}
|
||||
showBanUserDialog={props.showBanUserDialog}
|
||||
showSuspendUserDialog={props.showSuspendUserDialog}
|
||||
acceptComment={props.acceptComment}
|
||||
rejectComment={props.rejectComment} />
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,23 @@
|
||||
background-color: transparent;
|
||||
font-size: 16px;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
width: 90%;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.commentStatuses {
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
|
||||
li {
|
||||
display: inline-block;
|
||||
margin: 0 10px;
|
||||
cursor: pointer;
|
||||
padding: 0 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.active {
|
||||
font-weight: bold;
|
||||
border-bottom: 3px solid #F36451;
|
||||
}
|
||||
|
||||
@@ -2,12 +2,20 @@ import React, {PropTypes} from 'react';
|
||||
import {Button, Drawer} from 'coral-ui';
|
||||
import styles from './UserDetail.css';
|
||||
import Slot from 'coral-framework/components/Slot';
|
||||
import Comment from './Comment';
|
||||
import {actionsMap} from '../helpers/moderationQueueActionsMap';
|
||||
|
||||
export default class UserDetail extends React.Component {
|
||||
static propTypes = {
|
||||
id: PropTypes.string.isRequired,
|
||||
hideUserDetail: PropTypes.func.isRequired,
|
||||
root: PropTypes.object.isRequired,
|
||||
bannedWords: PropTypes.array.isRequired,
|
||||
suspectWords: PropTypes.array.isRequired,
|
||||
showBanUserDialog: PropTypes.func.isRequired,
|
||||
showSuspendUserDialog: PropTypes.func.isRequired,
|
||||
acceptComment: PropTypes.func.isRequired,
|
||||
rejectComment: PropTypes.func.isRequired,
|
||||
}
|
||||
|
||||
copyPermalink = () => {
|
||||
@@ -20,9 +28,33 @@ export default class UserDetail extends React.Component {
|
||||
}
|
||||
}
|
||||
|
||||
changeStatus = (tab) => {
|
||||
if (tab === 'all') {
|
||||
this.props.changeStatus('all');
|
||||
} else if (tab === 'rejected') {
|
||||
this.props.changeStatus('rejected');
|
||||
}
|
||||
}
|
||||
|
||||
render () {
|
||||
const {root: {user, totalComments, rejectedComments}, hideUserDetail} = this.props;
|
||||
const {
|
||||
root: {
|
||||
user,
|
||||
totalComments,
|
||||
rejectedComments,
|
||||
comments: {nodes}
|
||||
},
|
||||
moderation: {userDetailActiveTab: tab},
|
||||
bannedWords,
|
||||
suspectWords,
|
||||
showBanUserDialog,
|
||||
showSuspendUserDialog,
|
||||
acceptComment,
|
||||
rejectComment,
|
||||
hideUserDetail
|
||||
} = this.props;
|
||||
const localProfile = user.profiles.find((p) => p.provider === 'local');
|
||||
|
||||
let profile;
|
||||
if (localProfile) {
|
||||
profile = localProfile.id;
|
||||
@@ -62,8 +94,34 @@ export default class UserDetail extends React.Component {
|
||||
<p>{`${(rejectedPercent).toFixed(1)}%`}</p>
|
||||
</div>
|
||||
</div>
|
||||
<ul className={styles.commentStatuses}>
|
||||
<li className={tab === 'all' ? styles.active : ''} onClick={this.changeStatus.bind(this, 'all')}>All</li>
|
||||
<li className={tab === 'rejected' ? styles.active : ''} onClick={this.changeStatus.bind(this, 'rejected')}>Rejected</li>
|
||||
</ul>
|
||||
<div>
|
||||
{
|
||||
nodes.map((comment, i) => {
|
||||
const status = comment.action_summaries ? 'FLAGGED' : comment.status;
|
||||
return <Comment
|
||||
key={i}
|
||||
index={i}
|
||||
comment={comment}
|
||||
selected={false}
|
||||
suspectWords={suspectWords}
|
||||
bannedWords={bannedWords}
|
||||
viewUserDetail={() => {}}
|
||||
actions={actionsMap[status]}
|
||||
showBanUserDialog={showBanUserDialog}
|
||||
showSuspendUserDialog={showSuspendUserDialog}
|
||||
acceptComment={acceptComment}
|
||||
rejectComment={rejectComment}
|
||||
currentAsset={null}
|
||||
currentUserId={this.props.id}
|
||||
minimal={true} />;
|
||||
})
|
||||
}
|
||||
</div>
|
||||
</Drawer>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -178,12 +178,11 @@ span {
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
transition: all 200ms;
|
||||
padding: 10px 0 0;
|
||||
min-height: 220px;
|
||||
padding: 10px 0;
|
||||
min-height: 0;
|
||||
|
||||
.container {
|
||||
padding: 0 14px;
|
||||
min-height: 180px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
@@ -247,6 +246,7 @@ span {
|
||||
}
|
||||
|
||||
.created {
|
||||
padding: 5px;
|
||||
color: #262626;
|
||||
font-size: 14px;
|
||||
margin-left: 15px;
|
||||
@@ -433,7 +433,6 @@ span {
|
||||
.username {
|
||||
color: blue;
|
||||
text-decoration: underline;
|
||||
padding: 5px;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
|
||||
@@ -1,8 +1,25 @@
|
||||
import React, {PropTypes} from 'react';
|
||||
import {compose, gql} from 'react-apollo';
|
||||
import {connect} from 'react-redux';
|
||||
import {bindActionCreators} from 'redux';
|
||||
import UserDetail from '../components/UserDetail';
|
||||
import withQuery from 'coral-framework/hocs/withQuery';
|
||||
import {getSlotsFragments} from 'coral-framework/helpers/plugins';
|
||||
import {getDefinitionName} from 'coral-framework/utils';
|
||||
import {changeUserDetailStatuses} from 'coral-admin/src/actions/moderation';
|
||||
import Comment from './Comment';
|
||||
|
||||
const commentConnectionFragment = gql`
|
||||
fragment CoralAdmin_Moderation_CommentConnection on CommentConnection {
|
||||
nodes {
|
||||
...${getDefinitionName(Comment.fragments.comment)}
|
||||
}
|
||||
hasNextPage
|
||||
startCursor
|
||||
endCursor
|
||||
}
|
||||
${Comment.fragments.comment}
|
||||
`;
|
||||
|
||||
const pluginFragments = getSlotsFragments([
|
||||
'userProfile',
|
||||
@@ -19,12 +36,12 @@ class UserDetailContainer extends React.Component {
|
||||
return null;
|
||||
}
|
||||
|
||||
return <UserDetail {...this.props}/>;
|
||||
return <UserDetail changeStatus={this.props.changeUserDetailStatuses} {...this.props}/>;
|
||||
}
|
||||
}
|
||||
|
||||
export const withUserDetailQuery = withQuery(gql`
|
||||
query CoralAdmin_UserDetail($author_id: ID!) {
|
||||
query CoralAdmin_UserDetail($author_id: ID!, $statuses: [COMMENT_STATUS!]) {
|
||||
user(id: $author_id) {
|
||||
id
|
||||
username
|
||||
@@ -37,18 +54,35 @@ export const withUserDetailQuery = withQuery(gql`
|
||||
}
|
||||
totalComments: commentCount(query: {author_id: $author_id})
|
||||
rejectedComments: commentCount(query: {author_id: $author_id, statuses: [REJECTED]})
|
||||
comments: comments(query: {
|
||||
author_id: $author_id,
|
||||
statuses: $statuses
|
||||
}) {
|
||||
...CoralAdmin_Moderation_CommentConnection
|
||||
}
|
||||
${pluginFragments.spreads('root')}
|
||||
}
|
||||
${Comment.fragments.comment}
|
||||
${pluginFragments.definitions('user')}
|
||||
${pluginFragments.definitions('root')}
|
||||
${commentConnectionFragment}
|
||||
`, {
|
||||
options: ({id}) => {
|
||||
options: ({id, moderation: {userDetailStatuses: statuses}}) => {
|
||||
return {
|
||||
variables: {author_id: id}
|
||||
variables: {author_id: id, statuses}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
const mapStateToProps = (state) => ({
|
||||
moderation: state.moderation.toJS()
|
||||
});
|
||||
|
||||
const mapDispatchToProps = (dispatch) => ({
|
||||
...bindActionCreators({changeUserDetailStatuses}, dispatch)
|
||||
});
|
||||
|
||||
export default compose(
|
||||
connect(mapStateToProps, mapDispatchToProps),
|
||||
withUserDetailQuery,
|
||||
)(UserDetailContainer);
|
||||
|
||||
@@ -308,15 +308,6 @@ class Comment extends React.Component {
|
||||
commentId={comment.id}
|
||||
inline
|
||||
/>
|
||||
{!disableReply &&
|
||||
<ActionButton>
|
||||
<ReplyButton
|
||||
onClick={() => setActiveReplyBox(comment.id)}
|
||||
parentCommentId={parentId || comment.id}
|
||||
currentUserId={currentUser && currentUser.id}
|
||||
banned={false}
|
||||
/>
|
||||
</ActionButton>}
|
||||
<ActionButton>
|
||||
<IfUserCanModifyBest user={currentUser}>
|
||||
<BestButton
|
||||
@@ -326,6 +317,15 @@ class Comment extends React.Component {
|
||||
/>
|
||||
</IfUserCanModifyBest>
|
||||
</ActionButton>
|
||||
{!disableReply &&
|
||||
<ActionButton>
|
||||
<ReplyButton
|
||||
onClick={() => setActiveReplyBox(comment.id)}
|
||||
parentCommentId={parentId || comment.id}
|
||||
currentUserId={currentUser && currentUser.id}
|
||||
banned={false}
|
||||
/>
|
||||
</ActionButton>}
|
||||
<Slot
|
||||
fill="commentActions"
|
||||
data={this.props.data}
|
||||
|
||||
@@ -7,7 +7,7 @@ import esTA from '../../../node_modules/timeago.js/locales/es';
|
||||
import en from '../../../locales/en.yml';
|
||||
import es from '../../../locales/es.yml';
|
||||
|
||||
// Translations are happening at https://www.transifex.com/the-coral-project/talk-1/dashboard/.
|
||||
// Translations are happening at https://translate.lingohub.com/the-coral-project/dashboard
|
||||
|
||||
const defaultLanguage = 'en';
|
||||
const translations = {...en, ...es};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import React, {Component, PropTypes} from 'react';
|
||||
|
||||
import t from 'coral-framework/services/i18n';
|
||||
import styles from './IgnoredUsers.css';
|
||||
|
||||
export class IgnoredUsers extends Component {
|
||||
@@ -18,7 +18,7 @@ export class IgnoredUsers extends Component {
|
||||
<div>
|
||||
{
|
||||
users.length
|
||||
? <p>Because you ignored these, you do not see their comments.</p>
|
||||
? <p>{t('framework.because_you_ignored')}</p>
|
||||
: null
|
||||
}
|
||||
<dl className={styles.ignoredUserList}>
|
||||
@@ -29,7 +29,7 @@ export class IgnoredUsers extends Component {
|
||||
<dd className={styles.stopListening}>
|
||||
<a
|
||||
onClick={() => stopIgnoring({id})}
|
||||
className={styles.link}>Stop ignoring</a>
|
||||
className={styles.link}>{t('framework.stop_ignoring')}</a>
|
||||
</dd>
|
||||
</span>
|
||||
))
|
||||
|
||||
@@ -1,15 +1,25 @@
|
||||
.drawer {
|
||||
max-width: 700px;
|
||||
min-width: 400px;
|
||||
padding: 20px;
|
||||
min-width: 550px;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
right: -17px;
|
||||
bottom: 0;
|
||||
background-color: white;
|
||||
transition: transform 500ms ease-in-out;
|
||||
box-shadow: -3px 0px 4px 0px rgba(0,0,0,0.15);
|
||||
z-index: 10000;
|
||||
|
||||
.content {
|
||||
position: absolute;
|
||||
padding: 20px;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
}
|
||||
|
||||
.closeButton {
|
||||
|
||||
@@ -6,7 +6,9 @@ const Drawer = ({children, handleClickOutside}) => {
|
||||
return (
|
||||
<div className={styles.drawer}>
|
||||
<div className={styles.closeButton} onClick={handleClickOutside}>×</div>
|
||||
{children}
|
||||
<div className={styles.content}>
|
||||
{children}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -148,6 +148,9 @@ enum ACTION_TYPE {
|
||||
# CommentsQuery allows the ability to query comments by a specific methods.
|
||||
input CommentsQuery {
|
||||
|
||||
# Author of the comments
|
||||
author_id: ID
|
||||
|
||||
# Current status of a comment. Requires the `ADMIN` role.
|
||||
statuses: [COMMENT_STATUS!]
|
||||
|
||||
|
||||
+36
-10
@@ -3,17 +3,17 @@ en:
|
||||
are_you_sure: "Are you sure you would like to ban {0}?"
|
||||
ban_user: "Ban User?"
|
||||
banned_user: "Banned User"
|
||||
cancel: Cancel
|
||||
cancel: "Cancel"
|
||||
note: "Note: Banning this user will also place this comment in the Rejected queue."
|
||||
yes_ban_user: "Yes, Ban User"
|
||||
bio_offensive: "This bio is offensive"
|
||||
cancel: Cancel
|
||||
cancel: "Cancel"
|
||||
characters_remaining: "characters remaining"
|
||||
comment:
|
||||
anon: Anonymous
|
||||
anon: "Anonymous"
|
||||
ban_user: "Ban User"
|
||||
comment: "Post a comment"
|
||||
flagged: flagged
|
||||
flagged: "flagged"
|
||||
view_context: "View context"
|
||||
comment_box:
|
||||
post: "Post"
|
||||
@@ -126,7 +126,20 @@ en:
|
||||
title: "Configure Comment Stream"
|
||||
weeks: Weeks
|
||||
wordlist: "Banned Words"
|
||||
continue: Continue
|
||||
continue: "Continue"
|
||||
createdisplay:
|
||||
check_the_form: "Invalid Form. Please check the fields"
|
||||
continue: "Continue with the same Facebook username"
|
||||
error_create: "Error when changing username"
|
||||
fake_comment_body: "This is an example comment. Readers can share their thoughts and opinions with newsrooms in the comments section."
|
||||
fake_comment_date: "1 minute ago"
|
||||
if_you_dont_change_your_name: "If you don't change your username at this step your Facebook display name will appear alongside of all your comments."
|
||||
required_field: "Required field"
|
||||
save: Save
|
||||
special_characters: "Usernames can contain letters numbers and _ only"
|
||||
username: Username
|
||||
write_your_username: "Edit your username"
|
||||
your_username: "Your username appears on every comment you post."
|
||||
dashboard:
|
||||
auto_update: "Data automatically updates every five minutes or when you Reload."
|
||||
comment_count: comments
|
||||
@@ -145,8 +158,19 @@ en:
|
||||
edit_window_expired_close: "Close"
|
||||
edit_window_timer_prefix: "Edit Window: "
|
||||
second: "second"
|
||||
seconds_plural: "seconds"
|
||||
unexpected_error: "Unexpected error while saving changes. Sorry!"
|
||||
secondsPlural: "seconds"
|
||||
unexpectedError: "Unexpected error while saving changes. Sorry!"
|
||||
email:
|
||||
confirm:
|
||||
has_been_requested: "A email confirmation has been requested for the following account:"
|
||||
to_confirm: "To confirm the account, please visit the following link:"
|
||||
confirm_email: "Confirm Email"
|
||||
if_you_did_not: "If you did not request this, you can safely ignore this email."
|
||||
subject: "Email Confirmation"
|
||||
password_reset:
|
||||
we_received_a_request: "We received a request to reset your password. If you did not request this change, you can ignore this email."
|
||||
if_you_did: "If you did,"
|
||||
please_click: "please click here to reset password"
|
||||
embedlink:
|
||||
copy: "Copy to Clipboard"
|
||||
error:
|
||||
@@ -179,10 +203,11 @@ en:
|
||||
flag_username: "Report username"
|
||||
framework:
|
||||
banned_account_msg: "Your account is currently suspended. This means that you cannot Like Report or write comments. Please contact us if you have any questions."
|
||||
because_you_ignored: "Because you ignored the following commenters, their comments are hidden."
|
||||
comment: comment
|
||||
comment_is_ignored: "This comment is hidden because you ignored this user."
|
||||
comments: comments
|
||||
configure_stream: "Configure Stream"
|
||||
configure_stream: "Configure"
|
||||
content_not_available: "This content is not available"
|
||||
edit_name:
|
||||
button: Submit
|
||||
@@ -195,6 +220,7 @@ en:
|
||||
new_count: "View {0} new {1}"
|
||||
profile: Profile
|
||||
show_all_comments: "Show all comments"
|
||||
stop_ignoring: "Stop ignoring"
|
||||
success_bio_update: "Your biography has been updated"
|
||||
success_name_update: "Your username has been updated"
|
||||
success_update_settings: "The changes you have made have been applied to the comment stream on this article"
|
||||
@@ -238,8 +264,8 @@ en:
|
||||
reject: "Reject"
|
||||
rejected: "Rejected"
|
||||
select_stream: "Select Stream"
|
||||
shift_key: ⇧
|
||||
shortcuts: Shortcuts
|
||||
shift_key: "⇧"
|
||||
shortcuts: "Shortcuts"
|
||||
show_shortcuts: "Show Shortcuts"
|
||||
singleview: "Toggle single comment edit view"
|
||||
spam_ads: Spam/Ads
|
||||
|
||||
+154
-166
@@ -4,8 +4,7 @@ es:
|
||||
ban_user: "¿Quieres suspender el Usuario?"
|
||||
banned_user: "Usuario Suspendido"
|
||||
cancel: Cancelar
|
||||
note: "Nota: Suspender a este usuario también va a colocar este comentario en\
|
||||
\ la cola de Rechazados."
|
||||
note: "Nota: Suspender a este usuario también va a colocar este comentario en la cola de Rechazados."
|
||||
yes_ban_user: "Si, Suspender al usuario"
|
||||
bio_offensive: "Esta biografia es ofensiva"
|
||||
cancel: Cancelar
|
||||
@@ -23,22 +22,16 @@ es:
|
||||
comment: "Publicar un comentario"
|
||||
name: "Nombre"
|
||||
comment_post_notif: "Tu comentario ha sido publicado."
|
||||
comment_post_notif_premod: "Gracias por el comentario. Nuestro equipo de moderació\
|
||||
n va a revisarlo muy pronto."
|
||||
comment_post_banned_word: "Tu comentario contiene una o más palabras que no está\
|
||||
n permitidas en nuestro espacio, por lo que no será publicado. Si crees que\
|
||||
\ es un error, por favor contacta a nuestro equipo de moderación."
|
||||
comment_post_notif_premod: "Gracias por el comentario. Nuestro equipo de moderación va a revisarlo muy pronto."
|
||||
comment_post_banned_word: "Tu comentario contiene una o más palabras que no están permitidas en nuestro espacio, por lo que no será publicado. Si crees que es un error, por favor contacta a nuestro equipo de moderación."
|
||||
characters_remaining: "carácteres restantes"
|
||||
comment_is_best: "Este comentario es uno de los mejores"
|
||||
comment_offensive: "Este comentario es ofensivo"
|
||||
comment_singular: Comentario
|
||||
comment_plural: Comentarios
|
||||
comment_post_banned_word: "Tu comentario contiene una o más palabras que no está\
|
||||
n permitidas en nuestro espacio, por lo que no será publicado. Si crees que es\
|
||||
\ un error, por favor contacta a nuestro equipo de moderación."
|
||||
comment_post_banned_word: "Tu comentario contiene una o más palabras que no están permitidas en nuestro espacio, por lo que no será publicado. Si crees que es un error, por favor contacta a nuestro equipo de moderación."
|
||||
comment_post_notif: "Tu comentario ha sido publicado."
|
||||
comment_post_notif_premod: "Gracias por el comentario. Nuestro equipo de moderació\
|
||||
n va a revisarlo muy pronto."
|
||||
comment_post_notif_premod: "Gracias por el comentario. Nuestro equipo de moderación va a revisarlo muy pronto."
|
||||
community:
|
||||
account_creation_date: "Fecha de creación de la cuenta"
|
||||
active: Activa
|
||||
@@ -57,8 +50,7 @@ es:
|
||||
newsroom_role: "Rol en la redacción"
|
||||
no_flagged_accounts: "No hay ninguna cuenta reportada en este momento."
|
||||
no_results: "No se encontraron usuarios con ese nombre o correo."
|
||||
note: "Nota: Suspender a este usuario no le va a permitir (al usuario) borrar\
|
||||
\ ni editar ni comentar."
|
||||
note: "Nota: Suspender a este usuario no le va a permitir (al usuario) borrar ni editar ni comentar."
|
||||
offensive: "Este comentario es ofensivo"
|
||||
other: Otro
|
||||
people: Gente
|
||||
@@ -71,21 +63,15 @@ es:
|
||||
yes_ban_user: "Si, Suspendan el usuario"
|
||||
configure:
|
||||
apply: Aplicar
|
||||
banned_word_text: "Comentarios que contengan estas palabras o frases, en mayusculas\
|
||||
\ o minúsculas, serán automáticamente eliminados del hilo de comentario. Escribir\
|
||||
\ una palabra y apretar Enter o Tabulador para agregarla. O pueden pegar una\
|
||||
\ lista de palabras separadas por coma."
|
||||
banned_word_text: "Comentarios que contengan estas palabras o frases, en mayusculas o minúsculas, serán automáticamente eliminados del hilo de comentario. Escribir una palabra y apretar Enter o Tabulador para agregarla. O pueden pegar una lista de palabras separadas por coma."
|
||||
banned_words_title: "Lista de palabras prohibidas"
|
||||
close: "Cerrar"
|
||||
close_after: "Cerrar comentarios luego de"
|
||||
close_stream: "Cerrar comentarios"
|
||||
close_stream_configuration: "Este hilo de comentario está en este momento cerrado.\
|
||||
\ Al abrirlo, nuevos comentarios serán publicados y mostrados."
|
||||
closed_comments_desc: "Escribe un mensaje que será mostrado cuando los comentarios\
|
||||
\ estén cerrados y no se acepten más comentarios."
|
||||
close_stream_configuration: "Este hilo de comentario está en este momento cerrado. Al abrirlo, nuevos comentarios serán publicados y mostrados."
|
||||
closed_comments_desc: "Escribe un mensaje que será mostrado cuando los comentarios estén cerrados y no se acepten más comentarios."
|
||||
closed_comments_label: "Escribe un mensaje..."
|
||||
closed_stream_settings: "Mensaje que se muestra cuando no se aceptan más comentarios\
|
||||
\ en el articulo"
|
||||
closed_stream_settings: "Mensaje que se muestra cuando no se aceptan más comentarios en el articulo"
|
||||
comment_count_error: "Por favor escribir un número válido"
|
||||
comment_count_header: "Limitar el largo del comentario"
|
||||
comment_count_text_post: carácteres
|
||||
@@ -95,146 +81,145 @@ es:
|
||||
comment_stream_will_close: "El hilo de comentarios se cerrara"
|
||||
community: Comunidad
|
||||
configure: Configurar
|
||||
copy_and_paste: "Copiar y pegar el código de más abajo en tu CMS para colocar\
|
||||
\ la caja de comentarios en tus artículos"
|
||||
copy_and_paste: "Copiar y pegar el código de más abajo en tu CMS para colocar la caja de comentarios en tus artículos"
|
||||
custom_css_url: "URL CSS a medida"
|
||||
custom_css_url_desc: "URL de una hoja de estilo que va a sobrescribir los estilos\
|
||||
\ por defecto del hilo de comentarios. Puede ser interna o externa."
|
||||
custom_css_url_desc: "URL de una hoja de estilo que va a sobrescribir los estilos por defecto del hilo de comentarios. Puede ser interna o externa."
|
||||
dashboard: Panel
|
||||
days: Días
|
||||
description: "Como Administrador/a puedes modificar la configuración de los comentarios\
|
||||
\ en este artículo"
|
||||
domain_list_text: "Agrega dominios permitidos a Talk, por ejemplo tu localhost,\
|
||||
\ staging y ambientes de producción (ej. localhost:3000, staging.domain.com,\
|
||||
\ domain.com)."
|
||||
description: "Como Administrador/a puedes modificar la configuración de los comentarios en este artículo"
|
||||
domain_list_text: "Agrega dominios permitidos a Talk, por ejemplo tu localhost, staging y ambientes de producción (ej. localhost:3000, staging.domain.com, domain.com)."
|
||||
domain_list_title: "Dominios Permitidos"
|
||||
edit_comment_timeframe_heading: "Periodo de Tiempo para Edición del Comentario"
|
||||
edit_comment_timeframe_text_pre: "Los comentaristas tendrán"
|
||||
edit_comment_timeframe_text_post: "segundos para editar sus comentarios."
|
||||
embed_comment_stream: "Colocar Hilo de Comentarios"
|
||||
enable_premod_links_text: "Los moderadores deben aprobar todo comentario que contenga\
|
||||
\ un enlace antes de que sea publicado."
|
||||
enable_premod_links_text: "Los moderadores deben aprobar todo comentario que contenga un enlace antes de que sea publicado."
|
||||
enable_pre_moderation: "Permitir pre-moderación"
|
||||
enable_pre_moderation_text: "Los moderadores deben aprobar todo comentario antes\
|
||||
\ que sea publicado."
|
||||
enable_pre_moderation_text: "Los moderadores deben aprobar todo comentario antes que sea publicado."
|
||||
enable_premod_links: "Pre-Moderar Comentarios que contienen Enlaces"
|
||||
enable_premod: "Activar Pre Moderación"
|
||||
enable_premod_description: "Los y las moderadoras deben aprobar cualquier comentario\
|
||||
\ antes de su publicación"
|
||||
enable_premod_links_description: "Los y las moderadoras deben aprobar cualquier\
|
||||
\ comentario que contengan enlaces antes de su publicación."
|
||||
enable_premod_description: "Los y las moderadoras deben aprobar cualquier comentario antes de su publicación"
|
||||
enable_premod_links_description: "Los y las moderadoras deben aprobar cualquier comentario que contengan enlaces antes de su publicación."
|
||||
enable_questionbox: "Hacer una pregunta a los y las lectoras."
|
||||
enable_questionbox_description: "Esta pregunta aparecerá en la parte de arriba\
|
||||
\ del hilo de comentarios."
|
||||
enable_questionbox_description: "Esta pregunta aparecerá en la parte de arriba del hilo de comentarios."
|
||||
hours: Horas
|
||||
include_comment_stream: "Incluir Descripción de Hilo de Comentarios para Lectores"
|
||||
include_comment_stream_desc: "Escribir un mensaje para ser incluido al principio\
|
||||
\ del hilo de comentarios. Un tema planteado podría ser la guía de comunidad,\
|
||||
\ etc."
|
||||
include_comment_stream_desc: "Escribir un mensaje para ser incluido al principio del hilo de comentarios. Un tema planteado podría ser la guía de comunidad, etc."
|
||||
include_text: "Agregar tu texto aquí."
|
||||
include_question_here: "Escribir la pregunta aquí."
|
||||
moderate: Moderar
|
||||
moderation_settings: "Configuración de la Moderación"
|
||||
open: "Abrir"
|
||||
open_stream: "Abrir Hilo de Comentarios"
|
||||
open_stream_configuration: "Este hilo de comentarios está abierto. Al cerrarlo\
|
||||
\ no se podrán publicar nuevos comentarios pero todos los comentarios anteriores\
|
||||
\ aún serán mostrados."
|
||||
open_stream_configuration: "Este hilo de comentarios está abierto. Al cerrarlo no se podrán publicar nuevos comentarios pero todos los comentarios anteriores aún serán mostrados."
|
||||
require_email_verification: "Necesita confirmación su correo"
|
||||
require_email_verification_text: "Nuevos usuarios deben confirmar sus correos\
|
||||
\ antes de comentar"
|
||||
require_email_verification_text: "Nuevos usuarios deben confirmar sus correos antes de comentar"
|
||||
save_changes: "Guardar Cambios"
|
||||
shortcuts: Atajos
|
||||
sign_out: "Desconectar"
|
||||
stories: Artículos
|
||||
stream_settings: "Configuración de Comentarios"
|
||||
suspect_word_title: "Lista de palabras sospechosas"
|
||||
suspect_word_text: "Comentarios que contengan estas palabras o frases, considerando\
|
||||
\ mayusculas y minúsculas, serán automáticamente destacadas en los comentarios\
|
||||
\ publicados. Escribir una palabra y apretar Enter o Tabulador para agregarla.\
|
||||
\ O pegar una lista de palabras separadas por coma."
|
||||
suspect_word_text: "Comentarios que contengan estas palabras o frases, considerando mayusculas y minúsculas, serán automáticamente destacadas en los comentarios publicados. Escribir una palabra y apretar Enter o Tabulador para agregarla. O pegar una lista de palabras separadas por coma."
|
||||
tech_settings: "Configuración Técnica"
|
||||
title: "Configurar los comentarios"
|
||||
weeks: Semanas
|
||||
wordlist: "Palabras Suspendidas"
|
||||
continue: Continuar
|
||||
continue: "Continuar"
|
||||
createdisplay:
|
||||
check_the_form: "Formulario Inválido. Por favor verifica los campos"
|
||||
continue: "Continuar con el mismo nombre que aparece en Facebook"
|
||||
error_create: "Hubo un error al cambiar el nombre de usuario"
|
||||
fake_comment_body: "Este es un comentario de ejemplo. Las lectoras pueden compartir sus ideas y opiniones con los periodistas en la sección de comentarios."
|
||||
fake_comment_date: "hace un minuto"
|
||||
if_you_dont_change_your_name: "Si no modificas tu nombre de usuario en este paso tu nombre de Facebook aparecerá al lado de cada comentario que publiques."
|
||||
required_field: "Campo requerido"
|
||||
save: "Guardar"
|
||||
special_characters: "Los nombres sólo pueden contener letras números y _"
|
||||
username: "Nombre"
|
||||
write_your_username: "Edita tu nombre"
|
||||
your_username: "Tu nombre aparece en cada comentario que publiques."
|
||||
dashboard:
|
||||
auto_update: "Los datos se actualizan automáticamente cada cinco minutos o cuando\
|
||||
\ refresca el navegador."
|
||||
comment_count: comentarios
|
||||
flags: Reportes
|
||||
auto_update: "Los datos se actualizan automáticamente cada cinco minutos o cuando refresca el navegador."
|
||||
comment_count: "comentarios"
|
||||
flags: "Reportes"
|
||||
most_flags: "Artículos con la mayor cantidad de reportes"
|
||||
most_conversations: "Artículos con las mayores conversaciones"
|
||||
next_update: "{0} minutos hasta la próxima actualización."
|
||||
no_activity: "¡No han habido comentarios en ningún lado en los últimos 5 minutos."
|
||||
no_flags: "¡No ha habido ningún reporte en los últimos 5 minutos! Bravo!"
|
||||
no_likes: "¡No ha habido ningún 'me gusta' en los últimos 5 minutos. Todo tranquilo."
|
||||
done: Hecho
|
||||
done: "Hecho"
|
||||
edit_comment:
|
||||
body_input_label: "Editar este comentario"
|
||||
save_button: "Guardar cambios"
|
||||
edit_window_expired: "No se puede editar este comentario. El periodo de edición\
|
||||
\ ya ha concluido. Podrías publicar uno nuevo :-)"
|
||||
edit_window_expired: "No se puede editar este comentario. El periodo de edición ya ha concluido. Podrías publicar uno nuevo :-)"
|
||||
edit_window_expired_close: "Cerrar"
|
||||
edit_window_timer_prefix: "Ventana Edición:"
|
||||
second: "segundo"
|
||||
seconds_plural: "segundos"
|
||||
unexpected_error: "Lo siento. Ha habido un error no previsto al guardar los cambios."
|
||||
email:
|
||||
confirm:
|
||||
has_been_requested: "Un correo de confirmación ha sido pedido para la siguiente cuenta:"
|
||||
to_confirm: "Para confirmar la cuenta, por favor visitar el siguiente enlace:"
|
||||
confirm_email: "Confirmar Correo"
|
||||
if_you_did_not: "Si no has pedido esto, puedes ignorar el correo."
|
||||
subject: "Confirmación de Correo"
|
||||
password_reset:
|
||||
we_received_a_request: "Recibimos un pedido para resetear su contraseña. Si no ha pedido ese cambio, por favor ignorar el correo. "
|
||||
if_you_did: "Si lo hizo,"
|
||||
please_click: "por favor cliquea aqui para resetear la contraseña."
|
||||
embedlink:
|
||||
copy: "Copiar al portapapeles"
|
||||
error:
|
||||
COMMENT_TOO_SHORT: "Tu comentario debe tener algo escrito"
|
||||
NOT_AUTHORIZED: "Acción no autorizada."
|
||||
NO_SPECIAL_CHARACTERS: "Los nombres pueden contener letras números y _"
|
||||
PASSWORD_LENGTH: "Contraseña es muy corta"
|
||||
PROFANITY_ERROR: "Los nombres no pueden contener blasfemias. Por favor contacte\
|
||||
\ al o la administradora si cree que esto es un error"
|
||||
USERNAME_IN_USE: "Este nombre ya está siendo usado."
|
||||
USERNAME_REQUIRED: "Debe ingresar un nombre"
|
||||
EDIT_WINDOW_ENDED: "No puedes editar este comentario. El tiempo de edición ha\
|
||||
\ expirado."
|
||||
EDIT_USERNAME_NOT_AUTHORIZED: "No tiene permiso para editar el nombre de usuario."
|
||||
EMAIL_IN_USE: "Este correo se encuentra en uso"
|
||||
EMAIL_REQUIRED: "Se requiere un correo"
|
||||
LOGIN_MAXIMUM_EXCEEDED: "Ha realizado demasiados intentos fallidos de usar la\
|
||||
\ contraseña. Por favor espere."
|
||||
PASSWORD_REQUIRED: "Debe ingresar la contraseña"
|
||||
COMMENTING_CLOSED: "Los comentarios ya estan cerrados"
|
||||
NOT_FOUND: "Recurso no encontrado"
|
||||
INVALID_ASSET_URL: "La URL del articulo no es valida"
|
||||
email: "No es un correo válido"
|
||||
confirm_password: "Las contraseñas no coinciden. Inténtelo nuevamente"
|
||||
network_error: "Error al conectar con el servidor. Compruebe su conexión a Internet\
|
||||
\ y vuelva a intentarlo."
|
||||
edit_window_ended: "No puedes editar este comentario. El tiempo de edición ha expirado."
|
||||
edit_username_not_authorized: "No tiene permiso para editar el nombre de usuario."
|
||||
email: "No es un correo válido"
|
||||
email_in_use: "Este correo se encuentra en uso"
|
||||
email_not_verified: "Correo {0} no confirmado."
|
||||
email_password: "Correo y/o contraseña incorrecta."
|
||||
email_required: "Se requiere un correo"
|
||||
email_username_in_use: "Correo o nombre en uso."
|
||||
INVALID_ASSET_URL: "La URL del articulo no es valida"
|
||||
login_maximum_exceeded: "Ha realizado demasiados intentos fallidos de usar la contraseña. Por favor espere."
|
||||
network_error: "Error al conectar con el servidor. Compruebe su conexión a Internet y vuelva a intentarlo."
|
||||
NOT_AUTHORIZED: "Acción no autorizada."
|
||||
NOT_FOUND: "Recurso no encontrado"
|
||||
NO_SPECIAL_CHARACTERS: "Los nombres pueden contener letras números y _"
|
||||
organization_name: "El nombre de la organización debe contener letras y/o números."
|
||||
password: "La contraseña debe tener por lo menos 8 caracteres"
|
||||
PASSWORD_LENGTH: "Contraseña es muy corta"
|
||||
PASSWORD_REQUIRED: "Debe ingresar la contraseña"
|
||||
PROFANITY_ERROR: "Los nombres no pueden contener blasfemias. Por favor contacte al o la administradora si cree que esto es un error"
|
||||
username: "Los nombres pueden contener letras números y _"
|
||||
USERNAME_IN_USE: "Este nombre ya está siendo usado."
|
||||
USERNAME_REQUIRED: "Debe ingresar un nombre"
|
||||
flag_comment: "Reportar este comentario"
|
||||
flag_reason: "Razón por la que hacer este reporte (Opcional)"
|
||||
flag_username: "Reportar el nombre de usuario"
|
||||
framework:
|
||||
banned_account_msg: "Tu cuenta se encuentra suspendida. Esto significa que no\
|
||||
\ puedes gustar, marcar o escribir comentarios."
|
||||
comment: comentario
|
||||
banned_account_msg: "Tu cuenta se encuentra suspendida. Esto significa que no puedes gustar, marcar o escribir comentarios."
|
||||
comment: "comentario"
|
||||
comment_is_ignored: "Este comentario está escondido porque has ignorado al usuario."
|
||||
comments: comentarios
|
||||
comments: "comentarios"
|
||||
configure_stream: "Configurar Hilo de Comentarios"
|
||||
content_not_available: "Este contenido no se encuentra disponible"
|
||||
edit_name:
|
||||
button: Enviar
|
||||
button: "Enviar"
|
||||
error: "Nombres de usuarios pueden solamente incluir letras, números y _"
|
||||
label: "Nuevo Nombre"
|
||||
msg: "Tu cuenta está suspendida porque tu nombre de usuario ha sido considerado\
|
||||
\ no apropiado para el espacio. Para recuperar la cuenta, por favor ingresar\
|
||||
\ un nuevo nombre de usuario. Contáctanos si tienes alguna pregunta."
|
||||
msg: "Tu cuenta está suspendida porque tu nombre de usuario ha sido considerado no apropiado para el espacio. Para recuperar la cuenta, por favor ingresar un nuevo nombre de usuario. Contáctanos si tienes alguna pregunta."
|
||||
ignored_users: "Usuarios ignorados"
|
||||
my_comments: "Mis Comentarios"
|
||||
my_profile: "Mi perfil"
|
||||
new_count: "Ver {0} {1} nuevo"
|
||||
profile: Perfil
|
||||
show_all_comments: "Mostrar todos los comentarios"
|
||||
stop_ignoring: "No ignorar más"
|
||||
success_bio_update: "Tu biografia fue actualizada"
|
||||
success_name_update: "Tu nombre de usuario ha sido actualizado"
|
||||
success_update_settings: "La configuración de este articulo fue actualizada"
|
||||
@@ -242,8 +227,7 @@ es:
|
||||
view_all_replies_initial: "ver todas las {0} respuestas"
|
||||
view_more_comments: "Ver más comentarios"
|
||||
view_reply: "ver respuesta"
|
||||
from_settings_page: "Desde la página de configuración puedes ver tu historia de\
|
||||
\ comentarios."
|
||||
from_settings_page: "Desde la página de configuración puedes ver tu historia de comentarios."
|
||||
like: Me gusta
|
||||
loading_results: "Cargando Resultados"
|
||||
marketing: "Esto parece una propaganda"
|
||||
@@ -300,78 +284,88 @@ es:
|
||||
profile_settings: "Configuración del Perfil"
|
||||
reply: Responder
|
||||
report: Reportar
|
||||
report_notif: "Gracias por reportar este comentario. Nuestro equipo de moderació\
|
||||
n ha sido notificado y muy pronto lo va a revisar."
|
||||
report_notif: "Gracias por reportar este comentario. Nuestro equipo de moderación ha sido notificado y muy pronto lo va a revisar."
|
||||
report_notif_remove: "Tu reporte ha sido eliminado."
|
||||
reported: Reportado
|
||||
reported: "Reportado"
|
||||
set_best: "Etiquetar como el mejor"
|
||||
settings:
|
||||
all_comments: "Todos los comentarios"
|
||||
from_settings_page: "Desde la página de configuración puedes ver tu historial\
|
||||
\ de comentarios."
|
||||
from_settings_page: "Desde la página de configuración puedes ver tu historial de comentarios."
|
||||
my_comment_history: "Mi historial de comentarios"
|
||||
profile: Perfil
|
||||
profile_settings: "Configuración del perfil"
|
||||
sign_in: "Entrar"
|
||||
to_access: "para acceder al perfil"
|
||||
user_no_comment: "No has dejado aún ningún comentario. ¡Únete a la conversació\
|
||||
n!"
|
||||
user_no_comment: "No has dejado aún ningún comentario. ¡Únete a la conversación!"
|
||||
sign_in:
|
||||
email_verify_cta: "Por favor confirme su correo."
|
||||
request_new_verify_email: "Enviar otro correo:"
|
||||
verify_email: "¡Gracias por crear una cuenta! Le enviamos un correo a la dirección que dio para confirmar su cuenta."
|
||||
verify_email2: "Debe confirmarla antes de poder involucrarse en la comunidad."
|
||||
not_you: "¿No eres tu?"
|
||||
logged_in_as: "Entraste como"
|
||||
facebook_sign_in: "Entrar con Facebook"
|
||||
facebook_sign_up: "Registrarse con Facebook"
|
||||
logout: "Salir"
|
||||
sign_in: "Entrar"
|
||||
sign_in_to_join: "Entrar para unirte a la conversación"
|
||||
or: "O"
|
||||
email: "Dirección de Correo"
|
||||
password: "Contraseña"
|
||||
forgot_your_pass: "¿Has olvidado tu contraseña?"
|
||||
need_an_account: "¿Necesitas una cuenta?"
|
||||
register: "Registrar"
|
||||
sign_up: "Registro"
|
||||
confirm_password: "Confirmar Contraseña"
|
||||
username: "Nombre"
|
||||
already_have_an_account: "¿Ya tienes una cuenta?"
|
||||
recover_password: "Recuperar la contraseña"
|
||||
email_in_use: "Este correo se encuentra en uso"
|
||||
email_or_username_in_use: "Este correo ó nombre de usuario se encuentran en uso"
|
||||
required_field: "Este campo es requerido"
|
||||
passwords_dont_match: "Las contraseñas no coinciden."
|
||||
special_characters: "Los nombres pueden contener letras, números y _"
|
||||
sign_in_to_comment: "Entrar para comentar"
|
||||
temporarily_suspended: "De acuerdo con la guía de la comunidad de {0}, su cuenta ha sido temporalmente suspendida. Por favor unirse a la conversación {1}."
|
||||
check_the_form: "Formulario Inválido. Por favor, completa los campos"
|
||||
step_1_header: "Reportar un problema"
|
||||
step_2_header: "Ayúdanos a comprender"
|
||||
step_3_header: "Gracias por tu participación"
|
||||
stream:
|
||||
temporarily_suspended: "De acuerdo con la guía de la comunidad de {0}, su cuenta\
|
||||
\ ha sido temporalmente suspendida. Por favor unirse a la conversación {1}."
|
||||
temporarily_suspended: "De acuerdo con la guía de la comunidad de {0}, su cuenta ha sido temporalmente suspendida. Por favor unirse a la conversación {1}."
|
||||
streams:
|
||||
all: Todos
|
||||
article: Artículo
|
||||
closed: Cerrado
|
||||
empty_result: "Ningún articulo coincide con esta búsqueda. Intente expandir su\
|
||||
\ búsqueda."
|
||||
all: "Todos"
|
||||
article: "Artículo"
|
||||
closed: "Cerrado"
|
||||
empty_result: "Ningún articulo coincide con esta búsqueda. Intente expandir su búsqueda."
|
||||
filter_streams: "Filtrar Hilos"
|
||||
newest: Más nuevo
|
||||
oldest: Más antiguo
|
||||
open: Abierto
|
||||
newest: "Más nuevo"
|
||||
oldest: "Más antiguo"
|
||||
open: "Abierto"
|
||||
pubdate: "Fecha Publicación"
|
||||
search: Buscar
|
||||
search: "Buscar"
|
||||
sort_by: "Ordenar por"
|
||||
status: "Estado del Hilo"
|
||||
stream_status: "Estado del Hilo"
|
||||
suspenduser:
|
||||
bio: bio
|
||||
bio: "bio"
|
||||
cancel: "Cancelar"
|
||||
days: "{0} días"
|
||||
description_0: "¿Quiere suspender temporalmente a este usuario por su {0}? Hacerlo\
|
||||
\ va a ocultar temporalmente todos sus comentarios hasta que edite su {0}."
|
||||
description_1: "Suspender a este usuario va a deshabilitar temporalmente su cuenta\
|
||||
\ y ocultar todos sus comentarios en el sitio."
|
||||
description_notify: "Suspender a este usuario va a deshabilitar temporalmente\
|
||||
\ su cuenta y ocultar todos sus comentarios en el sitio."
|
||||
description_reject: "¿Quiere suspender temporalmente a este usuario por su {0}?\
|
||||
\ Hacerlo va a ocultar temporalmente sus comentarios hasta que edite su {0}."
|
||||
description_suspend: "Esta suspendiendo a {0}. Este comentario va a ir a la fila\
|
||||
\ de Rechazados, y a {0} no se le va a permitir gustar, marcar, responder o\
|
||||
\ publicar hasta que el tiempo de suspendido halla concluido."
|
||||
email: "Otro miembro de la comunidad recientemente marco su nombre de usuario\
|
||||
\ para revisarlo. Por su contenido su nombre de usuario ha sido rechazado. Esto\
|
||||
\ significa que no puede comentar o marcar contenido hasta que edite su nombre\
|
||||
\ de usuario. Envíenos un correo si tiene preguntas o comentarios."
|
||||
description_0: "¿Quiere suspender temporalmente a este usuario por su {0}? Hacerlo va a ocultar temporalmente todos sus comentarios hasta que edite su {0}."
|
||||
description_1: "Suspender a este usuario va a deshabilitar temporalmente su cuenta y ocultar todos sus comentarios en el sitio."
|
||||
description_notify: "Suspender a este usuario va a deshabilitar temporalmente su cuenta y ocultar todos sus comentarios en el sitio."
|
||||
description_reject: "¿Quiere suspender temporalmente a este usuario por su {0}? Hacerlo va a ocultar temporalmente sus comentarios hasta que edite su {0}."
|
||||
description_suspend: "Esta suspendiendo a {0}. Este comentario va a ir a la fila de Rechazados, y a {0} no se le va a permitir gustar, marcar, responder o publicar hasta que el tiempo de suspendido halla concluido."
|
||||
email: "Otro miembro de la comunidad recientemente marco su nombre de usuario para revisarlo. Por su contenido su nombre de usuario ha sido rechazado. Esto significa que no puede comentar o marcar contenido hasta que edite su nombre de usuario. Envíenos un correo si tiene preguntas o comentarios."
|
||||
email_subject: "Su cuenta ha sido suspendida"
|
||||
email_message_reject: "Otro miembro de la comunidad hace poco ha marcado su nombre\
|
||||
\ de usuario para revisar. Y este ha sido rechazado por su contenido. Esto significa\
|
||||
\ que no puede comentar, gustar o marcar contenido hasta que edite su nombre\
|
||||
\ de usuario. Envíenos un correo si tiene alguna preocupación o pregunta."
|
||||
email_message_suspend: "Querida {0},\n\nDe acuerdo a la guía comunitaria de {1},\
|
||||
\ su cuenta ha sido temporalmente suspendida. Durante este tiempo, no podrá\
|
||||
\ comentar, marcar o involucrarse con otros comentaristas. Por favor unirse\
|
||||
\ a la conversación {2}."
|
||||
email_message_reject: "Otro miembro de la comunidad hace poco ha marcado su nombre de usuario para revisar. Y este ha sido rechazado por su contenido. Esto significa que no puede comentar, gustar o marcar contenido hasta que edite su nombre de usuario. Envíenos un correo si tiene alguna preocupación o pregunta."
|
||||
email_message_suspend: "Querida {0}, De acuerdo a la guía comunitaria de {1}, su cuenta ha sido temporalmente suspendida. Durante este tiempo, no podrá comentar, marcar o involucrarse con otros comentaristas. Por favor unirse a la conversación {2}."
|
||||
error_email_message_empty: "Debe especificar un mensaje de correo."
|
||||
hours: "{0} horas"
|
||||
no_cancel: "No cancelar"
|
||||
notify_suspend_until: "Usuario {0} ha sido temporalmente suspendido. Esta suspension\
|
||||
\ va a terminar automáticamente en {1}."
|
||||
notify_suspend_until: "Usuario {0} ha sido temporalmente suspendido. Esta suspension va a terminar automáticamente en {1}."
|
||||
one_hour: "1 hora"
|
||||
send: Enviar
|
||||
send: "Enviar"
|
||||
select_duration: "Seleccionar la duración de la suspensión"
|
||||
suspend_user: "Suspender Usuario"
|
||||
title: "Suspender un usuario"
|
||||
@@ -383,8 +377,7 @@ es:
|
||||
username: nombre de usuario
|
||||
write_message: "Escribir un mensaje"
|
||||
yes_suspend: "Si, suspender"
|
||||
thank_you: "Valoramos tanto su seguridad en este espacio como sus comentarios. Un\
|
||||
\ o una moderadora va a leer su reporte."
|
||||
thank_you: "Valoramos tanto su seguridad en este espacio como sus comentarios. Un o una moderadora va a leer su reporte."
|
||||
unset_best: "Des-etiquetar como el mejor"
|
||||
user:
|
||||
bio_flags: "reportes para este bio"
|
||||
@@ -395,29 +388,24 @@ es:
|
||||
username_offensive: "Este nombre de usuario es ofensivo"
|
||||
view_conversation: "Ver Conversación"
|
||||
install:
|
||||
initial:
|
||||
description: "Vamos a crear su comunidad Talk en unos pocos pasos."
|
||||
submit: "Empecemos"
|
||||
add_organization:
|
||||
description: "Por favor díganos el nombre de su organización. Esta aparecerá\
|
||||
\ en correos cuando se inviten a nuevos miembros del equipo."
|
||||
label: "Nombre de la Organización"
|
||||
save: "Guardar"
|
||||
create:
|
||||
email: "Dirección de correo"
|
||||
username: "Nombre de Usuario"
|
||||
password: "Contraseña"
|
||||
confirm_password: "Confirmar Contraseña"
|
||||
save: "Guardar"
|
||||
permitted_domains:
|
||||
title: "Dominios permitidos"
|
||||
description: "Ingresar los dominios en donde estará Talk, por ejemplo sus ambientes\
|
||||
\ locales, de staging y producción (ej. localhost:3000, staging.domain.com,\
|
||||
\ domain.com)."
|
||||
submit: "Terminar la Instalación"
|
||||
final:
|
||||
description: "¡Gracias por instalar Talk! Enviamos un correo para verificar\
|
||||
\ su dirección de correo. Mientras esta terminando de configurar su cuenta,\
|
||||
\ ya puede comenzar a involucrarse con sus lectores."
|
||||
launch: "Iniciar Talk"
|
||||
close: "Cerrar este instalador"
|
||||
INITIAL:
|
||||
DESCRIPTION: "Vamos a crear su comunidad Talk en unos pocos pasos."
|
||||
SUBMIT: "Empecemos"
|
||||
ADD_ORGANIZATION:
|
||||
DESCRIPTION: "Por favor díganos el nombre de su organización. Esta aparecerá en correos cuando se inviten a nuevos miembros del equipo."
|
||||
LABEL: "Nombre de la Organización"
|
||||
SAVE: "Guardar"
|
||||
CREATE:
|
||||
EMAIL: "Dirección de correo"
|
||||
USERNAME: "Nombre de Usuario"
|
||||
PASSWORD: "Contraseña"
|
||||
CONFIRM_PASSWORD: "Confirmar Contraseña"
|
||||
SAVE: "Guardar"
|
||||
PERMITTED_DOMAINS:
|
||||
TITLE: "Dominios permitidos"
|
||||
DESCRIPTION: "Ingresar los dominios en donde estará Talk, por ejemplo sus ambientes locales, de staging y producción (ej. localhost:3000, staging.domain.com, domain.com)."
|
||||
SUBMIT: "Terminar la Instalación"
|
||||
FINAL:
|
||||
DESCRIPTION: "¡Gracias por instalar Talk! Enviamos un correo para verificar su dirección de correo. Mientras esta terminando de configurar su cuenta, ya puede comenzar a involucrarse con sus lectores."
|
||||
LAUNCH: "Iniciar Talk"
|
||||
CLOSE: "Cerrar este instalador"
|
||||
|
||||
+2
-1
@@ -112,7 +112,8 @@
|
||||
"subscriptions-transport-ws": "^0.5.5-alpha.0",
|
||||
"timekeeper": "^1.0.0",
|
||||
"uuid": "^3.0.1",
|
||||
"yaml-loader": "^0.4.0"
|
||||
"yaml-loader": "^0.4.0",
|
||||
"yamljs": "^0.2.10"
|
||||
},
|
||||
"devDependencies": {
|
||||
"apollo-client": "^1.0.4",
|
||||
|
||||
@@ -3,12 +3,13 @@ import {Button} from 'coral-ui';
|
||||
import {connect} from 'react-redux';
|
||||
import {bindActionCreators} from 'redux';
|
||||
import {showSignInDialog} from 'coral-framework/actions/auth';
|
||||
import t from 'coral-framework/services/i18n';
|
||||
|
||||
const SignInButton = ({loggedIn, showSignInDialog}) => (
|
||||
<div>
|
||||
{!loggedIn
|
||||
? <Button id="coralSignInButton" onClick={showSignInDialog} full>
|
||||
Sign in to comment
|
||||
{t('sign_in.sign_in_to_comment')}
|
||||
</Button>
|
||||
: null}
|
||||
</div>
|
||||
|
||||
@@ -10,7 +10,7 @@ const UserBox = ({loggedIn, user, logout, onShowProfile}) => (
|
||||
{
|
||||
loggedIn ? (
|
||||
<div className={styles.userBox}>
|
||||
{t('sign_in.logged_in_as')}
|
||||
<span className={styles.userBoxLoggedIn}>{t('sign_in.logged_in_as')}</span>
|
||||
<a onClick={onShowProfile}>{user.username}</a>. {t('sign_in.not_you')}
|
||||
<a className={styles.logout} onClick={() => logout()}>
|
||||
{t('sign_in.logout')}
|
||||
|
||||
@@ -70,6 +70,10 @@ input.error{
|
||||
letter-spacing: 0.1px;
|
||||
}
|
||||
|
||||
.userBoxLoggedIn {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.userBox a {
|
||||
color: black;
|
||||
font-weight: bold;
|
||||
|
||||
@@ -5,10 +5,10 @@ en:
|
||||
verify_email: "Thank you for creating an account! We sent an email to the address you provided to verify your account."
|
||||
verify_email2: "You must verify your account before engaging with the community."
|
||||
not_you: "Not you?"
|
||||
logged_in_as: "Logged in as"
|
||||
logged_in_as: "Signed in as"
|
||||
facebook_sign_in: "Sign in with Facebook"
|
||||
facebook_sign_up: "Sign up with Facebook"
|
||||
logout: "Logout"
|
||||
logout: "Sign out"
|
||||
sign_in: "Sign in"
|
||||
sign_in_to_join: "Sign in to join the conversation"
|
||||
or: "Or"
|
||||
|
||||
@@ -5,6 +5,7 @@ const CommentsService = require('../../../services/comments');
|
||||
const mailer = require('../../../services/mailer');
|
||||
const errors = require('../../../errors');
|
||||
const authorization = require('../../../middleware/authorization');
|
||||
const i18n = require('../../../services/i18n');
|
||||
const {
|
||||
ROOT_URL
|
||||
} = require('../../../config');
|
||||
@@ -109,12 +110,12 @@ const SendEmailConfirmation = (app, userID, email, referer) => UsersService
|
||||
.then((token) => {
|
||||
return mailer.sendSimple({
|
||||
template: 'email-confirm', // needed to know which template to render!
|
||||
locals: { // specifies the template locals.
|
||||
locals: { // specifies the template locals.
|
||||
token,
|
||||
rootURL: ROOT_URL,
|
||||
email
|
||||
},
|
||||
subject: 'Email Confirmation',
|
||||
subject: i18n.t('email.confirm.subject'),
|
||||
to: email
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<p>A email confirmation has been requested for the following account: <b><%= email %></b>.</p>
|
||||
<p>To confirm the account, please visit the following link: <a href="<%= rootURL %>/admin/confirm-email#<%= token %>">Confirm Email</a></p>
|
||||
<p>If you did not request this, you can safely ignore this email.</p>
|
||||
<p><%= t('email.confirm.has_been_requested') %> <b><%= email %></b>.</p>
|
||||
<p><%= t('email.confirm.to_confirm') %> <a href="<%= rootURL %>/admin/confirm-email#<%= token %>">Confirm Email</a></p>
|
||||
<p><%= t('email.confirm.if_you_did_not') %></p>
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
A email confirmation has been requested for the following account:
|
||||
<%= t('email.confirm.has_been_requested') %>
|
||||
|
||||
<%= email %>
|
||||
|
||||
To confirm the account, please visit the following link:
|
||||
<%= t('email.confirm.to_confirm') %>
|
||||
|
||||
<%= rootURL %>/confirm/endpoint#<%= token %>
|
||||
|
||||
If you did not request this, you can safely ignore this email.
|
||||
<%= t('email.confirm.if_you_did_not') %>
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
<p>We received a request to reset your password. If you did not request this change, you can ignore this email.<br />
|
||||
If you did, <a href="<%= rootURL %>/admin/password-reset#<%= token %>">please click here to reset password</a>.</p>
|
||||
<p><%= t('email.password_reset.we_received_a_request') %><br />
|
||||
<%= t('email.password_reset.if_you_did') %> <a href="<%= rootURL %>/admin/password-reset#<%= token %>"><%= t('email.password_reset.please_click') %></a>.</p>
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
We received a request to reset your password, click here to reset your password:
|
||||
<%= t('email.password_reset.we_received_a_request') %>. <%= t('email.password_reset.if_you_did') %> <%= t('email.password_reset.please_click') %>:
|
||||
|
||||
<%= rootURL %>/admin/password-reset#<%= token %>
|
||||
|
||||
If you did not request this change, you can ignore this email.
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
const has = require('lodash/has');
|
||||
const get = require('lodash/get');
|
||||
|
||||
const yaml = require('yamljs');
|
||||
const es = yaml.load('./locales/es.yml');
|
||||
const en = yaml.load('./locales/en.yml');
|
||||
|
||||
const accepts = require('accepts');
|
||||
|
||||
// default language
|
||||
let defaultLanguage = 'en';
|
||||
let language = defaultLanguage;
|
||||
const languages = ['en', 'es'];
|
||||
|
||||
const translations = Object.assign(en, es);
|
||||
|
||||
/**
|
||||
* Exposes a service object to allow translations.
|
||||
* @type {Object}
|
||||
*/
|
||||
const i18n = {
|
||||
|
||||
/**
|
||||
* Create the new Task kue.
|
||||
*/
|
||||
init(req) {
|
||||
const lang = accepts(req).language(languages);
|
||||
language = lang ? lang : defaultLanguage;
|
||||
},
|
||||
|
||||
/**
|
||||
* Translates a key.
|
||||
*/
|
||||
t(key, ...replacements) {
|
||||
|
||||
if (has(translations[language], key)) {
|
||||
|
||||
let translation = get(translations[language], key);
|
||||
|
||||
// replace any {n} with the arguments passed to this method
|
||||
replacements.forEach((str, i) => {
|
||||
translation = translation.replace(new RegExp(`\\{${i}\\}`, 'g'), str);
|
||||
});
|
||||
|
||||
return translation;
|
||||
} else {
|
||||
console.warn(`${key} language key not set`);
|
||||
return key;
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = i18n;
|
||||
+7
-2
@@ -5,6 +5,8 @@ const path = require('path');
|
||||
const fs = require('fs');
|
||||
const _ = require('lodash');
|
||||
|
||||
const i18n = require('./i18n');
|
||||
|
||||
const {
|
||||
SMTP_HOST,
|
||||
SMTP_USERNAME,
|
||||
@@ -18,7 +20,7 @@ const templates = {
|
||||
data: {}
|
||||
};
|
||||
|
||||
// load the temlates per request during development
|
||||
// load the templates per request during development
|
||||
templates.render = (name, format = 'txt', context) => new Promise((resolve, reject) => {
|
||||
|
||||
// If we are in production mode, check the view cache.
|
||||
@@ -50,7 +52,7 @@ templates.render = (name, format = 'txt', context) => new Promise((resolve, reje
|
||||
|
||||
return resolve(view(context));
|
||||
});
|
||||
});
|
||||
}); // ends templates.render
|
||||
|
||||
const options = {
|
||||
host: SMTP_HOST,
|
||||
@@ -78,6 +80,7 @@ const mailer = module.exports = {
|
||||
}),
|
||||
|
||||
sendSimple({template, locals, to, subject}) {
|
||||
|
||||
if (!to) {
|
||||
return Promise.reject('sendSimple requires a comma-separated list of "to" addresses');
|
||||
}
|
||||
@@ -89,6 +92,8 @@ const mailer = module.exports = {
|
||||
// Prefix the subject with `[Talk]`.
|
||||
subject = `[Talk] ${subject}`;
|
||||
|
||||
locals['t'] = i18n.t;
|
||||
|
||||
return Promise.all([
|
||||
|
||||
// Render the HTML version of the email.
|
||||
|
||||
@@ -8541,6 +8541,13 @@ yaml-loader@^0.4.0:
|
||||
dependencies:
|
||||
js-yaml "^3.5.2"
|
||||
|
||||
yamljs@^0.2.10:
|
||||
version "0.2.10"
|
||||
resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.2.10.tgz#481cc7c25ca73af59f591f0c96e3ce56c757a40f"
|
||||
dependencies:
|
||||
argparse "^1.0.7"
|
||||
glob "^7.0.5"
|
||||
|
||||
yargs-parser@^2.4.1:
|
||||
version "2.4.1"
|
||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4"
|
||||
|
||||
Reference in New Issue
Block a user