Merge 4.21.0 into master (#3467)

This commit is contained in:
Diego Mello 2021-10-28 14:48:53 -03:00 committed by GitHub
parent 4db5db7fa0
commit 5cd4d82477
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
196 changed files with 26479 additions and 15019 deletions

View File

@ -23,3 +23,4 @@ SECURITY.md
npm-debug.log npm-debug.log
yarn-error.log yarn-error.log
app/i18n/locales/

File diff suppressed because it is too large Load Diff

View File

@ -144,7 +144,7 @@ android {
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion
versionCode VERSIONCODE as Integer versionCode VERSIONCODE as Integer
versionName "4.20.0" versionName "4.21.0"
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true
if (!isFoss) { if (!isFoss) {
manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String] manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String]
@ -260,7 +260,6 @@ android {
dependencies { dependencies {
addUnimodulesDependencies() addUnimodulesDependencies()
implementation project(':watermelondb')
implementation project(':@react-native-community_viewpager') implementation project(':@react-native-community_viewpager')
playImplementation project(':reactnativenotifications') playImplementation project(':reactnativenotifications')
playImplementation project(':@react-native-firebase_app') playImplementation project(':@react-native-firebase_app')
@ -293,6 +292,8 @@ dependencies {
implementation "com.github.bumptech.glide:glide:4.9.0" implementation "com.github.bumptech.glide:glide:4.9.0"
annotationProcessor "com.github.bumptech.glide:compiler:4.9.0" annotationProcessor "com.github.bumptech.glide:compiler:4.9.0"
implementation "com.tencent:mmkv-static:1.2.1" implementation "com.tencent:mmkv-static:1.2.1"
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
implementation "com.squareup.okhttp3:okhttp-urlconnection:4.9.0"
} }
// Run this once to be able to run the application with BUCK // Run this once to be able to run the application with BUCK

View File

@ -3,7 +3,6 @@
package="chat.rocket.reactnative"> package="chat.rocket.reactnative">
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application <application

View File

@ -9,8 +9,9 @@ import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage; import com.facebook.react.ReactPackage;
import com.facebook.soloader.SoLoader; import com.facebook.soloader.SoLoader;
import com.nozbe.watermelondb.WatermelonDBPackage;
import com.reactnativecommunity.viewpager.RNCViewPagerPackage; import com.reactnativecommunity.viewpager.RNCViewPagerPackage;
import com.facebook.react.bridge.JSIModulePackage;
import com.swmansion.reanimated.ReanimatedJSIModulePackage;
import org.unimodules.adapters.react.ModuleRegistryAdapter; import org.unimodules.adapters.react.ModuleRegistryAdapter;
import org.unimodules.adapters.react.ReactModuleRegistryProvider; import org.unimodules.adapters.react.ReactModuleRegistryProvider;
@ -35,7 +36,6 @@ public class MainApplication extends Application implements ReactApplication {
protected List<ReactPackage> getPackages() { protected List<ReactPackage> getPackages() {
@SuppressWarnings("UnnecessaryLocalVariable") @SuppressWarnings("UnnecessaryLocalVariable")
List<ReactPackage> packages = new PackageList(this).getPackages(); List<ReactPackage> packages = new PackageList(this).getPackages();
packages.add(new WatermelonDBPackage());
packages.add(new RNCViewPagerPackage()); packages.add(new RNCViewPagerPackage());
packages.add(new SSLPinningPackage()); packages.add(new SSLPinningPackage());
List<ReactPackage> unimodules = Arrays.<ReactPackage>asList( List<ReactPackage> unimodules = Arrays.<ReactPackage>asList(
@ -52,6 +52,11 @@ public class MainApplication extends Application implements ReactApplication {
return "index"; return "index";
} }
@Override
protected JSIModulePackage getJSIModulePackage() {
return new ReanimatedJSIModulePackage(); // <- add
}
@Override @Override
protected @Nullable String getBundleAssetName() { protected @Nullable String getBundleAssetName() {
return "app.bundle"; return "app.bundle";

View File

@ -14,7 +14,6 @@ public class BasePackageList {
new expo.modules.imageloader.ImageLoaderPackage(), new expo.modules.imageloader.ImageLoaderPackage(),
new expo.modules.keepawake.KeepAwakePackage(), new expo.modules.keepawake.KeepAwakePackage(),
new expo.modules.localauthentication.LocalAuthenticationPackage(), new expo.modules.localauthentication.LocalAuthenticationPackage(),
new expo.modules.permissions.PermissionsPackage(),
new expo.modules.videothumbnails.VideoThumbnailsPackage(), new expo.modules.videothumbnails.VideoThumbnailsPackage(),
new expo.modules.webbrowser.WebBrowserPackage() new expo.modules.webbrowser.WebBrowserPackage()
); );

View File

@ -10,8 +10,8 @@ buildscript {
ext { ext {
buildToolsVersion = "29.0.3" buildToolsVersion = "29.0.3"
minSdkVersion = 23 minSdkVersion = 23
compileSdkVersion = 29 compileSdkVersion = 30
targetSdkVersion = 29 targetSdkVersion = 30
ndkVersion = "20.1.5948944" ndkVersion = "20.1.5948944"
glideVersion = "4.11.0" glideVersion = "4.11.0"
kotlin_version = "1.3.50" kotlin_version = "1.3.50"
@ -68,10 +68,10 @@ subprojects { subproject ->
afterEvaluate { afterEvaluate {
if ((subproject.plugins.hasPlugin('android') || subproject.plugins.hasPlugin('android-library'))) { if ((subproject.plugins.hasPlugin('android') || subproject.plugins.hasPlugin('android-library'))) {
android { android {
compileSdkVersion 29 compileSdkVersion 30
buildToolsVersion "29.0.3" buildToolsVersion "29.0.3"
defaultConfig { defaultConfig {
targetSdkVersion 29 targetSdkVersion 30
} }
variantFilter { variant -> variantFilter { variant ->
def names = variant.flavors*.name def names = variant.flavors*.name

View File

@ -2,8 +2,6 @@ apply from: '../node_modules/react-native-unimodules/gradle.groovy'
includeUnimodulesProjects() includeUnimodulesProjects()
rootProject.name = 'RocketChatRN' rootProject.name = 'RocketChatRN'
include ':watermelondb'
project(':watermelondb').projectDir = new File(rootProject.projectDir, '../node_modules/@nozbe/watermelondb/native/android')
include ':reactnativenotifications' include ':reactnativenotifications'
project(':reactnativenotifications').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-notifications/android/app') project(':reactnativenotifications').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-notifications/android/app')
include ':@react-native-community_viewpager' include ':@react-native-community_viewpager'

View File

@ -18,8 +18,6 @@ export const ROOMS = createRequestTypes('ROOMS', [
'SET_SEARCH', 'SET_SEARCH',
'CLOSE_SERVER_DROPDOWN', 'CLOSE_SERVER_DROPDOWN',
'TOGGLE_SERVER_DROPDOWN', 'TOGGLE_SERVER_DROPDOWN',
'CLOSE_SORT_DROPDOWN',
'TOGGLE_SORT_DROPDOWN',
'OPEN_SEARCH_HEADER', 'OPEN_SEARCH_HEADER',
'CLOSE_SEARCH_HEADER' 'CLOSE_SEARCH_HEADER'
]); ]);

View File

@ -45,18 +45,6 @@ export function toggleServerDropdown() {
}; };
} }
export function closeSortDropdown() {
return {
type: types.ROOMS.CLOSE_SORT_DROPDOWN
};
}
export function toggleSortDropdown() {
return {
type: types.ROOMS.TOGGLE_SORT_DROPDOWN
};
}
export function openSearchHeader() { export function openSearchHeader() {
return { return {
type: types.ROOMS.OPEN_SEARCH_HEADER type: types.ROOMS.OPEN_SEARCH_HEADER

View File

@ -0,0 +1,2 @@
export const DISPLAY_MODE_CONDENSED = 'condensed';
export const DISPLAY_MODE_EXPANDED = 'expanded';

View File

@ -3,7 +3,7 @@ import { Keyboard, Text } from 'react-native';
import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useSafeAreaInsets } from 'react-native-safe-area-context';
import { State, TapGestureHandler } from 'react-native-gesture-handler'; import { State, TapGestureHandler } from 'react-native-gesture-handler';
import ScrollBottomSheet from 'react-native-scroll-bottom-sheet'; import ScrollBottomSheet from 'react-native-scroll-bottom-sheet';
import Animated, { Easing, Extrapolate, Value, interpolate } from 'react-native-reanimated'; import Animated, { Easing, Extrapolate, Value, interpolateNode } from 'react-native-reanimated';
import * as Haptics from 'expo-haptics'; import * as Haptics from 'expo-haptics';
import { useBackHandler } from '@react-native-community/hooks'; import { useBackHandler } from '@react-native-community/hooks';
@ -132,11 +132,12 @@ const ActionSheet = React.memo(
const renderItem = ({ item }: any) => <Item item={item} hide={hide} theme={theme} />; const renderItem = ({ item }: any) => <Item item={item} hide={hide} theme={theme} />;
const animatedPosition = React.useRef(new Value(0)); const animatedPosition = React.useRef(new Value(0));
const opacity = interpolate(animatedPosition.current, { // TODO: Similar to https://github.com/wcandillon/react-native-redash/issues/307#issuecomment-827442320
const opacity = interpolateNode(animatedPosition.current, {
inputRange: [0, 1], inputRange: [0, 1],
outputRange: [0, themes[theme].backdropOpacity], outputRange: [0, themes[theme].backdropOpacity],
extrapolate: Extrapolate.CLAMP extrapolate: Extrapolate.CLAMP
}); }) as any;
return ( return (
<> <>

View File

@ -85,7 +85,7 @@ const Avatar = React.memo(
} }
return ( return (
<View style={[avatarStyle, style]}> <View style={[avatarStyle, style]} testID='avatar'>
{image} {image}
{children} {children}
</View> </View>

View File

@ -1,5 +1,5 @@
import React from 'react'; import React from 'react';
import { ScrollView, StyleSheet, View } from 'react-native'; import { ScrollView, ScrollViewProps, StyleSheet, View } from 'react-native';
import { themes } from '../constants/colors'; import { themes } from '../constants/colors';
import sharedStyles from '../views/Styles'; import sharedStyles from '../views/Styles';
@ -10,10 +10,10 @@ import AppVersion from './AppVersion';
import { isTablet } from '../utils/deviceInfo'; import { isTablet } from '../utils/deviceInfo';
import SafeAreaView from './SafeAreaView'; import SafeAreaView from './SafeAreaView';
interface IFormContainer { interface IFormContainer extends ScrollViewProps {
theme: string; theme: string;
testID: string; testID: string;
children: JSX.Element; children: React.ReactNode;
} }
const styles = StyleSheet.create({ const styles = StyleSheet.create({
@ -22,11 +22,11 @@ const styles = StyleSheet.create({
} }
}); });
export const FormContainerInner = ({ children }: { children: JSX.Element }) => ( export const FormContainerInner = ({ children }: { children: React.ReactNode }): JSX.Element => (
<View style={[sharedStyles.container, isTablet && sharedStyles.tabletScreenContent]}>{children}</View> <View style={[sharedStyles.container, isTablet && sharedStyles.tabletScreenContent]}>{children}</View>
); );
const FormContainer = ({ children, theme, testID, ...props }: IFormContainer) => ( const FormContainer = ({ children, theme, testID, ...props }: IFormContainer): JSX.Element => (
// @ts-ignore // @ts-ignore
<KeyboardView <KeyboardView
style={{ backgroundColor: themes[theme].backgroundColor }} style={{ backgroundColor: themes[theme].backgroundColor }}

View File

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { StyleSheet, Text, View } from 'react-native'; import { StyleProp, StyleSheet, Text, TextInputProps, TextStyle, View, ViewStyle } from 'react-native';
import { BorderlessButton } from 'react-native-gesture-handler'; import Touchable from 'react-native-platform-touchable';
import sharedStyles from '../views/Styles'; import sharedStyles from '../views/Styles';
import TextInput from '../presentation/TextInput'; import TextInput from '../presentation/TextInput';
@ -50,23 +50,21 @@ const styles = StyleSheet.create({
} }
}); });
interface IRCTextInputProps { interface IRCTextInputProps extends TextInputProps {
label: string; label?: string;
error: { error?: {
error: any; error: any;
reason: any; reason: any;
}; };
loading: boolean; loading?: boolean;
secureTextEntry: boolean; containerStyle?: StyleProp<ViewStyle>;
containerStyle: any; inputStyle?: TextStyle;
inputStyle: object; inputRef?: React.Ref<unknown>;
inputRef: any; testID?: string;
testID: string; iconLeft?: string;
iconLeft: string; iconRight?: string;
iconRight: string; left?: JSX.Element;
placeholder: string; onIconRightPress?(): void;
left: JSX.Element;
onIconRightPress(): void;
theme: string; theme: string;
} }
@ -95,9 +93,9 @@ export default class RCTextInput extends React.PureComponent<IRCTextInputProps,
get iconRight() { get iconRight() {
const { iconRight, onIconRightPress, theme } = this.props; const { iconRight, onIconRightPress, theme } = this.props;
return ( return (
<BorderlessButton onPress={onIconRightPress} style={[styles.iconContainer, styles.iconRight]}> <Touchable onPress={onIconRightPress} style={[styles.iconContainer, styles.iconRight]}>
<CustomIcon name={iconRight} style={{ color: themes[theme].bodyText }} size={20} /> <CustomIcon name={iconRight} style={{ color: themes[theme].bodyText }} size={20} />
</BorderlessButton> </Touchable>
); );
} }
@ -105,14 +103,14 @@ export default class RCTextInput extends React.PureComponent<IRCTextInputProps,
const { showPassword } = this.state; const { showPassword } = this.state;
const { testID, theme } = this.props; const { testID, theme } = this.props;
return ( return (
<BorderlessButton onPress={this.tooglePassword} style={[styles.iconContainer, styles.iconRight]}> <Touchable onPress={this.tooglePassword} style={[styles.iconContainer, styles.iconRight]}>
<CustomIcon <CustomIcon
name={showPassword ? 'unread-on-top' : 'unread-on-top-disabled'} name={showPassword ? 'unread-on-top' : 'unread-on-top-disabled'}
testID={testID ? `${testID}-icon-right` : null} testID={testID ? `${testID}-icon-right` : null}
style={{ color: themes[theme].auxiliaryText }} style={{ color: themes[theme].auxiliaryText }}
size={20} size={20}
/> />
</BorderlessButton> </Touchable>
); );
} }
@ -148,17 +146,10 @@ export default class RCTextInput extends React.PureComponent<IRCTextInputProps,
return ( return (
<View style={[styles.inputContainer, containerStyle]}> <View style={[styles.inputContainer, containerStyle]}>
{label ? ( {label ? (
<Text <Text style={[styles.label, { color: themes[theme].titleText }, error?.error && { color: dangerColor }]}>{label}</Text>
contentDescription={null}
// @ts-ignore
accessibilityLabel={null}
style={[styles.label, { color: themes[theme].titleText }, error.error && { color: dangerColor }]}>
{label}
</Text>
) : null} ) : null}
<View style={styles.wrap}> <View style={styles.wrap}>
<TextInput <TextInput
/* @ts-ignore*/
style={[ style={[
styles.input, styles.input,
iconLeft && styles.inputIconLeft, iconLeft && styles.inputIconLeft,
@ -168,14 +159,13 @@ export default class RCTextInput extends React.PureComponent<IRCTextInputProps,
borderColor: themes[theme].separatorColor, borderColor: themes[theme].separatorColor,
color: themes[theme].titleText color: themes[theme].titleText
}, },
error.error && { error?.error && {
color: dangerColor, color: dangerColor,
borderColor: dangerColor borderColor: dangerColor
}, },
inputStyle inputStyle
]} ]}
ref={inputRef} ref={inputRef}
/* @ts-ignore*/
autoCorrect={false} autoCorrect={false}
autoCapitalize='none' autoCapitalize='none'
underlineColorAndroid='transparent' underlineColorAndroid='transparent'
@ -183,8 +173,6 @@ export default class RCTextInput extends React.PureComponent<IRCTextInputProps,
testID={testID} testID={testID}
accessibilityLabel={placeholder} accessibilityLabel={placeholder}
placeholder={placeholder} placeholder={placeholder}
/* @ts-ignore*/
contentDescription={placeholder}
theme={theme} theme={theme}
{...inputProps} {...inputProps}
/> />

View File

@ -1,6 +1,7 @@
import React from 'react'; import React from 'react';
import { Text } from 'react-native'; import { Text } from 'react-native';
import { useTheme } from '../../theme';
import { themes } from '../../constants/colors'; import { themes } from '../../constants/colors';
import styles from './styles'; import styles from './styles';
import { events, logEvent } from '../../utils/log'; import { events, logEvent } from '../../utils/log';
@ -9,20 +10,20 @@ interface IAtMention {
mention: string; mention: string;
username: string; username: string;
navToRoomInfo: Function; navToRoomInfo: Function;
style: any; style?: any;
useRealName: boolean; useRealName: boolean;
theme: string;
mentions: any; mentions: any;
} }
const AtMention = React.memo(({ mention, mentions, username, navToRoomInfo, style = [], useRealName, theme }: IAtMention) => { const AtMention = React.memo(({ mention, mentions, username, navToRoomInfo, style = [], useRealName }: IAtMention) => {
const { theme } = useTheme();
if (mention === 'all' || mention === 'here') { if (mention === 'all' || mention === 'here') {
return ( return (
<Text <Text
style={[ style={[
styles.mention, styles.mention,
{ {
color: themes[theme].mentionGroupColor color: themes[theme!].mentionGroupColor
}, },
...style ...style
]}> ]}>
@ -34,11 +35,11 @@ const AtMention = React.memo(({ mention, mentions, username, navToRoomInfo, styl
let mentionStyle = {}; let mentionStyle = {};
if (mention === username) { if (mention === username) {
mentionStyle = { mentionStyle = {
color: themes[theme].mentionMeColor color: themes[theme!].mentionMeColor
}; };
} else { } else {
mentionStyle = { mentionStyle = {
color: themes[theme].mentionOtherColor color: themes[theme!].mentionOtherColor
}; };
} }
@ -61,7 +62,7 @@ const AtMention = React.memo(({ mention, mentions, username, navToRoomInfo, styl
); );
} }
return <Text style={[styles.text, { color: themes[theme].bodyText }, ...style]}>{`@${mention}`}</Text>; return <Text style={[styles.text, { color: themes[theme!].bodyText }, ...style]}>{`@${mention}`}</Text>;
}); });
export default AtMention; export default AtMention;

View File

@ -1,23 +1,26 @@
import React from 'react'; import React from 'react';
import { Text } from 'react-native'; import { Text, TextStyle } from 'react-native';
import { themes } from '../../constants/colors'; import { themes } from '../../constants/colors';
import { useTheme } from '../../theme';
import styles from './styles'; import styles from './styles';
interface IHashtag { interface IHashtag {
hashtag: string; hashtag: string;
navToRoomInfo: Function; navToRoomInfo: Function;
style: []; style?: TextStyle[];
theme: string;
channels: { channels: {
[index: number]: string | number;
name: string; name: string;
_id: number; _id: number;
}[]; }[];
} }
const Hashtag = React.memo(({ hashtag, channels, navToRoomInfo, style = [], theme }: IHashtag) => { const Hashtag = React.memo(({ hashtag, channels, navToRoomInfo, style = [] }: IHashtag) => {
const { theme } = useTheme();
const handlePress = () => { const handlePress = () => {
const index = channels.findIndex(channel => channel.name === hashtag); const index = channels?.findIndex(channel => channel.name === hashtag);
const navParam = { const navParam = {
t: 'c', t: 'c',
rid: channels[index]._id rid: channels[index]._id
@ -31,7 +34,7 @@ const Hashtag = React.memo(({ hashtag, channels, navToRoomInfo, style = [], them
style={[ style={[
styles.mention, styles.mention,
{ {
color: themes[theme].mentionOtherColor color: themes[theme!].mentionOtherColor
}, },
...style ...style
]} ]}
@ -40,7 +43,7 @@ const Hashtag = React.memo(({ hashtag, channels, navToRoomInfo, style = [], them
</Text> </Text>
); );
} }
return <Text style={[styles.text, { color: themes[theme].bodyText }, ...style]}>{`#${hashtag}`}</Text>; return <Text style={[styles.text, { color: themes[theme!].bodyText }, ...style]}>{`#${hashtag}`}</Text>;
}); });
export default Hashtag; export default Hashtag;

View File

@ -3,6 +3,7 @@ import { Image, Text } from 'react-native';
import { Node, Parser } from 'commonmark'; import { Node, Parser } from 'commonmark';
import Renderer from 'commonmark-react-renderer'; import Renderer from 'commonmark-react-renderer';
import removeMarkdown from 'remove-markdown'; import removeMarkdown from 'remove-markdown';
import { MarkdownAST } from '@rocket.chat/message-parser';
import shortnameToUnicode from '../../utils/shortnameToUnicode'; import shortnameToUnicode from '../../utils/shortnameToUnicode';
import I18n from '../../i18n'; import I18n from '../../i18n';
@ -20,9 +21,20 @@ import MarkdownTableCell from './TableCell';
import mergeTextNodes from './mergeTextNodes'; import mergeTextNodes from './mergeTextNodes';
import styles from './styles'; import styles from './styles';
import { isValidURL } from '../../utils/url'; import { isValidURL } from '../../utils/url';
import NewMarkdown from './new';
interface IUser {
_id: string;
username: string;
name: string;
}
type UserMention = Pick<IUser, '_id' | 'username' | 'name'>;
interface IMarkdownProps { interface IMarkdownProps {
msg: string; msg: string;
md: MarkdownAST;
mentions: UserMention[];
getCustomEmoji: Function; getCustomEmoji: Function;
baseUrl: string; baseUrl: string;
username: string; username: string;
@ -35,7 +47,7 @@ interface IMarkdownProps {
name: string; name: string;
_id: number; _id: number;
}[]; }[];
mentions: object[]; enableMessageParser: boolean;
navToRoomInfo: Function; navToRoomInfo: Function;
preview: boolean; preview: boolean;
theme: string; theme: string;
@ -97,7 +109,9 @@ class Markdown extends PureComponent<IMarkdownProps, any> {
constructor(props: IMarkdownProps) { constructor(props: IMarkdownProps) {
super(props); super(props);
this.renderer = this.createRenderer(); if (!this.isNewMarkdown) {
this.renderer = this.createRenderer();
}
} }
createRenderer = () => createRenderer = () =>
@ -139,6 +153,11 @@ class Markdown extends PureComponent<IMarkdownProps, any> {
renderParagraphsInLists: true renderParagraphsInLists: true
}); });
get isNewMarkdown(): boolean {
const { md, enableMessageParser } = this.props;
return enableMessageParser && !!md;
}
editedMessage = (ast: any) => { editedMessage = (ast: any) => {
const { isEdited } = this.props; const { isEdited } = this.props;
if (isEdited) { if (isEdited) {
@ -227,12 +246,12 @@ class Markdown extends PureComponent<IMarkdownProps, any> {
}; };
renderHashtag = ({ hashtag }: { hashtag: string }) => { renderHashtag = ({ hashtag }: { hashtag: string }) => {
const { channels, navToRoomInfo, style, theme } = this.props; const { channels, navToRoomInfo, style } = this.props;
return <MarkdownHashtag hashtag={hashtag} channels={channels} navToRoomInfo={navToRoomInfo} theme={theme} style={style} />; return <MarkdownHashtag hashtag={hashtag} channels={channels} navToRoomInfo={navToRoomInfo} style={style} />;
}; };
renderAtMention = ({ mentionName }: { mentionName: string }) => { renderAtMention = ({ mentionName }: { mentionName: string }) => {
const { username, mentions, navToRoomInfo, useRealName, style, theme } = this.props; const { username, mentions, navToRoomInfo, useRealName, style } = this.props;
return ( return (
<MarkdownAtMention <MarkdownAtMention
mentions={mentions} mentions={mentions}
@ -240,7 +259,6 @@ class Markdown extends PureComponent<IMarkdownProps, any> {
useRealName={useRealName} useRealName={useRealName}
username={username} username={username}
navToRoomInfo={navToRoomInfo} navToRoomInfo={navToRoomInfo}
theme={theme}
style={style} style={style}
/> />
); );
@ -329,12 +347,44 @@ class Markdown extends PureComponent<IMarkdownProps, any> {
}; };
render() { render() {
const { msg, numberOfLines, preview = false, theme, style = [], testID } = this.props; const {
msg,
md,
numberOfLines,
preview = false,
theme,
style = [],
testID,
mentions,
channels,
navToRoomInfo,
useRealName,
username,
getCustomEmoji,
baseUrl,
onLinkPress
} = this.props;
if (!msg) { if (!msg) {
return null; return null;
} }
if (this.isNewMarkdown && !preview) {
return (
<NewMarkdown
username={username}
baseUrl={baseUrl}
getCustomEmoji={getCustomEmoji}
useRealName={useRealName}
tokens={md}
mentions={mentions}
channels={channels}
navToRoomInfo={navToRoomInfo}
onLinkPress={onLinkPress}
/>
);
}
let m = formatText(msg); let m = formatText(msg);
// Ex: '[ ](https://open.rocket.chat/group/test?msg=abcdef) Test' // Ex: '[ ](https://open.rocket.chat/group/test?msg=abcdef) Test'

View File

@ -0,0 +1,25 @@
import React from 'react';
import { StyleSheet, View } from 'react-native';
import { BigEmoji as BigEmojiProps } from '@rocket.chat/message-parser';
import Emoji from './Emoji';
interface IBigEmojiProps {
value: BigEmojiProps['value'];
}
const styles = StyleSheet.create({
container: {
flexDirection: 'row'
}
});
const BigEmoji = ({ value }: IBigEmojiProps): JSX.Element => (
<View style={styles.container}>
{value.map(block => (
<Emoji value={block.value} isBigEmoji />
))}
</View>
);
export default BigEmoji;

View File

@ -0,0 +1,40 @@
import React from 'react';
import { StyleSheet, Text } from 'react-native';
import { Bold as BoldProps } from '@rocket.chat/message-parser';
import sharedStyles from '../../../views/Styles';
import Strike from './Strike';
import Italic from './Italic';
import Plain from './Plain';
import Link from './Link';
interface IBoldProps {
value: BoldProps['value'];
}
const styles = StyleSheet.create({
text: {
...sharedStyles.textBold
}
});
const Bold = ({ value }: IBoldProps): JSX.Element => (
<Text style={styles.text}>
{value.map(block => {
switch (block.type) {
case 'LINK':
return <Link value={block.value} />;
case 'PLAIN_TEXT':
return <Plain value={block.value} />;
case 'STRIKE':
return <Strike value={block.value} />;
case 'ITALIC':
return <Italic value={block.value} />;
default:
return null;
}
})}
</Text>
);
export default Bold;

View File

@ -0,0 +1,39 @@
import React from 'react';
import { Text } from 'react-native';
import { Code as CodeProps } from '@rocket.chat/message-parser';
import styles from '../styles';
import { themes } from '../../../constants/colors';
import { useTheme } from '../../../theme';
import CodeLine from './CodeLine';
interface ICodeProps {
value: CodeProps['value'];
}
const Code = ({ value }: ICodeProps): JSX.Element => {
const { theme } = useTheme();
return (
<Text
style={[
styles.codeBlock,
{
color: themes[theme!].bodyText,
backgroundColor: themes[theme!].bannerBackground,
borderColor: themes[theme!].borderColor
}
]}>
{value.map(block => {
switch (block.type) {
case 'CODE_LINE':
return <CodeLine value={block.value} />;
default:
return null;
}
})}
</Text>
);
};
export default Code;

View File

@ -0,0 +1,17 @@
import React from 'react';
import { Text } from 'react-native';
import { CodeLine as CodeLineProps } from '@rocket.chat/message-parser';
interface ICodeLineProps {
value: CodeLineProps['value'];
}
const CodeLine = ({ value }: ICodeLineProps): JSX.Element | null => {
if (value.type !== 'PLAIN_TEXT') {
return null;
}
return <Text>{value.value}</Text>;
};
export default CodeLine;

View File

@ -0,0 +1,29 @@
import React, { useContext } from 'react';
import { Text } from 'react-native';
import { Emoji as EmojiProps } from '@rocket.chat/message-parser';
import shortnameToUnicode from '../../../utils/shortnameToUnicode';
import { themes } from '../../../constants/colors';
import { useTheme } from '../../../theme';
import styles from '../styles';
import CustomEmoji from '../../EmojiPicker/CustomEmoji';
import MarkdownContext from './MarkdownContext';
interface IEmojiProps {
value: EmojiProps['value'];
isBigEmoji?: boolean;
}
const Emoji = ({ value, isBigEmoji }: IEmojiProps): JSX.Element => {
const { theme } = useTheme();
const { baseUrl, getCustomEmoji } = useContext(MarkdownContext);
const emojiUnicode = shortnameToUnicode(`:${value.value}:`);
const emoji = getCustomEmoji?.(value.value);
if (emoji) {
return <CustomEmoji baseUrl={baseUrl} style={[isBigEmoji ? styles.customEmojiBig : styles.customEmoji]} emoji={emoji} />;
}
return <Text style={[{ color: themes[theme!].bodyText }, isBigEmoji ? styles.textBig : styles.text]}>{emojiUnicode}</Text>;
};
export default Emoji;

View File

@ -0,0 +1,32 @@
import React from 'react';
import { Text } from 'react-native';
import { Heading as HeadingProps } from '@rocket.chat/message-parser';
import { themes } from '../../../constants/colors';
import styles from '../styles';
import { useTheme } from '../../../theme';
interface IHeadingProps {
value: HeadingProps['value'];
level: HeadingProps['level'];
}
const Heading = ({ value, level }: IHeadingProps): JSX.Element => {
const { theme } = useTheme();
const textStyle = styles[`heading${level}`];
return (
<Text style={[textStyle, { color: themes[theme!].bodyText }]}>
{value.map(block => {
switch (block.type) {
case 'PLAIN_TEXT':
return block.value;
default:
return null;
}
})}
</Text>
);
};
export default Heading;

View File

@ -0,0 +1,41 @@
import React from 'react';
import { Image as ImageProps } from '@rocket.chat/message-parser';
import { createImageProgress } from 'react-native-image-progress';
import * as Progress from 'react-native-progress';
import FastImage from '@rocket.chat/react-native-fast-image';
import { useTheme } from '../../../theme';
import { themes } from '../../../constants/colors';
import styles from '../../message/styles';
interface IImageProps {
value: ImageProps['value'];
}
type TMessageImage = {
img: string;
theme: string;
};
const ImageProgress = createImageProgress(FastImage);
const MessageImage = ({ img, theme }: TMessageImage) => (
<ImageProgress
style={[styles.inlineImage, { borderColor: themes[theme].borderColor }]}
source={{ uri: encodeURI(img) }}
resizeMode={FastImage.resizeMode.cover}
indicator={Progress.Pie}
indicatorProps={{
color: themes[theme].actionTintColor
}}
/>
);
const Image = ({ value }: IImageProps): JSX.Element => {
const { theme } = useTheme();
const { src } = value;
return <MessageImage img={src.value} theme={theme!} />;
};
export default Image;

View File

@ -0,0 +1,64 @@
import React, { useContext } from 'react';
import { Text } from 'react-native';
import { Paragraph as ParagraphProps } from '@rocket.chat/message-parser';
import Hashtag from '../Hashtag';
import AtMention from '../AtMention';
import styles from '../styles';
import Link from './Link';
import Plain from './Plain';
import Bold from './Bold';
import Strike from './Strike';
import Italic from './Italic';
import Emoji from './Emoji';
import InlineCode from './InlineCode';
import Image from './Image';
import MarkdownContext from './MarkdownContext';
interface IParagraphProps {
value: ParagraphProps['value'];
}
const Inline = ({ value }: IParagraphProps): JSX.Element => {
const { useRealName, username, navToRoomInfo, mentions, channels } = useContext(MarkdownContext);
return (
<Text style={styles.inline}>
{value.map(block => {
switch (block.type) {
case 'IMAGE':
return <Image value={block.value} />;
case 'PLAIN_TEXT':
return <Plain value={block.value} />;
case 'BOLD':
return <Bold value={block.value} />;
case 'STRIKE':
return <Strike value={block.value} />;
case 'ITALIC':
return <Italic value={block.value} />;
case 'LINK':
return <Link value={block.value} />;
case 'MENTION_USER':
return (
<AtMention
mention={block.value.value}
useRealName={useRealName}
username={username}
navToRoomInfo={navToRoomInfo}
mentions={mentions}
/>
);
case 'EMOJI':
return <Emoji value={block.value} />;
case 'MENTION_CHANNEL':
return <Hashtag hashtag={block.value.value} navToRoomInfo={navToRoomInfo} channels={channels} />;
case 'INLINE_CODE':
return <InlineCode value={block.value} />;
default:
return null;
}
})}
</Text>
);
};
export default Inline;

View File

@ -0,0 +1,38 @@
import React from 'react';
import { Text } from 'react-native';
import { InlineCode as InlineCodeProps } from '@rocket.chat/message-parser';
import styles from '../styles';
import { themes } from '../../../constants/colors';
import { useTheme } from '../../../theme';
interface IInlineCodeProps {
value: InlineCodeProps['value'];
}
const InlineCode = ({ value }: IInlineCodeProps): JSX.Element => {
const { theme } = useTheme();
return (
<Text
style={[
styles.codeInline,
{
color: themes[theme!].bodyText,
backgroundColor: themes[theme!].bannerBackground,
borderColor: themes[theme!].borderColor
}
]}>
{(block => {
switch (block.type) {
case 'PLAIN_TEXT':
return <Text>{block.value}</Text>;
default:
return null;
}
})(value)}
</Text>
);
};
export default InlineCode;

View File

@ -0,0 +1,39 @@
import React from 'react';
import { StyleSheet, Text } from 'react-native';
import { Italic as ItalicProps } from '@rocket.chat/message-parser';
import Strike from './Strike';
import Bold from './Bold';
import Plain from './Plain';
import Link from './Link';
interface IItalicProps {
value: ItalicProps['value'];
}
const styles = StyleSheet.create({
text: {
fontStyle: 'italic'
}
});
const Italic = ({ value }: IItalicProps): JSX.Element => (
<Text style={styles.text}>
{value.map(block => {
switch (block.type) {
case 'LINK':
return <Link value={block.value} />;
case 'PLAIN_TEXT':
return <Plain value={block.value} />;
case 'STRIKE':
return <Strike value={block.value} />;
case 'BOLD':
return <Bold value={block.value} />;
default:
return null;
}
})}
</Text>
);
export default Italic;

View File

@ -0,0 +1,60 @@
import React, { useContext } from 'react';
import { Text, Clipboard } from 'react-native';
import { Link as LinkProps } from '@rocket.chat/message-parser';
import styles from '../styles';
import I18n from '../../../i18n';
import { LISTENER } from '../../Toast';
import { useTheme } from '../../../theme';
import openLink from '../../../utils/openLink';
import EventEmitter from '../../../utils/events';
import { themes } from '../../../constants/colors';
import Strike from './Strike';
import Italic from './Italic';
import Bold from './Bold';
import MarkdownContext from './MarkdownContext';
interface ILinkProps {
value: LinkProps['value'];
}
const Link = ({ value }: ILinkProps): JSX.Element => {
const { theme } = useTheme();
const { onLinkPress } = useContext(MarkdownContext);
const { src, label } = value;
const handlePress = () => {
if (!src.value) {
return;
}
if (onLinkPress) {
return onLinkPress(src.value);
}
openLink(src.value, theme);
};
const onLongPress = () => {
Clipboard.setString(src.value);
EventEmitter.emit(LISTENER, { message: I18n.t('Copied_to_clipboard') });
};
return (
<Text onPress={handlePress} onLongPress={onLongPress} style={[styles.link, { color: themes[theme!].actionTintColor }]}>
{(block => {
switch (block.type) {
case 'PLAIN_TEXT':
return block.value;
case 'STRIKE':
return <Strike value={block.value} />;
case 'ITALIC':
return <Italic value={block.value} />;
case 'BOLD':
return <Bold value={block.value} />;
default:
return null;
}
})(label)}
</Text>
);
};
export default Link;

View File

@ -0,0 +1,29 @@
import React from 'react';
import { UserMention } from '../../message/interfaces';
interface IMarkdownContext {
mentions: UserMention[];
channels: {
name: string;
_id: number;
}[];
useRealName: boolean;
username: string;
baseUrl: string;
navToRoomInfo: Function;
getCustomEmoji?: Function;
onLinkPress?: Function;
}
const defaultState = {
mentions: [],
channels: [],
useRealName: false,
username: '',
baseUrl: '',
navToRoomInfo: () => {}
};
const MarkdownContext = React.createContext<IMarkdownContext>(defaultState);
export default MarkdownContext;

View File

@ -0,0 +1,28 @@
import React from 'react';
import { View, Text } from 'react-native';
import { OrderedList as OrderedListProps } from '@rocket.chat/message-parser';
import Inline from './Inline';
import styles from '../styles';
import { themes } from '../../../constants/colors';
import { useTheme } from '../../../theme';
interface IOrderedListProps {
value: OrderedListProps['value'];
}
const OrderedList = ({ value }: IOrderedListProps): JSX.Element => {
const { theme } = useTheme();
return (
<View>
{value.map((item, index) => (
<View style={styles.row}>
<Text style={[styles.text, { color: themes[theme!].bodyText }]}>{index + 1}. </Text>
<Inline value={item.value} />
</View>
))}
</View>
);
};
export default OrderedList;

View File

@ -0,0 +1,23 @@
import React from 'react';
import { Text } from 'react-native';
import { Paragraph as ParagraphProps } from '@rocket.chat/message-parser';
import Inline from './Inline';
import styles from '../styles';
import { useTheme } from '../../../theme';
import { themes } from '../../../constants/colors';
interface IParagraphProps {
value: ParagraphProps['value'];
}
const Paragraph = ({ value }: IParagraphProps): JSX.Element => {
const { theme } = useTheme();
return (
<Text style={[styles.text, { color: themes[theme!].bodyText }]}>
<Inline value={value} />
</Text>
);
};
export default Paragraph;

View File

@ -0,0 +1,22 @@
import React from 'react';
import { Text } from 'react-native';
import { Plain as PlainProps } from '@rocket.chat/message-parser';
import styles from '../styles';
import { useTheme } from '../../../theme';
import { themes } from '../../../constants/colors';
interface IPlainProps {
value: PlainProps['value'];
}
const Plain = ({ value }: IPlainProps): JSX.Element => {
const { theme } = useTheme();
return (
<Text accessibilityLabel={value} style={[styles.plainText, { color: themes[theme!].bodyText }]}>
{value}
</Text>
);
};
export default Plain;

View File

@ -0,0 +1,28 @@
import React from 'react';
import { View } from 'react-native';
import { Quote as QuoteProps } from '@rocket.chat/message-parser';
import { themes } from '../../../constants/colors';
import { useTheme } from '../../../theme';
import styles from '../styles';
import Paragraph from './Paragraph';
interface IQuoteProps {
value: QuoteProps['value'];
}
const Quote = ({ value }: IQuoteProps): JSX.Element => {
const { theme } = useTheme();
return (
<View style={styles.container}>
<View style={[styles.quote, { backgroundColor: themes[theme!].borderColor }]} />
<View style={styles.childContainer}>
{value.map(item => (
<Paragraph value={item.value} />
))}
</View>
</View>
);
};
export default Quote;

View File

@ -0,0 +1,39 @@
import React from 'react';
import { StyleSheet, Text } from 'react-native';
import { Strike as StrikeProps } from '@rocket.chat/message-parser';
import Bold from './Bold';
import Italic from './Italic';
import Plain from './Plain';
import Link from './Link';
interface IStrikeProps {
value: StrikeProps['value'];
}
const styles = StyleSheet.create({
text: {
textDecorationLine: 'line-through'
}
});
const Strike = ({ value }: IStrikeProps): JSX.Element => (
<Text style={styles.text}>
{value.map(block => {
switch (block.type) {
case 'LINK':
return <Link value={block.value} />;
case 'PLAIN_TEXT':
return <Plain value={block.value} />;
case 'BOLD':
return <Bold value={block.value} />;
case 'ITALIC':
return <Italic value={block.value} />;
default:
return null;
}
})}
</Text>
);
export default Strike;

View File

@ -0,0 +1,28 @@
import React from 'react';
import { Text, View } from 'react-native';
import { Tasks as TasksProps } from '@rocket.chat/message-parser';
import Inline from './Inline';
import styles from '../styles';
import { themes } from '../../../constants/colors';
import { useTheme } from '../../../theme';
interface ITasksProps {
value: TasksProps['value'];
}
const TaskList = ({ value = [] }: ITasksProps): JSX.Element => {
const { theme } = useTheme();
return (
<View>
{value.map(item => (
<View style={styles.row}>
<Text style={[styles.text, { color: themes[theme!].bodyText }]}>{item.status ? '- [x] ' : '- [ ] '}</Text>
<Inline value={item.value} />
</View>
))}
</View>
);
};
export default TaskList;

View File

@ -0,0 +1,28 @@
import React from 'react';
import { UnorderedList as UnorderedListProps } from '@rocket.chat/message-parser';
import { View, Text } from 'react-native';
import Inline from './Inline';
import styles from '../styles';
import { themes } from '../../../constants/colors';
import { useTheme } from '../../../theme';
interface IUnorderedListProps {
value: UnorderedListProps['value'];
}
const UnorderedList = ({ value }: IUnorderedListProps): JSX.Element => {
const { theme } = useTheme();
return (
<View>
{value.map(item => (
<View style={styles.row}>
<Text style={[styles.text, { color: themes[theme!].bodyText }]}>- </Text>
<Inline value={item.value} />
</View>
))}
</View>
);
};
export default UnorderedList;

View File

@ -0,0 +1,77 @@
import React from 'react';
import { MarkdownAST } from '@rocket.chat/message-parser';
import Quote from './Quote';
import Paragraph from './Paragraph';
import Heading from './Heading';
import Code from './Code';
import BigEmoji from './BigEmoji';
import OrderedList from './OrderedList';
import UnorderedList from './UnorderedList';
import { UserMention } from '../../message/interfaces';
import TaskList from './TaskList';
import MarkdownContext from './MarkdownContext';
interface IBodyProps {
tokens: MarkdownAST;
mentions: UserMention[];
channels: {
name: string;
_id: number;
}[];
getCustomEmoji?: Function;
onLinkPress?: Function;
navToRoomInfo: Function;
useRealName: boolean;
username: string;
baseUrl: string;
}
const Body = ({
tokens,
mentions,
channels,
useRealName,
username,
navToRoomInfo,
getCustomEmoji,
baseUrl,
onLinkPress
}: IBodyProps): JSX.Element => (
<MarkdownContext.Provider
value={{
mentions,
channels,
useRealName,
username,
navToRoomInfo,
getCustomEmoji,
baseUrl,
onLinkPress
}}>
{tokens.map(block => {
switch (block.type) {
case 'BIG_EMOJI':
return <BigEmoji value={block.value} />;
case 'UNORDERED_LIST':
return <UnorderedList value={block.value} />;
case 'ORDERED_LIST':
return <OrderedList value={block.value} />;
case 'TASKS':
return <TaskList value={block.value} />;
case 'QUOTE':
return <Quote value={block.value} />;
case 'PARAGRAPH':
return <Paragraph value={block.value} />;
case 'CODE':
return <Code value={block.value} />;
case 'HEADING':
return <Heading value={block.value} level={block.level} />;
default:
return null;
}
})}
</MarkdownContext.Provider>
);
export default Body;

View File

@ -30,6 +30,10 @@ export default StyleSheet.create<any>({
del: { del: {
textDecorationLine: 'line-through' textDecorationLine: 'line-through'
}, },
plainText: {
fontSize: 16,
flexShrink: 1
},
text: { text: {
fontSize: 16, fontSize: 16,
...sharedStyles.textRegular ...sharedStyles.textRegular
@ -70,12 +74,16 @@ export default StyleSheet.create<any>({
resizeMode: 'contain' resizeMode: 'contain'
}, },
codeInline: { codeInline: {
fontSize: 16,
...sharedStyles.textRegular, ...sharedStyles.textRegular,
...codeFontFamily, ...codeFontFamily,
borderWidth: 1, borderWidth: 1,
borderRadius: 4 borderRadius: 4,
paddingLeft: 2,
paddingTop: 2
}, },
codeBlock: { codeBlock: {
fontSize: 16,
...sharedStyles.textRegular, ...sharedStyles.textRegular,
...codeFontFamily, ...codeFontFamily,
borderWidth: 1, borderWidth: 1,
@ -153,5 +161,8 @@ export default StyleSheet.create<any>({
}, },
alignRight: { alignRight: {
textAlign: 'right' textAlign: 'right'
},
inline: {
flexShrink: 1
} }
}); });

View File

@ -51,8 +51,10 @@ const Content = React.memo(
// @ts-ignore // @ts-ignore
<Markdown <Markdown
msg={props.msg} msg={props.msg}
md={props.md}
baseUrl={baseUrl} baseUrl={baseUrl}
getCustomEmoji={props.getCustomEmoji} getCustomEmoji={props.getCustomEmoji}
enableMessageParser={user.enableMessageParserEarlyAdoption}
username={user.username} username={user.username}
isEdited={props.isEdited} isEdited={props.isEdited}
numberOfLines={isPreview ? 1 : 0} numberOfLines={isPreview ? 1 : 0}
@ -103,6 +105,9 @@ const Content = React.memo(
if (prevProps.isIgnored !== nextProps.isIgnored) { if (prevProps.isIgnored !== nextProps.isIgnored) {
return false; return false;
} }
if (!dequal(prevProps.md, nextProps.md)) {
return false;
}
if (!dequal(prevProps.mentions, nextProps.mentions)) { if (!dequal(prevProps.mentions, nextProps.mentions)) {
return false; return false;
} }

View File

@ -357,7 +357,8 @@ class MessageContainer extends React.Component<IMessageContainerProps, any> {
unread, unread,
blocks, blocks,
autoTranslate: autoTranslateMessage, autoTranslate: autoTranslateMessage,
replies replies,
md
} = item; } = item;
let message = msg; let message = msg;
@ -391,6 +392,7 @@ class MessageContainer extends React.Component<IMessageContainerProps, any> {
<Message <Message
id={id} id={id}
msg={message} msg={message}
md={md}
rid={rid} rid={rid}
author={u} author={u}
ts={ts} ts={ts}

View File

@ -1,3 +1,5 @@
import { MarkdownAST } from '@rocket.chat/message-parser';
export interface IMessageAttachments { export interface IMessageAttachments {
attachments: any; attachments: any;
timeFormat: string; timeFormat: string;
@ -48,12 +50,21 @@ export interface IMessageCallButton {
callJitsi: Function; callJitsi: Function;
} }
export interface IUser {
_id: string;
username: string;
name: string;
}
export type UserMention = Pick<IUser, '_id' | 'username' | 'name'>;
export interface IMessageContent { export interface IMessageContent {
isTemp: boolean; isTemp: boolean;
isInfo: boolean; isInfo: boolean;
tmid: string; tmid: string;
isThreadRoom: boolean; isThreadRoom: boolean;
msg: string; msg: string;
md: MarkdownAST;
theme: string; theme: string;
isEdited: boolean; isEdited: boolean;
isEncrypted: boolean; isEncrypted: boolean;
@ -62,7 +73,7 @@ export interface IMessageContent {
name: string; name: string;
_id: number; _id: number;
}[]; }[];
mentions: object[]; mentions: UserMention[];
navToRoomInfo: Function; navToRoomInfo: Function;
useRealName: boolean; useRealName: boolean;
isIgnored: boolean; isIgnored: boolean;

View File

@ -106,7 +106,6 @@ export default StyleSheet.create<any>({
}, },
image: { image: {
width: '100%', width: '100%',
// maxWidth: 400,
minHeight: isTablet ? 300 : 200, minHeight: isTablet ? 300 : 200,
borderRadius: 4, borderRadius: 4,
borderWidth: 1, borderWidth: 1,

View File

@ -51,7 +51,9 @@ class QueueListView extends React.Component {
server: PropTypes.string, server: PropTypes.string,
useRealName: PropTypes.bool, useRealName: PropTypes.bool,
navigation: PropTypes.object, navigation: PropTypes.object,
theme: PropTypes.string theme: PropTypes.string,
showAvatar: PropTypes.bool,
displayMode: PropTypes.string
}; };
shouldComponentUpdate(nextProps) { shouldComponentUpdate(nextProps) {
@ -95,7 +97,9 @@ class QueueListView extends React.Component {
useRealName, useRealName,
theme, theme,
isMasterDetail, isMasterDetail,
width width,
showAvatar,
displayMode
} = this.props; } = this.props;
const id = this.getUidDirectMessage(item); const id = this.getUidDirectMessage(item);
@ -117,6 +121,8 @@ class QueueListView extends React.Component {
getRoomAvatar={this.getRoomAvatar} getRoomAvatar={this.getRoomAvatar}
visitor={item.v} visitor={item.v}
swipeEnabled={false} swipeEnabled={false}
showAvatar={showAvatar}
displayMode={displayMode}
/> />
); );
}; };
@ -151,6 +157,8 @@ const mapStateToProps = state => ({
isMasterDetail: state.app.isMasterDetail, isMasterDetail: state.app.isMasterDetail,
server: state.server.server, server: state.server.server,
useRealName: state.settings.UI_Use_Real_Name, useRealName: state.settings.UI_Use_Real_Name,
queued: getInquiryQueueSelector(state) queued: getInquiryQueueSelector(state),
showAvatar: state.sortPreferences.showAvatar,
displayMode: state.sortPreferences.displayMode
}); });
export default connect(mapStateToProps)(withDimensions(withTheme(QueueListView))); export default connect(mapStateToProps)(withDimensions(withTheme(QueueListView)));

1
app/i18n/locales/af.json Normal file
View File

@ -0,0 +1 @@
{ }

File diff suppressed because it is too large Load Diff

1
app/i18n/locales/az.json Normal file
View File

@ -0,0 +1 @@
{ }

View File

@ -0,0 +1 @@
{ }

View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/bg.json Normal file
View File

@ -0,0 +1 @@
{ }

View File

@ -0,0 +1 @@
{ }

View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/bs.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/ca.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/cs.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/cy.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/da.json Normal file
View File

@ -0,0 +1 @@
{ }

View File

@ -0,0 +1 @@
{ }

File diff suppressed because it is too large Load Diff

1
app/i18n/locales/el.json Normal file
View File

@ -0,0 +1 @@
{ }

File diff suppressed because it is too large Load Diff

1
app/i18n/locales/eo.json Normal file
View File

@ -0,0 +1 @@
{ }

View File

@ -1,454 +1,445 @@
{ {
"1_person_reacted": "1 persona reaccionó", "1_person_reacted": "1 persona reaccionó",
"1_user": "1 usuario", "1_user": "1 usuario",
"error-action-not-allowed": "{{action}} no permitida", "error-action-not-allowed": "{{action}} no permitida",
"error-application-not-found": "Aplicación no encontrada", "error-application-not-found": "Aplicación no encontrada",
"error-archived-duplicate-name": "Hay un canal archivado con nombre {{room_name}}", "error-archived-duplicate-name": "Hay un canal archivado con nombre {{room_name}}",
"error-avatar-invalid-url": "URL de avatar inválida: {{url}}", "error-avatar-invalid-url": "URL de avatar inválida: {{url}}",
"error-avatar-url-handling": "Error durante el procesamiento de ajuste de imagen de usuario desde una dirección URL ({{url}}) para {{username}}", "error-avatar-url-handling": "Error durante el procesamiento de ajuste de imagen de usuario desde una dirección URL ({{url}}) para {{username}}",
"error-cant-invite-for-direct-room": "No se puede invitar a los usuarios a salas de chat directas", "error-cant-invite-for-direct-room": "No se puede invitar a los usuarios a salas de chat directas",
"error-could-not-change-email": "No es posible cambiar la dirección de correo electrónico", "error-could-not-change-email": "No es posible cambiar la dirección de correo electrónico",
"error-could-not-change-name": "No es posible cambiar el nombre", "error-could-not-change-name": "No es posible cambiar el nombre",
"error-could-not-change-username": "No es posible cambiar el nombre de usuario", "error-could-not-change-username": "No es posible cambiar el nombre de usuario",
"error-delete-protected-role": "No se puede eliminar un rol protegido", "error-delete-protected-role": "No se puede eliminar un rol protegido",
"error-department-not-found": "Departamento no encontrado", "error-department-not-found": "Departamento no encontrado",
"error-direct-message-file-upload-not-allowed": "No se permite compartir archivos en mensajes directos", "error-direct-message-file-upload-not-allowed": "No se permite compartir archivos en mensajes directos",
"error-duplicate-channel-name": "Ya existe un canal con nombre {{room_name}}", "error-duplicate-channel-name": "Ya existe un canal con nombre {{room_name}}",
"error-email-domain-blacklisted": "El dominio del correo electrónico está en la lista negra", "error-email-domain-blacklisted": "El dominio del correo electrónico está en la lista negra",
"error-email-send-failed": "Error al enviar el correo electrónico: {{message}}", "error-email-send-failed": "Error al enviar el correo electrónico: {{message}}",
"error-field-unavailable": "{{field}} ya está en uso :(", "error-field-unavailable": "{{field}} ya está en uso :(",
"error-file-too-large": "El archivo es demasiado grande", "error-file-too-large": "El archivo es demasiado grande",
"error-importer-not-defined": "El importador no se configuró correctamente. Falta la clase de importación", "error-importer-not-defined": "El importador no se configuró correctamente. Falta la clase de importación",
"error-input-is-not-a-valid-field": "{{input}} no es válido {{field}}", "error-input-is-not-a-valid-field": "{{input}} no es válido {{field}}",
"error-invalid-actionlink": "Enlace de acción inválido", "error-invalid-actionlink": "Enlace de acción inválido",
"error-invalid-arguments": "Los argumentos no son correctos", "error-invalid-arguments": "Los argumentos no son correctos",
"error-invalid-asset": "El archivo archivo no es correcto", "error-invalid-asset": "El archivo archivo no es correcto",
"error-invalid-channel": "El canal no es correcto.", "error-invalid-channel": "El canal no es correcto.",
"error-invalid-channel-start-with-chars": "Canal incorrecto. Debe comenzar con @ o #", "error-invalid-channel-start-with-chars": "Canal incorrecto. Debe comenzar con @ o #",
"error-invalid-custom-field": "Campo personalizado no válido", "error-invalid-custom-field": "Campo personalizado no válido",
"error-invalid-custom-field-name": "Nombre no válido para el campo personalizado. Utilice sólo letras, números, guiones o guión bajo", "error-invalid-custom-field-name": "Nombre no válido para el campo personalizado. Utilice sólo letras, números, guiones o guión bajo",
"error-invalid-date": "La fecha proporcionada no es correcta.", "error-invalid-date": "La fecha proporcionada no es correcta.",
"error-invalid-description": "La descripción no es correcta", "error-invalid-description": "La descripción no es correcta",
"error-invalid-domain": "El dominio no es correcto", "error-invalid-domain": "El dominio no es correcto",
"error-invalid-email": "El email {{email}} no es correcto", "error-invalid-email": "El email {{email}} no es correcto",
"error-invalid-email-address": "La dirección de correo no es correcta", "error-invalid-email-address": "La dirección de correo no es correcta",
"error-invalid-file-height": "La altura de la imagen no es correcta", "error-invalid-file-height": "La altura de la imagen no es correcta",
"error-invalid-file-type": "El formato del archivo no es correcto", "error-invalid-file-type": "El formato del archivo no es correcto",
"error-invalid-file-width": "El ancho de la imagen o es correcto", "error-invalid-file-width": "El ancho de la imagen o es correcto",
"error-invalid-from-address": "La dirección del remitente (FROM) no es correcta.", "error-invalid-from-address": "La dirección del remitente (FROM) no es correcta.",
"error-invalid-integration": "La integración no es correcta", "error-invalid-integration": "La integración no es correcta",
"error-invalid-message": "El mensaje no es correcto", "error-invalid-message": "El mensaje no es correcto",
"error-invalid-method": "El método no es correcto", "error-invalid-method": "El método no es correcto",
"error-invalid-name": "El nombre no es correcto", "error-invalid-name": "El nombre no es correcto",
"error-invalid-password": "La contraseña no es correcta", "error-invalid-password": "La contraseña no es correcta",
"error-invalid-redirectUri": "La URL de redirección no es correcta.", "error-invalid-redirectUri": "La URL de redirección no es correcta.",
"error-invalid-role": "El rol no es correcto", "error-invalid-role": "El rol no es correcto",
"error-invalid-room": "La sala no es correcta", "error-invalid-room": "La sala no es correcta",
"error-invalid-room-name": "No se puede asignar el nombre {{room_name}} a una sala.", "error-invalid-room-name": "No se puede asignar el nombre {{room_name}} a una sala.",
"error-invalid-room-type": "No se puede asignar el tipo {{type}} a una sala.", "error-invalid-room-type": "No se puede asignar el tipo {{type}} a una sala.",
"error-invalid-settings": "La configuración proporcionada no es correcta", "error-invalid-settings": "La configuración proporcionada no es correcta",
"error-invalid-subscription": "La suscripción no es correcta", "error-invalid-subscription": "La suscripción no es correcta",
"error-invalid-token": "El token no es correcto", "error-invalid-token": "El token no es correcto",
"error-invalid-triggerWords": "El triggerWords no es correcto", "error-invalid-triggerWords": "El triggerWords no es correcto",
"error-invalid-urls": "Las URLs no son correctas", "error-invalid-urls": "Las URLs no son correctas",
"error-invalid-user": "El usuario no es correcto", "error-invalid-user": "El usuario no es correcto",
"error-invalid-username": "El nombre de usuario no es correcto", "error-invalid-username": "El nombre de usuario no es correcto",
"error-invalid-webhook-response": "El webhook no ha respondido con código de estado HTTP 200.", "error-invalid-webhook-response": "El webhook no ha respondido con código de estado HTTP 200.",
"error-message-deleting-blocked": "No está permitido eliminar mensajes", "error-message-deleting-blocked": "No está permitido eliminar mensajes",
"error-message-editing-blocked": "No está permitido editar mensajes", "error-message-editing-blocked": "No está permitido editar mensajes",
"error-message-size-exceeded": "El mensaje supera el tamaño máximo permitido", "error-message-size-exceeded": "El mensaje supera el tamaño máximo permitido",
"error-missing-unsubscribe-link": "Debes proporcionar el enlace para cancelar la suscripción [unsubscribe].", "error-missing-unsubscribe-link": "Debes proporcionar el enlace para cancelar la suscripción [unsubscribe].",
"error-no-tokens-for-this-user": "No hay tokens asignados para el usuario", "error-no-tokens-for-this-user": "No hay tokens asignados para el usuario",
"error-not-allowed": "No permitido", "error-not-allowed": "No permitido",
"error-not-authorized": "No autorizado", "error-not-authorized": "No autorizado",
"error-push-disabled": "El Push está desactivado", "error-push-disabled": "El Push está desactivado",
"error-remove-last-owner": "El usuario es el único propietario existente. Debes establecer un nuevo propietario antes de eliminarlo.", "error-remove-last-owner": "El usuario es el único propietario existente. Debes establecer un nuevo propietario antes de eliminarlo.",
"error-role-in-use": "No puedes eliminar el rol dado que está en uso", "error-role-in-use": "No puedes eliminar el rol dado que está en uso",
"error-role-name-required": "Debes indicar el nombre del rol", "error-role-name-required": "Debes indicar el nombre del rol",
"error-the-field-is-required": "El campo {{field}} es obligatorio.", "error-the-field-is-required": "El campo {{field}} es obligatorio.",
"error-too-many-requests": "Error, demasiadas peticiones. Debes esperar {{seconds}} segundos antes de continuar. Por favor, sé paciente.", "error-too-many-requests": "Error, demasiadas peticiones. Debes esperar {{seconds}} segundos antes de continuar. Por favor, sé paciente.",
"error-user-is-not-activated": "El usuario no está activo", "error-user-is-not-activated": "El usuario no está activo",
"error-user-has-no-roles": "El usuario no tiene roles", "error-user-has-no-roles": "El usuario no tiene roles",
"error-user-limit-exceeded": "El número de usuarios que quieres invitar al canal #channel_name supera el límite establecido por el administrador.", "error-user-limit-exceeded": "El número de usuarios que quieres invitar al canal #channel_name supera el límite establecido por el administrador.",
"error-user-not-in-room": "El usuario no está en la sala", "error-user-not-in-room": "El usuario no está en la sala",
"error-user-registration-custom-field": "error-user-registration-custom-field", "error-user-registration-custom-field": "error-user-registration-custom-field",
"error-user-registration-disabled": "El registro de usuario está deshabilitado", "error-user-registration-disabled": "El registro de usuario está deshabilitado",
"error-user-registration-secret": "El registro de usuarios sólo está permitido por URL secretas", "error-user-registration-secret": "El registro de usuarios sólo está permitido por URL secretas",
"error-you-are-last-owner": "Eres el único propietario existente. Debes establecer un nuevo propietario antes de abandonar la sala.", "error-you-are-last-owner": "Eres el único propietario existente. Debes establecer un nuevo propietario antes de abandonar la sala.",
"Actions": "Acciones", "Actions": "Acciones",
"activity": "actividad", "Activity": "Actividad",
"Activity": "Actividad", "Add_Reaction": "Añadir reacción",
"Add_Reaction": "Añadir reacción", "Add_Server": "Añadir servidor",
"Add_Server": "Añadir servidor", "Admin_Panel": "Panel de Control",
"Admin_Panel": "Panel de Control", "Alert": "Alerta",
"Alert": "Alerta", "alert": "alerta",
"alert": "alerta", "alerts": "alertas",
"alerts": "alertas", "All_users_in_the_channel_can_write_new_messages": "Todos los usuarios en el canal pueden escribir mensajes",
"All_users_in_the_channel_can_write_new_messages": "Todos los usuarios en el canal pueden escribir mensajes", "All": "Todos",
"All": "Todos", "All_Messages": "Todos los mensajes",
"All_Messages": "Todos los mensajes", "Allow_Reactions": "Permitir reacciones",
"Allow_Reactions": "Permitir reacciones", "Alphabetical": "Alfabético",
"Alphabetical": "Alfabético", "and_more": "y más",
"and_more": "y más", "and": "y",
"and": "y", "announcement": "anuncio",
"announcement": "anuncio", "Announcement": "Anuncio",
"Announcement": "Anuncio", "Apply_Your_Certificate": "Aplica tu certificado",
"Apply_Your_Certificate": "Aplica tu certificado", "ARCHIVE": "FICHERO",
"ARCHIVE": "FICHERO", "archive": "fichero",
"archive": "fichero", "are_typing": "están escribiendo",
"are_typing": "están escribiendo", "Are_you_sure_question_mark": "¿Estás seguro?",
"Are_you_sure_question_mark": "¿Estás seguro?", "Are_you_sure_you_want_to_leave_the_room": "¿Deseas salir de la sala {{room}}?",
"Are_you_sure_you_want_to_leave_the_room": "¿Deseas salir de la sala {{room}}?", "Audio": "Audio",
"Audio": "Audio", "Authenticating": "Autenticando",
"Authenticating": "Autenticando", "Automatic": "Automático",
"Automatic": "Automático", "Auto_Translate": "Traducción automática",
"Auto_Translate": "Traducción automática", "Avatar_changed_successfully": "¡Avatar modificado correctamente!",
"Avatar_changed_successfully": "¡Avatar modificado correctamente!", "Avatar_Url": "URL del Avatar",
"Avatar_Url": "URL del Avatar", "Away": "Ausente",
"Away": "Ausente", "Back": "Volver",
"Back": "Volver", "Black": "Negro",
"Black": "Negro", "Block_user": "Bloquear usuario",
"Block_user": "Bloquear usuario", "Broadcast_channel_Description": "Sólo los usuarios autorizados pueden escribir nuevos mensajes, el resto podrán responder sobre los mismos.",
"Broadcast_channel_Description": "Sólo los usuarios autorizados pueden escribir nuevos mensajes, el resto podrán responder sobre los mismos.", "Broadcast_Channel": "Canal de Transmisión",
"Broadcast_Channel": "Canal de Transmisión", "Busy": "Ocupado",
"Busy": "Ocupado", "By_proceeding_you_are_agreeing": "Al proceder estarás de acuerdo",
"By_proceeding_you_are_agreeing": "Al proceder estarás de acuerdo", "Cancel_editing": "Cancelar edición",
"Cancel_editing": "Cancelar edición", "Cancel_recording": "Cancelar grabación",
"Cancel_recording": "Cancelar grabación", "Cancel": "Cancelar",
"Cancel": "Cancelar", "changing_avatar": "cambiando avatar",
"changing_avatar": "cambiando avatar", "creating_channel": "creando channel",
"creating_channel": "creando channel", "Channel_Name": "Nombre sala",
"Channel_Name": "Nombre sala", "Channels": "Salas",
"Channels": "Salas", "Chats": "Chats",
"Chats": "Chats", "Call_already_ended": "¡!La llamada ya ha finalizado!",
"Call_already_ended": "¡!La llamada ya ha finalizado!", "Click_to_join": "¡Unirme!",
"Click_to_join": "¡Unirme!", "Close": "Cerrar",
"Close": "Cerrar", "Close_emoji_selector": "Cerrar selector de emojis",
"Close_emoji_selector": "Cerrar selector de emojis", "Choose": "Seleccionar",
"Choose": "Seleccionar", "Choose_from_library": "Seleccionar desde galería",
"Choose_from_library": "Seleccionar desde galería", "Choose_file": "Seleccionar archivo",
"Choose_file": "Seleccionar archivo", "Code": "Código",
"Code": "Código", "Collaborative": "Colaborativo",
"Collaborative": "Colaborativo", "Confirm": "Confirmar",
"Confirm": "Confirmar", "Connect": "Conectar",
"Connect": "Conectar", "Connected": "Conectado",
"Connected": "Conectado", "connecting_server": "conectando al servidor",
"connecting_server": "conectando al servidor", "Connecting": "Conectando...",
"Connecting": "Conectando...", "Contact_us": "Contacta con nosotros",
"Contact_us": "Contacta con nosotros", "Contact_your_server_admin": "Contacta con el administrador.",
"Contact_your_server_admin": "Contacta con el administrador.", "Continue_with": "Continuar con",
"Continue_with": "Continuar con", "Copied_to_clipboard": "¡Copiado al portapapeles!",
"Copied_to_clipboard": "¡Copiado al portapapeles!", "Copy": "Copiar",
"Copy": "Copiar", "Permalink": "Enlace permanente",
"Permalink": "Enlace permanente", "Certificate_password": "Contraseña del certificado",
"Certificate_password": "Contraseña del certificado", "Whats_the_password_for_your_certificate": "¿Cuál es la contraseña de tu certificado?",
"Whats_the_password_for_your_certificate": "¿Cuál es la contraseña de tu certificado?", "Create_account": "Crear una cuenta",
"Create_account": "Crear una cuenta", "Create_Channel": "Crear sala",
"Create_Channel": "Crear sala", "Created_snippet": "crear mensaje en bloque",
"Created_snippet": "crear mensaje en bloque", "Create_a_new_workspace": "Crear un nuevo espacio de trabajo",
"Create_a_new_workspace": "Crear un nuevo espacio de trabajo", "Create": "Crear",
"Create": "Crear", "Dark": "Oscuro",
"Dark": "Oscuro", "Dark_level": "Nivel de oscuridad",
"Dark_level": "Nivel de oscuridad", "Default": "Por defecto",
"Default": "Por defecto", "Delete_Room_Warning": "Eliminar a un usuario causará la eliminación de todos los mensajes creados por dicho usuario. Esta operación no se puede deshacer.",
"Delete_Room_Warning": "Eliminar a un usuario causará la eliminación de todos los mensajes creados por dicho usuario. Esta operación no se puede deshacer.", "delete": "eliminar",
"delete": "eliminar", "Delete": "Eliminar",
"Delete": "Eliminar", "DELETE": "ELIMINAR",
"DELETE": "ELIMINAR", "deleting_room": "eliminando sala",
"deleting_room": "eliminando sala", "description": "descripción",
"description": "descripción", "Description": "Descripción",
"Description": "Descripción", "Desktop_Options": "Opciones de escritorio",
"Desktop_Options": "Opciones de escritorio", "Directory": "Directorio",
"Directory": "Directorio", "Direct_Messages": "Mensajes directos",
"Direct_Messages": "Mensajes directos", "Disable_notifications": "Desactivar notificaciones",
"Disable_notifications": "Desactivar notificaciones", "Discussions": "Conversaciones",
"Discussions": "Conversaciones", "Dont_Have_An_Account": "¿Todavía no tienes una cuenta?",
"Dont_Have_An_Account": "¿Todavía no tienes una cuenta?", "Do_you_have_a_certificate": "¿Tienes un certificado?",
"Do_you_have_a_certificate": "¿Tienes un certificado?", "Do_you_really_want_to_key_this_room_question_mark": "¿Deseas {{key}} de esta sala?",
"Do_you_really_want_to_key_this_room_question_mark": "¿Deseas {{key}} de esta sala?", "edit": "editar",
"edit": "editar", "edited": "editado",
"edited": "editado", "Edit": "Editar",
"Edit": "Editar", "Email_or_password_field_is_empty": "El email o la contraseña están vacíos",
"Email_or_password_field_is_empty": "El email o la contraseña están vacíos", "Email": "E-mail",
"Email": "E-mail", "email": "e-mail",
"email": "e-mail", "Enable_Auto_Translate": "Permitir Auto-Translate",
"Enable_Auto_Translate": "Permitir Auto-Translate", "Enable_notifications": "Permitir notificaciones",
"Enable_notifications": "Permitir notificaciones", "Everyone_can_access_this_channel": "Todos los usuarios pueden acceder a este canal",
"Everyone_can_access_this_channel": "Todos los usuarios pueden acceder a este canal", "Error_uploading": "Error en la subida",
"Error_uploading": "Error en la subida", "Favorites": "Favoritos",
"Favorite": "Favorito", "Files": "Archivos",
"Favorites": "Favoritos", "File_description": "Descripción del archivo",
"Files": "Archivos", "File_name": "Nombre del archivo",
"File_description": "Descripción del archivo", "Finish_recording": "Finalizar grabación",
"File_name": "Nombre del archivo", "Following_thread": "Siguiendo hilo",
"Finish_recording": "Finalizar grabación", "For_your_security_you_must_enter_your_current_password_to_continue": "Por seguridad, debes introducir tu contraseña para continuar",
"Following_thread": "Siguiendo hilo", "Forgot_password_If_this_email_is_registered": "Si este email está registrado, te enviaremos las instrucciones para resetear tu contraseña. Si no recibes un email en breve, vuelve aquí e inténtalo de nuevo.",
"For_your_security_you_must_enter_your_current_password_to_continue": "Por seguridad, debes introducir tu contraseña para continuar", "Forgot_password": "¿Ha olvidado su contraseña?",
"Forgot_password_If_this_email_is_registered": "Si este email está registrado, te enviaremos las instrucciones para resetear tu contraseña. Si no recibes un email en breve, vuelve aquí e inténtalo de nuevo.", "Forgot_Password": "Olvidé la contraseña",
"Forgot_password": "¿Ha olvidado su contraseña?", "Full_table": "Click para ver la tabla completa",
"Forgot_Password": "Olvidé la contraseña", "Has_joined_the_channel": "se ha unido al canal",
"Full_table": "Click para ver la tabla completa", "Has_joined_the_conversation": "se ha unido a la conversación",
"Group_by_favorites": "Agrupar por favoritos", "Has_left_the_channel": "ha dejado el canal",
"Group_by_type": "Agrupar por tipo", "In_App_And_Desktop": "En la aplicación y en el escritorio",
"Hide": "Ocultar", "In_App_and_Desktop_Alert_info": "Muestra un banner en la parte superior de la pantalla cuando la aplicación esté abierta y muestra una notificación en el escritorio",
"Has_joined_the_channel": "se ha unido al canal", "Invisible": "Invisible",
"Has_joined_the_conversation": "se ha unido a la conversación", "Invite": "Invitar",
"Has_left_the_channel": "ha dejado el canal", "is_a_valid_RocketChat_instance": "es una instancia válida de Rocket.Chat",
"In_App_And_Desktop": "En la aplicación y en el escritorio", "is_not_a_valid_RocketChat_instance": "no es una instancia válida de Rocket.Chat",
"In_App_and_Desktop_Alert_info": "Muestra un banner en la parte superior de la pantalla cuando la aplicación esté abierta y muestra una notificación en el escritorio", "is_typing": "escribiendo",
"Invisible": "Invisible", "Invalid_server_version": "El servidor que intentas conectar está usando una versión que ya no está soportada por la aplicación : {{currentVersion}}. Se requiere una versión {{minVersion}}.",
"Invite": "Invitar", "Join": "Conectar",
"is_a_valid_RocketChat_instance": "es una instancia válida de Rocket.Chat", "Just_invited_people_can_access_this_channel": "Sólo gente invitada puede acceder a este canal.",
"is_not_a_valid_RocketChat_instance": "no es una instancia válida de Rocket.Chat", "Language": "Idioma",
"is_typing": "escribiendo", "last_message": "último mensaje",
"Invalid_server_version": "El servidor que intentas conectar está usando una versión que ya no está soportada por la aplicación : {{currentVersion}}. Se requiere una versión {{minVersion}}.", "Leave_channel": "Abandonar el canal",
"Join": "Conectar", "leaving_room": "abandonando sala",
"Just_invited_people_can_access_this_channel": "Sólo gente invitada puede acceder a este canal.", "leave": "abandonar",
"Language": "Idioma", "Legal": "Legal",
"last_message": "último mensaje", "Light": "Claro",
"Leave_channel": "Abandonar el canal", "License": "Licencia",
"leaving_room": "abandonando sala", "Livechat": "LiveChat",
"leave": "abandonar", "Login": "Inicio de sesión",
"Legal": "Legal", "Login_error": "¡Sus credenciales fueron rechazadas! Por favor, inténtelo de nuevo.",
"Light": "Claro", "Login_with": "Iniciar sesión con",
"License": "Licencia", "Logout": "Cerrar sesión",
"Livechat": "LiveChat", "members": "miembros",
"Login": "Inicio de sesión", "Members": "Miembros",
"Login_error": "¡Sus credenciales fueron rechazadas! Por favor, inténtelo de nuevo.", "Mentioned_Messages": "Mensajes mencionados",
"Login_with": "Iniciar sesión con", "mentioned": "mencionado",
"Logout": "Cerrar sesión", "Mentions": "Menciones",
"members": "miembros", "Message_accessibility": "Mensaje de {{user}} a las {{time}}: {{message}}",
"Members": "Miembros", "Message_actions": "Acciones de mensaje",
"Mentioned_Messages": "Mensajes mencionados", "Message_pinned": "Mensaje fijado",
"mentioned": "mencionado", "Message_removed": "Mensaje eliminado",
"Mentions": "Menciones", "message": "mensaje",
"Message_accessibility": "Mensaje de {{user}} a las {{time}}: {{message}}", "messages": "mensajes",
"Message_actions": "Acciones de mensaje", "Messages": "Mensajes",
"Message_pinned": "Mensaje fijado", "Message_Reported": "Mensaje notificado",
"Message_removed": "Mensaje eliminado", "Microphone_Permission_Message": "Rocket.Chat necesita acceso a su micrófono para que pueda enviar un mensaje de audio.",
"message": "mensaje", "Microphone_Permission": "Permiso de micrófono",
"messages": "mensajes", "Mute": "Mutear",
"Messages": "Mensajes", "muted": "muteado",
"Message_Reported": "Mensaje notificado", "My_servers": "Mis servidores",
"Microphone_Permission_Message": "Rocket.Chat necesita acceso a su micrófono para que pueda enviar un mensaje de audio.", "N_people_reacted": "Han reaccionado {{n}} personas",
"Microphone_Permission": "Permiso de micrófono", "N_users": "{{n}} usuarios",
"Mute": "Mutear", "Name": "Nombre",
"muted": "muteado", "New_Message": "Nuevo mensaje",
"My_servers": "Mis servidores", "New_Password": "Nueva contraseña",
"N_people_reacted": "Han reaccionado {{n}} personas", "New_Server": "Nuevo servidor",
"N_users": "{{n}} usuarios", "Next": "Siguiente",
"name": "nombre", "No_files": "No hay archivos",
"Name": "Nombre", "No_mentioned_messages": "No hay mensajes mencionados",
"New_Message": "Nuevo mensaje", "No_pinned_messages": "No hay mensajes fijados",
"New_Password": "Nueva contraseña", "No_results_found": "No hay resultados",
"New_Server": "Nuevo servidor", "No_starred_messages": "No hay mensajes destacados",
"Next": "Siguiente", "No_thread_messages": "No hay hilos",
"No_files": "No hay archivos", "No_Message": "Sin mensajes",
"No_mentioned_messages": "No hay mensajes mencionados", "No_messages_yet": "No hay mensajes todavía",
"No_pinned_messages": "No hay mensajes fijados", "No_Reactions": "No hay reacciones",
"No_results_found": "No hay resultados", "No_Read_Receipts": "No hay confirmaciones de lectura",
"No_starred_messages": "No hay mensajes destacados", "Not_logged": "No ha iniciado sesión",
"No_thread_messages": "No hay hilos", "Not_RC_Server": "Esto no es un servidor de Rocket.Chat.\n{{contact}}",
"No_Message": "Sin mensajes", "Nothing": "Nada",
"No_messages_yet": "No hay mensajes todavía", "Nothing_to_save": "¡No hay nada por guardar!",
"No_Reactions": "No hay reacciones", "Notify_active_in_this_room": "Notificar a los usuarios activos en esta sala",
"No_Read_Receipts": "No hay confirmaciones de lectura", "Notify_all_in_this_room": "Notificar a todos en esta sala",
"Not_logged": "No ha iniciado sesión", "Notifications": "Notificaciones",
"Not_RC_Server": "Esto no es un servidor de Rocket.Chat.\n{{contact}}", "Notification_Duration": "Duración de la notificación",
"Nothing": "Nada", "Notification_Preferences": "Configuración de notificaciones",
"Nothing_to_save": "¡No hay nada por guardar!", "Offline": "Sin conexión",
"Notify_active_in_this_room": "Notificar a los usuarios activos en esta sala", "Oops": "Oops!",
"Notify_all_in_this_room": "Notificar a todos en esta sala", "Onboarding_title": "Bienvenido a Rocket.Chat",
"Notifications": "Notificaciones", "Online": "Conectado",
"Notification_Duration": "Duración de la notificación", "Only_authorized_users_can_write_new_messages": "Sólo pueden escribir mensajes usuarios autorizados",
"Notification_Preferences": "Configuración de notificaciones", "Open_emoji_selector": "Abrir selector de emojis",
"Offline": "Sin conexión", "Open_Source_Communication": "Comunicación Open Source",
"Oops": "Oops!", "Password": "Contraseña",
"Onboarding_title": "Bienvenido a Rocket.Chat", "Permalink_copied_to_clipboard": "¡Enlace permanente copiado al portapapeles!",
"Online": "Conectado", "Pin": "Fijar",
"Only_authorized_users_can_write_new_messages": "Sólo pueden escribir mensajes usuarios autorizados", "Pinned_Messages": "Mensajes fijados",
"Open_emoji_selector": "Abrir selector de emojis", "pinned": "fijado",
"Open_Source_Communication": "Comunicación Open Source", "Pinned": "Fijado",
"Password": "Contraseña", "Please_enter_your_password": "Por favor introduce la contraseña",
"Permalink_copied_to_clipboard": "¡Enlace permanente copiado al portapapeles!", "Preferences": "Preferencias",
"Pin": "Fijar", "Preferences_saved": "¡Preferencias guardadas!",
"Pinned_Messages": "Mensajes fijados", "Privacy_Policy": "Política de privacidad",
"pinned": "fijado", "Private_Channel": "Canal privado",
"Pinned": "Fijado", "Private": "Privado",
"Please_enter_your_password": "Por favor introduce la contraseña", "Processing": "Procesando...",
"Preferences": "Preferencias", "Profile_saved_successfully": "¡Perfil guardado correctamente!",
"Preferences_saved": "¡Preferencias guardadas!", "Profile": "Perfil",
"Privacy_Policy": "Política de privacidad", "Public_Channel": "Canal público",
"Private_Channel": "Canal privado", "Public": "Público",
"Private": "Privado", "Push_Notifications": "Notificaciones Push",
"Processing": "Procesando...", "Push_Notifications_Alert_Info": "Estas notificaciones se le entregan cuando la aplicación no está abierta",
"Profile_saved_successfully": "¡Perfil guardado correctamente!", "Quote": "Citar",
"Profile": "Perfil", "Reactions_are_disabled": "Las reacciones están desactivadas",
"Public_Channel": "Canal público", "Reactions_are_enabled": "Las reacciones están activadas",
"Public": "Público", "Reactions": "Reacciones",
"Push_Notifications": "Notificaciones Push", "Read_Only_Channel": "Canal de sólo lectura",
"Push_Notifications_Alert_Info": "Estas notificaciones se le entregan cuando la aplicación no está abierta", "Read_Only": "Sólo lectura ",
"Quote": "Citar", "Read_Receipt": "Comprobante de lectura",
"Reactions_are_disabled": "Las reacciones están desactivadas", "Receive_Group_Mentions": "Recibir menciones de grupo",
"Reactions_are_enabled": "Las reacciones están activadas", "Receive_Group_Mentions_Info": "Recibir menciones @all y @here",
"Reactions": "Reacciones", "Register": "Registrar",
"Read": "Leer", "Repeat_Password": "Repetir contraseña",
"Read_Only_Channel": "Canal de sólo lectura", "Replied_on": "Respondido el:",
"Read_Only": "Sólo lectura ", "replies": "respuestas",
"Read_Receipt": "Comprobante de lectura", "reply": "respuesta",
"Receive_Group_Mentions": "Recibir menciones de grupo", "Reply": "Respuesta",
"Receive_Group_Mentions_Info": "Recibir menciones @all y @here", "Report": "Informe",
"Register": "Registrar", "Receive_Notification": "Recibir notificación",
"Repeat_Password": "Repetir contraseña", "Receive_notifications_from": "Recibir notificación de {{name}}",
"Replied_on": "Respondido el:", "Resend": "Reenviar",
"replies": "respuestas", "Reset_password": "Resetear contraseña",
"reply": "respuesta", "resetting_password": "reseteando contraseña",
"Reply": "Respuesta", "RESET": "RESET",
"Report": "Informe", "Roles": "Roles",
"Receive_Notification": "Recibir notificación", "Room_actions": "Acciones de sala",
"Receive_notifications_from": "Recibir notificación de {{name}}", "Room_changed_announcement": "El anuncio de la sala cambió a: {{announcement}} por {{userBy}}",
"Resend": "Reenviar", "Room_changed_description": "La descripción de la sala cambió a: {{description}} por {{userBy}}",
"Reset_password": "Resetear contraseña", "Room_changed_privacy": "El tipo de la sala cambió a: {{type}} por {{userBy}}",
"resetting_password": "reseteando contraseña", "Room_changed_topic": "El asunto de la sala cambió a: {{topic}} por {{userBy}}",
"RESET": "RESET", "Room_Files": "Archivos",
"Roles": "Roles", "Room_Info_Edit": "Editar información de la sala",
"Room_actions": "Acciones de sala", "Room_Info": "Información de la sala",
"Room_changed_announcement": "El anuncio de la sala cambió a: {{announcement}} por {{userBy}}", "Room_Members": "Miembros de la sala",
"Room_changed_description": "La descripción de la sala cambió a: {{description}} por {{userBy}}", "Room_name_changed": "El nombre de la sala cambió a: {{name}} por {{userBy}}",
"Room_changed_privacy": "El tipo de la sala cambió a: {{type}} por {{userBy}}", "SAVE": "GUARDAR",
"Room_changed_topic": "El asunto de la sala cambió a: {{topic}} por {{userBy}}", "Save_Changes": "Guardar cambios",
"Room_Files": "Archivos", "Save": "Guardar",
"Room_Info_Edit": "Editar información de la sala", "saving_preferences": "guardando preferencias",
"Room_Info": "Información de la sala", "saving_profile": "guardando perfil",
"Room_Members": "Miembros de la sala", "saving_settings": "guardando configuración",
"Room_name_changed": "El nombre de la sala cambió a: {{name}} por {{userBy}}", "Search_Messages": "Buscar mensajes",
"SAVE": "GUARDAR", "Search": "Buscar",
"Save_Changes": "Guardar cambios", "Search_by": "Buscar por",
"Save": "Guardar", "Search_global_users": "Buscar por usuarios globales",
"saving_preferences": "guardando preferencias", "Search_global_users_description": "Si lo activas, puedes buscar cualquier usuario de otras empresas o servidores.",
"saving_profile": "guardando perfil", "Seconds": "{{second}} segundos",
"saving_settings": "guardando configuración", "Select_Avatar": "Selecciona avatar",
"Search_Messages": "Buscar mensajes", "Select_Server": "Selecciona servidor",
"Search": "Buscar", "Select_Users": "Selecciona usuarios",
"Search_by": "Buscar por", "Send": "Enviar",
"Search_global_users": "Buscar por usuarios globales", "Send_audio_message": "Enviar nota de audio",
"Search_global_users_description": "Si lo activas, puedes buscar cualquier usuario de otras empresas o servidores.", "Send_crash_report": "Enviar informe errores",
"Seconds": "{{second}} segundos", "Send_message": "Enviar mensaje",
"Select_Avatar": "Selecciona avatar", "Send_to": "Enviar a..",
"Select_Server": "Selecciona servidor", "Sent_an_attachment": "Enviar un adjunto",
"Select_Users": "Selecciona usuarios", "Server": "Servidor",
"Send": "Enviar", "Servers": "Servidores",
"Send_audio_message": "Enviar nota de audio", "Server_version": "Versión servidor: {{version}}",
"Send_crash_report": "Enviar informe errores", "Set_username_subtitle": "El nombre de usuario se utiliza para permitir que otros le mencionen en los mensajes",
"Send_message": "Enviar mensaje", "Settings": "Configuración",
"Send_to": "Enviar a..", "Settings_succesfully_changed": "¡Configuración cambiada correctamente!",
"Sent_an_attachment": "Enviar un adjunto", "Share": "Compartir",
"Server": "Servidor", "Share_this_app": "Compartir esta aplicación",
"Servers": "Servidores", "Show_Unread_Counter": "Mostrar contador de no leídos",
"Server_version": "Versión servidor: {{version}}", "Show_Unread_Counter_Info": "El contador de no leídos se muestra como una insignia a la derecha del canal, en la lista",
"Set_username_subtitle": "El nombre de usuario se utiliza para permitir que otros le mencionen en los mensajes", "Sign_in_your_server": "Accede a tu servidor",
"Settings": "Configuración", "Sign_Up": "Registrarse",
"Settings_succesfully_changed": "¡Configuración cambiada correctamente!", "Some_field_is_invalid_or_empty": "Algún campo no es correcto o está vacío",
"Share": "Compartir", "Sound": "Sonido",
"Share_this_app": "Compartir esta aplicación", "Star_room": "Destacar sala",
"Show_Unread_Counter": "Mostrar contador de no leídos", "Star": "Destacar",
"Show_Unread_Counter_Info": "El contador de no leídos se muestra como una insignia a la derecha del canal, en la lista", "Starred_Messages": "Mensajes destacados",
"Sign_in_your_server": "Accede a tu servidor", "starred": "destacado",
"Sign_Up": "Registrarse", "Starred": "Destacado",
"Some_field_is_invalid_or_empty": "Algún campo no es correcto o está vacío", "Start_of_conversation": "Comienzo de la conversación",
"Sorting_by": "Ordenado por {{key}}", "Started_discussion": "Comenzar una conversación:",
"Sound": "Sonido", "Started_call": "Llamada iniciada por {{userBy}}",
"Star_room": "Destacar sala", "Submit": "Enviar",
"Star": "Destacar", "Table": "Tabla",
"Starred_Messages": "Mensajes destacados", "Take_a_photo": "Enviar una foto",
"starred": "destacado", "Take_a_video": "Enviar un vídeo",
"Starred": "Destacado", "tap_to_change_status": "pulsa para cambiar el estado",
"Start_of_conversation": "Comienzo de la conversación", "Tap_to_view_servers_list": "Pulsa para ver la lista de servidores",
"Started_discussion": "Comenzar una conversación:", "Terms_of_Service": "Términos de servicio",
"Started_call": "Llamada iniciada por {{userBy}}", "Theme": "Tema",
"Submit": "Enviar", "There_was_an_error_while_action": "¡Ha habido un error mientras {{action}}!",
"Table": "Tabla", "This_room_is_blocked": "La sala está bloqueada",
"Take_a_photo": "Enviar una foto", "This_room_is_read_only": "Esta sala es de sólo lectura",
"Take_a_video": "Enviar un vídeo", "Thread": "Hilo",
"tap_to_change_status": "pulsa para cambiar el estado", "Threads": "Hilos",
"Tap_to_view_servers_list": "Pulsa para ver la lista de servidores", "Timezone": "Zona horaria",
"Terms_of_Service": "Términos de servicio", "To": "Para",
"Theme": "Tema", "topic": "asunto",
"There_was_an_error_while_action": "¡Ha habido un error mientras {{action}}!", "Topic": "Asunto",
"This_room_is_blocked": "La sala está bloqueada", "Translate": "Traducir",
"This_room_is_read_only": "Esta sala es de sólo lectura", "Try_again": "Intentar de nuevo",
"Thread": "Hilo", "Two_Factor_Authentication": "Autenticación de doble factor",
"Threads": "Hilos", "Type_the_channel_name_here": "Escribe el nombre del canal aquí",
"Timezone": "Zona horaria", "unarchive": "desarchivar",
"To": "Para", "UNARCHIVE": "DESARCHIVAR",
"topic": "asunto", "Unblock_user": "Desbloquear usuario",
"Topic": "Asunto", "Unfollowed_thread": "Dejar de seguir el hilo",
"Translate": "Traducir", "Unmute": "Desmutear",
"Try_again": "Intentar de nuevo", "unmuted": "Desmuteado",
"Two_Factor_Authentication": "Autenticación de doble factor", "Unpin": "Quitar estado fijado",
"Type_the_channel_name_here": "Escribe el nombre del canal aquí", "unread_messages": "marcar como no leído",
"unarchive": "desarchivar", "Unread": "Marcar como no leído",
"UNARCHIVE": "DESARCHIVAR", "Unread_on_top": "Mensajes no leídos en la parte superior",
"Unblock_user": "Desbloquear usuario", "Unstar": "Quitar destacado",
"Unfavorite": "Quitar favorito", "Updating": "Actualizando...",
"Unfollowed_thread": "Dejar de seguir el hilo", "Uploading": "Subiendo",
"Unmute": "Desmutear", "Upload_file_question_mark": "¿Subir fichero?",
"unmuted": "Desmuteado", "Users": "Usuarios",
"Unpin": "Quitar estado fijado", "User_added_by": "Usuario {{userAdded}} añadido por {{userBy}}",
"unread_messages": "marcar como no leído", "User_has_been_key": "El usuario ha sido {{key}}",
"Unread": "Marcar como no leído", "User_is_no_longer_role_by_": "{{user}} ha dejado de ser {{role}} por {{userBy}}",
"Unread_on_top": "Mensajes no leídos en la parte superior", "User_muted_by": "Usuario {{userMuted}} muteado por {{userBy}}",
"Unstar": "Quitar destacado", "User_removed_by": "Usuario {{userRemoved}} eliminado por {{userBy}}",
"Updating": "Actualizando...", "User_sent_an_attachment": "{{user}} envío un adjunto",
"Uploading": "Subiendo", "User_unmuted_by": "Usuario {{userUnmuted}} desmuteado por {{userBy}}",
"Upload_file_question_mark": "¿Subir fichero?", "User_was_set_role_by_": "{{user}} ha comenzado a ser {{role}} por {{userBy}}",
"Users": "Usuarios", "Username_is_empty": "Nombre de usuario está vacío",
"User_added_by": "Usuario {{userAdded}} añadido por {{userBy}}", "Username": "Nombre de usuario",
"User_has_been_key": "El usuario ha sido {{key}}", "Username_or_email": "Nombre de usuario o email",
"User_is_no_longer_role_by_": "{{user}} ha dejado de ser {{role}} por {{userBy}}", "Validating": "Validando",
"User_muted_by": "Usuario {{userMuted}} muteado por {{userBy}}", "Video_call": "Vídeo llamada",
"User_removed_by": "Usuario {{userRemoved}} eliminado por {{userBy}}", "View_Original": "Ver original",
"User_sent_an_attachment": "{{user}} envío un adjunto", "Voice_call": "Llamada de voz",
"User_unmuted_by": "Usuario {{userUnmuted}} desmuteado por {{userBy}}", "Websocket_disabled": "Websocket está deshabilitado para este servidor.\n{{contact}}",
"User_was_set_role_by_": "{{user}} ha comenzado a ser {{role}} por {{userBy}}", "Welcome": "Bienvenido",
"Username_is_empty": "Nombre de usuario está vacío", "Whats_your_2fa": "¿Cuál es tu código 2FA?",
"Username": "Nombre de usuario", "Without_Servers": "Sin servidores",
"Username_or_email": "Nombre de usuario o email", "Yes_action_it": "Sí, ¡{{action}}!",
"Validating": "Validando", "Yesterday": "Ayer",
"Video_call": "Vídeo llamada", "You_are_in_preview_mode": "Estás en modo vista previa",
"View_Original": "Ver original", "You_are_offline": "Estás desconectado",
"Voice_call": "Llamada de voz", "You_can_search_using_RegExp_eg": "Puedes usar expresiones regulares. Por ejemplo, `/^text$/i`",
"Websocket_disabled": "Websocket está deshabilitado para este servidor.\n{{contact}}", "You_colon": "Tú: ",
"Welcome": "Bienvenido", "you_were_mentioned": "has sido mencionado",
"Whats_your_2fa": "¿Cuál es tu código 2FA?", "you": "tú",
"Without_Servers": "Sin servidores", "You": "Tú",
"Yes_action_it": "Sí, ¡{{action}}!", "You_need_to_access_at_least_one_RocketChat_server_to_share_something": "Necesita acceder al menos a un servidor Rocket.Chat para compartir algo.",
"Yesterday": "Ayer", "Your_certificate": "Tu certificado",
"You_are_in_preview_mode": "Estás en modo vista previa", "Version_no": "Versión: {{version}}",
"You_are_offline": "Estás desconectado", "You_will_not_be_able_to_recover_this_message": "¡No podrás recuperar este mensaje!",
"You_can_search_using_RegExp_eg": "Puedes usar expresiones regulares. Por ejemplo, `/^text$/i`", "Change_Language": "Cambiar idioma",
"You_colon": "Tú: ", "Crash_report_disclaimer": "Nunca rastreamos el contenido de sus conversaciones. El informe del error sólo contiene información relevante para nosotros con el fin de identificar los problemas y solucionarlos.",
"you_were_mentioned": "has sido mencionado", "Type_message": "Escribir mensaje",
"you": "tú", "Room_search": "Búsqueda de salas",
"You": "Tú", "Room_selection": "Selecciona sala 1...9",
"You_need_to_access_at_least_one_RocketChat_server_to_share_something": "Necesita acceder al menos a un servidor Rocket.Chat para compartir algo.", "Next_room": "Siguiente sala",
"Your_certificate": "Tu certificado", "Previous_room": "Sala anterior",
"Version_no": "Versión: {{version}}", "New_room": "Nueva sala",
"You_will_not_be_able_to_recover_this_message": "¡No podrás recuperar este mensaje!", "Upload_room": "Subir a sala",
"Change_Language": "Cambiar idioma", "Search_messages": "Buscar mensajes",
"Crash_report_disclaimer": "Nunca rastreamos el contenido de sus conversaciones. El informe del error sólo contiene información relevante para nosotros con el fin de identificar los problemas y solucionarlos.", "Scroll_messages": "Scroll mensajes",
"Type_message": "Escribir mensaje", "Reply_latest": "Responder al último",
"Room_search": "Búsqueda de salas", "Server_selection": "Seleccionar servidor",
"Room_selection": "Selecciona sala 1...9", "Server_selection_numbers": "Seleccionar servidor 1...9",
"Next_room": "Siguiente sala", "Add_server": "Añadir servidor",
"Previous_room": "Sala anterior", "New_line": "Nueva línea"
"New_room": "Nueva sala",
"Upload_room": "Subir a sala",
"Search_messages": "Buscar mensajes",
"Scroll_messages": "Scroll mensajes",
"Reply_latest": "Responder al último",
"Server_selection": "Seleccionar servidor",
"Server_selection_numbers": "Seleccionar servidor 1...9",
"Add_server": "Añadir servidor",
"New_line": "Nueva línea"
} }

1
app/i18n/locales/et.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/eu.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/fa.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/fi.json Normal file
View File

@ -0,0 +1 @@
{ }

File diff suppressed because it is too large Load Diff

1
app/i18n/locales/gl.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/he.json Normal file
View File

@ -0,0 +1 @@
{ }

View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/hr.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/hu.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/id.json Normal file
View File

@ -0,0 +1 @@
{ }

File diff suppressed because it is too large Load Diff

View File

@ -1,492 +1,483 @@
{ {
"1_person_reacted": "1人がリアクション", "1_person_reacted": "1人がリアクション",
"1_user": "1人", "1_user": "1人",
"error-action-not-allowed": "{{action}}の権限がありません。", "error-action-not-allowed": "{{action}}の権限がありません。",
"error-application-not-found": "アプリケーションがありません。", "error-application-not-found": "アプリケーションがありません。",
"error-archived-duplicate-name": "アーカイブ名が重複しています: {{room_name}}", "error-archived-duplicate-name": "アーカイブ名が重複しています: {{room_name}}",
"error-avatar-invalid-url": "画像のURLが正しくありません: {{url}}", "error-avatar-invalid-url": "画像のURLが正しくありません: {{url}}",
"error-avatar-url-handling": "アバターをURL({{url}})から{{username}}に設定中にエラーが発生しました。", "error-avatar-url-handling": "アバターをURL({{url}})から{{username}}に設定中にエラーが発生しました。",
"error-cant-invite-for-direct-room": "ユーザーを直接ルームに招待することができません。", "error-cant-invite-for-direct-room": "ユーザーを直接ルームに招待することができません。",
"error-could-not-change-email": "メールアドレスを変更できません。", "error-could-not-change-email": "メールアドレスを変更できません。",
"error-could-not-change-name": "名前を変更できません。", "error-could-not-change-name": "名前を変更できません。",
"error-could-not-change-username": "ユーザー名を変更できません。", "error-could-not-change-username": "ユーザー名を変更できません。",
"error-delete-protected-role": "保護されたロールは削除できません。", "error-delete-protected-role": "保護されたロールは削除できません。",
"error-department-not-found": "ロールが存在しません。", "error-department-not-found": "ロールが存在しません。",
"error-direct-message-file-upload-not-allowed": "ダイレクトメッセージでのファイルのアップロードは許可されていません。", "error-direct-message-file-upload-not-allowed": "ダイレクトメッセージでのファイルのアップロードは許可されていません。",
"error-duplicate-channel-name": "{{channel_name}}と同名のチャンネルが存在します。", "error-duplicate-channel-name": "{{room_name}}と同名のチャンネルが存在します。",
"error-email-domain-blacklisted": "このドメインのメールアドレスはブラックリストに登録されています。", "error-email-domain-blacklisted": "このドメインのメールアドレスはブラックリストに登録されています。",
"error-email-send-failed": "次のメールアドレスの送信に失敗しました: {{message}}", "error-email-send-failed": "次のメールアドレスの送信に失敗しました: {{message}}",
"error-save-image": "画像の保存に失敗しました。", "error-save-image": "画像の保存に失敗しました。",
"error-field-unavailable": "{{field}}は既に使用されています。", "error-field-unavailable": "{{field}}は既に使用されています。",
"error-file-too-large": "ファイルが大きすぎます。", "error-file-too-large": "ファイルが大きすぎます。",
"error-importer-not-defined": "インポータが正しく定義されていません。Importクラスが見つかりません。", "error-importer-not-defined": "インポータが正しく定義されていません。Importクラスが見つかりません。",
"error-input-is-not-a-valid-field": "{{input}}は{{field}}の入力として正しくありません。", "error-input-is-not-a-valid-field": "{{input}}は{{field}}の入力として正しくありません。",
"error-invalid-actionlink": "アクションリンクが正しくありません。", "error-invalid-actionlink": "アクションリンクが正しくありません。",
"error-invalid-arguments": "引数が正しくありません。", "error-invalid-arguments": "引数が正しくありません。",
"error-invalid-asset": "アセットが不正です。", "error-invalid-asset": "アセットが不正です。",
"error-invalid-channel": "チャンネル名が不正です。", "error-invalid-channel": "チャンネル名が不正です。",
"error-invalid-channel-start-with-chars": "不正なチャンネルです。チャンネル名は@か#から開始します。", "error-invalid-channel-start-with-chars": "不正なチャンネルです。チャンネル名は@か#から開始します。",
"error-invalid-custom-field": "カスタムフィールドが不正です。", "error-invalid-custom-field": "カスタムフィールドが不正です。",
"error-invalid-custom-field-name": "カスタムフィールド名が不正です。半角英数字、ハイフン、アンダースコアのみを使用してください。", "error-invalid-custom-field-name": "カスタムフィールド名が不正です。半角英数字、ハイフン、アンダースコアのみを使用してください。",
"error-invalid-date": "不正な日時です", "error-invalid-date": "不正な日時です",
"error-invalid-description": "不正な詳細です", "error-invalid-description": "不正な詳細です",
"error-invalid-domain": "不正なドメインです", "error-invalid-domain": "不正なドメインです",
"error-invalid-email": "不正なメールアドレスです。 {{email}}", "error-invalid-email": "不正なメールアドレスです。 {{email}}",
"error-invalid-email-address": "不正なメールアドレスです", "error-invalid-email-address": "不正なメールアドレスです",
"error-invalid-file-height": "ファイルの高さが不正です", "error-invalid-file-height": "ファイルの高さが不正です",
"error-invalid-file-type": "ファイルの種類が不正です", "error-invalid-file-type": "ファイルの種類が不正です",
"error-invalid-file-width": "ファイルの幅が不正です", "error-invalid-file-width": "ファイルの幅が不正です",
"error-invalid-from-address": "不正なアドレスから通知しました", "error-invalid-from-address": "不正なアドレスから通知しました",
"error-invalid-integration": "不正なインテグレーションです。", "error-invalid-integration": "不正なインテグレーションです。",
"error-invalid-message": "不正なメッセージです。", "error-invalid-message": "不正なメッセージです。",
"error-invalid-method": "不正なメソッドです。", "error-invalid-method": "不正なメソッドです。",
"error-invalid-name": "不正な名前です", "error-invalid-name": "不正な名前です",
"error-invalid-password": "不正なパスワードです", "error-invalid-password": "不正なパスワードです",
"error-invalid-redirectUri": "不正なリダイレクトURIです", "error-invalid-redirectUri": "不正なリダイレクトURIです",
"error-invalid-role": "不正なロールです", "error-invalid-role": "不正なロールです",
"error-invalid-room": "不正なルームです", "error-invalid-room": "不正なルームです",
"error-invalid-room-name": "{{room_name}}は正しいルーム名ではありません。", "error-invalid-room-name": "{{room_name}}は正しいルーム名ではありません。",
"error-invalid-room-type": "{{type}}は正しいルームタイプではありません。", "error-invalid-room-type": "{{type}}は正しいルームタイプではありません。",
"error-invalid-settings": "不正な設定が送信されました", "error-invalid-settings": "不正な設定が送信されました",
"error-invalid-subscription": "不正な購読です", "error-invalid-subscription": "不正な購読です",
"error-invalid-token": "トークンが正しくありません", "error-invalid-token": "トークンが正しくありません",
"error-invalid-triggerWords": "トリガーワードが正しくありません", "error-invalid-triggerWords": "トリガーワードが正しくありません",
"error-invalid-urls": "URLが正しくありません", "error-invalid-urls": "URLが正しくありません",
"error-invalid-user": "ユーザーが正しくありません", "error-invalid-user": "ユーザーが正しくありません",
"error-invalid-username": "ユーザー名が正しくありません", "error-invalid-username": "ユーザー名が正しくありません",
"error-invalid-webhook-response": "WebhookのURLが200以外のステータスを返しています", "error-invalid-webhook-response": "WebhookのURLが200以外のステータスを返しています",
"error-message-deleting-blocked": "メッセージの削除をブロックされています。", "error-message-deleting-blocked": "メッセージの削除をブロックされています。",
"error-message-editing-blocked": "メッセージの編集をブロックされています。", "error-message-editing-blocked": "メッセージの編集をブロックされています。",
"error-message-size-exceeded": "メッセージの大きさが Message_MaxAllowedSize を超えています。", "error-message-size-exceeded": "メッセージの大きさが Message_MaxAllowedSize を超えています。",
"error-missing-unsubscribe-link": "購読停止リンクを入れてください。", "error-missing-unsubscribe-link": "購読停止リンクを入れてください。",
"error-no-tokens-for-this-user": "このユーザーにはトークンがありません。", "error-no-tokens-for-this-user": "このユーザーにはトークンがありません。",
"error-not-allowed": "許可されていません。", "error-not-allowed": "許可されていません。",
"error-not-authorized": "有効化されていません。", "error-not-authorized": "有効化されていません。",
"error-push-disabled": "プッシュは無効化されています。", "error-push-disabled": "プッシュは無効化されています。",
"error-remove-last-owner": "ルームの最後のオーナーです。ルームを退出する前に新しいオーナーを設定してください。", "error-remove-last-owner": "ルームの最後のオーナーです。ルームを退出する前に新しいオーナーを設定してください。",
"error-role-in-use": "使用中のロールを削除することはできません。", "error-role-in-use": "使用中のロールを削除することはできません。",
"error-role-name-required": "ロール名を入力してください。", "error-role-name-required": "ロール名を入力してください。",
"error-the-field-is-required": "{{field}}の入力欄は必須です。", "error-the-field-is-required": "{{field}}の入力欄は必須です。",
"error-too-many-requests": "エラーです。リクエストが多すぎます。リクエストの頻度を落としてください。{{seconds}} 秒以上待ってから再度お試しください。", "error-too-many-requests": "エラーです。リクエストが多すぎます。リクエストの頻度を落としてください。{{seconds}} 秒以上待ってから再度お試しください。",
"error-user-is-not-activated": "アカウントが有効化されていません。", "error-user-is-not-activated": "アカウントが有効化されていません。",
"error-user-has-no-roles": "ロールがありません。", "error-user-has-no-roles": "ロールがありません。",
"error-user-limit-exceeded": "#channel_name に招待できるユーザー数の上限を超えています。管理者にお問い合わせください。", "error-user-limit-exceeded": "#channel_name に招待できるユーザー数の上限を超えています。管理者にお問い合わせください。",
"error-user-not-in-room": "ユーザーがルームにいません。", "error-user-not-in-room": "ユーザーがルームにいません。",
"error-user-registration-custom-field": "error-user-registration-custom-field", "error-user-registration-custom-field": "error-user-registration-custom-field",
"error-user-registration-disabled": "ユーザー登録は無効化されています", "error-user-registration-disabled": "ユーザー登録は無効化されています",
"error-user-registration-secret": "ユーザーの登録は登録用URLからのみ許可されています", "error-user-registration-secret": "ユーザーの登録は登録用URLからのみ許可されています",
"error-you-are-last-owner": "あなたは最後のオーナーです。ルームを退出する前に別のオーナーを設定してください。", "error-you-are-last-owner": "あなたは最後のオーナーです。ルームを退出する前に別のオーナーを設定してください。",
"Actions": "アクション", "Actions": "アクション",
"activity": "アクティビティ", "Activity": "アクティビティ順",
"Activity": "アクティビティ順", "Add_Reaction": "リアクションを追加",
"Add_Reaction": "リアクションを追加", "Add_Server": "サーバーを追加",
"Add_Server": "サーバーを追加", "Add_users": "ユーザーを追加",
"Add_users": "ユーザーを追加", "Admin_Panel": "管理者パネル",
"Admin_Panel": "管理者パネル", "Alert": "アラート",
"Alert": "アラート", "alert": "アラート",
"alert": "アラート", "alerts": "アラート",
"alerts": "アラート", "All_users_in_the_channel_can_write_new_messages": "すべてのユーザーが新しいメッセージを書き込みできます",
"All_users_in_the_channel_can_write_new_messages": "すべてのユーザーが新しいメッセージを書き込みできます", "All": "すべての",
"All": "すべての", "All_Messages": "全メッセージ",
"All_Messages": "全メッセージ", "Allow_Reactions": "リアクションを許可",
"Allow_Reactions": "リアクションを許可", "Alphabetical": "アルファベット順",
"Alphabetical": "アルファベット順", "and_more": "さらに表示",
"and_more": "さらに表示", "and": "と",
"and": "と", "announcement": "アナウンス",
"announcement": "アナウンス", "Announcement": "アナウンス",
"Announcement": "アナウンス", "Apply_Your_Certificate": "証明書を適用する",
"Apply_Your_Certificate": "証明書を適用する", "ARCHIVE": "アーカイブ",
"ARCHIVE": "アーカイブ", "archive": "アーカイブ",
"archive": "アーカイブ", "are_typing": "が入力中",
"are_typing": "が入力中", "Are_you_sure_question_mark": "よろしいですか?",
"Are_you_sure_question_mark": "よろしいですか?", "Are_you_sure_you_want_to_leave_the_room": "{{room}}を退出してもよろしいですか?",
"Are_you_sure_you_want_to_leave_the_room": "{{room}}を退出してもよろしいですか?", "Audio": "音声",
"Audio": "音声", "Authenticating": "認証",
"Authenticating": "認証", "Automatic": "自動",
"Automatic": "自動", "Auto_Translate": "自動翻訳",
"Auto_Translate": "自動翻訳", "Avatar_changed_successfully": "アバターを変更しました!",
"Avatar_changed_successfully": "アバターを変更しました!", "Avatar_Url": "アバターURL",
"Avatar_Url": "アバターURL", "Away": "退出中",
"Away": "退出中", "Back": "戻る",
"Back": "戻る", "Black": "ブラック",
"Black": "ブラック", "Block_user": "ブロックしたユーザー",
"Block_user": "ブロックしたユーザー", "Broadcast_channel_Description": "許可されたユーザーのみが新しいメッセージを書き込めます。他のユーザーは返信することができます",
"Broadcast_channel_Description": "許可されたユーザーのみが新しいメッセージを書き込めます。他のユーザーは返信することができます", "Broadcast_Channel": "配信チャンネル",
"Broadcast_Channel": "配信チャンネル", "Busy": "取り込み中",
"Busy": "取り込み中", "By_proceeding_you_are_agreeing": "続行することにより、私達を承認します",
"By_proceeding_you_are_agreeing": "続行することにより、私達を承認します", "Cancel_editing": "編集をキャンセル",
"Cancel_editing": "編集をキャンセル", "Cancel_recording": "録音をキャンセル",
"Cancel_recording": "録音をキャンセル", "Cancel": "キャンセル",
"Cancel": "キャンセル", "changing_avatar": "アバターを変更",
"changing_avatar": "アバターを変更", "creating_channel": "チャンネルを作成",
"creating_channel": "チャンネルを作成", "creating_invite": "招待を作成",
"creating_invite": "招待を作成", "Channel_Name": "チャンネル名",
"Channel_Name": "チャンネル名", "Channels": "チャンネル",
"Channels": "チャンネル", "Chats": "チャット",
"Chats": "チャット", "Call_already_ended": "通話は終了しています。",
"Call_already_ended": "通話は終了しています。", "Click_to_join": "クリックして参加!",
"Click_to_join": "クリックして参加!", "Close": "閉じる",
"Close": "閉じる", "Close_emoji_selector": "絵文字ピッカーを閉じる",
"Close_emoji_selector": "絵文字ピッカーを閉じる", "Choose": "選択",
"Choose": "選択", "Choose_from_library": "ライブラリから選択",
"Choose_from_library": "ライブラリから選択", "Choose_file": "ファイルを選択",
"Choose_file": "ファイルを選択", "Code": "コード",
"Code": "コード", "Collaborative": "コラボ",
"Collaborative": "コラボ", "Confirm": "承認",
"Confirm": "承認", "Connect": "接続",
"Connect": "接続", "Connected": "接続しました",
"Connected": "接続しました", "connecting_server": "サーバーに接続中",
"connecting_server": "サーバーに接続中", "Connecting": "接続中...",
"Connecting": "接続中...", "Contact_us": "お問い合わせ",
"Contact_us": "お問い合わせ", "Contact_your_server_admin": "サーバー管理者にお問い合わせください。",
"Contact_your_server_admin": "サーバー管理者にお問い合わせください。", "Continue_with": "次でログイン: ",
"Continue_with": "次でログイン: ", "Copied_to_clipboard": "クリップボードにコピー!",
"Copied_to_clipboard": "クリップボードにコピー!", "Copy": "コピー",
"Copy": "コピー", "Permalink": "パーマリンク",
"Permalink": "パーマリンク", "Certificate_password": "パスワード証明書",
"Certificate_password": "パスワード証明書", "Clear_cache": "ローカルのサーバーキャッシュをクリア",
"Clear_cache": "ローカルのサーバーキャッシュをクリア", "Whats_the_password_for_your_certificate": "証明書のパスワードはなんですか?",
"Whats_the_password_for_your_certificate": "証明書のパスワードはなんですか?", "Create_account": "アカウントを作成",
"Create_account": "アカウントを作成", "Create_Channel": "チャンネルを作成",
"Create_Channel": "チャンネルを作成", "Created_snippet": "スニペットを作成",
"Created_snippet": "スニペットを作成", "Create_a_new_workspace": "新しいワークスペースを作成",
"Create_a_new_workspace": "新しいワークスペースを作成", "Create": "作成",
"Create": "作成", "Dark": "ダーク",
"Dark": "ダーク", "Dark_level": "ダークレベル",
"Dark_level": "ダークレベル", "Default": "デフォルト",
"Default": "デフォルト", "Default_browser": "デフォルトのブラウザ",
"Default_browser": "デフォルトのブラウザ", "Delete_Room_Warning": "ルームを削除すると、ルームに投稿されたすべてのメッセージが削除されます。この操作は取り消せません。",
"Delete_Room_Warning": "ルームを削除すると、ルームに投稿されたすべてのメッセージが削除されます。この操作は取り消せません。", "delete": "削除",
"delete": "削除", "Delete": "削除",
"Delete": "削除", "DELETE": "削除",
"DELETE": "削除", "deleting_room": "ルームを削除",
"deleting_room": "ルームを削除", "description": "概要",
"description": "概要", "Description": "概要",
"Description": "概要", "Desktop_Options": "デスクトップオプション",
"Desktop_Options": "デスクトップオプション", "Directory": "ディレクトリ",
"Directory": "ディレクトリ", "Direct_Messages": "ダイレクトメッセージ",
"Direct_Messages": "ダイレクトメッセージ", "Disable_notifications": "通知を無効化",
"Disable_notifications": "通知を無効化", "Discussions": "ディスカッション",
"Discussions": "ディスカッション", "Dont_Have_An_Account": "アカウントがありませんか?",
"Dont_Have_An_Account": "アカウントがありませんか?", "Do_you_have_a_certificate": "証明書を持っていますか?",
"Do_you_have_a_certificate": "証明書を持っていますか?", "Do_you_really_want_to_key_this_room_question_mark": "本当にこのルームを{{key}}しますか?",
"Do_you_really_want_to_key_this_room_question_mark": "本当にこのルームを{{key}}しますか?", "edit": "編集",
"edit": "編集", "edited": "編集済",
"edited": "編集済", "Edit": "編集",
"Edit": "編集", "Edit_Invite": "編集に招待",
"Edit_Invite": "編集に招待", "Email_or_password_field_is_empty": "メールアドレスかパスワードの入力欄が空です",
"Email_or_password_field_is_empty": "メールアドレスかパスワードの入力欄が空です", "Email": "メールアドレス",
"Email": "メールアドレス", "email": "メールアドレス",
"email": "メールアドレス", "Enable_Auto_Translate": "自動翻訳を有効にする",
"Enable_Auto_Translate": "自動翻訳を有効にする", "Enable_notifications": "通知を有効にする",
"Enable_notifications": "通知を有効にする", "Everyone_can_access_this_channel": "全員このチャンネルにアクセスできます",
"Everyone_can_access_this_channel": "全員このチャンネルにアクセスできます", "Error_uploading": "アップロードエラー",
"Error_uploading": "アップロードエラー", "Expiration_Days": "期限切れ (日)",
"Expiration_Days": "期限切れ (日)", "Favorites": "お気に入り",
"Favorite": "お気に入り", "Files": "ファイル",
"Favorites": "お気に入り", "File_description": "ファイルの説明",
"Files": "ファイル", "File_name": "ファイル名",
"File_description": "ファイルの説明", "Finish_recording": "録音停止",
"File_name": "ファイル名", "Following_thread": "スレッド更新時に通知",
"Finish_recording": "録音停止", "For_your_security_you_must_enter_your_current_password_to_continue": "セキュリティのため、続けるには現在のパスワードを入力してください。",
"Following_thread": "スレッド更新時に通知", "Forgot_password_If_this_email_is_registered": "送信したメールアドレスが登録されていれば、パスワードのリセット方法を送信しました。メールアドレスがすぐに来ない場合はやり直してください。",
"For_your_security_you_must_enter_your_current_password_to_continue": "セキュリティのため、続けるには現在のパスワードを入力してください。", "Forgot_password": "パスワードを忘れた",
"Forgot_password_If_this_email_is_registered": "送信したメールアドレスが登録されていれば、パスワードのリセット方法を送信しました。メールアドレスがすぐに来ない場合はやり直してください。", "Forgot_Password": "パスワードを忘れた",
"Forgot_password": "パスワードを忘れた", "Full_table": "クリックしてテーブル全体を見る",
"Forgot_Password": "パスワードを忘れた", "Generate_New_Link": "新しいリンクを生成",
"Full_table": "クリックしてテーブル全体を見る", "Has_joined_the_channel": "はチャンネルに参加しました",
"Generate_New_Link": "新しいリンクを生成", "Has_joined_the_conversation": "は会話に参加しました",
"Group_by_favorites": "お気に入りをグループ化", "Has_left_the_channel": "はチャンネルを退出しました",
"Group_by_type": "タイプ別にグループ化", "In_App_And_Desktop": "アプリ内とデスクトップ",
"Hide": "隠す", "In_App_and_Desktop_Alert_info": "アプリを表示中にはバナーを上部に表示し、デスクトップには通知を送ります。",
"Has_joined_the_channel": "はチャンネルに参加しました", "Invisible": "状態を隠す",
"Has_joined_the_conversation": "は会話に参加しました", "Invite": "招待",
"Has_left_the_channel": "はチャンネルを退出しました", "is_a_valid_RocketChat_instance": "は正しいRocket.Chatのインスタンスです",
"In_App_And_Desktop": "アプリ内とデスクトップ", "is_not_a_valid_RocketChat_instance": "はRocket.Chatのインスタンスではありません",
"In_App_and_Desktop_Alert_info": "アプリを表示中にはバナーを上部に表示し、デスクトップには通知を送ります。", "is_typing": "が入力中",
"Invisible": "状態を隠す", "Invalid_or_expired_invite_token": "招待トークンが無効か、期限が切れています",
"Invite": "招待", "Invalid_server_version": "接続しようとしているサーバーのバージョン({{currentVersion}})はサポートされていません。\n\nサポートする最低バージョンは {{minVersion}} です",
"is_a_valid_RocketChat_instance": "は正しいRocket.Chatのインスタンスです", "Invite_Link": "招待リンク",
"is_not_a_valid_RocketChat_instance": "はRocket.Chatのインスタンスではありません", "Invite_users": "ユーザーを招待",
"is_typing": "が入力中", "Join": "参加",
"Invalid_or_expired_invite_token": "招待トークンが無効か、期限が切れています", "Just_invited_people_can_access_this_channel": "招待されたユーザーだけがこのチャンネルに参加できます",
"Invalid_server_version": "接続しようとしているサーバーのバージョン({{currentVersion}})はサポートされていません。\n\nサポートする最低バージョンは {{minVersion}} です", "Language": "言語",
"Invite_Link": "招待リンク", "last_message": "最後のメッセージ",
"Invite_users": "ユーザーを招待", "Leave_channel": "チャンネルを退出",
"Join": "参加", "leaving_room": "チャンネルを退出",
"Just_invited_people_can_access_this_channel": "招待されたユーザーだけがこのチャンネルに参加できます", "Leave": "ルームを退出",
"Language": "言語", "leave": "退出",
"last_message": "最後のメッセージ", "Legal": "法的項目",
"Leave_channel": "チャンネルを退出", "Light": "ライト",
"leaving_room": "チャンネルを退出", "License": "ライセンス",
"Leave": "ルームを退出", "Livechat": "ライブチャット",
"leave": "退出", "Login": "ログイン",
"Legal": "法的項目", "Login_error": "証明書が承認されませんでした。再度お試しください。",
"Light": "ライト", "Login_with": "次でログイン: ",
"License": "ライセンス", "Logout": "ログアウト",
"Livechat": "ライブチャット", "Max_number_of_uses": "最大利用数",
"Login": "ログイン", "members": "メンバー",
"Login_error": "証明書が承認されませんでした。再度お試しください。", "Members": "メンバー",
"Login_with": "次でログイン: ", "Mentioned_Messages": "メンションされたメッセージ",
"Logout": "ログアウト", "mentioned": "メンション",
"Max_number_of_uses": "最大利用数", "Mentions": "メンション",
"members": "メンバー", "Message_accessibility": "{{user}} から {{time}} にメッセージ: {{message}}",
"Members": "メンバー", "Message_actions": "メッセージアクション",
"Mentioned_Messages": "メンションされたメッセージ", "Message_pinned": "メッセージをピン留め",
"mentioned": "メンション", "Message_removed": "メッセージを除く",
"Mentions": "メンション", "message": "メッセージ",
"Message_accessibility": "{{user}} から {{time}} にメッセージ: {{message}}", "messages": "メッセージ",
"Message_actions": "メッセージアクション", "Message": "メッセージ",
"Message_pinned": "メッセージをピン留め", "Messages": "メッセージ",
"Message_removed": "メッセージを除く", "Message_Reported": "メッセージを報告しました",
"message": "メッセージ", "Microphone_Permission_Message": "Rocket.Chatは音声メッセージを送信するのにマイクのアクセスの許可が必要です。",
"messages": "メッセージ", "Microphone_Permission": "マイクの許可",
"Message": "メッセージ", "Mute": "ミュート",
"Messages": "メッセージ", "muted": "ミュートした",
"Message_Reported": "メッセージを報告しました", "My_servers": "自分のサーバー",
"Microphone_Permission_Message": "Rocket.Chatは音声メッセージを送信するのにマイクのアクセスの許可が必要です。", "N_people_reacted": "{{n}}人がリアクションしました",
"Microphone_Permission": "マイクの許可", "N_users": "{{n}}人",
"Mute": "ミュート", "Name": "名前",
"muted": "ミュートした", "Never": "ずっと受け取らない",
"My_servers": "自分のサーバー", "New_Message": "メッセージ",
"N_people_reacted": "{{n}}人がリアクションしました", "New_Password": "新しいパスワード",
"N_users": "{{n}}人", "New_Server": "新規サーバー",
"name": "アルファベット", "Next": "次へ",
"Name": "名前", "No_files": "ファイルがありません",
"Never": "ずっと受け取らない", "No_limit": "制限なし",
"New_Message": "メッセージ", "No_mentioned_messages": "メンションされたメッセージはありません",
"New_Password": "新しいパスワード", "No_pinned_messages": "ピン留めされたメッセージはありません",
"New_Server": "新規サーバー", "No_results_found": "結果なし",
"Next": "次へ", "No_starred_messages": "お気に入りされたメッセージはありません",
"No_files": "ファイルがありません", "No_thread_messages": "スレッドのメッセージはありません",
"No_limit": "制限なし", "No_Message": "メッセージなし",
"No_mentioned_messages": "メンションされたメッセージはありません", "No_messages_yet": "まだメッセージはありません",
"No_pinned_messages": "ピン留めされたメッセージはありません", "No_Reactions": "リアクションなし",
"No_results_found": "結果なし", "No_Read_Receipts": "未読通知はありません",
"No_starred_messages": "お気に入りされたメッセージはありません", "Not_logged": "ログされていません",
"No_thread_messages": "スレッドのメッセージはありません", "Not_RC_Server": "Rocket.Chatサーバーではありません。\n{{contact}}",
"No_Message": "メッセージなし", "Nothing": "何もなし",
"No_messages_yet": "まだメッセージはありません", "Nothing_to_save": "保存するものはありません!",
"No_Reactions": "リアクションなし", "Notify_active_in_this_room": "このルームのアクティブなユーザーに通知する",
"No_Read_Receipts": "未読通知はありません", "Notify_all_in_this_room": "このルームのユーザー全員に通知する",
"Not_logged": "ログされていません", "Notifications": "通知",
"Not_RC_Server": "Rocket.Chatサーバーではありません。\n{{contact}}", "Notification_Duration": "通知の期間",
"Nothing": "何もなし", "Notification_Preferences": "通知設定",
"Nothing_to_save": "保存するものはありません!", "Offline": "オフライン",
"Notify_active_in_this_room": "このルームのアクティブなユーザーに通知する", "Oops": "おっと!",
"Notify_all_in_this_room": "このルームのユーザー全員に通知する", "Onboarding_title": "Rocket.Chatへようこそ",
"Notifications": "通知", "Online": "オンライン",
"Notification_Duration": "通知の期間", "Only_authorized_users_can_write_new_messages": "承認されたユーザーだけが新しいメッセージを書き込めます",
"Notification_Preferences": "通知設定", "Open_emoji_selector": "絵文字ピッカーを開く",
"Offline": "オフライン", "Open_Source_Communication": "オープンソースコミュニケーション",
"Oops": "おっと!", "Password": "パスワード",
"Onboarding_title": "Rocket.Chatへようこそ", "Permalink_copied_to_clipboard": "リンクをクリップボードにコピーしました!",
"Online": "オンライン", "Pin": "ピン留め",
"Only_authorized_users_can_write_new_messages": "承認されたユーザーだけが新しいメッセージを書き込めます", "Pinned_Messages": "ピン留めされたメッセージ",
"Open_emoji_selector": "絵文字ピッカーを開く", "pinned": "ピン留めされた",
"Open_Source_Communication": "オープンソースコミュニケーション", "Pinned": "ピン留めされました",
"Password": "パスワード", "Please_enter_your_password": "パスワードを入力してください",
"Permalink_copied_to_clipboard": "リンクをクリップボードにコピーしました!", "Preferences": "設定",
"Pin": "ピン留め", "Preferences_saved": "設定が保存されました。",
"Pinned_Messages": "ピン留めされたメッセージ", "Privacy_Policy": " プライバシーポリシー",
"pinned": "ピン留めされた", "Private_Channel": "プライベートチャンネル",
"Pinned": "ピン留めされました", "Private": "プライベート",
"Please_enter_your_password": "パスワードを入力してください", "Processing": "処理中...",
"Preferences": "設定", "Profile_saved_successfully": "プロフィールが保存されました!",
"Preferences_saved": "設定が保存されました。", "Profile": "プロフィール",
"Privacy_Policy": " プライバシーポリシー", "Public_Channel": "パブリックチャンネル",
"Private_Channel": "プライベートチャンネル", "Public": "パブリック",
"Private": "プライベート", "Push_Notifications": "プッシュ通知",
"Processing": "処理中...", "Push_Notifications_Alert_Info": "通知はアプリを開いていない時に送られます。",
"Profile_saved_successfully": "プロフィールが保存されました!", "Quote": "引用",
"Profile": "プロフィール", "Reactions_are_disabled": "リアクションは無効化されています",
"Public_Channel": "パブリックチャンネル", "Reactions_are_enabled": "リアクションは有効化されています",
"Public": "パブリック", "Reactions": "リアクション",
"Push_Notifications": "プッシュ通知", "Read_Only_Channel": "読み取り専用チャンネル",
"Push_Notifications_Alert_Info": "通知はアプリを開いていない時に送られます。", "Read_Only": "読み取り専用",
"Quote": "引用", "Read_Receipt": "レシートを見る",
"Reactions_are_disabled": "リアクションは無効化されています", "Receive_Group_Mentions": "グループの通知を受け取る",
"Reactions_are_enabled": "リアクションは有効化されています", "Receive_Group_Mentions_Info": "@all と @here の通知を受け取る",
"Reactions": "リアクション", "Register": "登録",
"Read": "読む", "Repeat_Password": "パスワードを再入力",
"Read_Only_Channel": "読み取り専用チャンネル", "Replied_on": "返信:",
"Read_Only": "読み取り専用", "replies": "返信",
"Read_Receipt": "レシートを見る", "reply": "返信",
"Receive_Group_Mentions": "グループの通知を受け取る", "Reply": "返信",
"Receive_Group_Mentions_Info": "@all と @here の通知を受け取る", "Report": "報告",
"Register": "登録", "Receive_Notification": "通知を受け取る",
"Repeat_Password": "パスワードを再入力", "Receive_notifications_from": "{{name}}からの通知を受け取る",
"Replied_on": "返信:", "Resend": "再送信",
"replies": "返信", "Reset_password": "パスワードをリセット",
"reply": "返信", "resetting_password": "パスワードを再設定",
"Reply": "返信", "RESET": "リセット",
"Report": "報告", "Review_app_title": "アプリにご満足いただけておりますか?",
"Receive_Notification": "通知を受け取る", "Review_app_desc": "{{store}}で5段階で評価をお願いします",
"Receive_notifications_from": "{{name}}からの通知を受け取る", "Review_app_yes": "はい!",
"Resend": "再送信", "Review_app_no": "いいえ",
"Reset_password": "パスワードをリセット", "Review_app_later": "あとで",
"resetting_password": "パスワードを再設定", "Review_app_unable_store": "{{store}}を開けません。",
"RESET": "リセット", "Review_this_app": "アプリをレビューする",
"Review_app_title": "アプリにご満足いただけておりますか?", "Roles": "ロール",
"Review_app_desc": "{{store}}で5段階で評価をお願いします", "Room_actions": "ルームアクション",
"Review_app_yes": "はい!", "Room_changed_announcement": "{{userBy}}がアナウンスを変更しました: {{announcement}}",
"Review_app_no": "いいえ", "Room_changed_description": "{{userBy}}が概要を変更しました: {{description}}",
"Review_app_later": "あとで", "Room_changed_privacy": "{{userBy}}がルームタイプを変更しました。: {{type}}",
"Review_app_unable_store": "{{store}}を開けません。", "Room_changed_topic": "{{userBy}}がトピックを変更しました: {{topic}}",
"Review_this_app": "アプリをレビューする", "Room_Files": "ルームのファイル",
"Roles": "ロール", "Room_Info_Edit": "ルーム情報を編集",
"Room_actions": "ルームアクション", "Room_Info": "ルーム情報",
"Room_changed_announcement": "{{userBy}}がアナウンスを変更しました: {{announcement}}", "Room_Members": "ルームのメンバー",
"Room_changed_description": "{{userBy}}が概要を変更しました: {{description}}", "Room_name_changed": "ルーム名が{{userBy}}により変更されました: {{name}}",
"Room_changed_privacy": "{{userBy}}がルームタイプを変更しました。: {{type}}", "SAVE": "保存",
"Room_changed_topic": "{{userBy}}がトピックを変更しました: {{topic}}", "Save_Changes": "変更を保存",
"Room_Files": "ルームのファイル", "Save": "保存",
"Room_Info_Edit": "ルーム情報を編集", "saving_preferences": "設定を保存中",
"Room_Info": "ルーム情報", "saving_profile": "プロフィールを設定中",
"Room_Members": "ルームのメンバー", "saving_settings": "サーバー設定を保存中",
"Room_name_changed": "ルーム名が{{userBy}}により変更されました: {{name}}", "saved_to_gallery": "ギャラリーに保存しました",
"SAVE": "保存", "Search_Messages": "メッセージを検索",
"Save_Changes": "変更を保存", "Search": "検索",
"Save": "保存", "Search_by": "検索種別: ",
"saving_preferences": "設定を保存中", "Search_global_users": "グローバルユーザーのための検索",
"saving_profile": "プロフィールを設定中", "Search_global_users_description": "有効にした場合、他の会社やサーバーの誰もがあなたを検索可能になります。",
"saving_settings": "サーバー設定を保存中", "Seconds": "{{second}} 秒",
"saved_to_gallery": "ギャラリーに保存しました", "Select_Avatar": "アバターを選択",
"Search_Messages": "メッセージを検索", "Select_Server": "サーバーを選択",
"Search": "検索", "Select_Users": "ユーザーを選択",
"Search_by": "検索種別: ", "Send": "送信",
"Search_global_users": "グローバルユーザーのための検索", "Send_audio_message": "録音メッセージを送信",
"Search_global_users_description": "有効にした場合、他の会社やサーバーの誰もがあなたを検索可能になります。", "Send_crash_report": "クラッシュレポートを送信",
"Seconds": "{{second}} 秒", "Send_message": "メッセージを送信",
"Select_Avatar": "アバターを選択", "Send_to": "送信先...",
"Select_Server": "サーバーを選択", "Sent_an_attachment": "添付ファイルを送信しました",
"Select_Users": "ユーザーを選択", "Server": "サーバー",
"Send": "送信", "Servers": "サーバー",
"Send_audio_message": "録音メッセージを送信", "Server_version": "サーバーバージョン: {{version}}",
"Send_crash_report": "クラッシュレポートを送信", "Set_username_subtitle": "ユーザー名はメッセージ中であなたにメンションするのに使われます。",
"Send_message": "メッセージを送信", "Settings": "設定",
"Send_to": "送信先...", "Settings_succesfully_changed": "設定が更新されました!",
"Sent_an_attachment": "添付ファイルを送信しました", "Share": "シェア",
"Server": "サーバー", "Share_Link": "リンクをシェアする",
"Servers": "サーバー", "Share_this_app": "このアプリをシェアする",
"Server_version": "サーバーバージョン: {{version}}", "Show_more": "Show more..",
"Set_username_subtitle": "ユーザー名はメッセージ中であなたにメンションするのに使われます。", "Show_Unread_Counter": "未読件数を表示する",
"Settings": "設定", "Show_Unread_Counter_Info": "未読件数はリスト上で、チャンネルの右側にバッジで表示されます。",
"Settings_succesfully_changed": "設定が更新されました!", "Sign_in_your_server": "サーバーに接続",
"Share": "シェア", "Sign_Up": "登録",
"Share_Link": "リンクをシェアする", "Some_field_is_invalid_or_empty": "不正、または空の入力欄があります。",
"Share_this_app": "このアプリをシェアする", "Sound": "音",
"Show_more": "Show more..", "Star_room": "お気に入りルーム",
"Show_Unread_Counter": "未読件数を表示する", "Star": "お気に入り",
"Show_Unread_Counter_Info": "未読件数はリスト上で、チャンネルの右側にバッジで表示されます。", "Starred_Messages": "お気に入りされたメッセージ",
"Sign_in_your_server": "サーバーに接続", "starred": "お気に入りされています",
"Sign_Up": "登録", "Starred": "お気に入りされています",
"Some_field_is_invalid_or_empty": "不正、または空の入力欄があります。", "Start_of_conversation": "会話を開始する",
"Sorting_by": "{{key}}順", "Started_discussion": "ディスカッションを開始する:",
"Sound": "音", "Started_call": "{{userBy}}と通話する",
"Star_room": "お気に入りルーム", "Submit": "送信",
"Star": "お気に入り", "Table": "表",
"Starred_Messages": "お気に入りされたメッセージ", "Take_a_photo": "写真を撮影",
"starred": "お気に入りされています", "Take_a_video": "動画を撮影",
"Starred": "お気に入りされています", "tap_to_change_status": "タップしてステータスを変更",
"Start_of_conversation": "会話を開始する", "Tap_to_view_servers_list": "タップしてサーバーリストを見る",
"Started_discussion": "ディスカッションを開始する:", "Terms_of_Service": " 利用規約 ",
"Started_call": "{{userBy}}と通話する", "Theme": "テーマ",
"Submit": "送信", "There_was_an_error_while_action": "{{action}}の最中にエラーが発生しました!",
"Table": "表", "This_room_is_blocked": "このルームはブロックされています。",
"Take_a_photo": "写真を撮影", "This_room_is_read_only": "このルームは読み取り専用です。",
"Take_a_video": "動画を撮影", "Thread": "スレッド",
"tap_to_change_status": "タップしてステータスを変更", "Threads": "スレッド",
"Tap_to_view_servers_list": "タップしてサーバーリストを見る", "Timezone": "タイムゾーン",
"Terms_of_Service": " 利用規約 ", "To": "To",
"Theme": "テーマ", "topic": "トピック",
"There_was_an_error_while_action": "{{action}}の最中にエラーが発生しました!", "Topic": "トピック",
"This_room_is_blocked": "このルームはブロックされています。", "Translate": "翻訳",
"This_room_is_read_only": "このルームは読み取り専用です。", "Try_again": "再度お試しください。",
"Thread": "スレッド", "Two_Factor_Authentication": "2段階認証",
"Threads": "スレッド", "Type_the_channel_name_here": "ここにチャンネル名を入力",
"Timezone": "タイムゾーン", "unarchive": "アーカイブ解除",
"To": "To", "UNARCHIVE": "アーカイブ解除",
"topic": "トピック", "Unblock_user": "ブロックを解除",
"Topic": "トピック", "Unfollowed_thread": "スレッド更新時に通知しない",
"Translate": "翻訳", "Unmute": "ミュート解除",
"Try_again": "再度お試しください。", "unmuted": "ミュート解除しました",
"Two_Factor_Authentication": "2段階認証", "Unpin": "ピン留めを解除",
"Type_the_channel_name_here": "ここにチャンネル名を入力", "unread_messages": "未読",
"unarchive": "アーカイブ解除", "Unread": "未読",
"UNARCHIVE": "アーカイブ解除", "Unread_on_top": "未読メッセージを上に表示",
"Unblock_user": "ブロックを解除", "Unstar": "お気に入り解除",
"Unfavorite": "お気に入り解除", "Updating": "更新中...",
"Unfollowed_thread": "スレッド更新時に通知しない", "Uploading": "アップロード中",
"Unmute": "ミュート解除", "Upload_file_question_mark": "ファイルをアップロードしますか?",
"unmuted": "ミュート解除しました", "Users": "ユーザー",
"Unpin": "ピン留めを解除", "User_added_by": "{{userBy}} が {{userAdded}} を追加しました",
"unread_messages": "未読", "User_Info": "ユーザー情報",
"Unread": "未読", "User_has_been_key": "ユーザーは{{key}}",
"Unread_on_top": "未読メッセージを上に表示", "User_is_no_longer_role_by_": "{{userBy}} は {{user}} のロール {{role}} を削除しました。",
"Unstar": "お気に入り解除", "User_muted_by": "{{userBy}} は {{userMuted}} をミュートしました。",
"Updating": "更新中...", "User_removed_by": "{{userBy}} は {{userRemoved}} を退出させました。",
"Uploading": "アップロード中", "User_sent_an_attachment": "{{user}}は添付ファイルを送信しました",
"Upload_file_question_mark": "ファイルをアップロードしますか?", "User_unmuted_by": "{{userUnmuted}} は {{userBy}} にミュート解除されました。",
"Users": "ユーザー", "User_was_set_role_by_": "{{user}} was set {{role}} by {{userBy}}",
"User_added_by": "{{userBy}} が {{userAdded}} を追加しました", "Username_is_empty": "ユーザー名が空です。",
"User_Info": "ユーザー情報", "Username": "ユーザー名",
"User_has_been_key": "ユーザーは{{key}}", "Username_or_email": "ユーザー名かメールアドレス",
"User_is_no_longer_role_by_": "{{userBy}} は {{user}} のロール {{role}} を削除しました。", "Validating": "検証中",
"User_muted_by": "{{userBy}} は {{userMuted}} をミュートしました。", "Video_call": "ビデオ通話",
"User_removed_by": "{{userBy}} は {{userRemoved}} を退出させました。", "View_Original": "オリジナルを見る",
"User_sent_an_attachment": "{{user}}は添付ファイルを送信しました", "Voice_call": "音声通話",
"User_unmuted_by": "{{userUnmuted}} は {{userBy}} にミュート解除されました。", "Websocket_disabled": "Websocketはこのサーバーでは無効化されています。\n{{contact}}",
"User_was_set_role_by_": "{{user}} was set {{role}} by {{userBy}}", "Welcome": "ようこそ",
"Username_is_empty": "ユーザー名が空です。", "Whats_your_2fa": "2段階認証のコードを入力してください",
"Username": "ユーザー名", "Without_Servers": "サーバーを除く",
"Username_or_email": "ユーザー名かメールアドレス", "Write_External_Permission_Message": "Rocket.Chatは画像を保存するためにギャラリーへのアクセスを求めています。",
"Validating": "検証中", "Write_External_Permission": "ギャラリーへのアクセス許可",
"Video_call": "ビデオ通話", "Yes_action_it": "はい、{{action}}します!",
"View_Original": "オリジナルを見る", "Yesterday": "昨日",
"Voice_call": "音声通話", "You_are_in_preview_mode": "プレビューモードです。",
"Websocket_disabled": "Websocketはこのサーバーでは無効化されています。\n{{contact}}", "You_are_offline": "オフラインです。",
"Welcome": "ようこそ", "You_can_search_using_RegExp_eg": "正規表現を利用できます。 例: `/^text$/i`",
"Whats_your_2fa": "2段階認証のコードを入力してください", "You_colon": "あなた: ",
"Without_Servers": "サーバーを除く", "you_were_mentioned": "あなたがメンションしました",
"Write_External_Permission_Message": "Rocket.Chatは画像を保存するためにギャラリーへのアクセスを求めています。", "you": "あなた",
"Write_External_Permission": "ギャラリーへのアクセス許可", "You": "あなた",
"Yes_action_it": "はい、{{action}}します!", "Logged_out_by_server": "サーバーからログアウトします。もう一度ログインしてください。",
"Yesterday": "昨日", "You_need_to_access_at_least_one_RocketChat_server_to_share_something": "シェアするためには1つ以上のサーバーにアクセスする必要があります。",
"You_are_in_preview_mode": "プレビューモードです。", "Your_certificate": "あなたの認証情報",
"You_are_offline": "オフラインです。", "Your_invite_link_will_expire_after__usesLeft__uses": "招待リンクはあと{{usesLeft}}回で使用できなくなります。",
"You_can_search_using_RegExp_eg": "正規表現を利用できます。 例: `/^text$/i`", "Your_invite_link_will_expire_on__date__or_after__usesLeft__uses": "招待リンクは{{date}}までか、あと{{usesLeft}}回で使用できなくなります。",
"You_colon": "あなた: ", "Your_invite_link_will_expire_on__date__": "招待リンクは{{date}}に使用できなくなります。",
"you_were_mentioned": "あなたがメンションしました", "Your_invite_link_will_never_expire": "招待リンクはずっと有効です。",
"you": "あなた", "Version_no": "バージョン: {{version}}",
"You": "あなた", "You_will_not_be_able_to_recover_this_message": "このメッセージは復元できません!",
"Logged_out_by_server": "サーバーからログアウトします。もう一度ログインしてください。", "Change_Language": "言語を変更",
"You_need_to_access_at_least_one_RocketChat_server_to_share_something": "シェアするためには1つ以上のサーバーにアクセスする必要があります。", "Crash_report_disclaimer": "クラッシュレポートには問題を特定し、修正するために必要な情報のみが含まれます。チャット内のコンテンツは送信されません。",
"Your_certificate": "あなたの認証情報", "Type_message": "メッセージを入力",
"Your_invite_link_will_expire_after__usesLeft__uses": "招待リンクはあと{{usesLeft}}回で使用できなくなります。", "Room_search": "ルームを検索",
"Your_invite_link_will_expire_on__date__or_after__usesLeft__uses": "招待リンクは{{date}}までか、あと{{usesLeft}}回で使用できなくなります。", "Room_selection": "ルームを選択 1...9",
"Your_invite_link_will_expire_on__date__": "招待リンクは{{date}}に使用できなくなります。", "Next_room": "次のルーム",
"Your_invite_link_will_never_expire": "招待リンクはずっと有効です。", "Previous_room": "前のルーム",
"Version_no": "バージョン: {{version}}", "New_room": "新しいルーム",
"You_will_not_be_able_to_recover_this_message": "このメッセージは復元できません!", "Upload_room": "ルームにアップロード",
"Change_Language": "言語を変更", "Search_messages": "メッセージを検索",
"Crash_report_disclaimer": "クラッシュレポートには問題を特定し、修正するために必要な情報のみが含まれます。チャット内のコンテンツは送信されません。", "Scroll_messages": "メッセージをスクロール",
"Type_message": "メッセージを入力", "Reply_latest": "最新のメッセージにリプライ",
"Room_search": "ルームを検索", "Server_selection": "サーバー選択",
"Room_selection": "ルームを選択 1...9", "Server_selection_numbers": "サーバー選択 1...9",
"Next_room": "次のルーム", "Add_server": "サーバーを追加",
"Previous_room": "前のルーム", "New_line": "新しい行",
"New_room": "新しいルーム", "You_will_be_logged_out_of_this_application": "アプリからログアウトします。",
"Upload_room": "ルームにアップロード", "Clear": "クリア",
"Search_messages": "メッセージを検索", "This_will_clear_all_your_offline_data": "オフラインデータをすべて削除します。",
"Scroll_messages": "メッセージをスクロール", "invalid-room": "無効なルーム"
"Reply_latest": "最新のメッセージにリプライ",
"Server_selection": "サーバー選択",
"Server_selection_numbers": "サーバー選択 1...9",
"Add_server": "サーバーを追加",
"New_line": "新しい行",
"You_will_be_logged_out_of_this_application": "アプリからログアウトします。",
"Clear": "クリア",
"This_will_clear_all_your_offline_data": "オフラインデータをすべて削除します。",
"invalid-room": "無効なルーム"
} }

View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/kg.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/km.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/ko.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/ku.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/ln.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/lo.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/lt.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/lv.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/mn.json Normal file
View File

@ -0,0 +1 @@
{ }

View File

@ -0,0 +1 @@
{ }

File diff suppressed because it is too large Load Diff

1
app/i18n/locales/no.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/pl.json Normal file
View File

@ -0,0 +1 @@
{ }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1
app/i18n/locales/ro.json Normal file
View File

@ -0,0 +1 @@
{ }

File diff suppressed because it is too large Load Diff

1
app/i18n/locales/si.json Normal file
View File

@ -0,0 +1 @@
{ }

View File

@ -0,0 +1 @@
{ }

View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/sq.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/sr.json Normal file
View File

@ -0,0 +1 @@
{ }

1
app/i18n/locales/sv.json Normal file
View File

@ -0,0 +1 @@
{ }

Some files were not shown because too many files have changed in this diff Show More