mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-03 07:55:36 +00:00
repair translate bug (#2892)
* repair translate bug * escape repo-name * repair translate bug * repair shared-repo-list-item translate bug
This commit is contained in:
@@ -35,6 +35,7 @@ class CreateDepartmentRepoDialog extends React.Component {
|
||||
handleKeyPress = (e) => {
|
||||
if (e.key === 'Enter') {
|
||||
this.handleSubmit();
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,20 +51,16 @@ class CreateDepartmentRepoDialog extends React.Component {
|
||||
let errMessage = '';
|
||||
let repoName = this.state.repoName.trim();
|
||||
if (!repoName.length) {
|
||||
errMessage = 'Name is required';
|
||||
errMessage = gettext('Name is required');
|
||||
this.setState({errMessage: errMessage});
|
||||
return false;
|
||||
}
|
||||
if (repoName.indexOf('/') > -1) {
|
||||
errMessage = 'Name should not include \'/\'.';
|
||||
this.setState({errMessage: errMessage});
|
||||
return false;
|
||||
}
|
||||
if (repoName.length > maxFileName) {
|
||||
errMessage = 'RepoName\'s length is must little than ' + maxFileName;
|
||||
errMessage = gettext('Name should not include \'/\'.');
|
||||
this.setState({errMessage: errMessage});
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -90,7 +87,7 @@ class CreateDepartmentRepoDialog extends React.Component {
|
||||
/>
|
||||
</FormGroup>
|
||||
</Form>
|
||||
<Label className="err-message">{gettext(this.state.errMessage)}</Label>
|
||||
<Label className="err-message">{this.state.errMessage}</Label>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="primary" onClick={this.handleSubmit}>{gettext('Submit')}</Button>
|
||||
|
@@ -66,12 +66,12 @@ class CreateRepoDialog extends React.Component {
|
||||
let errMessage = '';
|
||||
let repoName = this.state.repoName.trim();
|
||||
if (!repoName.length) {
|
||||
errMessage = 'Name is required';
|
||||
errMessage = gettext('Name is required');
|
||||
this.setState({errMessage: errMessage});
|
||||
return false;
|
||||
}
|
||||
if (repoName.indexOf('/') > -1) {
|
||||
errMessage = 'Name should not include \'/\'.';
|
||||
errMessage = gettext('Name should not include \'/\'.');
|
||||
this.setState({errMessage: errMessage});
|
||||
return false;
|
||||
}
|
||||
@@ -79,22 +79,22 @@ class CreateRepoDialog extends React.Component {
|
||||
let password1 = this.state.password1.trim();
|
||||
let password2 = this.state.password2.trim();
|
||||
if (!password1.length) {
|
||||
errMessage = 'Please enter password';
|
||||
errMessage = gettext('Please enter password');
|
||||
this.setState({errMessage: errMessage});
|
||||
return false;
|
||||
}
|
||||
if (!password2.length) {
|
||||
errMessage = 'Please enter the password again';
|
||||
errMessage = gettext('Please enter the password again');
|
||||
this.setState({errMessage: errMessage});
|
||||
return false;
|
||||
}
|
||||
if (password1.length < 8) {
|
||||
errMessage = 'Password is too short';
|
||||
errMessage = gettext('Password is too short');
|
||||
this.setState({errMessage: errMessage});
|
||||
return false;
|
||||
}
|
||||
if (password1 !== password2) {
|
||||
errMessage = 'Passwords don\'t match';
|
||||
errMessage = gettext('Passwords don\'t match');
|
||||
this.setState({errMessage: errMessage});
|
||||
return false;
|
||||
}
|
||||
@@ -201,7 +201,7 @@ class CreateRepoDialog extends React.Component {
|
||||
</div>
|
||||
}
|
||||
</Form>
|
||||
<Label className="err-message">{gettext(this.state.errMessage)}</Label>
|
||||
<Label className="err-message">{this.state.errMessage}</Label>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="primary" onClick={this.handleSubmit}>{gettext('Submit')}</Button>
|
||||
|
@@ -1,6 +1,7 @@
|
||||
import React, { Component } from 'react';
|
||||
import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap';
|
||||
import { gettext } from '../../utils/constants';
|
||||
import { Utils } from '../../utils/utils';
|
||||
|
||||
class DeleteRepoDialog extends Component {
|
||||
|
||||
@@ -20,7 +21,7 @@ class DeleteRepoDialog extends Component {
|
||||
render() {
|
||||
|
||||
const data = this.props.data;
|
||||
const repoName = data ? '<span class="sf-font">' + data.repoName + '</span>' : null;
|
||||
const repoName = data ? '<span class="sf-font">' + Utils.HTMLescape(data.repoName) + '</span>' : null;
|
||||
let message = gettext("Are you sure you want to delete %s ?");
|
||||
message = message.replace('%s', repoName);
|
||||
const popup = (
|
||||
|
@@ -54,7 +54,6 @@ class InternalLinkDialog extends React.Component {
|
||||
}
|
||||
|
||||
render() {
|
||||
let internalLinkDesc = 'An internal link is a link to a file or folder that can be accessed by users with read permission to the file or folder.';
|
||||
return (
|
||||
<span className={'file-internal-link'} title={gettext('Internal Link')}>
|
||||
<i className="fa fa-link" onClick={this.getInternalLink}></i>
|
||||
@@ -62,7 +61,7 @@ class InternalLinkDialog extends React.Component {
|
||||
<ModalHeader toggle={this.toggle}>{gettext('Internal Link')}</ModalHeader>
|
||||
<ModalBody>
|
||||
<p className="tip mb-1">
|
||||
{gettext(internalLinkDesc)}
|
||||
{gettext('An internal link is a link to a file or folder that can be accessed by users with read permission to the file or folder.')}
|
||||
</p>
|
||||
<p>
|
||||
<a target="_blank" href={this.state.smartLink}>{this.state.smartLink}</a>
|
||||
|
@@ -38,7 +38,7 @@ class ReadmeDialog extends React.Component {
|
||||
render() {
|
||||
return (
|
||||
<Modal isOpen={true} toggle={this.props.toggleCancel} className="readme-dialog" size="lg">
|
||||
<ModalHeader>{gettext(this.props.fileName)}
|
||||
<ModalHeader>{this.props.fileName}
|
||||
<a className="readme-dialog-edit" href={this.props.href} target='_blank'><i className="fa fa-pencil"></i></a>
|
||||
</ModalHeader>
|
||||
<ModalBody>
|
||||
|
@@ -32,7 +32,7 @@ class ShareRepoListItem extends React.Component {
|
||||
<tr>
|
||||
<td className="text-center"><input type="checkbox" className="vam" name="repo" onChange={this.onRepoSelect} /></td>
|
||||
<td className="text-center"><img src={siteRoot + 'media/img/lib/48/lib.png'} alt={gettext('icon')} /></td>
|
||||
<td className="name">{gettext(repo.repo_name)}</td>
|
||||
<td className="name">{repo.repo_name}</td>
|
||||
<td>{moment(repo.last_modified).fromNow()}</td>
|
||||
<td>
|
||||
<Input style={{height: '1.5rem', padding: 0}} type="select" name="select" onChange={this.onPermissionChange} value={repo.sharePermission}>
|
||||
|
@@ -72,7 +72,7 @@ class WikiSelectDialog extends React.Component {
|
||||
<tr key={index}>
|
||||
<td className="text-center"><input type="radio" className="vam" name="repo" value={repo.repo_id} onChange={this.onChange.bind(this, repo)} /></td>
|
||||
<td className="text-center"><img src={siteRoot + 'media/img/lib/48/lib.png'} width="24" alt={gettext('icon')} /></td>
|
||||
<td>{gettext(repo.repo_name)}</td>
|
||||
<td>{repo.repo_name}</td>
|
||||
<td>{moment(repo.last_modified).fromNow()}</td>
|
||||
</tr>
|
||||
);
|
||||
|
@@ -290,8 +290,6 @@ class DirentListItem extends React.Component {
|
||||
this.interval = setInterval(this.addDownloadAnimation, 1000);
|
||||
}).catch(() => {
|
||||
clearInterval(this.interval);
|
||||
// toaster.danger(gettext(''));
|
||||
//todo;
|
||||
});
|
||||
} else {
|
||||
let url = URLDecorator.getUrl({type: 'download_file_url', repoID: repoID, filePath: direntPath});
|
||||
|
@@ -151,6 +151,30 @@ class SharedRepoListItem extends React.Component {
|
||||
this.setState({isShowSharedDialog: false});
|
||||
}
|
||||
|
||||
translateMenuItem = (menuItem) => {
|
||||
let translateResult = '';
|
||||
switch(menuItem) {
|
||||
case 'Rename':
|
||||
translateResult = gettext('Rename');
|
||||
break;
|
||||
case 'Folder Permission':
|
||||
translateResult = gettext('Folder Premission');
|
||||
break;
|
||||
case 'Details':
|
||||
translateResult = gettext('Details');
|
||||
break;
|
||||
case 'Unshare':
|
||||
translateResult = gettext('Unshare');
|
||||
break;
|
||||
case 'Share':
|
||||
translateResult = gettext('Share');
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return translateResult;
|
||||
}
|
||||
|
||||
generatorOperations = () => {
|
||||
let { repo, currentGroup } = this.props;
|
||||
//todo this have a bug; use current api is not return admins param;
|
||||
@@ -164,7 +188,7 @@ class SharedRepoListItem extends React.Component {
|
||||
if (isStaff && repo.owner_email == currentGroup.id + '@seafile_group') { //is a member of this current group,
|
||||
this.isDeparementOnwerGroupMember = true;
|
||||
if (folderPermEnabled) {
|
||||
operations = ['Rename', 'Folder Permission', 'deatils'];
|
||||
operations = ['Rename', 'Folder Permission', 'Details'];
|
||||
} else {
|
||||
operations = ['Rename', 'Details']
|
||||
}
|
||||
@@ -181,7 +205,7 @@ class SharedRepoListItem extends React.Component {
|
||||
}
|
||||
} else {
|
||||
if (isRepoOwner) {
|
||||
operations.push('share');
|
||||
operations.push('Share');
|
||||
}
|
||||
if (isStaff || isRepoOwner) {
|
||||
operations.push('Unshare');
|
||||
@@ -195,13 +219,13 @@ class SharedRepoListItem extends React.Component {
|
||||
if (this.props.libraryType && this.props.libraryType === 'public') {
|
||||
let isRepoOwner = this.props.repo.owner_email === username;
|
||||
if (isSystemStaff || isRepoOwner) {
|
||||
operations.push('unshare');
|
||||
operations.push('Unshare');
|
||||
}
|
||||
} else {
|
||||
operations = this.generatorOperations();
|
||||
if (this.isDeparementOnwerGroupMember) {
|
||||
operations.unshift('unshare');
|
||||
operations.unshift('share');
|
||||
operations.unshift('Unshare');
|
||||
operations.unshift('Share');
|
||||
}
|
||||
}
|
||||
return (
|
||||
@@ -219,7 +243,7 @@ class SharedRepoListItem extends React.Component {
|
||||
<div className="mobile-operation-menu">
|
||||
{operations.map((item, index) => {
|
||||
return (
|
||||
<DropdownItem key={index} data-toggle={item} onClick={this.onMenuItemClick}>{gettext(item)}</DropdownItem>
|
||||
<DropdownItem key={index} data-toggle={item} onClick={this.onMenuItemClick}>{this.translateMenuItem(item)}</DropdownItem>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
@@ -260,7 +284,7 @@ class SharedRepoListItem extends React.Component {
|
||||
/>
|
||||
<DropdownMenu>
|
||||
{operations.map((item, index) => {
|
||||
return <DropdownItem key={index} data-toggle={item} onClick={this.onMenuItemClick}>{gettext(item)}</DropdownItem>
|
||||
return <DropdownItem key={index} data-toggle={item} onClick={this.onMenuItemClick}>{this.translateMenuItem(item)}</DropdownItem>
|
||||
})}
|
||||
</DropdownMenu>
|
||||
</Dropdown>
|
||||
|
@@ -164,10 +164,10 @@ class WikiListItem extends Component {
|
||||
<td className="name">
|
||||
{this.state.isRenameing ?
|
||||
<WikiRename wiki={wiki} onRenameConfirm={this.onRenameConfirm} onRenameCancel={this.onRenameCancel}/> :
|
||||
<a href={wiki.link}>{gettext(wiki.name)}</a>
|
||||
<a href={wiki.link}>{wiki.name}</a>
|
||||
}
|
||||
</td>
|
||||
<td><a href={userProfileURL} target='_blank'>{gettext(wiki.owner_nickname)}</a></td>
|
||||
<td><a href={userProfileURL} target='_blank'>{wiki.owner_nickname}</a></td>
|
||||
<td>{moment(wiki.updated_at).fromNow()}</td>
|
||||
<td>
|
||||
<WikiPermissionEditor
|
||||
|
Reference in New Issue
Block a user