1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-04 08:28:11 +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:
杨顺强
2019-01-28 16:32:32 +08:00
committed by Daniel Pan
parent 55da78826e
commit d702be3b2b
10 changed files with 51 additions and 32 deletions

View File

@@ -35,6 +35,7 @@ class CreateDepartmentRepoDialog extends React.Component {
handleKeyPress = (e) => { handleKeyPress = (e) => {
if (e.key === 'Enter') { if (e.key === 'Enter') {
this.handleSubmit(); this.handleSubmit();
e.preventDefault();
} }
} }
@@ -50,20 +51,16 @@ class CreateDepartmentRepoDialog extends React.Component {
let errMessage = ''; let errMessage = '';
let repoName = this.state.repoName.trim(); let repoName = this.state.repoName.trim();
if (!repoName.length) { if (!repoName.length) {
errMessage = 'Name is required'; errMessage = gettext('Name is required');
this.setState({errMessage: errMessage}); this.setState({errMessage: errMessage});
return false; return false;
} }
if (repoName.indexOf('/') > -1) { if (repoName.indexOf('/') > -1) {
errMessage = 'Name should not include \'/\'.'; errMessage = gettext('Name should not include \'/\'.');
this.setState({errMessage: errMessage});
return false;
}
if (repoName.length > maxFileName) {
errMessage = 'RepoName\'s length is must little than ' + maxFileName;
this.setState({errMessage: errMessage}); this.setState({errMessage: errMessage});
return false; return false;
} }
return true; return true;
} }
@@ -90,7 +87,7 @@ class CreateDepartmentRepoDialog extends React.Component {
/> />
</FormGroup> </FormGroup>
</Form> </Form>
<Label className="err-message">{gettext(this.state.errMessage)}</Label> <Label className="err-message">{this.state.errMessage}</Label>
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="primary" onClick={this.handleSubmit}>{gettext('Submit')}</Button> <Button color="primary" onClick={this.handleSubmit}>{gettext('Submit')}</Button>

View File

@@ -66,12 +66,12 @@ class CreateRepoDialog extends React.Component {
let errMessage = ''; let errMessage = '';
let repoName = this.state.repoName.trim(); let repoName = this.state.repoName.trim();
if (!repoName.length) { if (!repoName.length) {
errMessage = 'Name is required'; errMessage = gettext('Name is required');
this.setState({errMessage: errMessage}); this.setState({errMessage: errMessage});
return false; return false;
} }
if (repoName.indexOf('/') > -1) { if (repoName.indexOf('/') > -1) {
errMessage = 'Name should not include \'/\'.'; errMessage = gettext('Name should not include \'/\'.');
this.setState({errMessage: errMessage}); this.setState({errMessage: errMessage});
return false; return false;
} }
@@ -79,22 +79,22 @@ class CreateRepoDialog extends React.Component {
let password1 = this.state.password1.trim(); let password1 = this.state.password1.trim();
let password2 = this.state.password2.trim(); let password2 = this.state.password2.trim();
if (!password1.length) { if (!password1.length) {
errMessage = 'Please enter password'; errMessage = gettext('Please enter password');
this.setState({errMessage: errMessage}); this.setState({errMessage: errMessage});
return false; return false;
} }
if (!password2.length) { if (!password2.length) {
errMessage = 'Please enter the password again'; errMessage = gettext('Please enter the password again');
this.setState({errMessage: errMessage}); this.setState({errMessage: errMessage});
return false; return false;
} }
if (password1.length < 8) { if (password1.length < 8) {
errMessage = 'Password is too short'; errMessage = gettext('Password is too short');
this.setState({errMessage: errMessage}); this.setState({errMessage: errMessage});
return false; return false;
} }
if (password1 !== password2) { if (password1 !== password2) {
errMessage = 'Passwords don\'t match'; errMessage = gettext('Passwords don\'t match');
this.setState({errMessage: errMessage}); this.setState({errMessage: errMessage});
return false; return false;
} }
@@ -201,7 +201,7 @@ class CreateRepoDialog extends React.Component {
</div> </div>
} }
</Form> </Form>
<Label className="err-message">{gettext(this.state.errMessage)}</Label> <Label className="err-message">{this.state.errMessage}</Label>
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="primary" onClick={this.handleSubmit}>{gettext('Submit')}</Button> <Button color="primary" onClick={this.handleSubmit}>{gettext('Submit')}</Button>

View File

@@ -1,6 +1,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap'; import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap';
import { gettext } from '../../utils/constants'; import { gettext } from '../../utils/constants';
import { Utils } from '../../utils/utils';
class DeleteRepoDialog extends Component { class DeleteRepoDialog extends Component {
@@ -20,7 +21,7 @@ class DeleteRepoDialog extends Component {
render() { render() {
const data = this.props.data; 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 ?"); let message = gettext("Are you sure you want to delete %s ?");
message = message.replace('%s', repoName); message = message.replace('%s', repoName);
const popup = ( const popup = (

View File

@@ -54,7 +54,6 @@ class InternalLinkDialog extends React.Component {
} }
render() { 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 ( return (
<span className={'file-internal-link'} title={gettext('Internal Link')}> <span className={'file-internal-link'} title={gettext('Internal Link')}>
<i className="fa fa-link" onClick={this.getInternalLink}></i> <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> <ModalHeader toggle={this.toggle}>{gettext('Internal Link')}</ModalHeader>
<ModalBody> <ModalBody>
<p className="tip mb-1"> <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>
<p> <p>
<a target="_blank" href={this.state.smartLink}>{this.state.smartLink}</a> <a target="_blank" href={this.state.smartLink}>{this.state.smartLink}</a>

View File

@@ -38,7 +38,7 @@ class ReadmeDialog extends React.Component {
render() { render() {
return ( return (
<Modal isOpen={true} toggle={this.props.toggleCancel} className="readme-dialog" size="lg"> <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> <a className="readme-dialog-edit" href={this.props.href} target='_blank'><i className="fa fa-pencil"></i></a>
</ModalHeader> </ModalHeader>
<ModalBody> <ModalBody>

View File

@@ -32,7 +32,7 @@ class ShareRepoListItem extends React.Component {
<tr> <tr>
<td className="text-center"><input type="checkbox" className="vam" name="repo" onChange={this.onRepoSelect} /></td> <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="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>{moment(repo.last_modified).fromNow()}</td>
<td> <td>
<Input style={{height: '1.5rem', padding: 0}} type="select" name="select" onChange={this.onPermissionChange} value={repo.sharePermission}> <Input style={{height: '1.5rem', padding: 0}} type="select" name="select" onChange={this.onPermissionChange} value={repo.sharePermission}>

View File

@@ -72,7 +72,7 @@ class WikiSelectDialog extends React.Component {
<tr key={index}> <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"><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 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> <td>{moment(repo.last_modified).fromNow()}</td>
</tr> </tr>
); );

View File

@@ -290,8 +290,6 @@ class DirentListItem extends React.Component {
this.interval = setInterval(this.addDownloadAnimation, 1000); this.interval = setInterval(this.addDownloadAnimation, 1000);
}).catch(() => { }).catch(() => {
clearInterval(this.interval); clearInterval(this.interval);
// toaster.danger(gettext(''));
//todo;
}); });
} else { } else {
let url = URLDecorator.getUrl({type: 'download_file_url', repoID: repoID, filePath: direntPath}); let url = URLDecorator.getUrl({type: 'download_file_url', repoID: repoID, filePath: direntPath});

View File

@@ -151,6 +151,30 @@ class SharedRepoListItem extends React.Component {
this.setState({isShowSharedDialog: false}); 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 = () => { generatorOperations = () => {
let { repo, currentGroup } = this.props; let { repo, currentGroup } = this.props;
//todo this have a bug; use current api is not return admins param; //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, if (isStaff && repo.owner_email == currentGroup.id + '@seafile_group') { //is a member of this current group,
this.isDeparementOnwerGroupMember = true; this.isDeparementOnwerGroupMember = true;
if (folderPermEnabled) { if (folderPermEnabled) {
operations = ['Rename', 'Folder Permission', 'deatils']; operations = ['Rename', 'Folder Permission', 'Details'];
} else { } else {
operations = ['Rename', 'Details'] operations = ['Rename', 'Details']
} }
@@ -181,7 +205,7 @@ class SharedRepoListItem extends React.Component {
} }
} else { } else {
if (isRepoOwner) { if (isRepoOwner) {
operations.push('share'); operations.push('Share');
} }
if (isStaff || isRepoOwner) { if (isStaff || isRepoOwner) {
operations.push('Unshare'); operations.push('Unshare');
@@ -195,13 +219,13 @@ class SharedRepoListItem extends React.Component {
if (this.props.libraryType && this.props.libraryType === 'public') { if (this.props.libraryType && this.props.libraryType === 'public') {
let isRepoOwner = this.props.repo.owner_email === username; let isRepoOwner = this.props.repo.owner_email === username;
if (isSystemStaff || isRepoOwner) { if (isSystemStaff || isRepoOwner) {
operations.push('unshare'); operations.push('Unshare');
} }
} else { } else {
operations = this.generatorOperations(); operations = this.generatorOperations();
if (this.isDeparementOnwerGroupMember) { if (this.isDeparementOnwerGroupMember) {
operations.unshift('unshare'); operations.unshift('Unshare');
operations.unshift('share'); operations.unshift('Share');
} }
} }
return ( return (
@@ -219,7 +243,7 @@ class SharedRepoListItem extends React.Component {
<div className="mobile-operation-menu"> <div className="mobile-operation-menu">
{operations.map((item, index) => { {operations.map((item, index) => {
return ( 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> </div>
@@ -260,7 +284,7 @@ class SharedRepoListItem extends React.Component {
/> />
<DropdownMenu> <DropdownMenu>
{operations.map((item, index) => { {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> </DropdownMenu>
</Dropdown> </Dropdown>

View File

@@ -164,10 +164,10 @@ class WikiListItem extends Component {
<td className="name"> <td className="name">
{this.state.isRenameing ? {this.state.isRenameing ?
<WikiRename wiki={wiki} onRenameConfirm={this.onRenameConfirm} onRenameCancel={this.onRenameCancel}/> : <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>
<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>{moment(wiki.updated_at).fromNow()}</td>
<td> <td>
<WikiPermissionEditor <WikiPermissionEditor