Compare commits

...

36 Commits

Author SHA1 Message Date
Jason Frerich
8d21cd26f9 wip 2022-10-31 08:55:42 -05:00
Jason Frerich
8b9f378b70 nits 2022-10-28 13:55:40 -05:00
Jason Frerich
39e3d5a22b fix lint 2022-10-28 13:46:11 -05:00
Jason Frerich
ef76c6968e remove comments 2022-10-28 13:40:41 -05:00
Jason Frerich
e1dd87ec75 focus the input when any modifier is added to the search input 2022-10-28 12:02:49 -05:00
Jason Frerich
c1cc640546 Add search tab icon 2022-10-28 09:49:54 -05:00
Guillermo Vayá
fd7ab546e0 don't bold muted channels (#6713) 2022-10-28 10:53:29 -03:00
Anurag Shivarathri
04c3533b95 [Gekidou MM-47224] Don’t show in app notifications for the active thread (#6704)
* Conditions fix

* Comments fix
2022-10-28 10:04:58 -03:00
Jason Frerich
d26d000ce3 [Gekidou MM-47999, MM-48005] Remove unusable modifiers, default team picker to current team (#6709)
* add showMore component only when exceeding 4 modifier elements

* rename variable

* When the user switches teams, default search screen to to that team
2022-10-28 10:04:30 -03:00
Elias Nahum
2eb52990ca apply heading style to hashtags (#6710) 2022-10-28 10:02:32 -03:00
Matthew Birtch
14cc74fdb9 update team sidebar's background color to match with the theme color used in the webapp (#6711) 2022-10-28 10:01:51 -03:00
Jason Frerich
c627fb8df9 [Gekidou MM-46229] Add hideAndLock, showAndUnlock callbacks for Search (#6677)
Co-authored-by: Elias Nahum <nahumhbl@gmail.com>
2022-10-27 22:04:26 -05:00
master7
7cf2bff658 Translated using Weblate (Polish)
Currently translated at 45.9% (390 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/pl/
2022-10-27 13:27:15 +03:00
Tom De Moor
80f2460e80 Translated using Weblate (Dutch)
Currently translated at 75.2% (639 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2022-10-27 13:27:15 +03:00
MArtin Johnson
6eadcb56eb Translated using Weblate (Swedish)
Currently translated at 47.1% (400 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/sv/
2022-10-27 13:27:15 +03:00
Tom De Moor
41d184059a Translated using Weblate (Dutch)
Currently translated at 72.3% (614 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2022-10-27 13:27:15 +03:00
Angel Mendez Cano
3c84673eb1 Translated using Weblate (Spanish)
Currently translated at 91.0% (773 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/es/
2022-10-27 13:27:15 +03:00
Angel Mendez Cano
8b4ecd4e22 Translated using Weblate (Spanish)
Currently translated at 73.1% (621 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/es/
2022-10-27 13:27:15 +03:00
Weblate
42c604b039 Added translation using Weblate (Croatian) 2022-10-27 13:27:15 +03:00
kaakaa
572388b0cf Translated using Weblate (Japanese)
Currently translated at 100.0% (849 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2022-10-27 13:27:15 +03:00
Angel Mendez Cano
b805ff4d54 Translated using Weblate (Spanish)
Currently translated at 56.3% (478 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/es/
2022-10-27 13:27:15 +03:00
kaakaa
24f6ad25ca Translated using Weblate (Japanese)
Currently translated at 45.4% (386 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ja/
2022-10-27 13:27:15 +03:00
Matthew Williams
f3b7219bc0 Translated using Weblate (English (Australia))
Currently translated at 99.7% (847 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/en_AU/
2022-10-27 13:27:15 +03:00
Tom De Moor
b9e8de35ce Translated using Weblate (Dutch)
Currently translated at 46.1% (392 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2022-10-27 13:27:15 +03:00
Elias Nahum
b5531fdf12 Translated using Weblate (Spanish)
Currently translated at 47.1% (400 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/es/
2022-10-27 13:27:15 +03:00
jprusch
9bfca3ec9f Translated using Weblate (German)
Currently translated at 100.0% (849 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2022-10-27 13:27:15 +03:00
Tom De Moor
7e6ae93b70 Translated using Weblate (Dutch)
Currently translated at 45.3% (385 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/nl/
2022-10-27 13:27:15 +03:00
JtheBAB
964c0fcb2d Translated using Weblate (German)
Currently translated at 81.1% (689 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2022-10-27 13:27:15 +03:00
jprusch
5edf1ec45b Translated using Weblate (German)
Currently translated at 81.1% (689 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2022-10-27 13:27:15 +03:00
alzee
3c7e7ad436 Translated using Weblate (Chinese (Simplified))
Currently translated at 44.9% (382 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/zh_Hans/
2022-10-27 13:27:15 +03:00
Константин
00d24e20ce Translated using Weblate (Russian)
Currently translated at 45.4% (386 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/ru/
2022-10-27 13:27:15 +03:00
Guillermo Vayá
aab2c31d20 Translated using Weblate (Spanish)
Currently translated at 45.8% (389 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/es/
2022-10-27 13:27:15 +03:00
jprusch
170b0122d0 Translated using Weblate (German)
Currently translated at 65.3% (555 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2022-10-27 13:27:15 +03:00
JtheBAB
abd81c26a1 Translated using Weblate (German)
Currently translated at 65.3% (555 of 849 strings)

Translation: mattermost-languages-shipped/mattermost-mobile-v2
Translate-URL: https://translate.mattermost.com/projects/mattermost/mattermost-mobile-v2/de/
2022-10-27 13:27:15 +03:00
Avinash Lingaloo
4f4a3c30f4 Bump app build number to 429 (#6705) 2022-10-27 10:27:50 +04:00
Christopher Poile
67342246eb MM-45754 - Calls: Add current call bar to thread screen (#6628)
* remove isCallsPluginEnabled; add current call bar to thread screen

* popTo thread/call screen; updateProps in dismissAllModalsAndPopToScreen

* remove unneeded withServerUrl; only updateProps if needed
2022-10-25 21:34:51 -04:00
47 changed files with 6106 additions and 3776 deletions

View File

@@ -145,7 +145,7 @@ android {
applicationId "com.mattermost.rnbeta"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 428
versionCode 429
versionName "2.0.0"
testBuildType System.getProperty('testBuildType', 'debug')
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'

View File

@@ -103,7 +103,7 @@ const ChannelIcon = ({
let unreadGroup;
let mutedStyle;
if (isUnread) {
if (isUnread && !isMuted) {
unreadIcon = styles.iconUnread;
unreadGroupBox = styles.groupBoxUnread;
unreadGroup = styles.groupUnread;
@@ -116,7 +116,7 @@ const ChannelIcon = ({
}
if (isInfo) {
activeIcon = isUnread ? styles.iconInfoUnread : styles.iconInfo;
activeIcon = isUnread && !isMuted ? styles.iconInfoUnread : styles.iconInfo;
activeGroupBox = styles.groupBoxInfo;
activeGroup = isUnread ? styles.groupInfoUnread : styles.groupInfo;
}

View File

@@ -151,7 +151,7 @@ const ChannelListItem = ({
}, [channel.id]);
const textStyles = useMemo(() => [
isBolded ? textStyle.bold : textStyle.regular,
isBolded && !isMuted ? textStyle.bold : textStyle.regular,
styles.text,
isBolded && styles.highlight,
isActive && isTablet && !isInfo ? styles.textActive : null,

View File

@@ -2,13 +2,13 @@
// See LICENSE.txt for license information.
import React from 'react';
import {Text, TextStyle} from 'react-native';
import {StyleProp, Text, TextStyle} from 'react-native';
import {popToRoot, dismissAllModals} from '@screens/navigation';
type HashtagProps = {
hashtag: string;
linkStyle: TextStyle;
linkStyle: StyleProp<TextStyle>;
};
const Hashtag = ({hashtag, linkStyle}: HashtagProps) => {

View File

@@ -284,10 +284,16 @@ const Markdown = ({
return renderText({context, literal: `#${hashtag}`});
}
const linkStyle = [textStyles.link];
const headingIndex = context.findIndex((c) => c.includes('heading'));
if (headingIndex > -1) {
linkStyle.push(textStyles[context[headingIndex]]);
}
return (
<Hashtag
hashtag={hashtag}
linkStyle={textStyles.link}
linkStyle={linkStyle}
/>
);
};

View File

@@ -4,9 +4,11 @@
import React, {useMemo} from 'react';
import {Platform, Text, View} from 'react-native';
import Animated, {useAnimatedStyle, withTiming} from 'react-native-reanimated';
import {useSafeAreaInsets} from 'react-native-safe-area-context';
import CompassIcon from '@components/compass_icon';
import TouchableWithFeedback from '@components/touchable_with_feedback';
import ViewConstants from '@constants/view';
import {changeOpacity, makeStyleSheetFromTheme} from '@utils/theme';
import {typography} from '@utils/typography';
@@ -24,18 +26,18 @@ type Props = {
defaultHeight: number;
hasSearch: boolean;
isLargeTitle: boolean;
largeHeight: number;
heightOffset: number;
leftComponent?: React.ReactElement;
onBackPress?: () => void;
onTitlePress?: () => void;
rightButtons?: HeaderRightButton[];
scrollValue?: Animated.SharedValue<number>;
lockValue?: Animated.SharedValue<number | null>;
showBackButton?: boolean;
subtitle?: string;
subtitleCompanion?: React.ReactElement;
theme: Theme;
title?: string;
top: number;
}
const hitSlop = {top: 20, bottom: 20, left: 20, right: 20};
@@ -127,20 +129,21 @@ const Header = ({
defaultHeight,
hasSearch,
isLargeTitle,
largeHeight,
heightOffset,
leftComponent,
onBackPress,
onTitlePress,
rightButtons,
scrollValue,
lockValue,
showBackButton = true,
subtitle,
subtitleCompanion,
theme,
title,
top,
}: Props) => {
const styles = getStyleSheet(theme);
const insets = useSafeAreaInsets();
const opacity = useAnimatedStyle(() => {
if (!isLargeTitle) {
@@ -151,8 +154,7 @@ const Header = ({
return {opacity: 0};
}
const largeTitleLabelHeight = 60;
const barHeight = (largeHeight - defaultHeight) - largeTitleLabelHeight;
const barHeight = heightOffset - ViewConstants.LARGE_HEADER_TITLE_HEIGHT;
const val = (scrollValue?.value ?? 0);
const showDuration = 200;
const hideDuration = 50;
@@ -161,11 +163,15 @@ const Header = ({
return {
opacity: withTiming(opacityValue, {duration}),
};
}, [defaultHeight, largeHeight, isLargeTitle, hasSearch]);
}, [heightOffset, isLargeTitle, hasSearch]);
const containerStyle = useMemo(() => {
return [styles.container, {height: defaultHeight + top, paddingTop: top}];
}, [defaultHeight, theme]);
const containerAnimatedStyle = useAnimatedStyle(() => ({
height: defaultHeight,
paddingTop: insets.top,
}), [defaultHeight, lockValue]);
const containerStyle = useMemo(() => (
[styles.container, containerAnimatedStyle]), [styles, containerAnimatedStyle]);
const additionalTitleStyle = useMemo(() => ({
marginLeft: Platform.select({android: showBackButton && !leftComponent ? 20 : 0}),

View File

@@ -1,19 +1,21 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React from 'react';
import Animated, {useAnimatedStyle} from 'react-native-reanimated';
import {useSafeAreaInsets} from 'react-native-safe-area-context';
import React, {forwardRef, useImperativeHandle, useRef} from 'react';
import {NativeSyntheticEvent, TextInputSelectionChangeEventData} from 'react-native';
import Animated, {useAnimatedStyle, useDerivedValue} from 'react-native-reanimated';
import {SEARCH_INPUT_HEIGHT, SEARCH_INPUT_MARGIN} from '@constants/view';
import {useTheme} from '@context/theme';
import useHeaderHeight, {MAX_OVERSCROLL} from '@hooks/header';
import {clamp} from '@utils/gallery';
import {makeStyleSheetFromTheme} from '@utils/theme';
import Header, {HeaderRightButton} from './header';
import NavigationHeaderLargeTitle from './large';
import NavigationSearch from './search';
import type {SearchProps} from '@components/search';
import type {SearchProps, SearchRef} from '@components/search';
type Props = SearchProps & {
hasSearch?: boolean;
@@ -23,11 +25,14 @@ type Props = SearchProps & {
onTitlePress?: () => void;
rightButtons?: HeaderRightButton[];
scrollValue?: Animated.SharedValue<number>;
lockValue?: Animated.SharedValue<number | null>;
hideHeader?: () => void;
showBackButton?: boolean;
subtitle?: string;
subtitleCompanion?: React.ReactElement;
title?: string;
cursorPosition?: number;
selection?: {start: number; end?: number | undefined } | undefined;
}
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
@@ -39,37 +44,67 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
},
}));
const NavigationHeader = ({
hasSearch = false,
isLargeTitle = false,
leftComponent,
onBackPress,
onTitlePress,
rightButtons,
scrollValue,
showBackButton,
subtitle,
subtitleCompanion,
title = '',
hideHeader,
...searchProps
}: Props) => {
const theme = useTheme();
const insets = useSafeAreaInsets();
const styles = getStyleSheet(theme);
const NavigationHeader = forwardRef<SearchRef, Props>((props: Props, ref) => {
const {
hasSearch = false,
isLargeTitle = false,
leftComponent,
onBackPress,
onTitlePress,
rightButtons,
scrollValue,
lockValue,
showBackButton,
subtitle,
subtitleCompanion,
title = '',
hideHeader,
} = props;
const searchProps = props;
const {largeHeight, defaultHeight} = useHeaderHeight();
const theme = useTheme();
const styles = getStyleSheet(theme);
const searchRef = useRef<SearchRef>(null);
useImperativeHandle(ref, () => ({
focus: () => {
searchRef.current?.focus?.();
},
onSelectionChange: (event: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => {
// @ts-expect-error cancel is not part of TextInput does exist in SearchBar
searchRef.current?.onSelectionChange?.(event);
},
}), [searchRef]);
const {largeHeight, defaultHeight, headerOffset} = useHeaderHeight();
const containerHeight = useAnimatedStyle(() => {
const minHeight = defaultHeight + insets.top;
const minHeight = defaultHeight;
const value = -(scrollValue?.value || 0);
const height = ((isLargeTitle ? largeHeight : defaultHeight)) + value + insets.top;
const calculatedHeight = (isLargeTitle ? largeHeight : defaultHeight) + value;
const height = lockValue?.value ? lockValue.value : calculatedHeight;
return {
height: Math.max(height, minHeight),
minHeight,
maxHeight: largeHeight + insets.top + MAX_OVERSCROLL,
maxHeight: largeHeight + MAX_OVERSCROLL,
};
});
const minScrollValue = useDerivedValue(() => scrollValue?.value || 0, [scrollValue]);
const translateY = useDerivedValue(() => (
lockValue?.value ? -lockValue.value : Math.min(-minScrollValue.value, headerOffset)
), [lockValue, minScrollValue, headerOffset]);
const searchTopStyle = useAnimatedStyle(() => {
const margin = clamp(-minScrollValue.value, -headerOffset, headerOffset);
const marginTop = (lockValue?.value ? -lockValue?.value : margin) - SEARCH_INPUT_HEIGHT - SEARCH_INPUT_MARGIN;
return {marginTop};
}, [lockValue, headerOffset, scrollValue]);
const heightOffset = useDerivedValue(() => (
lockValue?.value ? lockValue.value : headerOffset
), [lockValue, headerOffset]);
return (
<>
<Animated.View style={[styles.container, containerHeight]}>
@@ -77,45 +112,43 @@ const NavigationHeader = ({
defaultHeight={defaultHeight}
hasSearch={hasSearch}
isLargeTitle={isLargeTitle}
largeHeight={largeHeight}
heightOffset={heightOffset.value}
leftComponent={leftComponent}
onBackPress={onBackPress}
onTitlePress={onTitlePress}
rightButtons={rightButtons}
lockValue={lockValue}
scrollValue={scrollValue}
showBackButton={showBackButton}
subtitle={subtitle}
subtitleCompanion={subtitleCompanion}
theme={theme}
title={title}
top={insets.top}
/>
{isLargeTitle &&
<NavigationHeaderLargeTitle
defaultHeight={defaultHeight}
heightOffset={heightOffset.value}
hasSearch={hasSearch}
largeHeight={largeHeight}
scrollValue={scrollValue}
subtitle={subtitle}
theme={theme}
title={title}
translateY={translateY}
/>
}
{hasSearch &&
<NavigationSearch
{...searchProps}
defaultHeight={defaultHeight}
largeHeight={largeHeight}
scrollValue={scrollValue}
hideHeader={hideHeader}
theme={theme}
top={0}
/>
<NavigationSearch
{...searchProps}
hideHeader={hideHeader}
theme={theme}
topStyle={searchTopStyle}
ref={searchRef}
/>
}
</Animated.View>
</>
);
};
});
NavigationHeader.displayName = 'NavHeader';
export default NavigationHeader;

View File

@@ -9,13 +9,12 @@ import {changeOpacity, makeStyleSheetFromTheme} from '@utils/theme';
import {typography} from '@utils/typography';
type Props = {
defaultHeight: number;
heightOffset: number;
hasSearch: boolean;
largeHeight: number;
scrollValue?: Animated.SharedValue<number>;
subtitle?: string;
theme: Theme;
title: string;
translateY: Animated.DerivedValue<number>;
}
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
@@ -34,33 +33,29 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
}));
const NavigationHeaderLargeTitle = ({
defaultHeight,
largeHeight,
heightOffset,
hasSearch,
scrollValue,
subtitle,
theme,
title,
translateY,
}: Props) => {
const styles = getStyleSheet(theme);
const transform = useAnimatedStyle(() => {
const value = scrollValue?.value || 0;
return {
transform: [{translateY: Math.min(-value, largeHeight - defaultHeight)}],
};
});
const transform = useAnimatedStyle(() => (
{transform: [{translateY: translateY.value}]}
), [translateY?.value]);
const containerStyle = useMemo(() => {
return [{height: largeHeight - defaultHeight}, styles.container];
}, [defaultHeight, largeHeight, theme]);
return [{height: heightOffset}, styles.container];
}, [heightOffset, theme]);
return (
<Animated.View style={[containerStyle, transform]}>
<Text
ellipsizeMode='tail'
numberOfLines={1}
style={styles.heading}
style={[styles.heading]}
testID='navigation.large_header.title'
>
{title}

View File

@@ -1,36 +1,27 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {useCallback, useEffect, useMemo} from 'react';
import {DeviceEventEmitter, Keyboard, NativeSyntheticEvent, Platform, TextInputFocusEventData} from 'react-native';
import Animated, {useAnimatedStyle} from 'react-native-reanimated';
import React, {forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef} from 'react';
import {DeviceEventEmitter, Keyboard, NativeSyntheticEvent, Platform, TextInputFocusEventData, TextInputSelectionChangeEventData, ViewStyle} from 'react-native';
import Animated, {AnimatedStyleProp} from 'react-native-reanimated';
import Search, {SearchProps} from '@components/search';
import Search, {SearchProps, SearchRef} from '@components/search';
import {Events} from '@constants';
import {HEADER_SEARCH_HEIGHT} from '@constants/view';
import {changeOpacity, makeStyleSheetFromTheme} from '@utils/theme';
import {typography} from '@utils/typography';
type Props = SearchProps & {
defaultHeight: number;
largeHeight: number;
scrollValue?: Animated.SharedValue<number>;
topStyle: AnimatedStyleProp<ViewStyle>;
hideHeader?: () => void;
theme: Theme;
top: number;
}
const INITIAL_TOP = -45;
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
container: {
backgroundColor: theme.sidebarBg,
height: HEADER_SEARCH_HEIGHT,
justifyContent: 'center',
paddingHorizontal: 20,
width: '100%',
zIndex: 10,
top: INITIAL_TOP,
},
inputContainerStyle: {
backgroundColor: changeOpacity(theme.sidebarText, 0.12),
@@ -40,16 +31,21 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
},
}));
const NavigationSearch = ({
defaultHeight,
largeHeight,
scrollValue,
hideHeader,
theme,
...searchProps
}: Props) => {
const NavigationSearch = forwardRef<SearchRef, Props>((searchProps: Props, ref) => {
const {theme, hideHeader, topStyle} = searchProps;
const searchRef = useRef<SearchRef>(null);
const styles = getStyleSheet(theme);
useImperativeHandle(ref, () => ({
focus: () => {
searchRef.current?.focus?.();
},
onSelectionChange: (event: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => {
// @ts-expect-error cancel is not part of TextInput does exist in SearchBar
searchRef.current?.onSelectionChange(event.nativeEvent);
},
}), [searchRef]);
const cancelButtonProps: SearchProps['cancelButtonProps'] = useMemo(() => ({
buttonTextStyle: {
color: changeOpacity(theme.sidebarText, 0.72),
@@ -58,12 +54,6 @@ const NavigationSearch = ({
color: theme.sidebarText,
}), [theme]);
const searchTop = useAnimatedStyle(() => {
const value = scrollValue?.value || 0;
const min = (largeHeight - defaultHeight);
return {marginTop: Math.min(-Math.min((value), min), min)};
}, [largeHeight, defaultHeight]);
const onFocus = useCallback((e: NativeSyntheticEvent<TextInputFocusEventData>) => {
hideHeader?.();
searchProps.onFocus?.(e);
@@ -89,7 +79,7 @@ const NavigationSearch = ({
}, []);
return (
<Animated.View style={[styles.container, searchTop]}>
<Animated.View style={[styles.container, topStyle]}>
<Search
{...searchProps}
cancelButtonProps={cancelButtonProps}
@@ -100,10 +90,12 @@ const NavigationSearch = ({
placeholderTextColor={changeOpacity(theme.sidebarText, Platform.select({android: 0.56, default: 0.72}))}
searchIconColor={theme.sidebarText}
selectionColor={theme.sidebarText}
ref={searchRef}
/>
</Animated.View>
);
};
});
NavigationSearch.displayName = 'NavSearch';
export default NavigationSearch;

View File

@@ -75,7 +75,7 @@ function PostDraft({
ios: (keyboardHeight ? keyboardHeight - keyboardAdjustment : (postInputTop + insetsAdjustment)),
default: postInputTop + insetsAdjustment,
});
const autocompleteAvailableSpace = containerHeight - autocompletePosition - (isChannelScreen ? headerHeight + insets.top : 0);
const autocompleteAvailableSpace = containerHeight - autocompletePosition - (isChannelScreen ? headerHeight : 0);
const [animatedAutocompletePosition, animatedAutocompleteAvailableSpace] = useAutocompleteDefaultAnimatedValues(autocompletePosition, autocompleteAvailableSpace);

View File

@@ -6,7 +6,7 @@
import React, {forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState} from 'react';
import {useIntl} from 'react-intl';
import {ActivityIndicatorProps, Keyboard, Platform, StyleProp, TextInput, TextInputProps, TextStyle, TouchableOpacityProps, ViewStyle} from 'react-native';
import {ActivityIndicatorProps, Keyboard, NativeSyntheticEvent, Platform, StyleProp, TextInput, TextInputProps, TextInputSelectionChangeEventData, TextStyle, TouchableOpacityProps, ViewStyle} from 'react-native';
import {SearchBar} from 'react-native-elements';
import CompassIcon from '@components/compass_icon';
@@ -16,6 +16,8 @@ import {changeOpacity, makeStyleSheetFromTheme} from '@utils/theme';
import {typography} from '@utils/typography';
export type SearchProps = TextInputProps & {
cursorPosition: number;
selection?: {start: number; end?: number | undefined } | undefined;
cancelIcon?: React.ReactElement;
cancelButtonProps?: Partial<TouchableOpacityProps> & {
buttonStyle?: StyleProp<ViewStyle>;
@@ -42,11 +44,12 @@ export type SearchProps = TextInputProps & {
showLoading?: boolean;
};
type SearchRef = {
blur: () => void;
cancel: () => void;
clear: () => void;
focus: () => void;
export type SearchRef = {
blur?: () => void;
cancel?: () => void;
clear?: () => void;
focus?: () => void;
onSelectionChange: (event: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => void;
}
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
@@ -80,6 +83,32 @@ const Search = forwardRef<SearchRef, SearchProps>((props: SearchProps, ref) => {
const searchClearButtonTestID = `${props.testID}.search.clear.button`;
const searchCancelButtonTestID = `${props.testID}.search.cancel.button`;
const searchInputTestID = `${props.testID}.search.input`;
const [localCursorPosition, setLocalCursorPosition] = useState(props.cursorPosition);
useEffect(() => {
if (localCursorPosition !== props.cursorPosition) {
setLocalCursorPosition(props.cursorPosition);
}
// setLocalSelection({start: props.cursorPosition});
}, [props.cursorPosition]);
const onChangeText = useCallback((text: string) => {
setValue(text);
props.onChangeText?.(text);
}, [props.onChangeText, value, props.selection]);
const onSelectionChange = useCallback((event: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => {
// const onSelectionChange = useCallback(({nativeEvent: {selection, text}}) => {
console.log('<><> onSelectionChange - selection', event.nativeEvent.selection);
setLocalCursorPosition(event.nativeEvent.selection.start);
// setLocalSelection(selection);
}, [props.selection]);
// console.log('props.selection', props.selection, 'localSelection', localSelection);
// console.log('props.selection', props.selection);
const onCancel = useCallback(() => {
Keyboard.dismiss();
@@ -92,11 +121,6 @@ const Search = forwardRef<SearchRef, SearchProps>((props: SearchProps, ref) => {
props.onClear?.();
}, [props.onClear]);
const onChangeText = useCallback((text: string) => {
setValue(text);
props.onChangeText?.(text);
}, [props.onChangeText]);
const cancelButtonProps = useMemo(() => ({
buttonTextStyle: {
color: changeOpacity(theme.centerChannelColor, 0.72),
@@ -151,7 +175,13 @@ const Search = forwardRef<SearchRef, SearchProps>((props: SearchProps, ref) => {
focus: () => {
searchRef.current?.focus();
},
onSelectionChange: (event: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => {
// console.log('. IN HERE!');
console.log('event?.nativeEvent.selection', event);
// @ts-expect-error cancel is not part of TextInput does exist in SearchBar
searchRef.current?.onSelectionChange?.(event);
},
}), [searchRef]);
return (
@@ -172,6 +202,8 @@ const Search = forwardRef<SearchRef, SearchProps>((props: SearchProps, ref) => {
// @ts-expect-error onChangeText type definition is wrong in elements
onChangeText={onChangeText}
selection={{start: localCursorPosition}}
onSelectionChange={onSelectionChange}
placeholder={props.placeholder || intl.formatMessage({id: 'search_bar.search', defaultMessage: 'Search'})}
placeholderTextColor={props.placeholderTextColor || changeOpacity(theme.centerChannelColor, Platform.select({android: 0.56, default: 0.72}))}
platform={Platform.select({android: 'android', default: 'ios'})}

View File

@@ -28,7 +28,7 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => {
paddingTop: 10,
},
listContainer: {
backgroundColor: theme.sidebarTeamBarBg,
backgroundColor: theme.sidebarHeaderBg,
borderTopRightRadius: 12,
flex: 1,
},

View File

@@ -7,21 +7,19 @@ export const BOTTOM_TAB_HEIGHT = 52;
export const BOTTOM_TAB_ICON_SIZE = 31.2;
export const PROFILE_PICTURE_SIZE = 32;
export const PROFILE_PICTURE_EMOJI_SIZE = 28;
export const SEARCH_INPUT_HEIGHT = Platform.select({android: 40, default: 36});
export const TEAM_SIDEBAR_WIDTH = 72;
export const TABLET_HEADER_HEIGHT = 44;
export const TABLET_SIDEBAR_WIDTH = 320;
export const IOS_STATUS_BAR_HEIGHT = 20;
export const IOS_DEFAULT_HEADER_HEIGHT = 44;
export const ANDROID_DEFAULT_HEADER_HEIGHT = 56;
export const LARGE_HEADER_TITLE = 60;
export const HEADER_WITH_SEARCH_HEIGHT = -16;
export const HEADER_WITH_SUBTITLE = 24;
export const DEFAULT_HEADER_HEIGHT = Platform.select({android: 56, default: 44});
export const LARGE_HEADER_TITLE_HEIGHT = 60;
export const SUBTITLE_HEIGHT = 24;
export const KEYBOARD_TRACKING_OFFSET = 72;
export const HEADER_SEARCH_HEIGHT = SEARCH_INPUT_HEIGHT + 5;
export const HEADER_SEARCH_BOTTOM_MARGIN = 10;
export const SEARCH_INPUT_HEIGHT = Platform.select({android: 40, default: 36});
export const SEARCH_INPUT_MARGIN = 5;
export const JOIN_CALL_BAR_HEIGHT = 38;
export const CURRENT_CALL_BAR_HEIGHT = 74;
@@ -41,14 +39,10 @@ export default {
TEAM_SIDEBAR_WIDTH,
TABLET_HEADER_HEIGHT,
IOS_STATUS_BAR_HEIGHT,
IOS_DEFAULT_HEADER_HEIGHT,
ANDROID_DEFAULT_HEADER_HEIGHT,
LARGE_HEADER_TITLE,
HEADER_WITH_SEARCH_HEIGHT,
HEADER_WITH_SUBTITLE,
DEFAULT_HEADER_HEIGHT,
LARGE_HEADER_TITLE_HEIGHT,
SUBTITLE_HEIGHT,
KEYBOARD_TRACKING_OFFSET,
HEADER_SEARCH_HEIGHT,
HEADER_SEARCH_BOTTOM_MARGIN,
QUICK_OPTIONS_HEIGHT,
};

View File

@@ -2,8 +2,8 @@
// See LICENSE.txt for license information.
import React, {useCallback, useMemo} from 'react';
import {NativeScrollEvent, Platform} from 'react-native';
import Animated, {runOnJS, scrollTo, useAnimatedRef, useAnimatedScrollHandler, useDerivedValue, useSharedValue} from 'react-native-reanimated';
import {NativeScrollEvent} from 'react-native';
import Animated, {runOnJS, scrollTo, useAnimatedRef, useAnimatedScrollHandler, useDerivedValue, useSharedValue, withTiming} from 'react-native-reanimated';
import {useSafeAreaInsets} from 'react-native-safe-area-context';
import ViewConstants from '@constants/view';
@@ -18,52 +18,52 @@ type HeaderScrollContext = {
export const MAX_OVERSCROLL = 80;
export const useDefaultHeaderHeight = () => {
const insets = useSafeAreaInsets();
const isTablet = useIsTablet();
let headerHeight = ViewConstants.DEFAULT_HEADER_HEIGHT;
if (isTablet) {
return ViewConstants.TABLET_HEADER_HEIGHT;
headerHeight = ViewConstants.TABLET_HEADER_HEIGHT;
}
if (Platform.OS === 'ios') {
return ViewConstants.IOS_DEFAULT_HEADER_HEIGHT;
}
return ViewConstants.ANDROID_DEFAULT_HEADER_HEIGHT;
return headerHeight + insets.top;
};
export const useLargeHeaderHeight = () => {
const defaultHeight = useDefaultHeaderHeight();
return defaultHeight + ViewConstants.LARGE_HEADER_TITLE + ViewConstants.HEADER_WITH_SUBTITLE;
let largeHeight = useDefaultHeaderHeight();
largeHeight += ViewConstants.LARGE_HEADER_TITLE_HEIGHT;
largeHeight += ViewConstants.SUBTITLE_HEIGHT;
return largeHeight;
};
export const useHeaderHeight = () => {
const defaultHeight = useDefaultHeaderHeight();
const largeHeight = useLargeHeaderHeight();
return useMemo(() => {
return {
defaultHeight,
largeHeight,
};
}, [defaultHeight, largeHeight]);
const headerOffset = largeHeight - defaultHeight;
return useMemo(() => ({
defaultHeight,
largeHeight,
headerOffset,
}), [defaultHeight, largeHeight]);
};
export const useCollapsibleHeader = <T>(isLargeTitle: boolean, onSnap?: (offset: number) => void) => {
const insets = useSafeAreaInsets();
const animatedRef = useAnimatedRef<Animated.ScrollView>();
const {largeHeight, defaultHeight} = useHeaderHeight();
const {largeHeight, defaultHeight, headerOffset} = useHeaderHeight();
const scrollValue = useSharedValue(0);
const lockValue = useSharedValue<number | null>(null);
const autoScroll = useSharedValue(false);
const snapping = useSharedValue(false);
const scrollEnabled = useSharedValue(true);
const headerHeight = useDerivedValue(() => {
const minHeight = defaultHeight + insets.top;
const value = -(scrollValue?.value || 0);
const header = (isLargeTitle ? largeHeight : defaultHeight);
const height = header + value + insets.top;
if (height > header + (insets.top * 2)) {
return Math.min(height, largeHeight + insets.top + MAX_OVERSCROLL);
const heightWithScroll = (isLargeTitle ? largeHeight : defaultHeight) + value;
let height = Math.max(heightWithScroll, defaultHeight);
if (value > insets.top) {
height = Math.min(heightWithScroll, largeHeight + MAX_OVERSCROLL);
}
return Math.max(height, minHeight);
return height;
});
function snapIfNeeded(dir: string, offset: number) {
@@ -72,27 +72,35 @@ export const useCollapsibleHeader = <T>(isLargeTitle: boolean, onSnap?: (offset:
snapping.value = true;
if (dir === 'down' && offset < largeHeight) {
runOnJS(onSnap)(0);
} else if (dir === 'up' && offset < (defaultHeight + insets.top)) {
runOnJS(onSnap)((largeHeight - defaultHeight));
} else if (dir === 'up' && offset < (defaultHeight)) {
runOnJS(onSnap)(headerOffset);
}
snapping.value = false;
snapping.value = Boolean(withTiming(0, {duration: 100}));
}
}
const setAutoScroll = (enabled: boolean) => {
autoScroll.value = enabled;
};
const onScroll = useAnimatedScrollHandler({
onBeginDrag: (e: NativeScrollEvent, ctx: HeaderScrollContext) => {
ctx.start = e.contentOffset.y;
ctx.dragging = true;
},
onScroll: (e, ctx) => {
if (ctx.dragging || autoScroll.value) {
if (!scrollEnabled.value) {
scrollTo(animatedRef, 0, headerOffset, false);
return;
}
if (ctx.dragging || autoScroll.value || snapping.value) {
scrollValue.value = e.contentOffset.y;
} else {
// here we want to ensure that the scroll position
// always start at 0 if the user has not dragged
// the scrollview manually
scrollValue.value = 0;
scrollTo(animatedRef, 0, 0, false);
scrollTo(animatedRef, 0, scrollValue.value, false);
}
},
onEndDrag: (e, ctx) => {
@@ -119,8 +127,12 @@ export const useCollapsibleHeader = <T>(isLargeTitle: boolean, onSnap?: (offset:
},
}, [insets, defaultHeight, largeHeight, animatedRef]);
const hideHeader = useCallback(() => {
const offset = largeHeight - defaultHeight;
const hideHeader = useCallback((lock = false) => {
if (lock) {
lockValue.value = defaultHeight;
}
const offset = headerOffset;
if (animatedRef?.current && Math.abs((scrollValue?.value || 0)) <= insets.top) {
autoScroll.value = true;
if ('scrollTo' in animatedRef.current) {
@@ -136,15 +148,24 @@ export const useCollapsibleHeader = <T>(isLargeTitle: boolean, onSnap?: (offset:
}
}, [largeHeight, defaultHeight]);
const unlock = useCallback(() => {
lockValue.value = null;
}, []);
return {
defaultHeight,
largeHeight,
scrollPaddingTop: (isLargeTitle ? largeHeight : defaultHeight) + insets.top,
scrollPaddingTop: (isLargeTitle ? largeHeight : defaultHeight),
scrollRef: animatedRef as unknown as React.RefObject<T>,
scrollValue,
onScroll,
hideHeader,
lockValue,
unlock,
headerHeight,
headerOffset,
scrollEnabled,
setAutoScroll,
};
};

View File

@@ -95,19 +95,38 @@ class PushNotifications {
const isTabletDevice = await isTablet();
const displayName = await queryServerName(DatabaseManager.appDatabase!.database, serverUrl);
const channelId = await getCurrentChannelId(database);
const isCRTEnabled = await getIsCRTEnabled(database);
let serverName;
if (Object.keys(DatabaseManager.serverDatabases).length > 1) {
serverName = displayName;
}
const isDifferentChannel = payload?.channel_id !== channelId;
const isVisibleThread = payload?.root_id === EphemeralStore.getCurrentThreadId();
let isChannelScreenVisible = NavigationStore.getNavigationTopComponentId() === Screens.CHANNEL;
if (isTabletDevice) {
isChannelScreenVisible = NavigationStore.getVisibleTab() === Screens.HOME;
}
const isThreadNotification = Boolean(payload?.root_id);
if (isDifferentChannel || (!isChannelScreenVisible && !isVisibleThread)) {
const isSameChannelNotification = payload?.channel_id === channelId;
const isSameThreadNotification = isThreadNotification && payload?.root_id === EphemeralStore.getCurrentThreadId();
let isInChannelScreen = NavigationStore.getNavigationTopComponentId() === Screens.CHANNEL;
if (isTabletDevice) {
isInChannelScreen = NavigationStore.getVisibleTab() === Screens.HOME;
}
const isInThreadScreen = NavigationStore.getNavigationTopComponentId() === Screens.THREAD;
// Conditions:
// 1. If not in channel screen or thread screen, show the notification
const condition1 = !isInChannelScreen && !isInThreadScreen;
// 2. If is in channel screen,
// - Show notification of other channels
// or
// - Show notification if CRT is enabled and it's a thread notification (doesn't matter if it's the same channel)
const condition2 = isInChannelScreen && (!isSameChannelNotification || (isCRTEnabled && isThreadNotification));
// 3. If is in thread screen,
// - Show the notification if it doesn't belong to the thread
const condition3 = isInThreadScreen && !isSameThreadNotification;
if (condition1 || condition2 || condition3) {
DeviceEventEmitter.emit(Navigation.NAVIGATION_SHOW_OVERLAY);
const screen = Screens.IN_APP_NOTIFICATION;

View File

@@ -13,7 +13,7 @@ import CompassIcon from '@components/compass_icon';
import {Events, Screens, WebsocketEvents} from '@constants';
import {CURRENT_CALL_BAR_HEIGHT} from '@constants/view';
import {useTheme} from '@context/theme';
import {goToScreen} from '@screens/navigation';
import {dismissAllModalsAndPopToScreen} from '@screens/navigation';
import {makeStyleSheetFromTheme} from '@utils/theme';
import {displayUsername} from '@utils/user';
@@ -24,6 +24,7 @@ type Props = {
currentCall: CurrentCall | null;
userModelsDict: Dictionary<UserModel>;
teammateNameDisplay: string;
threadScreen?: boolean;
}
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => {
@@ -85,6 +86,7 @@ const CurrentCallBar = ({
currentCall,
userModelsDict,
teammateNameDisplay,
threadScreen,
}: Props) => {
const theme = useTheme();
const {formatMessage} = useIntl();
@@ -128,7 +130,7 @@ const CurrentCallBar = ({
}
}, [speaker, setTalkingMessage]);
const goToCallScreen = useCallback(() => {
const goToCallScreen = useCallback(async () => {
const options: Options = {
layout: {
backgroundColor: '#000',
@@ -143,8 +145,8 @@ const CurrentCallBar = ({
},
};
const title = formatMessage({id: 'mobile.calls_call_screen', defaultMessage: 'Call'});
goToScreen(Screens.CALL, title, {}, options);
}, []);
await dismissAllModalsAndPopToScreen(Screens.CALL, title, {fromThreadScreen: threadScreen}, options);
}, [formatMessage, threadScreen]);
const myParticipant = currentCall?.participants[currentCall.myUserId];

View File

@@ -5,12 +5,9 @@ import React from 'react';
import {View, Platform, StyleSheet} from 'react-native';
import {useSafeAreaInsets} from 'react-native-safe-area-context';
import {ANDROID_DEFAULT_HEADER_HEIGHT, IOS_DEFAULT_HEADER_HEIGHT} from '@constants/view';
import {DEFAULT_HEADER_HEIGHT} from '@constants/view';
let topBarHeight = ANDROID_DEFAULT_HEADER_HEIGHT;
if (Platform.OS === 'ios') {
topBarHeight = IOS_DEFAULT_HEADER_HEIGHT;
}
const topBarHeight = DEFAULT_HEADER_HEIGHT;
const style = StyleSheet.create({
wrapper: {
@@ -29,12 +26,13 @@ const style = StyleSheet.create({
type Props = {
children: React.ReactNode;
threadScreen?: boolean;
}
const FloatingCallContainer = (props: Props) => {
const FloatingCallContainer = ({threadScreen, ...props}: Props) => {
const insets = useSafeAreaInsets();
const wrapperTop = {
top: topBarHeight + insets.top,
top: insets.top + (threadScreen ? 0 : topBarHeight),
};
return (

View File

@@ -38,7 +38,13 @@ import SlideUpPanelItem, {ITEM_HEIGHT} from '@components/slide_up_panel_item';
import {WebsocketEvents, Screens} from '@constants';
import {useTheme} from '@context/theme';
import DatabaseManager from '@database/manager';
import {bottomSheet, dismissBottomSheet, goToScreen, popTopScreen} from '@screens/navigation';
import {
bottomSheet,
dismissAllModalsAndPopToScreen,
dismissBottomSheet,
goToScreen,
popTopScreen,
} from '@screens/navigation';
import NavigationStore from '@store/navigation_store';
import {bottomSheetSnapPoint} from '@utils/helpers';
import {mergeNavigationOptions} from '@utils/navigation';
@@ -50,6 +56,7 @@ export type Props = {
currentCall: CurrentCall | null;
participantsDict: Dictionary<CallParticipant>;
teammateNameDisplay: string;
fromThreadScreen?: boolean;
}
const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
@@ -247,18 +254,20 @@ const getStyleSheet = makeStyleSheetFromTheme((theme: Theme) => ({
},
}));
const CallScreen = ({componentId, currentCall, participantsDict, teammateNameDisplay}: Props) => {
const CallScreen = ({componentId, currentCall, participantsDict, teammateNameDisplay, fromThreadScreen}: Props) => {
const intl = useIntl();
const theme = useTheme();
const insets = useSafeAreaInsets();
const {width, height} = useWindowDimensions();
const isLandscape = width > height;
const [showControlsInLandscape, setShowControlsInLandscape] = useState(false);
const myParticipant = currentCall?.participants[currentCall.myUserId];
const style = getStyleSheet(theme);
const showControls = !isLandscape || showControlsInLandscape;
const [speakers, setSpeakers] = useState<Dictionary<boolean>>({});
const style = getStyleSheet(theme);
const isLandscape = width > height;
const showControls = !isLandscape || showControlsInLandscape;
const myParticipant = currentCall?.participants[currentCall.myUserId];
const chatThreadTitle = intl.formatMessage({id: 'mobile.calls_chat_thread', defaultMessage: 'Chat thread'});
useEffect(() => {
mergeNavigationOptions('Call', {
layout: {
@@ -329,17 +338,20 @@ const CallScreen = ({componentId, currentCall, participantsDict, teammateNameDis
const activeUrl = await DatabaseManager.getActiveServerUrl();
if (activeUrl === currentCall.serverUrl) {
goToScreen(Screens.THREAD, '', {rootId: currentCall.threadId});
await dismissAllModalsAndPopToScreen(Screens.THREAD, chatThreadTitle, {rootId: currentCall.threadId});
return;
}
// TODO: this is a temporary solution until we have a proper cross-team thread view.
// https://mattermost.atlassian.net/browse/MM-45752
popTopScreen(componentId);
await popTopScreen(componentId);
if (fromThreadScreen) {
await popTopScreen(Screens.THREAD);
}
await DatabaseManager.setActiveServerDatabase(currentCall.serverUrl);
await appEntry(currentCall.serverUrl, Date.now());
goToScreen(Screens.THREAD, '', {rootId: currentCall.threadId});
}, [currentCall?.serverUrl, currentCall?.threadId]);
await goToScreen(Screens.THREAD, chatThreadTitle, {rootId: currentCall.threadId});
}, [currentCall?.serverUrl, currentCall?.threadId, fromThreadScreen, componentId, chatThreadTitle]);
const showOtherActions = useCallback(() => {
const renderContent = () => {
@@ -348,7 +360,7 @@ const CallScreen = ({componentId, currentCall, participantsDict, teammateNameDis
<SlideUpPanelItem
icon='message-text-outline'
onPress={switchToThread}
text={intl.formatMessage({id: 'mobile.calls_chat_thread', defaultMessage: 'Chat thread'})}
text={chatThreadTitle}
/>
</View>
);

View File

@@ -28,7 +28,6 @@ type ChannelProps = {
serverUrl: string;
channelId: string;
componentId?: string;
isCallsPluginEnabled: boolean;
isCallInCurrentChannel: boolean;
isInACall: boolean;
isInCurrentChannelCall: boolean;
@@ -47,7 +46,6 @@ const Channel = ({
serverUrl,
channelId,
componentId,
isCallsPluginEnabled,
isCallInCurrentChannel,
isInACall,
isInCurrentChannelCall,
@@ -94,7 +92,7 @@ const Channel = ({
return () => back?.remove();
}, [componentId, isTablet]);
const marginTop = defaultHeight + (isTablet ? insets.top : 0);
const marginTop = defaultHeight + (isTablet ? 0 : -insets.top);
useEffect(() => {
// This is done so that the header renders
// and the screen does not look totally blank
@@ -120,7 +118,7 @@ const Channel = ({
let callsComponents: JSX.Element | null = null;
const showJoinCallBanner = isCallInCurrentChannel && !isInCurrentChannelCall;
if (isCallsPluginEnabled && (showJoinCallBanner || isInACall)) {
if (showJoinCallBanner || isInACall) {
callsComponents = (
<FloatingCallContainer>
{showJoinCallBanner &&

View File

@@ -4,7 +4,6 @@
import React, {useCallback, useMemo} from 'react';
import {useIntl} from 'react-intl';
import {Keyboard, Platform, Text, View} from 'react-native';
import {useSafeAreaInsets} from 'react-native-safe-area-context';
import CompassIcon from '@components/compass_icon';
import CustomStatusEmoji from '@components/custom_status/custom_status_emoji';
@@ -75,13 +74,12 @@ const ChannelHeader = ({
const theme = useTheme();
const styles = getStyleSheet(theme);
const defaultHeight = useDefaultHeaderHeight();
const insets = useSafeAreaInsets();
const callsAvailable = callsEnabledInChannel && !callsFeatureRestricted;
const isDMorGM = isTypeDMorGM(channelType);
const contextStyle = useMemo(() => ({
top: defaultHeight + insets.top,
}), [defaultHeight, insets.top]);
top: defaultHeight,
}), [defaultHeight]);
const leftComponent = useMemo(() => {
if (isTablet || !channelId || !teamId) {

View File

@@ -20,10 +20,6 @@ type EnhanceProps = WithDatabaseArgs & {
const enhanced = withObservables([], ({database, serverUrl}: EnhanceProps) => {
const channelId = observeCurrentChannelId(database);
const isCallsPluginEnabled = observeCallsConfig(serverUrl).pipe(
switchMap((config) => of$(config.pluginEnabled)),
distinctUntilChanged(),
);
const isCallInCurrentChannel = combineLatest([channelId, observeChannelsWithCalls(serverUrl)]).pipe(
switchMap(([id, calls]) => of$(Boolean(calls[id]))),
distinctUntilChanged(),
@@ -60,7 +56,6 @@ const enhanced = withObservables([], ({database, serverUrl}: EnhanceProps) => {
return {
channelId,
isCallsPluginEnabled,
isCallInCurrentChannel,
isInACall,
isInCurrentChannelCall,

View File

@@ -43,8 +43,9 @@ const edges: Edge[] = ['left', 'right'];
const AnimatedSafeAreaView = Animated.createAnimatedComponent(SafeAreaView);
const Header = ({index, onClose, style, total}: Props) => {
const insets = useSafeAreaInsets();
const {width} = useWindowDimensions();
const height = useDefaultHeaderHeight();
const height = useDefaultHeaderHeight() - insets.top;
const {top} = useSafeAreaInsets();
const topContainerStyle = useMemo(() => [{height: top, backgroundColor: '#000'}], [top]);
const containerStyle = useMemo(() => [styles.container, {height}], [height]);

View File

@@ -4,7 +4,7 @@
import React, {useCallback, useMemo, useState} from 'react';
import {useIntl} from 'react-intl';
import {Keyboard, StyleSheet, View} from 'react-native';
import {Edge, SafeAreaView, useSafeAreaInsets} from 'react-native-safe-area-context';
import {Edge, SafeAreaView} from 'react-native-safe-area-context';
import NavigationHeader from '@components/navigation_header';
import RoundedHeaderContext from '@components/rounded_header_context';
@@ -30,7 +30,6 @@ const styles = StyleSheet.create({
const GlobalThreads = ({componentId}: Props) => {
const appState = useAppState();
const intl = useIntl();
const insets = useSafeAreaInsets();
const switchingTeam = useTeamSwitch();
const isTablet = useIsTablet();
@@ -39,13 +38,13 @@ const GlobalThreads = ({componentId}: Props) => {
const [tab, setTab] = useState<GlobalThreadsTab>('all');
const containerStyle = useMemo(() => {
const marginTop = defaultHeight + insets.top;
const marginTop = defaultHeight;
return {flex: 1, marginTop};
}, [defaultHeight, insets.top]);
}, [defaultHeight]);
const contextStyle = useMemo(() => ({
top: defaultHeight + insets.top,
}), [defaultHeight, insets.top]);
top: defaultHeight,
}), [defaultHeight]);
const onBackPress = useCallback(() => {
Keyboard.dismiss();

View File

@@ -20,10 +20,9 @@ import Account from './account';
import ChannelList from './channel_list';
import RecentMentions from './recent_mentions';
import SavedMessages from './saved_messages';
import Search from './search';
import TabBar from './tab_bar';
// import Search from './search';
import type {LaunchProps} from '@typings/launch';
if (Platform.OS === 'ios') {
@@ -125,11 +124,11 @@ export default function HomeScreen(props: HomeProps) {
>
{() => <ChannelList {...props}/>}
</Tab.Screen>
{/* <Tab.Screen
<Tab.Screen
name={Screens.SEARCH}
component={Search}
options={{unmountOnBlur: false, lazy: true, tabBarTestID: 'tab_bar.search.tab', freezeOnBlur: true}}
/> */}
/>
<Tab.Screen
name={Screens.MENTIONS}
component={RecentMentions}

View File

@@ -4,9 +4,9 @@
import {useIsFocused, useRoute} from '@react-navigation/native';
import React, {useCallback, useState, useEffect, useMemo} from 'react';
import {useIntl} from 'react-intl';
import {ActivityIndicator, DeviceEventEmitter, FlatList, ListRenderItemInfo, Platform, StyleSheet, View} from 'react-native';
import {ActivityIndicator, DeviceEventEmitter, FlatList, ListRenderItemInfo, StyleSheet, View} from 'react-native';
import Animated, {useAnimatedStyle, useSharedValue, withTiming} from 'react-native-reanimated';
import {SafeAreaView, Edge, useSafeAreaInsets} from 'react-native-safe-area-context';
import {SafeAreaView, Edge} from 'react-native-safe-area-context';
import {fetchRecentMentions} from '@actions/remote/search';
import NavigationHeader from '@components/navigation_header';
@@ -14,7 +14,6 @@ import DateSeparator from '@components/post_list/date_separator';
import PostWithChannelInfo from '@components/post_with_channel_info';
import RoundedHeaderContext from '@components/rounded_header_context';
import {Events, Screens} from '@constants';
import {BOTTOM_TAB_HEIGHT} from '@constants/view';
import {useServerUrl} from '@context/server';
import {useTheme} from '@context/theme';
import {useCollapsibleHeader} from '@hooks/header';
@@ -40,7 +39,6 @@ const styles = StyleSheet.create({
},
container: {
flex: 1,
marginBottom: Platform.select({ios: BOTTOM_TAB_HEIGHT}),
},
empty: {
alignItems: 'center',
@@ -53,7 +51,6 @@ const RecentMentionsScreen = ({mentions, currentTimezone, isTimezoneEnabled}: Pr
const theme = useTheme();
const route = useRoute();
const isFocused = useIsFocused();
const insets = useSafeAreaInsets();
const {formatMessage} = useIntl();
const [refreshing, setRefreshing] = useState(false);
const [loading, setLoading] = useState(true);
@@ -87,8 +84,7 @@ const RecentMentionsScreen = ({mentions, currentTimezone, isTimezoneEnabled}: Pr
}, [serverUrl, isFocused]);
const {scrollPaddingTop, scrollRef, scrollValue, onScroll, headerHeight} = useCollapsibleHeader<FlatList<string>>(true, onSnap);
const paddingTop = useMemo(() => ({paddingTop: scrollPaddingTop - insets.top, flexGrow: 1}), [scrollPaddingTop, insets.top]);
const scrollViewStyle = useMemo(() => ({top: insets.top}), [insets.top]);
const paddingTop = useMemo(() => ({paddingTop: scrollPaddingTop, flexGrow: 1}), [scrollPaddingTop]);
const posts = useMemo(() => selectOrderedPosts(mentions, 0, false, '', '', false, isTimezoneEnabled, currentTimezone, false).reverse(), [mentions]);
const animated = useAnimatedStyle(() => {
@@ -195,7 +191,6 @@ const RecentMentionsScreen = ({mentions, currentTimezone, isTimezoneEnabled}: Pr
renderItem={renderItem}
removeClippedSubviews={true}
onViewableItemsChanged={onViewableItemsChanged}
style={scrollViewStyle}
testID='recent_mentions.post_list.flat_list'
/>
</Animated.View>

View File

@@ -4,9 +4,9 @@
import {useIsFocused, useRoute} from '@react-navigation/native';
import React, {useCallback, useEffect, useMemo, useState} from 'react';
import {useIntl} from 'react-intl';
import {DeviceEventEmitter, FlatList, ListRenderItemInfo, Platform, StyleSheet, View} from 'react-native';
import {DeviceEventEmitter, FlatList, ListRenderItemInfo, StyleSheet, View} from 'react-native';
import Animated, {useAnimatedStyle, useSharedValue, withTiming} from 'react-native-reanimated';
import {Edge, SafeAreaView, useSafeAreaInsets} from 'react-native-safe-area-context';
import {Edge, SafeAreaView} from 'react-native-safe-area-context';
import {fetchSavedPosts} from '@actions/remote/post';
import Loading from '@components/loading';
@@ -15,7 +15,6 @@ import DateSeparator from '@components/post_list/date_separator';
import PostWithChannelInfo from '@components/post_with_channel_info';
import RoundedHeaderContext from '@components/rounded_header_context';
import {Events, Screens} from '@constants';
import {BOTTOM_TAB_HEIGHT} from '@constants/view';
import {useServerUrl} from '@context/server';
import {useTheme} from '@context/theme';
import {useCollapsibleHeader} from '@hooks/header';
@@ -41,7 +40,6 @@ const styles = StyleSheet.create({
},
container: {
flex: 1,
marginBottom: Platform.select({ios: BOTTOM_TAB_HEIGHT}),
},
empty: {
alignItems: 'center',
@@ -58,7 +56,6 @@ function SavedMessages({posts, currentTimezone, isTimezoneEnabled}: Props) {
const serverUrl = useServerUrl();
const route = useRoute();
const isFocused = useIsFocused();
const insets = useSafeAreaInsets();
const params = route.params as {direction: string};
const toLeft = params.direction === 'left';
@@ -88,8 +85,7 @@ function SavedMessages({posts, currentTimezone, isTimezoneEnabled}: Props) {
}, [serverUrl, isFocused]);
const {scrollPaddingTop, scrollRef, scrollValue, onScroll, headerHeight} = useCollapsibleHeader<FlatList<string>>(true, onSnap);
const paddingTop = useMemo(() => ({paddingTop: scrollPaddingTop - insets.top, flexGrow: 1}), [scrollPaddingTop, insets.top]);
const scrollViewStyle = useMemo(() => ({top: insets.top}), [insets.top]);
const paddingTop = useMemo(() => ({paddingTop: scrollPaddingTop, flexGrow: 1}), [scrollPaddingTop]);
const data = useMemo(() => selectOrderedPosts(posts, 0, false, '', '', false, isTimezoneEnabled, currentTimezone, false).reverse(), [posts]);
const animated = useAnimatedStyle(() => {
@@ -196,7 +192,6 @@ function SavedMessages({posts, currentTimezone, isTimezoneEnabled}: Props) {
onScroll={onScroll}
removeClippedSubviews={true}
onViewableItemsChanged={onViewableItemsChanged}
style={scrollViewStyle}
testID='saved_messages.post_list.flat_list'
/>
</Animated.View>

View File

@@ -2,6 +2,7 @@
// See LICENSE.txt for license information.
import React from 'react';
import Animated from 'react-native-reanimated';
import Modifiers from './modifiers';
import RecentSearches from './recent_searches';
@@ -10,6 +11,7 @@ import type TeamSearchHistoryModel from '@typings/database/models/servers/team_s
type Props = {
recentSearches: TeamSearchHistoryModel[];
scrollEnabled: Animated.SharedValue<boolean>;
searchValue?: string;
setRecentValue: (value: string) => void;
setSearchValue: (value: string) => void;
@@ -18,7 +20,7 @@ type Props = {
teamName: string;
}
const Initial = ({setRecentValue, recentSearches, searchValue, teamId, teamName, setTeamId, setSearchValue}: Props) => {
const Initial = ({recentSearches, scrollEnabled, searchValue, setRecentValue, teamId, teamName, setTeamId, setSearchValue}: Props) => {
return (
<>
<Modifiers
@@ -26,6 +28,7 @@ const Initial = ({setRecentValue, recentSearches, searchValue, teamId, teamName,
setSearchValue={setSearchValue}
setTeamId={setTeamId}
teamId={teamId}
scrollEnabled={scrollEnabled}
/>
{Boolean(recentSearches.length) &&
<RecentSearches

View File

@@ -1,7 +1,7 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {useCallback, useMemo, useState} from 'react';
import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
import {IntlShape, useIntl} from 'react-intl';
import {View} from 'react-native';
import Animated, {useSharedValue, useAnimatedStyle, withTiming} from 'react-native-reanimated';
@@ -17,6 +17,7 @@ import ShowMoreButton from './show_more';
const MODIFIER_LABEL_HEIGHT = 48;
const TEAM_PICKER_ICON_SIZE = 32;
const NUM_ITEMS_BEFORE_EXPAND = 4;
const getStyleFromTheme = makeStyleSheetFromTheme((theme) => {
return {
@@ -47,19 +48,23 @@ const getModifiersSectionsData = (intl: IntlShape): ModifierItem[] => {
term: 'In:',
testID: 'search.in_section',
description: formatMessage({id: 'mobile.search.modifier.in', defaultMessage: ' a specific channel'}),
}, {
term: 'On:',
testID: 'search.on_section',
description: formatMessage({id: 'mobile.search.modifier.on', defaultMessage: ' a specific date'}),
}, {
term: 'After:',
testID: 'search.after_section',
description: formatMessage({id: 'mobile.search.modifier.after', defaultMessage: ' after a date'}),
}, {
term: 'Before:',
testID: 'search.before_section',
description: formatMessage({id: 'mobile.search.modifier.before', defaultMessage: ' before a date'}),
}, {
},
// {
// term: 'On:',
// testID: 'search.on_section',
// description: formatMessage({id: 'mobile.search.modifier.on', defaultMessage: ' a specific date'}),
// },
// {
// term: 'After:',
// testID: 'search.after_section',
// description: formatMessage({id: 'mobile.search.modifier.after', defaultMessage: ' after a date'}),
// }, {
// term: 'Before:',
// testID: 'search.before_section',
// description: formatMessage({id: 'mobile.search.modifier.before', defaultMessage: ' before a date'}),
// },
{
term: '-',
testID: 'search.exclude_section',
description: formatMessage({id: 'mobile.search.modifier.exclude', defaultMessage: ' exclude search terms'}),
@@ -73,34 +78,51 @@ const getModifiersSectionsData = (intl: IntlShape): ModifierItem[] => {
};
type Props = {
scrollEnabled: Animated.SharedValue<boolean>;
setSearchValue: (value: string) => void;
searchValue?: string;
setTeamId: (id: string) => void;
teamId: string;
}
const Modifiers = ({searchValue, setSearchValue, setTeamId, teamId}: Props) => {
const Modifiers = ({scrollEnabled, searchValue, setSearchValue, setTeamId, teamId}: Props) => {
const theme = useTheme();
const intl = useIntl();
const [showMore, setShowMore] = useState(false);
const show = useSharedValue(3 * MODIFIER_LABEL_HEIGHT);
const height = useSharedValue(NUM_ITEMS_BEFORE_EXPAND * MODIFIER_LABEL_HEIGHT);
const data = useMemo(() => getModifiersSectionsData(intl), [intl]);
const timeoutRef = useRef<NodeJS.Timeout | undefined>();
const styles = getStyleFromTheme(theme);
const animatedStyle = useAnimatedStyle(() => (
{
width: '100%',
height: withTiming(show.value, {duration: 300}),
overflow: 'hidden',
}
));
const animatedStyle = useAnimatedStyle(() => ({
width: '100%',
height: withTiming(height.value, {duration: 300}),
overflow: 'hidden',
}), []);
const handleShowMore = useCallback(() => {
const nextShowMore = !showMore;
setShowMore(nextShowMore);
show.value = (nextShowMore ? data.length : 3) * MODIFIER_LABEL_HEIGHT;
scrollEnabled.value = false;
height.value = (nextShowMore ? data.length : NUM_ITEMS_BEFORE_EXPAND) * MODIFIER_LABEL_HEIGHT;
if (timeoutRef.current) {
clearTimeout(timeoutRef.current);
}
setTimeout(() => {
scrollEnabled.value = true;
}, 350);
}, [showMore]);
useEffect(() => {
return () => {
if (timeoutRef.current) {
scrollEnabled.value = true;
clearTimeout(timeoutRef.current);
}
};
}, []);
const renderModifier = (item: ModifierItem) => {
return (
<Modifier
@@ -129,10 +151,12 @@ const Modifiers = ({searchValue, setSearchValue, setTeamId, teamId}: Props) => {
<Animated.View style={animatedStyle}>
{data.map((item) => renderModifier(item))}
</Animated.View>
<ShowMoreButton
onPress={handleShowMore}
showMore={showMore}
/>
{data.length > NUM_ITEMS_BEFORE_EXPAND &&
<ShowMoreButton
onPress={handleShowMore}
showMore={showMore}
/>
}
</>
);
};

View File

@@ -21,7 +21,7 @@ export type ModifierItem = {
type Props = {
item: ModifierItem;
setSearchValue: (value: string) => void;
setSearchValue: (value: string, cursorOffset?: number) => void;
searchValue?: string;
}
@@ -40,7 +40,8 @@ const Modifier = ({item, searchValue, setSearchValue}: Props) => {
newValue = `${searchValue} ${modifierTerm}`;
}
setSearchValue(newValue);
const cursorPosition = item.testID === 'search.phrases_section' ? -1 : undefined;
setSearchValue(newValue, cursorPosition);
});
return (

View File

@@ -2,20 +2,22 @@
// See LICENSE.txt for license information.
import {useIsFocused, useNavigation} from '@react-navigation/native';
import React, {useCallback, useMemo, useState} from 'react';
import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
import {useIntl} from 'react-intl';
import {FlatList, LayoutChangeEvent, Platform, StyleSheet, ViewProps} from 'react-native';
import {FlatList, LayoutChangeEvent, NativeSyntheticEvent, Platform, StyleSheet, TextInputSelectionChangeEventData, ViewProps} from 'react-native';
import Animated, {useAnimatedStyle, useDerivedValue, withTiming} from 'react-native-reanimated';
import {Edge, SafeAreaView, useSafeAreaInsets} from 'react-native-safe-area-context';
import {getPosts} from '@actions/local/post';
import {addSearchToTeamSearchHistory} from '@actions/local/team';
import {searchPosts, searchFiles} from '@actions/remote/search';
import useDidUpdate from '@app/hooks/did_update';
import Autocomplete from '@components/autocomplete';
import FreezeScreen from '@components/freeze_screen';
import Loading from '@components/loading';
import NavigationHeader from '@components/navigation_header';
import RoundedHeaderContext from '@components/rounded_header_context';
import {SearchRef} from '@components/search';
import {BOTTOM_TAB_HEIGHT} from '@constants/view';
import {useServerUrl} from '@context/server';
import {useTheme} from '@context/theme';
@@ -81,8 +83,12 @@ const SearchScreen = ({teamId}: Props) => {
const serverUrl = useServerUrl();
const searchTerm = (nav.getState().routes[stateIndex].params as any)?.searchTerm;
const [cursorPosition, setCursorPosition] = useState(searchTerm?.length);
const [searchValue, setSearchValue] = useState<string>(searchTerm);
const clearRef = useRef<boolean>(false);
const cancelRef = useRef<boolean>(false);
const searchRef = useRef<SearchRef>(null);
const [cursorPosition, setCursorPosition] = useState(searchTerm?.length || 0);
const [searchValue, setSearchValue] = useState<string>(searchTerm || '');
const [searchTeamId, setSearchTeamId] = useState<string>(teamId);
const [selectedTab, setSelectedTab] = useState<TabType>(TabTypes.MESSAGES);
const [filter, setFilter] = useState<FileFilter>(FileFilters.ALL);
@@ -96,23 +102,68 @@ const SearchScreen = ({teamId}: Props) => {
const [fileInfos, setFileInfos] = useState<FileInfo[]>(emptyFileResults);
const [fileChannelIds, setFileChannelIds] = useState<string[]>([]);
const onSnap = (offset: number) => {
scrollRef.current?.scrollToOffset({offset, animated: true});
useEffect(() => {
setSearchTeamId(teamId);
}, [teamId]);
const onSnap = (offset: number, animated = true) => {
scrollRef.current?.scrollToOffset({offset, animated});
};
const {scrollPaddingTop, scrollRef, scrollValue, onScroll, headerHeight, hideHeader} = useCollapsibleHeader<FlatList>(true, onSnap);
const {
headerHeight,
headerOffset,
hideHeader,
lockValue,
onScroll,
scrollEnabled,
scrollPaddingTop,
scrollRef,
scrollValue,
setAutoScroll,
unlock,
} = useCollapsibleHeader<FlatList>(true, onSnap);
const handleCancelAndClearSearch = useCallback(() => {
const resetToInitial = useCallback(() => {
setShowResults(false);
setSearchValue('');
setLastSearchedValue('');
setFilter(FileFilters.ALL);
setShowResults(false);
}, []);
const handleTextChange = useCallback((newValue: string) => {
const handleClearSearch = useCallback(() => {
clearRef.current = true;
resetToInitial();
}, [resetToInitial]);
const handleCancelSearch = useCallback(() => {
cancelRef.current = true;
resetToInitial();
onSnap(0);
}, [resetToInitial]);
const handleTextChange = useCallback((newValue: string, cursorOffset?: undefined) => {
searchRef.current?.focus?.();
const newCursorPos = (newValue.length + (cursorOffset || 0));
// console.log(
// 'newValue', newValue,
// 'newVal.len', newValue.length,
// 'offset', cursorOffset,
// 'newCursorPos', newCursorPos,
// );
setCursorPosition(newCursorPos);
setSearchValue(newValue);
setCursorPosition(newValue.length);
}, []);
}, [cursorPosition, searchRef]);
const onSelectionChange = (e: NativeSyntheticEvent<TextInputSelectionChangeEventData>) => {
console.log('e.nativeEvent', e.nativeEvent);
console.log('. IN HERE!');
};
searchRef.current?.onSelectionChange?.(onSelectionChange);
// console.log('searchValue', searchValue, 'cursorPosition', cursorPosition);
const handleLoading = useCallback((show: boolean) => {
(showResults ? setResultsLoading : setLoading)(show);
@@ -121,9 +172,10 @@ const SearchScreen = ({teamId}: Props) => {
const handleSearch = useCallback(async (newSearchTeamId: string, term: string) => {
const searchParams = getSearchParams(term);
if (!searchParams.terms) {
handleCancelAndClearSearch();
handleClearSearch();
return;
}
hideHeader(true);
handleLoading(true);
setFilter(FileFilters.ALL);
setLastSearchedValue(term);
@@ -141,7 +193,7 @@ const SearchScreen = ({teamId}: Props) => {
setFileChannelIds(channels?.length ? channels : emptyChannelIds);
handleLoading(false);
setShowResults(true);
}, [handleCancelAndClearSearch, handleLoading, showResults]);
}, [handleClearSearch, handleLoading]);
const onSubmit = useCallback(() => {
handleSearch(searchTeamId, searchValue);
@@ -167,38 +219,33 @@ const SearchScreen = ({teamId}: Props) => {
handleSearch(newTeamId, lastSearchedValue);
}, [lastSearchedValue, handleSearch]);
const containerStyle = useMemo(() => {
const justifyContent = (resultsLoading || loading) ? 'center' : 'flex-start';
return {paddingTop: scrollPaddingTop, flexGrow: 1, justifyContent} as ViewProps;
const initialContainerStyle = useMemo(() => {
return {
paddingTop: scrollPaddingTop,
flexGrow: 1,
justifyContent: (resultsLoading || loading) ? 'center' : 'flex-start',
} as ViewProps;
}, [loading, resultsLoading, scrollPaddingTop]);
const loadingComponent = useMemo(() => (
<Loading
containerStyle={[styles.loading, {paddingTop: scrollPaddingTop}]}
color={theme.buttonBg}
size='large'
/>
), [theme, scrollPaddingTop]);
const initialComponent = useMemo(() => (
<Initial
searchValue={searchValue}
setRecentValue={handleRecentSearch}
setSearchValue={handleTextChange}
setTeamId={setSearchTeamId}
teamId={searchTeamId}
/>
), [searchValue, searchTeamId, handleRecentSearch, handleTextChange]);
const renderItem = useCallback(() => {
if (loading) {
return loadingComponent;
}
return initialComponent;
}, [
loading && loadingComponent,
initialComponent,
]);
const renderInitialOrLoadingItem = useCallback(() => {
return loading ? (
<Loading
containerStyle={[styles.loading, {paddingTop: scrollPaddingTop}]}
color={theme.buttonBg}
size='large'
/>
) : (
<Initial
scrollEnabled={scrollEnabled}
searchValue={searchValue}
setRecentValue={handleRecentSearch}
setSearchValue={handleTextChange}
setTeamId={setSearchTeamId}
teamId={searchTeamId}
/>
);
}, [handleRecentSearch, handleTextChange, loading,
scrollPaddingTop, searchTeamId, searchValue, theme]);
const animated = useAnimatedStyle(() => {
if (isFocused) {
@@ -211,37 +258,20 @@ const SearchScreen = ({teamId}: Props) => {
return {
opacity: withTiming(0, {duration: 150}),
flex: 1,
transform: [{translateX: withTiming(stateIndex < searchScreenIndex ? 25 : -25, {duration: 150})}],
};
}, [isFocused, stateIndex]);
const top = useAnimatedStyle(() => {
return {
top: headerHeight.value,
zIndex: lastSearchedValue ? 10 : 0,
};
}, [headerHeight.value, lastSearchedValue]);
const headerTopStyle = useAnimatedStyle(() => ({
top: lockValue.value ? lockValue.value : headerHeight.value,
zIndex: lastSearchedValue ? 10 : 0,
}), [headerHeight, lastSearchedValue, lockValue]);
const onLayout = useCallback((e: LayoutChangeEvent) => {
setContainerHeight(e.nativeEvent.layout.height);
}, []);
let header = null;
if (lastSearchedValue && !loading) {
header = (
<Header
teamId={searchTeamId}
setTeamId={handleResultsTeamChange}
onTabSelect={setSelectedTab}
onFilterChanged={handleFilterChange}
numberMessages={posts.length}
selectedTab={selectedTab}
numberFiles={fileInfos.length}
selectedFilter={filter}
/>
);
}
const autocompleteMaxHeight = useDerivedValue(() => {
const iosAdjust = keyboardHeight ? keyboardHeight - BOTTOM_TAB_HEIGHT : insets.bottom;
const autocompleteRemoveFromHeight = headerHeight.value + (Platform.OS === 'ios' ? iosAdjust : 0);
@@ -250,7 +280,7 @@ const SearchScreen = ({teamId}: Props) => {
const autocompletePosition = useDerivedValue(() => {
return headerHeight.value - AutocompletePaddingTop;
}, [containerHeight]);
}, [headerHeight]);
const autocomplete = useMemo(() => (
<Autocomplete
@@ -267,6 +297,31 @@ const SearchScreen = ({teamId}: Props) => {
/>
), [cursorPosition, handleTextChange, searchValue, autocompleteMaxHeight, autocompletePosition, searchTeamId]);
// when clearing the input from the search results, scroll the initial view
// back to the top so the header is in the collapsed state
const onFlatLayout = useCallback(() => {
if (clearRef.current || cancelRef.current) {
unlock();
}
if (clearRef.current) {
onSnap(headerOffset, false);
clearRef.current = false;
} else if (cancelRef.current) {
onSnap(0);
cancelRef.current = false;
}
}, [headerOffset, scrollRef]);
useDidUpdate(() => {
if (isFocused) {
setTimeout(() => {
setAutoScroll(true);
}, 300);
} else {
setAutoScroll(false);
}
}, [isFocused]);
return (
<FreezeScreen freeze={!isFocused}>
<NavigationHeader
@@ -275,14 +330,20 @@ const SearchScreen = ({teamId}: Props) => {
title={intl.formatMessage({id: 'screen.search.title', defaultMessage: 'Search'})}
hasSearch={true}
scrollValue={scrollValue}
lockValue={lockValue}
hideHeader={hideHeader}
onChangeText={handleTextChange}
onSubmitEditing={onSubmit}
onSelectionChange={onSelectionChange}
blurOnSubmit={true}
placeholder={intl.formatMessage({id: 'screen.search.placeholder', defaultMessage: 'Search messages & files'})}
onClear={handleCancelAndClearSearch}
onCancel={handleCancelAndClearSearch}
onClear={handleClearSearch}
onCancel={handleCancelSearch}
defaultValue={searchValue}
//selection={selection}
cursorPosition={cursorPosition}
ref={searchRef}
/>
<SafeAreaView
style={styles.flex}
@@ -290,14 +351,26 @@ const SearchScreen = ({teamId}: Props) => {
onLayout={onLayout}
>
<Animated.View style={animated}>
<Animated.View style={top}>
<Animated.View style={headerTopStyle}>
<RoundedHeaderContext/>
{header}
{lastSearchedValue && !loading &&
<Header
teamId={searchTeamId}
setTeamId={handleResultsTeamChange}
onTabSelect={setSelectedTab}
onFilterChanged={handleFilterChange}
numberMessages={posts.length}
selectedTab={selectedTab}
numberFiles={fileInfos.length}
selectedFilter={filter}
/>
}
</Animated.View>
{!showResults &&
<AnimatedFlatList
onLayout={onFlatLayout}
data={dummyData}
contentContainerStyle={containerStyle}
contentContainerStyle={initialContainerStyle}
keyboardShouldPersistTaps='handled'
keyboardDismissMode={'interactive'}
nestedScrollEnabled={true}
@@ -308,7 +381,7 @@ const SearchScreen = ({teamId}: Props) => {
scrollToOverflowEnabled={true}
overScrollMode='always'
ref={scrollRef}
renderItem={renderItem}
renderItem={renderInitialOrLoadingItem}
/>
}
{showResults && !loading &&
@@ -318,7 +391,7 @@ const SearchScreen = ({teamId}: Props) => {
searchValue={lastSearchedValue}
posts={posts}
fileInfos={fileInfos}
scrollPaddingTop={scrollPaddingTop}
scrollPaddingTop={lockValue.value}
fileChannelIds={fileChannelIds}
/>
}

View File

@@ -403,7 +403,7 @@ export async function dismissAllModalsAndPopToRoot() {
* (if the screen is not in the stack, it will push a new one)
* @param screenId Screen to pop or display
* @param title Title to be shown in the top bar
* @param passProps Props to pass to the screen (Only if the screen does not exist in the stack)
* @param passProps Props to pass to the screen
* @param options Navigation options
*/
export async function dismissAllModalsAndPopToScreen(screenId: string, title: string, passProps = {}, options = {}) {
@@ -421,6 +421,9 @@ export async function dismissAllModalsAndPopToScreen(screenId: string, title: st
}
try {
await Navigation.popTo(screenId, mergeOptions);
if (Object.keys(passProps).length > 0) {
await Navigation.updateProps(screenId, passProps);
}
} catch {
// catch in case there is nothing to pop
}

View File

@@ -3,7 +3,10 @@
import {withDatabase} from '@nozbe/watermelondb/DatabaseProvider';
import withObservables from '@nozbe/with-observables';
import {of as of$} from 'rxjs';
import {distinctUntilChanged, switchMap} from 'rxjs/operators';
import {observeCurrentCall} from '@calls/state';
import {observePost} from '@queries/servers/post';
import Thread from './thread';
@@ -11,8 +14,14 @@ import Thread from './thread';
import type {WithDatabaseArgs} from '@typings/database/database';
const enhanced = withObservables(['rootId'], ({database, rootId}: WithDatabaseArgs & {rootId: string}) => {
const isInACall = observeCurrentCall().pipe(
switchMap((call) => of$(Boolean(call))),
distinctUntilChanged(),
);
return {
rootPost: observePost(database, rootId),
isInACall,
};
});

View File

@@ -6,6 +6,8 @@ import {DeviceEventEmitter, LayoutChangeEvent, StyleSheet, View} from 'react-nat
import {KeyboardTrackingViewRef} from 'react-native-keyboard-tracking-view';
import {Edge, SafeAreaView} from 'react-native-safe-area-context';
import CurrentCallBar from '@calls/components/current_call_bar';
import FloatingCallContainer from '@calls/components/floating_call_container';
import FreezeScreen from '@components/freeze_screen';
import PostDraft from '@components/post_draft';
import RoundedHeaderContext from '@components/rounded_header_context';
@@ -23,6 +25,7 @@ import type PostModel from '@typings/database/models/servers/post';
type ThreadProps = {
componentId: string;
rootPost?: PostModel;
isInACall: boolean;
};
const edges: Edge[] = ['left', 'right'];
@@ -31,7 +34,7 @@ const styles = StyleSheet.create({
flex: {flex: 1},
});
const Thread = ({componentId, rootPost}: ThreadProps) => {
const Thread = ({componentId, rootPost, isInACall}: ThreadProps) => {
const appState = useAppState();
const postDraftRef = useRef<KeyboardTrackingViewRef>(null);
const [containerHeight, setContainerHeight] = useState(0);
@@ -96,6 +99,11 @@ const Thread = ({componentId, rootPost}: ThreadProps) => {
/>
</>
}
{isInACall &&
<FloatingCallContainer threadScreen={true}>
<CurrentCallBar threadScreen={true}/>
</FloatingCallContainer>
}
</SafeAreaView>
</FreezeScreen>
);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1
assets/base/i18n/hr.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

View File

@@ -1,382 +1,390 @@
{
"about.date": "Data Kompilacji:",
"about.enterpriseEditione1": "Edycja Enterprise",
"about.enterpriseEditionLearn": "Dowiedz się więcej na temat edycji Enteprise na ",
"about.enterpriseEditionSt": "Współczesna komunikacja zza twojego firewalla.",
"about.hash": "Hash Kompilacji:",
"about.hashee": "Hash Kompilacji Enterprise:",
"about.teamEditionLearn": "Dołącz do społeczności Mattermost na ",
"about.teamEditionSt": "Cała komunikacja Twojego zespołu w jednym miejscu, z natychmiastowym przeszukiwaniem i dostępna z każdego miejsca.",
"about.teamEditiont0": "Edycja Zespołowa",
"about.teamEditiont1": "Edycja Enterprise",
"api.channel.add_guest.added": "{addedUsername} został dodany do kanału jako gość przez {username}.",
"api.channel.add_member.added": "{addedUsername} został dodany do kanału przez {username}.",
"api.channel.guest_join_channel.post_and_forget": "{username} dołączył do kanału jako gość.",
"apps.error": "Błąd: {error}",
"apps.error.command.field_missing": "Brakujące wymagane pola: `{fieldName}`.",
"apps.error.command.same_channel": "Kanał powtórzony dla pola `{fieldName}`: `{option}`.",
"apps.error.command.same_option": "Opcja powtórzona dla pola `{fieldName}`: `{option}`.",
"apps.error.command.same_user": "Użytkownik powtórzony dla pola `{fieldName}`: `{option}`.",
"apps.error.command.unknown_channel": "Nieznany kanał dla pola `{fieldName}`: `{option}`.",
"apps.error.command.unknown_option": "Nieznana opcja dla pola `{fieldName}`: `{option}`.",
"apps.error.command.unknown_user": "Nieznany użytkownik dla pola `{fieldName}`: `{option}`.",
"apps.error.form.no_form": "`form` jest niezdefiniowany.",
"apps.error.form.no_lookup": "`szukaj` nie jest zdefiniowane.",
"apps.error.form.no_source": "`źródło` nie jest zdefiniowane.",
"apps.error.form.no_submit": "`wyślij` nie jest zdefiniowane",
"apps.error.form.refresh": "Wystąpił błąd podczas wybierania pól. Skontaktuj się z developerem. Szczegóły: {details}",
"apps.error.form.refresh_no_refresh": "Odświeżenie w polu nieodświeżalnym.",
"apps.error.form.submit.pretext": "Wystąpił błąd podczas wysyłania. Skontaktuj się z deweloperem. Szczegóły: {details}",
"apps.error.lookup.error_preparing_request": "Błąd podczas przeszukiwania: {errorMessage}",
"apps.error.malformed_binding": "To wiązanie nie jest prawidłowo utworzone. Skontaktuj się z twórcą aplikacji.",
"apps.error.parser": "Błąd składni: {error}",
"apps.error.parser.execute_non_leaf": "Musisz wybrać podpolecenie.",
"apps.error.parser.missing_binding": "Brakujące nawiązania poleceń.",
"apps.error.parser.missing_field_value": "Brakująca wartość pola.",
"apps.error.parser.missing_list_end": "Oczekiwany token zamykający listę.",
"apps.error.parser.missing_quote": "Oczekiwany podwójny cudzysłów przed zakończeniem wprowadzania danych.",
"apps.error.parser.missing_source": "Formularz nie ma ani nadawcy, ani źródła.",
"apps.error.parser.missing_submit": "Nie ma rozmów lub formularzy.",
"apps.error.parser.missing_tick": "Oczekiwany podwójny cudzysłów przed zakończeniem wprowadzania danych.",
"apps.error.parser.multiple_equal": "Wielokrotne znaki `=` nie są dozwolone.",
"apps.error.parser.no_argument_pos_x": "Nie można zidentyfikować argumentu.",
"apps.error.parser.no_bindings": "Brak powiązań z poleceniami.",
"apps.error.parser.no_form": "Nie znaleziono formularza.",
"apps.error.parser.no_match": "`{command}`: Nie znaleziono pasującej komendy w tym obszarze roboczym.",
"apps.error.parser.no_slash_start": "Komenda musi zaczynać się od `/`.",
"apps.error.parser.unexpected_character": "Nieoczekiwany znak.",
"apps.error.parser.unexpected_comma": "Nieoczekiwany przecinek.",
"apps.error.parser.unexpected_error": "Nieoczekiwany błąd.",
"apps.error.parser.unexpected_flag": "Komenda nie akceptuje flagi `{flagName}`.",
"apps.error.parser.unexpected_squared_bracket": "Nieoczekiwane otwarcie listy.",
"apps.error.parser.unexpected_state": "Nieosiągalne: Nieoczekiwany stan matchBinding: `{state}`.",
"apps.error.parser.unexpected_whitespace": "Nieosiągalne: Nieoczekiwana spacja.",
"apps.error.responses.navigate.no_url": "Typ odpowiedzi to `navigate`, ale żaden adres url nie został zawarty w odpowiedzi.",
"apps.error.responses.unexpected_error": "Otrzymano nieoczekiwany błąd.",
"apps.error.responses.unknown_field_error": "Otrzymano błąd dla nieznanego pola. Nazwa pola: `{field}`. Błąd: `{error}`.",
"apps.error.responses.unknown_type": "Typ odpowiedzi aplikacji nie jest obsługiwany. Typ odpowiedzi: {type}.",
"apps.error.unknown": "Wystąpił nieznany błąd.",
"apps.suggestion.dynamic.error": "Błąd dynamicznego wyboru",
"apps.suggestion.errors.parser_error": "Błąd przetwarzania",
"apps.suggestion.no_dynamic": "Nie zwrócono żadnych danych dla sugestii dynamicznych",
"apps.suggestion.no_static": "Brak pasujących opcji.",
"apps.suggestion.no_suggestion": "Brak pasujących sugestii.",
"archivedChannelMessage": "Przeglądasz **zarchiwizowany kanał**. Nowe wiadomości nie mogą być wysłane.",
"camera_type.photo.option": "Przechwyć zdjęcie",
"camera_type.title": "Wybierz działanie",
"camera_type.video.option": "Nagraj wideo",
"center_panel.archived.closeChannel": "Zamknij Kanał",
"channel_info.header": "Nagłówek:",
"channel_loader.someone": "Ktoś",
"channel_modal.descriptionHelp": "Opisz jak ten kanał powinien być używany.",
"channel_modal.header": "Nagłówek",
"channel_modal.name": "Nazwa",
"channel_modal.optional": "(opcjonalne)",
"channel_modal.purpose": "Cel",
"combined_system_message.added_to_channel.many_expanded": "{users} i {lastUser} zostali **dodani do kanału** przez {actor}.",
"combined_system_message.added_to_channel.one": "{firstUser} został **dodany do kanału** przez {actor}.",
"combined_system_message.added_to_channel.one_you": "Zostałeś **dodany do kanału** przez {actor}.",
"combined_system_message.added_to_channel.two": "{firstUser} i {secondUser} zostali **dodani do kanału** przez {actor}.",
"combined_system_message.added_to_team.many_expanded": "{users} i {lastUser} zostali **dodani do zespołu** przez {actor}.",
"combined_system_message.added_to_team.one": "{firstUser} został **dodany do zespołu** przez {actor}.",
"combined_system_message.added_to_team.one_you": "Zostałeś **dodany do zespołu** przez {actor}.",
"combined_system_message.added_to_team.two": "{firstUser} i {secondUser} zostali **dodani do zespołu** przez {actor}.",
"combined_system_message.joined_channel.many_expanded": "{users} i {lastUser} **dołączyli do kanału**.",
"combined_system_message.joined_channel.one": "{firstUser} **dołączył do kanału**.",
"combined_system_message.joined_channel.one_you": "Ty **dołączyłeś do kanału**.",
"combined_system_message.joined_channel.two": "{firstUser} i {secondUser} **dołączyli do kanału**.",
"combined_system_message.joined_team.many_expanded": "{users} i {lastUser} **dołączyli do zespołu**.",
"combined_system_message.joined_team.one": "{firstUser} **dołączył do zespołu**.",
"combined_system_message.joined_team.one_you": "Ty **dołączyłeś do zespołu**.",
"combined_system_message.joined_team.two": "{firstUser} i {secondUser} **dołączyli do zespołu**.",
"combined_system_message.left_channel.many_expanded": "{users} i {lastUser} **opuścili kanał**.",
"combined_system_message.left_channel.one": "{firstUser} **opuścił kanał**.",
"combined_system_message.left_channel.one_you": "Ty **opuściłeś kanał**.",
"combined_system_message.left_channel.two": "{firstUser} i {secondUser} **opuścili kanał**.",
"combined_system_message.left_team.many_expanded": "{users} i {lastUser} **opuścili zespół**.",
"combined_system_message.left_team.one": "{firstUser} **opuścił zespół**.",
"combined_system_message.left_team.one_you": "Ty **opuściłeś zespół**.",
"combined_system_message.left_team.two": "{firstUser} i {secondUser} **opuścili zespół**.",
"combined_system_message.removed_from_channel.many_expanded": "{users} i {lastUser} zostali **usunięci z kanału**.",
"combined_system_message.removed_from_channel.one": "{firstUser} został **usunięty z kanału**.",
"combined_system_message.removed_from_channel.one_you": "Ty zostałeś **usunięty z kanału**.",
"combined_system_message.removed_from_channel.two": "{firstUser} i {secondUser} zostali **usunięci z kanału**.",
"combined_system_message.removed_from_team.many_expanded": "{users} i {lastUser} zostali **usunięci z zespołu**.",
"combined_system_message.removed_from_team.one": "{firstUser} został **usunięty z zespołu**.",
"combined_system_message.removed_from_team.one_you": "Zostałeś **usunięty z zespołu**.",
"combined_system_message.removed_from_team.two": "{firstUser} i {secondUser} zostali **usunięci z zespołu**.",
"combined_system_message.you": "Ty",
"create_post.deactivated": "Przeglądasz zarchiwizowany kanał z deaktywowanym użytkownikiem.",
"create_post.write": "Napisz na {channelDisplayName}",
"custom_status.expiry_dropdown.custom": "Własne",
"custom_status.expiry_dropdown.date_and_time": "Data i godzina",
"custom_status.expiry_dropdown.dont_clear": "Nie czyść",
"custom_status.expiry_dropdown.four_hours": "4 godziny",
"custom_status.expiry_dropdown.one_hour": "1 godzina",
"custom_status.expiry_dropdown.thirty_minutes": "30 minut",
"custom_status.expiry_dropdown.this_week": "W tym tygodniu",
"custom_status.expiry_dropdown.today": "Dzisiaj",
"custom_status.expiry_time.today": "Dzisiaj",
"custom_status.expiry_time.tomorrow": "Jutro",
"custom_status.expiry.at": "na",
"custom_status.expiry.until": "Dopóki",
"custom_status.failure_message": "Nie udało się zaktualizować statusu. Spróbuj ponownie",
"custom_status.suggestions.in_a_meeting": "Na spotkaniu",
"custom_status.suggestions.on_a_vacation": "Na wakacjach",
"custom_status.suggestions.out_for_lunch": "Jestem na lunchu",
"custom_status.suggestions.out_sick": "Na chorobowym",
"custom_status.suggestions.working_from_home": "Praca zdalna",
"date_separator.today": "Dzisiaj",
"date_separator.yesterday": "Wczoraj",
"edit_post.editPost": "Edytuj post...",
"edit_post.save": "Zapisz",
"emoji_picker.activities": "Działania",
"emoji_picker.animals-nature": "Zwierzęta i przyroda",
"emoji_picker.custom": "Własne",
"emoji_picker.flags": "Flagi",
"emoji_picker.food-drink": "Żywność i napoje",
"emoji_picker.objects": "Obiekty",
"emoji_picker.people-body": "Ludzie i ciało",
"emoji_picker.searchResults": "Wyniki Wyszukiwania",
"emoji_picker.smileys-emotion": "Uśmieszki i Emotikony",
"emoji_picker.symbols": "Symbole",
"emoji_picker.travel-places": "Podróże i miejsca",
"emoji_skin.dark_skin_tone": "odcień ciemnego wyglądu",
"emoji_skin.default": "domyślny odcień wyglądu",
"emoji_skin.light_skin_tone": "jasny odcień wyglądu",
"emoji_skin.medium_dark_skin_tone": "średnio szary odcień wyglądu",
"emoji_skin.medium_light_skin_tone": "średnio jasny odcień wyglądu",
"emoji_skin.medium_skin_tone": "średni odcień wyglądu",
"file_upload.fileAbove": "Plik musi być mniejszy niż {max}",
"friendly_date.daysAgo": "{count} {count, plural, one {dzień} other {dni}} temu",
"friendly_date.hoursAgo": "{count} {count, plural, one {godz} other {godz}} temu",
"friendly_date.minsAgo": "{count} {count, plural, one {min} other {min}} temu",
"friendly_date.monthsAgo": "{count} {count, plural, one {miesiąc} other {miesięcy}} temu",
"friendly_date.now": "Teraz",
"friendly_date.yearsAgo": "{count} {count, plural, one {rok} other {lat}} temu",
"friendly_date.yesterday": "Wczoraj",
"gallery.footer.channel_name": "Współdzielone w {channelName}",
"gallery.open_file": "Otwórz plik",
"get_post_link_modal.title": "Kopiuj odnośnik",
"global_threads.allThreads": "Wszystkie Twoje Wątki",
"global_threads.emptyThreads.message": "Wszystkie wątki, w których jesteś wspomniany lub w których brałeś udział będą tutaj widoczne wraz z wątkami, które śledziłeś.",
"global_threads.emptyThreads.title": "Nie ma jeszcze śledzonych wątków",
"global_threads.emptyUnreads.message": "Wygląda na to, że wszystko jest dograne.",
"global_threads.emptyUnreads.title": "Brak nieprzeczytanych wątków",
"global_threads.markAllRead.cancel": "Anuluj",
"global_threads.markAllRead.markRead": "Oznacz jako przeczytane",
"global_threads.markAllRead.message": "Zostanie usunięty status nieprzeczytany dla wszystkich twoich wątków pokazanych tutaj",
"global_threads.markAllRead.title": "Czy na pewno chcesz oznaczyć wszystkie wątki jako przeczytane?",
"global_threads.options.mark_as_read": "Oznacz jako przeczytane",
"global_threads.options.open_in_channel": "Otwórz na kanale",
"global_threads.unreads": "Nieprzeczytane",
"last_users_message.added_to_channel.type": "zostało **dodanych do kanału** przez {actor}.",
"last_users_message.added_to_team.type": "zostało **dodanych do zespołu** przez {actor}.",
"last_users_message.first": "{firstUser} i ",
"last_users_message.joined_channel.type": "**dołączył do kanału**.",
"last_users_message.joined_team.type": "**dołączył do zespołu**.",
"last_users_message.left_channel.type": "**opuścił kanał**.",
"last_users_message.left_team.type": "**opuścił zespół**.",
"last_users_message.others": "{numOthers} innych ",
"last_users_message.removed_from_channel.type": "został **usunięty z kanału**.",
"last_users_message.removed_from_team.type": "został **usunięty z zespołu**.",
"login_mfa.tokenReq": "Wprowadź token MFA",
"login.email": "E-mail",
"login.ldapUsername": "Nazwa użytkownika AD/LDAP",
"login.or": "lub",
"login.password": "Hasło",
"login.username": "Nazwa użytkownika",
"mobile.about.appVersion": "Wersja Aplikacji: {version} (Build {number})",
"mobile.account.settings.save": "Zapisz",
"mobile.action_menu.select": "Wybierz opcję",
"mobile.android.back_handler_exit": "Naciśnij przycisk wstecz, aby wyjść",
"mobile.android.photos_permission_denied_title": "Dostęp do biblioteki zdjęć jest wymagany",
"mobile.camera_photo_permission_denied_title": "{applicationName} chce uzyskać dostęp do aparatu",
"mobile.channel_info.alertNo": "Nie",
"mobile.channel_info.alertYes": "Tak",
"mobile.commands.error_title": "Błąd wykonywania komendy",
"mobile.components.select_server_view.connect": "Połączono",
"mobile.components.select_server_view.enterServerUrl": "Wprowadź adres URL serwera",
"mobile.components.select_server_view.proceed": "Kontynuuj",
"mobile.create_channel": "Utwórz",
"mobile.custom_status.choose_emoji": "Wybierz emotikonę",
"mobile.custom_status.clear_after": "Wyczyść po",
"mobile.custom_status.modal_confirm": "Ukończono",
"mobile.display_settings.theme": "Motyw",
"mobile.document_preview.failed_description": "Wystąpił błąd podczas otwierania dokumentu. Proszę, upewnij się, że zainstalowałeś przeglądarkę {fileType} i spróbuj ponownie.\n",
"mobile.document_preview.failed_title": "Otwieranie dokumentu się nie powiodło",
"mobile.downloader.disabled_description": "Pobieranie plików zostało wyłączone na tym serwerze. Proszę skontaktować się ze swoim Administratorem Systemu aby uzyskać więcej szczegółów.\n",
"mobile.downloader.disabled_title": "Pobieranie wyłączone",
"mobile.downloader.failed_description": "Wystąpił błąd podczas pobierania pliku. Proszę sprawdzić swoje połączenie z internetem i spróbować ponownie.\n",
"mobile.downloader.failed_title": "Pobieranie nie udane",
"mobile.edit_channel": "Zapisz",
"mobile.edit_post.title": "Edycja Wiadomości",
"mobile.error_handler.button": "Wznów",
"mobile.error_handler.description": "\nKliknij \"ponowne uruchomienie\" aby zrestartować aplikację. Po restarcie możesz zgłosić problem poprzez menu ustawień.\n",
"mobile.error_handler.title": "Wystąpił nieoczekiwany błąd",
"mobile.file_upload.disabled2": "Przesyłanie plików z telefonu komórkowego jest wyłączone.",
"mobile.file_upload.max_warning": "Dodawanie jest ograniczone do maksymalnie {count} plików.",
"mobile.files_paste.error_description": "Podczas wklejania pliku(ów) wystąpił błąd. Spróbuj ponownie.",
"mobile.files_paste.error_dismiss": "Odrzuć",
"mobile.files_paste.error_title": "Wklejenie nie powiodło się",
"mobile.gallery.title": "{index} z {total}",
"mobile.ios.photos_permission_denied_title": "Dostęp do biblioteki zdjęć jest wymagany",
"mobile.link.error.text": "Nie można otworzyć linku.",
"mobile.link.error.title": "Błąd",
"mobile.managed.blocked_by": "Zablokowany przez {vendor}",
"mobile.managed.exit": "Wyjście",
"mobile.managed.jailbreak": "Urządzenia z Jailbreakiem nie są zaufane przez {vendor}, proszę wyjść z aplikacji.",
"mobile.managed.not_secured.android": "To urządzenie musi zostać zabezpieczone blokadą ekranu, aby użyć Mattermost.",
"mobile.managed.not_secured.ios": "To urządzenie musi zostać zabezpieczone hasłem, aby używać Mattermost.\n\nIdz do Ustawienia > Identyfikacja twarzy i hasło.",
"mobile.managed.not_secured.ios.touchId": "To urządzenie musi zostać zabezpieczone hasłem, aby używać Mattermost.\n\nPrzejdź do Ustawienia > Touch ID i Hasło.",
"mobile.managed.secured_by": "Zabezpieczony przez {vendor}",
"mobile.managed.settings": "Idz do ustawień",
"mobile.markdown.code.copy_code": "Skopiuj Kod",
"mobile.markdown.code.plusMoreLines": "+{count, number} więcej {count, plural, one {line} other {lines}}",
"mobile.markdown.image.too_large": "Obrazek przekracza maksymalne rozmiary szerokości {maxWidth} oraz {maxHeight} wysokości:",
"mobile.markdown.link.copy_url": "Kopiuj URL",
"mobile.mention.copy_mention": "Kopiuj wzmiankę",
"mobile.message_length.message": "Twoja aktualna wiadomość jest za długa. Aktualna liczba znaków: {max}/{count}",
"mobile.message_length.message_split_left": "Wiadomość przekracza limit znaków",
"mobile.message_length.title": "Długość Wiadomości",
"mobile.microphone_permission_denied_description": "Aby wziąć udział w tym połączeniu, otwórz Ustawienia, aby umożliwić Mattermost dostęp do mikrofonu.",
"mobile.microphone_permission_denied_title": "{applicationName} chce uzyskać dostęp do swojego mikrofonu",
"mobile.oauth.failed_to_login": "Twoja próba logowania nie powiodła się. Proszę spróbować ponownie.",
"mobile.oauth.failed_to_open_link": "Nie udało się otworzyć linku. Proszę spróbować ponownie.",
"mobile.oauth.something_wrong": "Coś poszło nie tak",
"mobile.oauth.try_again": "Spróbuj ponownie",
"mobile.open_gm.error": "Nie możemy otworzyć wiadomości grupowej z tymi użytkownikami. Sprawdź połączenie i spróbuj ponownie.",
"mobile.permission_denied_dismiss": "Nie pozwalaj",
"mobile.permission_denied_retry": "Ustawienia",
"mobile.post_info.add_reaction": "Dodaj Reakcję",
"mobile.post_info.copy_text": "Kopiuj Tekst",
"mobile.post_info.mark_unread": "Oznacz jako nieprzeczytane",
"mobile.post_info.pin": "Przypnij do kanału",
"mobile.post_info.reply": "Odpowiedź",
"mobile.post_info.unpin": "Odepnij od kanału",
"mobile.post_pre_header.pinned": "Przypięty",
"mobile.post_textbox.entire_channel_here.message": "Używając @here zamierzasz wysyłać powiadomienia do {totalMembers, number} {totalMembers, plural, one {osoby} other {osób}} więcej. Czy jesteś pewien, że chcesz to zrobić?",
"mobile.post_textbox.entire_channel_here.message.with_timezones": "Używając @here zamierzasz wysyłać powiadomienia do {totalMembers, number} {totalMembers, plural, one {osoby} other {osób}} więcej, w {timezones, number} {timezones, plural, one {strefie czasowej} other {strefach czasowych}}. Czy jesteś pewien, że chcesz to zrobić?",
"mobile.post_textbox.entire_channel.cancel": "Anuluj",
"mobile.post_textbox.entire_channel.confirm": "Potwierdź",
"mobile.post_textbox.entire_channel.message": "Z pomocą @all lub @channel, zamierzasz wysyłać powiadomienia do {totalMembers, number} {totalMembers, plural, one {person} other {people}}. Jesteś pewien, że chcesz to zrobić?",
"mobile.post_textbox.entire_channel.message.with_timezones": "Z pomocą @all lub @channel, który zamierzasz wysyłać powiadomienia do {totalMembers, number} {totalMembers, plural, one {person} other {people}} in {timezones, number} {timezones, plural, one {timezone} other {timezones}}.. Jesteś pewien, że chcesz to zrobić?",
"mobile.post_textbox.entire_channel.title": "Potwierdź wysyłanie powiadomień do całego kanału",
"mobile.post_textbox.groups.title": "Confirm sending notifications to groups",
"mobile.post_textbox.uploadFailedDesc": "Niektórych załączników nie udało się przesłać na serwer. Czy na pewno chcesz opublikować wiadomość?",
"mobile.post_textbox.uploadFailedTitle": "Błąd załącznika",
"mobile.post.cancel": "Anuluj",
"mobile.post.delete_question": "Czy na pewno chcesz usunąć tą wiadomość?",
"mobile.post.delete_title": "Usuń wiadomość",
"mobile.post.failed_delete": "Usuń wiadomość",
"mobile.post.failed_retry": "Spróbuj ponownie",
"mobile.posts_view.moreMsg": "Więcej Nowych Wiadomości Powyżej",
"mobile.privacy_link": "Polityka prywatności",
"mobile.push_notification_reply.button": "Wyślij",
"mobile.push_notification_reply.placeholder": "Napisz odpowiedź...",
"mobile.push_notification_reply.title": "Odpowiedź",
"mobile.rename_channel.display_name_maxLength": "Nazwa kanału musi posiadać mniej niż {maxLength, number} znaków",
"mobile.rename_channel.display_name_minLength": "Nazwa kanału musi zawierać{minLength, number} lub więcej znaków",
"mobile.rename_channel.display_name_required": "Nazwa kanału jest wymagana",
"mobile.request.invalid_response": "Nieprawidłowa odpowiedź od serwera.",
"mobile.reset_status.alert_cancel": "Anuluj",
"mobile.reset_status.title_ooo": "Wyłączyć \"poza biurem\"?",
"mobile.routes.code": "{language} Kod",
"mobile.routes.code.noLanguage": "Kod",
"mobile.routes.custom_status": "Ustaw status",
"mobile.routes.table": "Tabela",
"mobile.routes.user_profile": "Profil",
"mobile.search.jump": "Przejdź do najnowszych wiadomości",
"mobile.server_link.error.text": "Link nie może być znaleziony na tym serwerze.",
"mobile.server_link.error.title": "Link Error",
"mobile.server_link.unreachable_channel.error": "Permalink należy do usuniętych wiadomości lub do kanału, do którego nie masz dostępu.",
"mobile.server_link.unreachable_team.error": "Permalink należy do usuniętych wiadomości lub do kanału, do którego nie masz dostępu.",
"mobile.server_upgrade.alert_description": "Ta wersja serwera nie jest wspierana i użytkownicy będą narażeni na problemy z kompatybilnością, które powodują awarie lub poważne błędy podważające podstawową funkcjonalność aplikacji. Wymagana jest aktualizacja do wersji serwera {serverVersion} lub nowszej.",
"mobile.server_upgrade.button": "OK",
"mobile.server_upgrade.dismiss": "Odrzuć",
"mobile.server_upgrade.learn_more": "Dowiedz się więcej",
"mobile.server_upgrade.title": "Wymagane uaktualnienie serwera",
"mobile.server_url.empty": "Proszę wprowadzić prawidłowy adres URL serwera",
"mobile.server_url.invalid_format": "Adres musi zaczynać się od http:// lub https://",
"mobile.set_status.away": "Zaraz wracam",
"mobile.set_status.dnd": "Nie przeszkadzać",
"mobile.set_status.offline": "Offline",
"mobile.set_status.online": "Dostępny",
"mobile.storage_permission_denied_title": "{applicationName} chce otrzymać dostęp do twoich plików",
"mobile.suggestion.members": "Użytkownicy",
"mobile.system_message.channel_archived_message": "{username} zarchiwizował kanał",
"mobile.system_message.channel_unarchived_message": "{username} zarchiwizował kanał",
"mobile.system_message.update_channel_displayname_message_and_forget.updated_from": "{username} zaktualizowała nazwę wyświetlaną kanału z: {oldDisplayName} do: {newDisplayName}",
"mobile.system_message.update_channel_header_message_and_forget.removed": "{username} usunął nagłówek kanału (był: : {oldHeader})",
"mobile.system_message.update_channel_header_message_and_forget.updated_from": "{username} zaktualizował nagłówek kanału z: {oldHeader} na: {newHeader}",
"mobile.system_message.update_channel_header_message_and_forget.updated_to": "{username} zaktualizował nagłówek kanału na: {newHeader}",
"mobile.system_message.update_channel_purpose_message.removed": "{username} usunął cel kanału (było: {oldPurpose})",
"mobile.system_message.update_channel_purpose_message.updated_from": "{username} zaktualizował cel kanału z: {oldPurpose} na: {newPurpose}",
"mobile.system_message.update_channel_purpose_message.updated_to": "{username} zaktualizował cel kanału na: {newPurpose}",
"mobile.tos_link": "Warunki korzystania z usługi",
"mobile.unsupported_server.message": "Załączniki, podglądy linków, reakcje i dane osadzone mogą nie być wyświetlane poprawnie. Jeśli ten problem nadal występuje, skontaktuj się z Administratorem Systemu, aby zaktualizować serwer Mattermost.",
"mobile.unsupported_server.ok": "OK",
"mobile.unsupported_server.title": "Niewspierana wersja serwera",
"mobile.user_list.deactivated": "Dezaktywowano",
"modal.manual_status.auto_responder.message_": "Czy chcesz zmienić swój status na \"{status}\" i wyłączyć automatyczne odpowiedzi?",
"modal.manual_status.auto_responder.message_away": "Czy chcesz zmienić swój status na \"Zaraz Wracam\" i wyłączyć automatyczne odpowiedzi?",
"modal.manual_status.auto_responder.message_dnd": "Czy chcesz zmienić swój status na \"Nie przeszkadzać\" i wyłączyć automatyczne odpowiedzi?",
"modal.manual_status.auto_responder.message_offline": "Czy chcesz zmienić swój status na \"Offline\" i wyłączyć automatyczne odpowiedzi?",
"modal.manual_status.auto_responder.message_online": "Czy chcesz zmienić swój status na \"Online\" i wyłączyć automatyczne odpowiedzi?",
"msg_typing.areTyping": "{users} i {last} piszą...",
"msg_typing.isTyping": "{user} pisze...",
"password_send.description": "Aby zresetować hasło musisz podać e-mail, którego użyłeś w trakcie rejestracji",
"password_send.error": "Podaj poprawny adres e-mail.",
"password_send.link": "Jeśli konto istnieje, wiadomość e-mail dotycząca resetowania hasła zostanie wysłana na adres:",
"permalink.show_dialog_warn.cancel": "Anuluj",
"permalink.show_dialog_warn.join": "Dołącz do",
"permalink.show_dialog_warn.title": "Dołącz do kanału prywatnego",
"post_body.check_for_out_of_channel_groups_mentions.message": "nie zostali powiadomieni poprzez tą wzmiankę, ponieważ nie są na kanale. Nie można ich dodać do kanału, ponieważ nie są członkami grup połączonych. Aby dodać je do tego kanału, muszą zostać dodane do połączonych grup.",
"post_body.check_for_out_of_channel_mentions.link.and": " i ",
"post_body.check_for_out_of_channel_mentions.link.private": "dodaj je do tego prywatnego kanału",
"post_body.check_for_out_of_channel_mentions.link.public": "dodaj je do kanału",
"post_body.check_for_out_of_channel_mentions.message_last": "? Będą mieć dostęp do całej historii wiadomości.",
"post_body.check_for_out_of_channel_mentions.message.multiple": "zostały wspomniane, ale nie są w kanale. Czy chciałbyś ",
"post_body.check_for_out_of_channel_mentions.message.one": "został wspomniany, ale nie ma go w kanale. Czy chciałbyś ",
"post_body.commentedOn": "skomentował wiadomość {name}: ",
"post_body.deleted": "(wiadomość usunięta)",
"post_info.del": "Usuń",
"post_info.edit": "Edytuj",
"post_info.system": "System",
"post_message_view.edited": "(edytowany)",
"posts_view.newMsg": "Nowe Wiadomości",
"search_bar.search": "Szukaj",
"status_dropdown.set_away": "Zaraz wracam",
"status_dropdown.set_dnd": "Nie przeszkadzać",
"status_dropdown.set_offline": "Offline",
"status_dropdown.set_online": "Dostępny",
"suggestion.mention.all": "Powiadamia wszystkich na tym kanale",
"suggestion.mention.channel": "Powiadamia wszystkich na tym kanale",
"suggestion.mention.channels": "Moje kanały",
"suggestion.mention.groups": "Group Mentions",
"suggestion.mention.here": "Powiadamia wszystkich obecnie dostępnych na kanale",
"suggestion.mention.members": "Członkowie kanału",
"suggestion.mention.morechannels": "Inne kanały",
"suggestion.mention.nonmembers": "Nie na kanale",
"suggestion.mention.special": "Specjalne wzmianki",
"suggestion.mention.you": " (you)",
"suggestion.search.direct": "Wiadomości bezpośrednie",
"suggestion.search.private": "Kanały prywatne",
"suggestion.search.public": "Kanały publiczne",
"threads": "Wątki",
"threads.deleted": "Oryginalna wiadomość Usunięta",
"threads.follow": "Obserwuj",
"threads.following": "Obserwując",
"threads.followMessage": "Obserwuj Wiadomość",
"threads.followThread": "Obserwuj Wątek",
"threads.newReplies": "{count} {count, plural, one {nowa odpowiedź} other {nowe odpowiedzi}}",
"threads.replies": "{count} {count, plural, one {odpowiedź} other {odpowiedzi}}",
"threads.unfollowMessage": "Przestań obserwować wiadomość",
"threads.unfollowThread": "Przestań obserwować Wątek",
"user.settings.general.email": "E-mail",
"user.settings.general.firstName": "Imię",
"user.settings.general.lastName": "Nazwisko",
"user.settings.general.nickname": "Pseudonim",
"user.settings.general.position": "Stanowisko",
"user.settings.general.username": "Nazwa użytkownika"
}
"about.date": "Data Kompilacji:",
"about.enterpriseEditione1": "Edycja Enterprise",
"about.enterpriseEditionLearn": "Dowiedz się więcej na temat edycji Enteprise na ",
"about.enterpriseEditionSt": "Współczesna komunikacja zza twojego firewalla.",
"about.hash": "Hash Kompilacji:",
"about.hashee": "Hash Kompilacji Enterprise:",
"about.teamEditionLearn": "Dołącz do społeczności Mattermost na ",
"about.teamEditionSt": "Cała komunikacja Twojego zespołu w jednym miejscu, z natychmiastowym przeszukiwaniem i dostępna z każdego miejsca.",
"about.teamEditiont0": "Edycja Zespołowa",
"about.teamEditiont1": "Edycja Enterprise",
"api.channel.add_guest.added": "{addedUsername} został dodany do kanału jako gość przez {username}.",
"api.channel.add_member.added": "{addedUsername} został dodany do kanału przez {username}.",
"api.channel.guest_join_channel.post_and_forget": "{username} dołączył do kanału jako gość.",
"apps.error": "Błąd: {error}",
"apps.error.command.field_missing": "Brakujące wymagane pola: `{fieldName}`.",
"apps.error.command.same_channel": "Kanał powtórzony dla pola `{fieldName}`: `{option}`.",
"apps.error.command.same_option": "Opcja powtórzona dla pola `{fieldName}`: `{option}`.",
"apps.error.command.same_user": "Użytkownik powtórzony dla pola `{fieldName}`: `{option}`.",
"apps.error.command.unknown_channel": "Nieznany kanał dla pola `{fieldName}`: `{option}`.",
"apps.error.command.unknown_option": "Nieznana opcja dla pola `{fieldName}`: `{option}`.",
"apps.error.command.unknown_user": "Nieznany użytkownik dla pola `{fieldName}`: `{option}`.",
"apps.error.form.no_form": "`form` jest niezdefiniowany.",
"apps.error.form.no_lookup": "`szukaj` nie jest zdefiniowane.",
"apps.error.form.no_source": "`źródło` nie jest zdefiniowane.",
"apps.error.form.no_submit": "`wyślij` nie jest zdefiniowane",
"apps.error.form.refresh": "Wystąpił błąd podczas wybierania pól. Skontaktuj się z developerem. Szczegóły: {details}",
"apps.error.form.refresh_no_refresh": "Odświeżenie w polu nieodświeżalnym.",
"apps.error.form.submit.pretext": "Wystąpił błąd podczas wysyłania. Skontaktuj się z deweloperem. Szczegóły: {details}",
"apps.error.lookup.error_preparing_request": "Błąd podczas przeszukiwania: {errorMessage}",
"apps.error.malformed_binding": "To wiązanie nie jest prawidłowo utworzone. Skontaktuj się z twórcą aplikacji.",
"apps.error.parser": "Błąd składni: {error}",
"apps.error.parser.execute_non_leaf": "Musisz wybrać podpolecenie.",
"apps.error.parser.missing_binding": "Brakujące nawiązania poleceń.",
"apps.error.parser.missing_field_value": "Brakująca wartość pola.",
"apps.error.parser.missing_list_end": "Oczekiwany token zamykający listę.",
"apps.error.parser.missing_quote": "Oczekiwany podwójny cudzysłów przed zakończeniem wprowadzania danych.",
"apps.error.parser.missing_source": "Formularz nie ma ani nadawcy, ani źródła.",
"apps.error.parser.missing_submit": "Nie ma rozmów lub formularzy.",
"apps.error.parser.missing_tick": "Oczekiwany podwójny cudzysłów przed zakończeniem wprowadzania danych.",
"apps.error.parser.multiple_equal": "Wielokrotne znaki `=` nie są dozwolone.",
"apps.error.parser.no_argument_pos_x": "Nie można zidentyfikować argumentu.",
"apps.error.parser.no_bindings": "Brak powiązań z poleceniami.",
"apps.error.parser.no_form": "Nie znaleziono formularza.",
"apps.error.parser.no_match": "`{command}`: Nie znaleziono pasującej komendy w tym obszarze roboczym.",
"apps.error.parser.no_slash_start": "Komenda musi zaczynać się od `/`.",
"apps.error.parser.unexpected_character": "Nieoczekiwany znak.",
"apps.error.parser.unexpected_comma": "Nieoczekiwany przecinek.",
"apps.error.parser.unexpected_error": "Nieoczekiwany błąd.",
"apps.error.parser.unexpected_flag": "Komenda nie akceptuje flagi `{flagName}`.",
"apps.error.parser.unexpected_squared_bracket": "Nieoczekiwane otwarcie listy.",
"apps.error.parser.unexpected_state": "Nieosiągalne: Nieoczekiwany stan matchBinding: `{state}`.",
"apps.error.parser.unexpected_whitespace": "Nieosiągalne: Nieoczekiwana spacja.",
"apps.error.responses.navigate.no_url": "Typ odpowiedzi to `navigate`, ale żaden adres url nie został zawarty w odpowiedzi.",
"apps.error.responses.unexpected_error": "Otrzymano nieoczekiwany błąd.",
"apps.error.responses.unknown_field_error": "Otrzymano błąd dla nieznanego pola. Nazwa pola: `{field}`. Błąd: `{error}`.",
"apps.error.responses.unknown_type": "Typ odpowiedzi aplikacji nie jest obsługiwany. Typ odpowiedzi: {type}.",
"apps.error.unknown": "Wystąpił nieznany błąd.",
"apps.suggestion.dynamic.error": "Błąd dynamicznego wyboru",
"apps.suggestion.errors.parser_error": "Błąd przetwarzania",
"apps.suggestion.no_dynamic": "Nie zwrócono żadnych danych dla sugestii dynamicznych",
"apps.suggestion.no_static": "Brak pasujących opcji.",
"apps.suggestion.no_suggestion": "Brak pasujących sugestii.",
"archivedChannelMessage": "Przeglądasz **zarchiwizowany kanał**. Nowe wiadomości nie mogą być wysłane.",
"camera_type.photo.option": "Przechwyć zdjęcie",
"camera_type.title": "Wybierz działanie",
"camera_type.video.option": "Nagraj wideo",
"center_panel.archived.closeChannel": "Zamknij Kanał",
"channel_info.header": "Nagłówek:",
"channel_loader.someone": "Ktoś",
"channel_modal.descriptionHelp": "Opisz jak ten kanał powinien być używany.",
"channel_modal.header": "Nagłówek",
"channel_modal.name": "Nazwa",
"channel_modal.optional": "(opcjonalne)",
"channel_modal.purpose": "Cel",
"combined_system_message.added_to_channel.many_expanded": "{users} i {lastUser} zostali **dodani do kanału** przez {actor}.",
"combined_system_message.added_to_channel.one": "{firstUser} został **dodany do kanału** przez {actor}.",
"combined_system_message.added_to_channel.one_you": "Zostałeś **dodany do kanału** przez {actor}.",
"combined_system_message.added_to_channel.two": "{firstUser} i {secondUser} zostali **dodani do kanału** przez {actor}.",
"combined_system_message.added_to_team.many_expanded": "{users} i {lastUser} zostali **dodani do zespołu** przez {actor}.",
"combined_system_message.added_to_team.one": "{firstUser} został **dodany do zespołu** przez {actor}.",
"combined_system_message.added_to_team.one_you": "Zostałeś **dodany do zespołu** przez {actor}.",
"combined_system_message.added_to_team.two": "{firstUser} i {secondUser} zostali **dodani do zespołu** przez {actor}.",
"combined_system_message.joined_channel.many_expanded": "{users} i {lastUser} **dołączyli do kanału**.",
"combined_system_message.joined_channel.one": "{firstUser} **dołączył do kanału**.",
"combined_system_message.joined_channel.one_you": "Ty **dołączyłeś do kanału**.",
"combined_system_message.joined_channel.two": "{firstUser} i {secondUser} **dołączyli do kanału**.",
"combined_system_message.joined_team.many_expanded": "{users} i {lastUser} **dołączyli do zespołu**.",
"combined_system_message.joined_team.one": "{firstUser} **dołączył do zespołu**.",
"combined_system_message.joined_team.one_you": "Ty **dołączyłeś do zespołu**.",
"combined_system_message.joined_team.two": "{firstUser} i {secondUser} **dołączyli do zespołu**.",
"combined_system_message.left_channel.many_expanded": "{users} i {lastUser} **opuścili kanał**.",
"combined_system_message.left_channel.one": "{firstUser} **opuścił kanał**.",
"combined_system_message.left_channel.one_you": "Ty **opuściłeś kanał**.",
"combined_system_message.left_channel.two": "{firstUser} i {secondUser} **opuścili kanał**.",
"combined_system_message.left_team.many_expanded": "{users} i {lastUser} **opuścili zespół**.",
"combined_system_message.left_team.one": "{firstUser} **opuścił zespół**.",
"combined_system_message.left_team.one_you": "Ty **opuściłeś zespół**.",
"combined_system_message.left_team.two": "{firstUser} i {secondUser} **opuścili zespół**.",
"combined_system_message.removed_from_channel.many_expanded": "{users} i {lastUser} zostali **usunięci z kanału**.",
"combined_system_message.removed_from_channel.one": "{firstUser} został **usunięty z kanału**.",
"combined_system_message.removed_from_channel.one_you": "Ty zostałeś **usunięty z kanału**.",
"combined_system_message.removed_from_channel.two": "{firstUser} i {secondUser} zostali **usunięci z kanału**.",
"combined_system_message.removed_from_team.many_expanded": "{users} i {lastUser} zostali **usunięci z zespołu**.",
"combined_system_message.removed_from_team.one": "{firstUser} został **usunięty z zespołu**.",
"combined_system_message.removed_from_team.one_you": "Zostałeś **usunięty z zespołu**.",
"combined_system_message.removed_from_team.two": "{firstUser} i {secondUser} zostali **usunięci z zespołu**.",
"combined_system_message.you": "Ty",
"create_post.deactivated": "Przeglądasz zarchiwizowany kanał z deaktywowanym użytkownikiem.",
"create_post.write": "Napisz na {channelDisplayName}",
"custom_status.expiry_dropdown.custom": "Własne",
"custom_status.expiry_dropdown.date_and_time": "Data i godzina",
"custom_status.expiry_dropdown.dont_clear": "Nie czyść",
"custom_status.expiry_dropdown.four_hours": "4 godziny",
"custom_status.expiry_dropdown.one_hour": "1 godzina",
"custom_status.expiry_dropdown.thirty_minutes": "30 minut",
"custom_status.expiry_dropdown.this_week": "W tym tygodniu",
"custom_status.expiry_dropdown.today": "Dzisiaj",
"custom_status.expiry_time.today": "Dzisiaj",
"custom_status.expiry_time.tomorrow": "Jutro",
"custom_status.expiry.at": "na",
"custom_status.expiry.until": "Dopóki",
"custom_status.failure_message": "Nie udało się zaktualizować statusu. Spróbuj ponownie",
"custom_status.suggestions.in_a_meeting": "Na spotkaniu",
"custom_status.suggestions.on_a_vacation": "Na wakacjach",
"custom_status.suggestions.out_for_lunch": "Jestem na lunchu",
"custom_status.suggestions.out_sick": "Na chorobowym",
"custom_status.suggestions.working_from_home": "Praca zdalna",
"date_separator.today": "Dzisiaj",
"date_separator.yesterday": "Wczoraj",
"edit_post.editPost": "Edytuj post...",
"edit_post.save": "Zapisz",
"emoji_picker.activities": "Działania",
"emoji_picker.animals-nature": "Zwierzęta i przyroda",
"emoji_picker.custom": "Własne",
"emoji_picker.flags": "Flagi",
"emoji_picker.food-drink": "Żywność i napoje",
"emoji_picker.objects": "Obiekty",
"emoji_picker.people-body": "Ludzie i ciało",
"emoji_picker.searchResults": "Wyniki Wyszukiwania",
"emoji_picker.smileys-emotion": "Uśmieszki i Emotikony",
"emoji_picker.symbols": "Symbole",
"emoji_picker.travel-places": "Podróże i miejsca",
"emoji_skin.dark_skin_tone": "odcień ciemnego wyglądu",
"emoji_skin.default": "domyślny odcień wyglądu",
"emoji_skin.light_skin_tone": "jasny odcień wyglądu",
"emoji_skin.medium_dark_skin_tone": "średnio szary odcień wyglądu",
"emoji_skin.medium_light_skin_tone": "średnio jasny odcień wyglądu",
"emoji_skin.medium_skin_tone": "średni odcień wyglądu",
"file_upload.fileAbove": "Plik musi być mniejszy niż {max}",
"friendly_date.daysAgo": "{count} {count, plural, one {dzień} other {dni}} temu",
"friendly_date.hoursAgo": "{count} {count, plural, one {godz} other {godz}} temu",
"friendly_date.minsAgo": "{count} {count, plural, one {min} other {min}} temu",
"friendly_date.monthsAgo": "{count} {count, plural, one {miesiąc} other {miesięcy}} temu",
"friendly_date.now": "Teraz",
"friendly_date.yearsAgo": "{count} {count, plural, one {rok} other {lat}} temu",
"friendly_date.yesterday": "Wczoraj",
"gallery.footer.channel_name": "Współdzielone w {channelName}",
"gallery.open_file": "Otwórz plik",
"get_post_link_modal.title": "Kopiuj odnośnik",
"global_threads.allThreads": "Wszystkie Twoje Wątki",
"global_threads.emptyThreads.message": "Wszystkie wątki, w których jesteś wspomniany lub w których brałeś udział będą tutaj widoczne wraz z wątkami, które śledziłeś.",
"global_threads.emptyThreads.title": "Nie ma jeszcze śledzonych wątków",
"global_threads.emptyUnreads.message": "Wygląda na to, że wszystko jest dograne.",
"global_threads.emptyUnreads.title": "Brak nieprzeczytanych wątków",
"global_threads.markAllRead.cancel": "Anuluj",
"global_threads.markAllRead.markRead": "Oznacz jako przeczytane",
"global_threads.markAllRead.message": "Zostanie usunięty status nieprzeczytany dla wszystkich twoich wątków pokazanych tutaj",
"global_threads.markAllRead.title": "Czy na pewno chcesz oznaczyć wszystkie wątki jako przeczytane?",
"global_threads.options.mark_as_read": "Oznacz jako przeczytane",
"global_threads.options.open_in_channel": "Otwórz na kanale",
"global_threads.unreads": "Nieprzeczytane",
"last_users_message.added_to_channel.type": "zostało **dodanych do kanału** przez {actor}.",
"last_users_message.added_to_team.type": "zostało **dodanych do zespołu** przez {actor}.",
"last_users_message.first": "{firstUser} i ",
"last_users_message.joined_channel.type": "**dołączył do kanału**.",
"last_users_message.joined_team.type": "**dołączył do zespołu**.",
"last_users_message.left_channel.type": "**opuścił kanał**.",
"last_users_message.left_team.type": "**opuścił zespół**.",
"last_users_message.others": "{numOthers} innych ",
"last_users_message.removed_from_channel.type": "został **usunięty z kanału**.",
"last_users_message.removed_from_team.type": "został **usunięty z zespołu**.",
"login_mfa.tokenReq": "Wprowadź token MFA",
"login.email": "E-mail",
"login.ldapUsername": "Nazwa użytkownika AD/LDAP",
"login.or": "lub",
"login.password": "Hasło",
"login.username": "Nazwa użytkownika",
"mobile.about.appVersion": "Wersja Aplikacji: {version} (Build {number})",
"mobile.account.settings.save": "Zapisz",
"mobile.action_menu.select": "Wybierz opcję",
"mobile.android.back_handler_exit": "Naciśnij przycisk wstecz, aby wyjść",
"mobile.android.photos_permission_denied_title": "{applicationName} chce uzyskać dostęp do twoich zdjęć",
"mobile.camera_photo_permission_denied_title": "{applicationName} chce uzyskać dostęp do aparatu",
"mobile.channel_info.alertNo": "Nie",
"mobile.channel_info.alertYes": "Tak",
"mobile.commands.error_title": "Błąd wykonywania komendy",
"mobile.components.select_server_view.connect": "Połączono",
"mobile.components.select_server_view.enterServerUrl": "Wprowadź adres URL serwera",
"mobile.components.select_server_view.proceed": "Kontynuuj",
"mobile.create_channel": "Utwórz",
"mobile.custom_status.choose_emoji": "Wybierz emotikonę",
"mobile.custom_status.clear_after": "Wyczyść po",
"mobile.custom_status.modal_confirm": "Ukończono",
"mobile.display_settings.theme": "Motyw",
"mobile.document_preview.failed_description": "Wystąpił błąd podczas otwierania dokumentu. Proszę, upewnij się, że zainstalowałeś przeglądarkę {fileType} i spróbuj ponownie.\n",
"mobile.document_preview.failed_title": "Otwieranie dokumentu się nie powiodło",
"mobile.downloader.disabled_description": "Pobieranie plików zostało wyłączone na tym serwerze. Proszę skontaktować się ze swoim Administratorem Systemu aby uzyskać więcej szczegółów.\n",
"mobile.downloader.disabled_title": "Pobieranie wyłączone",
"mobile.downloader.failed_description": "Wystąpił błąd podczas pobierania pliku. Proszę sprawdzić swoje połączenie z internetem i spróbować ponownie.\n",
"mobile.downloader.failed_title": "Pobieranie nie udane",
"mobile.edit_channel": "Zapisz",
"mobile.edit_post.title": "Edycja Wiadomości",
"mobile.error_handler.button": "Wznów",
"mobile.error_handler.description": "\nKliknij \"ponowne uruchomienie\" aby zrestartować aplikację. Po restarcie możesz zgłosić problem poprzez menu ustawień.\n",
"mobile.error_handler.title": "Wystąpił nieoczekiwany błąd",
"mobile.file_upload.disabled2": "Przesyłanie plików z telefonu komórkowego jest wyłączone.",
"mobile.file_upload.max_warning": "Dodawanie jest ograniczone do maksymalnie {count} plików.",
"mobile.files_paste.error_description": "Podczas wklejania pliku(ów) wystąpił błąd. Spróbuj ponownie.",
"mobile.files_paste.error_dismiss": "Odrzuć",
"mobile.files_paste.error_title": "Wklejenie nie powiodło się",
"mobile.gallery.title": "{index} z {total}",
"mobile.ios.photos_permission_denied_title": "{applicationName} chciałaby uzyskać dostęp do twoich zdjęć",
"mobile.link.error.text": "Nie można otworzyć linku.",
"mobile.link.error.title": "Błąd",
"mobile.managed.blocked_by": "Zablokowany przez {vendor}",
"mobile.managed.exit": "Wyjście",
"mobile.managed.jailbreak": "Urządzenia z Jailbreakiem nie są zaufane przez {vendor}, proszę wyjść z aplikacji.",
"mobile.managed.not_secured.android": "To urządzenie musi zostać zabezpieczone blokadą ekranu, aby użyć Mattermost.",
"mobile.managed.not_secured.ios": "To urządzenie musi zostać zabezpieczone hasłem, aby używać Mattermost.\n\nIdz do Ustawienia > Identyfikacja twarzy i hasło.",
"mobile.managed.not_secured.ios.touchId": "To urządzenie musi zostać zabezpieczone hasłem, aby używać Mattermost.\n\nPrzejdź do Ustawienia > Touch ID i Hasło.",
"mobile.managed.secured_by": "Zabezpieczony przez {vendor}",
"mobile.managed.settings": "Idz do ustawień",
"mobile.markdown.code.copy_code": "Skopiuj Kod",
"mobile.markdown.code.plusMoreLines": "+{count, number} więcej {count, plural, one {line} other {lines}}",
"mobile.markdown.image.too_large": "Obrazek przekracza maksymalne rozmiary szerokości {maxWidth} oraz {maxHeight} wysokości:",
"mobile.markdown.link.copy_url": "Kopiuj URL",
"mobile.mention.copy_mention": "Kopiuj wzmiankę",
"mobile.message_length.message": "Twoja aktualna wiadomość jest za długa. Aktualna liczba znaków: {max}/{count}",
"mobile.message_length.message_split_left": "Wiadomość przekracza limit znaków",
"mobile.message_length.title": "Długość Wiadomości",
"mobile.microphone_permission_denied_description": "Aby wziąć udział w tym połączeniu, otwórz Ustawienia, aby umożliwić Mattermost dostęp do mikrofonu.",
"mobile.microphone_permission_denied_title": "{applicationName} chce uzyskać dostęp do swojego mikrofonu",
"mobile.oauth.failed_to_login": "Twoja próba logowania nie powiodła się. Proszę spróbować ponownie.",
"mobile.oauth.failed_to_open_link": "Nie udało się otworzyć linku. Proszę spróbować ponownie.",
"mobile.oauth.something_wrong": "Coś poszło nie tak",
"mobile.oauth.try_again": "Spróbuj ponownie",
"mobile.open_gm.error": "Nie możemy otworzyć wiadomości grupowej z tymi użytkownikami. Sprawdź połączenie i spróbuj ponownie.",
"mobile.permission_denied_dismiss": "Nie pozwalaj",
"mobile.permission_denied_retry": "Ustawienia",
"mobile.post_info.add_reaction": "Dodaj Reakcję",
"mobile.post_info.copy_text": "Kopiuj Tekst",
"mobile.post_info.mark_unread": "Oznacz jako nieprzeczytane",
"mobile.post_info.pin": "Przypnij do kanału",
"mobile.post_info.reply": "Odpowiedź",
"mobile.post_info.unpin": "Odepnij od kanału",
"mobile.post_pre_header.pinned": "Przypięty",
"mobile.post_textbox.entire_channel_here.message": "Używając @here zamierzasz wysyłać powiadomienia do {totalMembers, number} {totalMembers, plural, one {osoby} other {osób}} więcej. Czy jesteś pewien, że chcesz to zrobić?",
"mobile.post_textbox.entire_channel_here.message.with_timezones": "Używając @here zamierzasz wysyłać powiadomienia do {totalMembers, number} {totalMembers, plural, one {osoby} other {osób}} więcej, w {timezones, number} {timezones, plural, one {strefie czasowej} other {strefach czasowych}}. Czy jesteś pewien, że chcesz to zrobić?",
"mobile.post_textbox.entire_channel.cancel": "Anuluj",
"mobile.post_textbox.entire_channel.confirm": "Potwierdź",
"mobile.post_textbox.entire_channel.message": "Z pomocą @all lub @channel, zamierzasz wysyłać powiadomienia do {totalMembers, number} {totalMembers, plural, one {person} other {people}}. Jesteś pewien, że chcesz to zrobić?",
"mobile.post_textbox.entire_channel.message.with_timezones": "Z pomocą @all lub @channel, który zamierzasz wysyłać powiadomienia do {totalMembers, number} {totalMembers, plural, one {person} other {people}} in {timezones, number} {timezones, plural, one {timezone} other {timezones}}.. Jesteś pewien, że chcesz to zrobić?",
"mobile.post_textbox.entire_channel.title": "Potwierdź wysyłanie powiadomień do całego kanału",
"mobile.post_textbox.groups.title": "Confirm sending notifications to groups",
"mobile.post_textbox.uploadFailedDesc": "Niektórych załączników nie udało się przesłać na serwer. Czy na pewno chcesz opublikować wiadomość?",
"mobile.post_textbox.uploadFailedTitle": "Błąd załącznika",
"mobile.post.cancel": "Anuluj",
"mobile.post.delete_question": "Czy na pewno chcesz usunąć tą wiadomość?",
"mobile.post.delete_title": "Usuń wiadomość",
"mobile.post.failed_delete": "Usuń wiadomość",
"mobile.post.failed_retry": "Spróbuj ponownie",
"mobile.posts_view.moreMsg": "Więcej Nowych Wiadomości Powyżej",
"mobile.privacy_link": "Polityka prywatności",
"mobile.push_notification_reply.button": "Wyślij",
"mobile.push_notification_reply.placeholder": "Napisz odpowiedź...",
"mobile.push_notification_reply.title": "Odpowiedź",
"mobile.rename_channel.display_name_maxLength": "Nazwa kanału musi posiadać mniej niż {maxLength, number} znaków",
"mobile.rename_channel.display_name_minLength": "Nazwa kanału musi zawierać{minLength, number} lub więcej znaków",
"mobile.rename_channel.display_name_required": "Nazwa kanału jest wymagana",
"mobile.request.invalid_response": "Nieprawidłowa odpowiedź od serwera.",
"mobile.reset_status.alert_cancel": "Anuluj",
"mobile.reset_status.title_ooo": "Wyłączyć \"poza biurem\"?",
"mobile.routes.code": "{language} Kod",
"mobile.routes.code.noLanguage": "Kod",
"mobile.routes.custom_status": "Ustaw status",
"mobile.routes.table": "Tabela",
"mobile.routes.user_profile": "Profil",
"mobile.search.jump": "Przejdź do najnowszych wiadomości",
"mobile.server_link.error.text": "Link nie może być znaleziony na tym serwerze.",
"mobile.server_link.error.title": "Link Error",
"mobile.server_link.unreachable_channel.error": "Permalink należy do usuniętych wiadomości lub do kanału, do którego nie masz dostępu.",
"mobile.server_link.unreachable_team.error": "Permalink należy do usuniętych wiadomości lub do kanału, do którego nie masz dostępu.",
"mobile.server_upgrade.alert_description": "Ta wersja serwera nie jest wspierana i użytkownicy będą narażeni na problemy z kompatybilnością, które powodują awarie lub poważne błędy podważające podstawową funkcjonalność aplikacji. Wymagana jest aktualizacja do wersji serwera {serverVersion} lub nowszej.",
"mobile.server_upgrade.button": "OK",
"mobile.server_upgrade.dismiss": "Odrzuć",
"mobile.server_upgrade.learn_more": "Dowiedz się więcej",
"mobile.server_upgrade.title": "Wymagane uaktualnienie serwera",
"mobile.server_url.empty": "Proszę wprowadzić prawidłowy adres URL serwera",
"mobile.server_url.invalid_format": "Adres musi zaczynać się od http:// lub https://",
"mobile.set_status.away": "Zaraz wracam",
"mobile.set_status.dnd": "Nie przeszkadzać",
"mobile.set_status.offline": "Offline",
"mobile.set_status.online": "Dostępny",
"mobile.storage_permission_denied_title": "{applicationName} chce otrzymać dostęp do twoich plików",
"mobile.suggestion.members": "Użytkownicy",
"mobile.system_message.channel_archived_message": "{username} zarchiwizował kanał",
"mobile.system_message.channel_unarchived_message": "{username} zarchiwizował kanał",
"mobile.system_message.update_channel_displayname_message_and_forget.updated_from": "{username} zaktualizowała nazwę wyświetlaną kanału z: {oldDisplayName} do: {newDisplayName}",
"mobile.system_message.update_channel_header_message_and_forget.removed": "{username} usunął nagłówek kanału (był: : {oldHeader})",
"mobile.system_message.update_channel_header_message_and_forget.updated_from": "{username} zaktualizował nagłówek kanału z: {oldHeader} na: {newHeader}",
"mobile.system_message.update_channel_header_message_and_forget.updated_to": "{username} zaktualizował nagłówek kanału na: {newHeader}",
"mobile.system_message.update_channel_purpose_message.removed": "{username} usunął cel kanału (było: {oldPurpose})",
"mobile.system_message.update_channel_purpose_message.updated_from": "{username} zaktualizował cel kanału z: {oldPurpose} na: {newPurpose}",
"mobile.system_message.update_channel_purpose_message.updated_to": "{username} zaktualizował cel kanału na: {newPurpose}",
"mobile.tos_link": "Warunki korzystania z usługi",
"mobile.unsupported_server.message": "Załączniki, podglądy linków, reakcje i dane osadzone mogą nie być wyświetlane poprawnie. Jeśli ten problem nadal występuje, skontaktuj się z Administratorem Systemu, aby zaktualizować serwer Mattermost.",
"mobile.unsupported_server.ok": "OK",
"mobile.unsupported_server.title": "Niewspierana wersja serwera",
"mobile.user_list.deactivated": "Dezaktywowano",
"modal.manual_status.auto_responder.message_": "Czy chcesz zmienić swój status na \"{status}\" i wyłączyć automatyczne odpowiedzi?",
"modal.manual_status.auto_responder.message_away": "Czy chcesz zmienić swój status na \"Zaraz Wracam\" i wyłączyć automatyczne odpowiedzi?",
"modal.manual_status.auto_responder.message_dnd": "Czy chcesz zmienić swój status na \"Nie przeszkadzać\" i wyłączyć automatyczne odpowiedzi?",
"modal.manual_status.auto_responder.message_offline": "Czy chcesz zmienić swój status na \"Offline\" i wyłączyć automatyczne odpowiedzi?",
"modal.manual_status.auto_responder.message_online": "Czy chcesz zmienić swój status na \"Online\" i wyłączyć automatyczne odpowiedzi?",
"msg_typing.areTyping": "{users} i {last} piszą...",
"msg_typing.isTyping": "{user} pisze...",
"password_send.description": "Aby zresetować hasło musisz podać e-mail, którego użyłeś w trakcie rejestracji",
"password_send.error": "Podaj poprawny adres e-mail.",
"password_send.link": "Jeśli konto istnieje, wiadomość e-mail dotycząca resetowania hasła zostanie wysłana na adres:",
"permalink.show_dialog_warn.cancel": "Anuluj",
"permalink.show_dialog_warn.join": "Dołącz do",
"permalink.show_dialog_warn.title": "Dołącz do kanału prywatnego",
"post_body.check_for_out_of_channel_groups_mentions.message": "nie zostali powiadomieni poprzez tą wzmiankę, ponieważ nie są na kanale. Nie można ich dodać do kanału, ponieważ nie są członkami grup połączonych. Aby dodać je do tego kanału, muszą zostać dodane do połączonych grup.",
"post_body.check_for_out_of_channel_mentions.link.and": " i ",
"post_body.check_for_out_of_channel_mentions.link.private": "dodaj je do tego prywatnego kanału",
"post_body.check_for_out_of_channel_mentions.link.public": "dodaj je do kanału",
"post_body.check_for_out_of_channel_mentions.message_last": "? Będą mieć dostęp do całej historii wiadomości.",
"post_body.check_for_out_of_channel_mentions.message.multiple": "zostały wspomniane, ale nie są w kanale. Czy chciałbyś ",
"post_body.check_for_out_of_channel_mentions.message.one": "został wspomniany, ale nie ma go w kanale. Czy chciałbyś ",
"post_body.commentedOn": "Skomentowane w {name}{apostrophe} wiadomości: ",
"post_body.deleted": "(wiadomość usunięta)",
"post_info.del": "Usuń",
"post_info.edit": "Edytuj",
"post_info.system": "System",
"post_message_view.edited": "(edytowany)",
"posts_view.newMsg": "Nowe Wiadomości",
"search_bar.search": "Szukaj",
"status_dropdown.set_away": "Zaraz wracam",
"status_dropdown.set_dnd": "Nie przeszkadzać",
"status_dropdown.set_offline": "Offline",
"status_dropdown.set_online": "Dostępny",
"suggestion.mention.all": "Powiadamia wszystkich na tym kanale",
"suggestion.mention.channel": "Powiadamia wszystkich na tym kanale",
"suggestion.mention.channels": "Moje kanały",
"suggestion.mention.groups": "Group Mentions",
"suggestion.mention.here": "Powiadamia wszystkich obecnie dostępnych na kanale",
"suggestion.mention.members": "Członkowie kanału",
"suggestion.mention.morechannels": "Inne kanały",
"suggestion.mention.nonmembers": "Nie na kanale",
"suggestion.mention.special": "Specjalne wzmianki",
"suggestion.mention.you": " (you)",
"suggestion.search.direct": "Wiadomości bezpośrednie",
"suggestion.search.private": "Kanały prywatne",
"suggestion.search.public": "Kanały publiczne",
"threads": "Wątki",
"threads.deleted": "Oryginalna wiadomość Usunięta",
"threads.follow": "Obserwuj",
"threads.following": "Obserwując",
"threads.followMessage": "Obserwuj Wiadomość",
"threads.followThread": "Obserwuj Wątek",
"threads.newReplies": "{count} {count, plural, one {nowa odpowiedź} other {nowe odpowiedzi}}",
"threads.replies": "{count} {count, plural, one {odpowiedź} other {odpowiedzi}}",
"threads.unfollowMessage": "Przestań obserwować wiadomość",
"threads.unfollowThread": "Przestań obserwować Wątek",
"user.settings.general.email": "E-mail",
"user.settings.general.firstName": "Imię",
"user.settings.general.lastName": "Nazwisko",
"user.settings.general.nickname": "Pseudonim",
"user.settings.general.position": "Stanowisko",
"user.settings.general.username": "Nazwa użytkownika",
"alert.channel_deleted.title": "Kanał zarchiwizowany",
"alert.channel_deleted.description": "Kanał {displayName} został zarchiwizowany.",
"advanced_settings.delete_data": "Usuń dokumenty i dane",
"account.your_profile": "Twój Profil",
"account.user_status.title": "Obecność użytkownika",
"account.settings": "Ustawienia",
"account.logout_from": "Wyloguj się z {serverName}",
"account.logout": "Wyloguj się"
}

View File

@@ -1,382 +1,386 @@
{
"about.date": "Дата сборки:",
"about.enterpriseEditione1": "Корпоративная редакция",
"about.enterpriseEditionLearn": "Подробнее о Корпоративной редакции читайте на ",
"about.enterpriseEditionSt": "Современное общение в вашей внутренней сети.",
"about.hash": "Хэш сборки:",
"about.hashee": "Хэш сборки EE:",
"about.teamEditionLearn": "Присоединяйтесь к сообществу Mattermost на ",
"about.teamEditionSt": "Всё общение вашей команды собрано в одном месте, с мгновенным поиском и доступом отовсюду.",
"about.teamEditiont0": "Командная редакция",
"about.teamEditiont1": "Корпоративная редакция",
"api.channel.add_guest.added": "{addedUsername} добавлен в канал как гость участником {username}.",
"api.channel.add_member.added": "{addedUsername} добавлен в канал участником {username}.",
"api.channel.guest_join_channel.post_and_forget": "{username} присоединился к каналу как гость.",
"apps.error": "Ошибка: {error}",
"apps.error.command.field_missing": "Обязательные поля отсутствуют: `{fieldName}`.",
"apps.error.command.same_channel": "Канал повторяется для поля `{fieldName}`: `{option}`.",
"apps.error.command.same_option": "Опция повторяется для поля `{fieldName}`: `{option}`.",
"apps.error.command.same_user": "Пользователь повторяется для поля `{fieldName}`: `{option}`.",
"apps.error.command.unknown_channel": "Неизвестный канал для поля `{fieldName}`: `{option}`.",
"apps.error.command.unknown_option": "Неизвестная опция для поля `{fieldName}`: `{option}`.",
"apps.error.command.unknown_user": "Неизвестный пользователь для поля `{fieldName}`: `{option}`.",
"apps.error.form.no_form": "`form` не определено.",
"apps.error.form.no_lookup": "`lookup` не задано.",
"apps.error.form.no_source": "`source` не определен.",
"apps.error.form.no_submit": "`submit` не определен",
"apps.error.form.refresh": "Произошла ошибка при извлечении выбранных полей. Свяжитесь с разработчиком приложения. Подробности: {details}",
"apps.error.form.refresh_no_refresh": "Вызывается \"Обновить\" для необновляемого поля.",
"apps.error.form.submit.pretext": "Произошла ошибка при отправке формы. Свяжитесь с разработчиком приложения. Подробности: {details}",
"apps.error.lookup.error_preparing_request": "Ошибка при подготовке запроса на поиск: {errorMessage}",
"apps.error.malformed_binding": "Эта привязка неправильно сформирована. Свяжитесь с разработчиком приложения.",
"apps.error.parser": "Ошибка разбора: {error}",
"apps.error.parser.execute_non_leaf": "Вы должны выбрать подкоманду.",
"apps.error.parser.missing_binding": "Отсутствуют привязки команд.",
"apps.error.parser.missing_field_value": "Значение поля отсутствует.",
"apps.error.parser.missing_list_end": "Ожидается токен закрытия списка.",
"apps.error.parser.missing_quote": "Ожидается парная двойная кавычка до конца строки ввода.",
"apps.error.parser.missing_source": "Форма не имеет ни отправки, ни источника.",
"apps.error.parser.missing_submit": "Нет вызова отправки в привязке или форме.",
"apps.error.parser.missing_tick": "Ожидается парный апостроф до конца строки ввода.",
"apps.error.parser.multiple_equal": "Множественные знаки `=` не допускаются.",
"apps.error.parser.no_argument_pos_x": "Невозможно идентифицировать аргумент.",
"apps.error.parser.no_bindings": "Нет привязки команды.",
"apps.error.parser.no_form": "Форма не найдена.",
"apps.error.parser.no_match": "`{command}`: нет совпадений в этой рабочей области.",
"apps.error.parser.no_slash_start": "Команда должна начинаться с `/`.",
"apps.error.parser.unexpected_character": "Неожиданный символ.",
"apps.error.parser.unexpected_comma": "Неожиданная запятая.",
"apps.error.parser.unexpected_error": "Неожиданная ошибка.",
"apps.error.parser.unexpected_flag": "Команда не принимает флаг `{flagName}`.",
"apps.error.parser.unexpected_squared_bracket": "Неожиданное открытие списка.",
"apps.error.parser.unexpected_state": "Недоступно: Неожиданное состояние в matchBinding: `{state}`.",
"apps.error.parser.unexpected_whitespace": "Недоступно: Неожиданные пробелы.",
"apps.error.responses.navigate.no_url": "Тип ответа `navigate`, но в ответ не был включен ни один url.",
"apps.error.responses.unexpected_error": "Получена неожиданная ошибка.",
"apps.error.responses.unknown_field_error": "Получена ошибка для неизвестного поля. Имя поля: `{field}`. Ошибка: `{error}`.",
"apps.error.responses.unknown_type": "Тип ответа приложения не поддерживается. Тип ответа: {type}.",
"apps.error.unknown": "Произошла неизвестная ошибка.",
"apps.suggestion.dynamic.error": "Ошибка динамического выбора",
"apps.suggestion.errors.parser_error": "Ошибка разбора",
"apps.suggestion.no_dynamic": "Нет данных для динамических предложений",
"apps.suggestion.no_static": "Нет подходящих вариантов.",
"apps.suggestion.no_suggestion": "Нет подходящих предложений.",
"archivedChannelMessage": "Вы просматриваете **архивированный канал**. Создание новых сообщений запрещено.",
"camera_type.photo.option": "Сделать фото",
"camera_type.title": "Выберите действие",
"camera_type.video.option": "Записать видео",
"center_panel.archived.closeChannel": "Закрыть канал",
"channel_info.header": "Заголовок:",
"channel_loader.someone": "Кто-то",
"channel_modal.descriptionHelp": "Опишите, как следует использовать этот канал.",
"channel_modal.header": "Заголовок",
"channel_modal.name": "Имя",
"channel_modal.optional": "(необязательно)",
"channel_modal.purpose": "Назначение",
"combined_system_message.added_to_channel.many_expanded": "{users} и {lastUser} были **добавлены на канал** пользователем {actor}.",
"combined_system_message.added_to_channel.one": "{firstUser} **приглашается на канал**. Кем: {actor}.",
"combined_system_message.added_to_channel.one_you": "Вы были **добавлены на канал** пользователем {actor}.",
"combined_system_message.added_to_channel.two": "{firstUser} и {secondUser} **приглашены в команду пользователем** {actor}.",
"combined_system_message.added_to_team.many_expanded": "{users} и {lastUser} были **добавлены в команду** пользователем {actor}.",
"combined_system_message.added_to_team.one": "{firstUser} **приглашается в команду** пользователем {actor}.",
"combined_system_message.added_to_team.one_you": "Вы были **добавлены в команду** пользователем {actor}.",
"combined_system_message.added_to_team.two": "{firstUser} и {secondUser} **добавлены в команду** пользователем {actor}.",
"combined_system_message.joined_channel.many_expanded": "{users} и {lastUser} **присоединились к каналу**.",
"combined_system_message.joined_channel.one": "{firstUser} - **выполнен вход на канал**.",
"combined_system_message.joined_channel.one_you": "Вы **подключились к каналу**.",
"combined_system_message.joined_channel.two": "{firstUser} и {secondUser} **присоединились к каналу**.",
"combined_system_message.joined_team.many_expanded": "{users} и {lastUser} **присоединились к команде**.",
"combined_system_message.joined_team.one": "{firstUser} **присоединяется к команде**.",
"combined_system_message.joined_team.one_you": "Вы **присоединились к команде**.",
"combined_system_message.joined_team.two": "{firstUser} и {secondUser} **присоединились к команде**.",
"combined_system_message.left_channel.many_expanded": "{users} и {lastUser} **покинули канал**.",
"combined_system_message.left_channel.one": "{firstUser} **покинул канал**.",
"combined_system_message.left_channel.one_you": "Вы **покинули канал**.",
"combined_system_message.left_channel.two": "{firstUser} и {secondUser} **покинули канал**.",
"combined_system_message.left_team.many_expanded": "{users} и {lastUser} **покинули команду**.",
"combined_system_message.left_team.one": "{firstUser} **покидает команду**.",
"combined_system_message.left_team.one_you": "Вы **покинули команду**.",
"combined_system_message.left_team.two": "{firstUser} и {secondUser} **покинули команду**.",
"combined_system_message.removed_from_channel.many_expanded": "{users} и {lastUser} **удалены с канала**.",
"combined_system_message.removed_from_channel.one": "{firstUser} был **удалён с канала**.",
"combined_system_message.removed_from_channel.one_you": "Вы были **удалены с канала**.",
"combined_system_message.removed_from_channel.two": "{firstUser} и {secondUser} были **удалены с канала**.",
"combined_system_message.removed_from_team.many_expanded": "{users} и {lastUser} **удалены из команды**.",
"combined_system_message.removed_from_team.one": "{firstUser} был **удалён из команды**.",
"combined_system_message.removed_from_team.one_you": "Вы были **удалены с канала**.",
"combined_system_message.removed_from_team.two": "{firstUser} и {secondUser} **удалены из команды**.",
"combined_system_message.you": "Вы",
"create_post.deactivated": "Вы просматриваете архивированный канал как деактивированный пользователь.",
"create_post.write": "Написать в {channelDisplayName}",
"custom_status.expiry_dropdown.custom": "Настраиваемое",
"custom_status.expiry_dropdown.date_and_time": "Дата и время",
"custom_status.expiry_dropdown.dont_clear": "Не очищать",
"custom_status.expiry_dropdown.four_hours": "4 часа",
"custom_status.expiry_dropdown.one_hour": "1 час",
"custom_status.expiry_dropdown.thirty_minutes": "30 минут",
"custom_status.expiry_dropdown.this_week": "На этой неделе",
"custom_status.expiry_dropdown.today": "Cегодня",
"custom_status.expiry_time.today": "Cегодня",
"custom_status.expiry_time.tomorrow": "Завтра",
"custom_status.expiry.at": "в",
"custom_status.expiry.until": "До",
"custom_status.failure_message": "Не удалось обновить статус. Попробуй еще раз",
"custom_status.suggestions.in_a_meeting": "На встрече",
"custom_status.suggestions.on_a_vacation": "В отпуске",
"custom_status.suggestions.out_for_lunch": "На обеде",
"custom_status.suggestions.out_sick": "На больничном",
"custom_status.suggestions.working_from_home": "Работаю из дома",
"date_separator.today": "Cегодня",
"date_separator.yesterday": "Вчера",
"edit_post.editPost": "Редактировать сообщение...",
"edit_post.save": "Сохранить",
"emoji_picker.activities": "Мероприятия",
"emoji_picker.animals-nature": "Животные и природа",
"emoji_picker.custom": "Настраиваемое",
"emoji_picker.flags": "Флаги",
"emoji_picker.food-drink": "Еда и напитки",
"emoji_picker.objects": "Объекты",
"emoji_picker.people-body": "Люди и тело",
"emoji_picker.searchResults": "Результаты поиска",
"emoji_picker.smileys-emotion": "Смайлы и эмоции",
"emoji_picker.symbols": "Символы",
"emoji_picker.travel-places": "Путешествия и места",
"emoji_skin.dark_skin_tone": "темный оттенок кожи",
"emoji_skin.default": "оттенок кожи по умолчанию",
"emoji_skin.light_skin_tone": "светлый оттенок кожи",
"emoji_skin.medium_dark_skin_tone": "средне-темный оттенок кожи",
"emoji_skin.medium_light_skin_tone": "средне-светлый оттенок кожи",
"emoji_skin.medium_skin_tone": "средний оттенок кожи",
"file_upload.fileAbove": "Файлы должны быть меньше {max}МБ",
"friendly_date.daysAgo": "{count} {count, plural, one {день} few{дня} other {дней}} назад",
"friendly_date.hoursAgo": "{count} {count, plural, one {час} few{часа} other {часов}} назад",
"friendly_date.minsAgo": "{count} {count, plural, one {минута} few{минуты} other {минут}} назад",
"friendly_date.monthsAgo": "{count} {count, plural, one {месяц} few{месяца} other {месяцев}} назад",
"friendly_date.now": "Сейчас",
"friendly_date.yearsAgo": "{count} {count, plural, one {год} few{года} other {лет}} назад",
"friendly_date.yesterday": "Вчера",
"gallery.footer.channel_name": "Поделились в {channelName}",
"gallery.open_file": "Открыть файл",
"get_post_link_modal.title": "Скопировать ссылку",
"global_threads.allThreads": "Все ваши обсуждения",
"global_threads.emptyThreads.message": "Здесь будут показаны все обсуждения, в которых вы упоминались или в которых вы участвовали, вместе с любыми обсуждениями, на которые вы подписаны.",
"global_threads.emptyThreads.title": "Пока нет подписок",
"global_threads.emptyUnreads.message": "Похоже, вы все догнали.",
"global_threads.emptyUnreads.title": "Нет непрочитанных цепочек",
"global_threads.markAllRead.cancel": "Отмена",
"global_threads.markAllRead.markRead": "Отметить как прочитанное",
"global_threads.markAllRead.message": "Это очистит любой непрочитанный статус для всех ваших цепочек, показанных здесь",
"global_threads.markAllRead.title": "Вы действительно хотите отметить все цепочки как прочитанные?",
"global_threads.options.mark_as_read": "Пометить как прочитанное",
"global_threads.options.open_in_channel": "Открыть в канале",
"global_threads.unreads": "Непрочитанные",
"last_users_message.added_to_channel.type": "**добавлены на канал**. Кем: {actor}.",
"last_users_message.added_to_team.type": "были **добавлены в команду** пользователем {actor}.",
"last_users_message.first": "{firstUser} и ",
"last_users_message.joined_channel.type": "**присоединился к каналу**.",
"last_users_message.joined_team.type": "присоединяется к команде.",
"last_users_message.left_channel.type": "**покинул канал**.",
"last_users_message.left_team.type": "**покинул команду**.",
"last_users_message.others": "{numOthers} других ",
"last_users_message.removed_from_channel.type": "были **удалены с канала**.",
"last_users_message.removed_from_team.type": "были **удалены из команды**.",
"login_mfa.tokenReq": "Пожалуйста, введите токен МФА",
"login.email": "Электронная почта",
"login.ldapUsername": "Имя пользователя AD/LDAP",
"login.or": "или",
"login.password": "Пароль",
"login.username": "Имя пользователя",
"mobile.about.appVersion": "Версия приложения: {version} (Сборка {number})",
"mobile.account.settings.save": "Сохранить",
"mobile.action_menu.select": "Выберите опцию",
"mobile.android.back_handler_exit": "Нажмите еще раз, чтобы выйти",
"mobile.android.photos_permission_denied_title": "{applicationName} хотело бы получить доступ к вашим фотографиям",
"mobile.camera_photo_permission_denied_title": "{applicationName} хотел бы получить доступ к вашей камере",
"mobile.channel_info.alertNo": "Нет",
"mobile.channel_info.alertYes": "Да",
"mobile.commands.error_title": "Ошибка при выполнении команды",
"mobile.components.select_server_view.connect": "Подключиться",
"mobile.components.select_server_view.enterServerUrl": "Введите адрес сервера",
"mobile.components.select_server_view.proceed": "Продолжить",
"mobile.create_channel": "Создать",
"mobile.custom_status.choose_emoji": "Выберите смайлик",
"mobile.custom_status.clear_after": "Очистить после",
"mobile.custom_status.modal_confirm": "Готово",
"mobile.display_settings.theme": "Тема",
"mobile.document_preview.failed_description": "Ошибка при открытии документа. Пожалуйста, убедитесь, что у вас есть приложение для просмотра {fileType} и попробуйте снова.\n",
"mobile.document_preview.failed_title": "Ошибка открытия документа",
"mobile.downloader.disabled_description": "Этот сервер не разрешает скачивать файлы. Пожалуйста, обратитесь к системному администратору за подробностями.\n",
"mobile.downloader.disabled_title": "Загрузки отключены",
"mobile.downloader.failed_description": "Ошибка загрузки файла. Пожалуйста, проверьте своё интернет соединение и попробуйте снова.\n",
"mobile.downloader.failed_title": "Ошибка загрузки",
"mobile.edit_channel": "Сохранить",
"mobile.edit_post.title": "Редактирование сообщения",
"mobile.error_handler.button": "Перезапустить",
"mobile.error_handler.description": "\nНажмите на кнопку Перезапустить, чтобы открыть приложение заново. После запуска, вы можете сообщить о проблеме через меню настроек.\n",
"mobile.error_handler.title": "Произошла непредвиденная ошибка",
"mobile.file_upload.disabled2": "Загрузка файлов с мобильного устройства отключена.",
"mobile.file_upload.max_warning": "Количество загрузок ограничено: не более {count} файлов.",
"mobile.files_paste.error_description": "Ошибка при отправке файлов. Пожалуйста, попробуйте снова.",
"mobile.files_paste.error_dismiss": "Отмена",
"mobile.files_paste.error_title": "Вставить не удалось",
"mobile.gallery.title": "{index} из {total}",
"mobile.ios.photos_permission_denied_title": "{applicationName} хотело бы получить доступ к вашим фотографиям",
"mobile.link.error.text": "Невозможно открыть ссылку.",
"mobile.link.error.title": "Ошибка",
"mobile.managed.blocked_by": "Заблокирован {vendor}",
"mobile.managed.exit": "Выход",
"mobile.managed.jailbreak": "Устройства с джейлбрейком не являются доверенными {vendor}, выйдите из приложения.",
"mobile.managed.not_secured.android": "Это устройство должно быть защищено с помощью блокировки экрана, чтобы использовать Mattermost.",
"mobile.managed.not_secured.ios": "Это устройство должно быть защищено паролем для использования Mattermost. \n\nПерейдите в Настройки > Face ID и пароль.",
"mobile.managed.not_secured.ios.touchId": "Это устройство должно быть защищено паролем для использования Mattermost.\n\nПерейдите в Настройки > Touch ID и пароль.",
"mobile.managed.secured_by": "Защищено {vendor}",
"mobile.managed.settings": "Перейти к настройкам",
"mobile.markdown.code.copy_code": "Скопировать код",
"mobile.markdown.code.plusMoreLines": "еще +{count, number} {count, plural, one {строка} few {строки} other {строк}}",
"mobile.markdown.image.too_large": "Изображение превышает максимальное разрешение {maxWidth} на {maxHeight}:",
"mobile.markdown.link.copy_url": "Скопировать URL",
"mobile.mention.copy_mention": "Скопировать упоминание",
"mobile.message_length.message": "Слишком длинное сообщение. Текущее количество знаков: {count}/{max}",
"mobile.message_length.message_split_left": "Сообщение превышает лимит символов",
"mobile.message_length.title": "Длина сообщения",
"mobile.microphone_permission_denied_description": "Чтобы принять участие в этом вызове, откройте «Настройки», чтобы предоставить Mattermost доступ к вашему микрофону.",
"mobile.microphone_permission_denied_title": "{applicationName} хочет получить доступ к вашему микрофону",
"mobile.oauth.failed_to_login": "Ваша попытка входа не удалась. Пожалуйста, попробуйте ещё раз.",
"mobile.oauth.failed_to_open_link": "Ссылка не открылась. Пожалуйста, попробуйте еще раз.",
"mobile.oauth.something_wrong": "Что-то пошло не так",
"mobile.oauth.try_again": "Попробовать ещё",
"mobile.open_gm.error": "Не удалось открыть групповое сообщение с этими пользователями. Пожалуйста, проверьте подключение и попробуйте заново.",
"mobile.permission_denied_dismiss": "Не разрешать",
"mobile.permission_denied_retry": "Параметры",
"mobile.post_info.add_reaction": "Добавить реакцию",
"mobile.post_info.copy_text": "Копировать текст",
"mobile.post_info.mark_unread": "Пометить как непрочитанное",
"mobile.post_info.pin": "Прикрепить сообщение",
"mobile.post_info.reply": "Ответить",
"mobile.post_info.unpin": "Открепить сообщение",
"mobile.post_pre_header.pinned": "Прикреплено",
"mobile.post_textbox.entire_channel_here.message": "Используя @here, Вы собираетесь отправлять уведомления {totalMembers, number} {totalMembers, plural, one {человеку} other {людям}}. Вы уверены, что хотите это сделать?",
"mobile.post_textbox.entire_channel_here.message.with_timezones": "Используя @here, вы собираетесь отправить уведомления {totalMembers, number} {totalMembers, plural, one {человеку} other {людям}} в {timezones, number} {timezones, plural, one {часовом поясе} other {часовых поясах}}. Вы уверены, что хотите это сделать?",
"mobile.post_textbox.entire_channel.cancel": "Отмена",
"mobile.post_textbox.entire_channel.confirm": "Подтвердить",
"mobile.post_textbox.entire_channel.message": "Используя @all или @channel, вы собираетесь отправлять уведомления {totalMembers, number} {totalMembers, plural, one {человеку} few {людям} other {человекам}}. Вы уверены, что хотите это сделать?",
"mobile.post_textbox.entire_channel.message.with_timezones": "Используя @all или @channel, вы собираетесь отправлять уведомления {totalMembers, number} {totalMembers, plural, one {человеку} other {людям}} в {timezones, number} {timezones, plural, one {часовом поясе} other {часовых поясах}}. Вы уверены, что хотите это сделать?",
"mobile.post_textbox.entire_channel.title": "Подтвердите отправку уведомления всему каналу",
"mobile.post_textbox.groups.title": "Подтвердите отправку уведомлений группам",
"mobile.post_textbox.uploadFailedDesc": "Некоторые вложения не были загружены на сервер. Вы уверены, что хотите отправить сообщение?",
"mobile.post_textbox.uploadFailedTitle": "Ошибка загрузки",
"mobile.post.cancel": "Отмена",
"mobile.post.delete_question": "Вы действительно хотите удалить запись?",
"mobile.post.delete_title": "Удалить пост",
"mobile.post.failed_delete": "Удалить сообщение",
"mobile.post.failed_retry": "Попробовать снова",
"mobile.posts_view.moreMsg": "Загрузить еще сообщения",
"mobile.privacy_link": "Политика конфиденциальности",
"mobile.push_notification_reply.button": "Отправить",
"mobile.push_notification_reply.placeholder": "Ответить...",
"mobile.push_notification_reply.title": "Ответить",
"mobile.rename_channel.display_name_maxLength": "Название канала не должно превышать {maxLength, number} символов",
"mobile.rename_channel.display_name_minLength": "Название канала должно быть не меньше, чем {minLength, number} символов",
"mobile.rename_channel.display_name_required": "Вы должны указать название канала",
"mobile.request.invalid_response": "Получен неверный ответ от сервера.",
"mobile.reset_status.alert_cancel": "Отмена",
"mobile.reset_status.title_ooo": "Выключить \"Не на работе\"?",
"mobile.routes.code": "{language} код",
"mobile.routes.code.noLanguage": "Код",
"mobile.routes.custom_status": "Установить статус",
"mobile.routes.table": "Таблица",
"mobile.routes.user_profile": "Профиль",
"mobile.search.jump": "Перейти к недавним сообщениям",
"mobile.server_link.error.text": "Ссылка не найдена на этом сервере.",
"mobile.server_link.error.title": "Ошибка ссылки",
"mobile.server_link.unreachable_channel.error": "Постоянная ссылка принадлежит к удалённому каналу или каналу, к которому у вас нет доступа.",
"mobile.server_link.unreachable_team.error": "Постоянная ссылка принадлежит к удалённой команде или команде, к которой у вас нет доступа.",
"mobile.server_upgrade.alert_description": "Эта версия сервера не поддерживается, и пользователи будут сталкиваться с проблемами совместимости, которые вызывают сбои или серьезные ошибки, нарушающие основные функции приложения. Требуется обновление до версии сервера {serverVersion} или новее.",
"mobile.server_upgrade.button": "Ок\"",
"mobile.server_upgrade.dismiss": "Отмена",
"mobile.server_upgrade.learn_more": "Узнать больше",
"mobile.server_upgrade.title": "Требуется обновление сервера",
"mobile.server_url.empty": "Пожалуйста, введите действительный URL-адрес сервера",
"mobile.server_url.invalid_format": "Адрес должен начинаться с http:// или https://",
"mobile.set_status.away": "Отошёл",
"mobile.set_status.dnd": "Не беспокоить",
"mobile.set_status.offline": "Не в сети",
"mobile.set_status.online": "В сети",
"mobile.storage_permission_denied_title": "{applicationName} хотело бы получить доступ к вашим файлам",
"mobile.suggestion.members": "Участники",
"mobile.system_message.channel_archived_message": "{username} архивировал канал",
"mobile.system_message.channel_unarchived_message": "{username} разархивировал канал",
"mobile.system_message.update_channel_displayname_message_and_forget.updated_from": "{username} сменил отображаемое имя канала с: {oldDisplayName} на: {newDisplayName}",
"mobile.system_message.update_channel_header_message_and_forget.removed": "{username} удалил заголовок канала (было: {oldHeader})",
"mobile.system_message.update_channel_header_message_and_forget.updated_from": "{username} изменил(а) заголовок канала с {oldHeader} на {newHeader}",
"mobile.system_message.update_channel_header_message_and_forget.updated_to": "{username} изменил(а) заголовок канала на {newHeader}",
"mobile.system_message.update_channel_purpose_message.removed": "{username} удалил заголовок канала (было: {oldPurpose})",
"mobile.system_message.update_channel_purpose_message.updated_from": "{username} изменил назначение канала с {oldPurpose} на {newPurpose}",
"mobile.system_message.update_channel_purpose_message.updated_to": "{username} установил назначение канала: {newPurpose}",
"mobile.tos_link": "Условия использования",
"mobile.unsupported_server.message": "Вложения, предварительный просмотр ссылок, реакции и встроенные данные могут отображаться некорректно. Если проблема не устраняется, обратитесь к системному администратору для обновления сервера Mattermost.",
"mobile.unsupported_server.ok": "Ок\"",
"mobile.unsupported_server.title": "Неподдерживаемая версия сервера",
"mobile.user_list.deactivated": "Деактивирован",
"modal.manual_status.auto_responder.message_": "Вы хотите установить статус \"{status}\" и отключить автоматические ответы?",
"modal.manual_status.auto_responder.message_away": "Вы хотите установить статус \"Отошёл\" и отключить автоматические ответы?",
"modal.manual_status.auto_responder.message_dnd": "Вы хотите установить статус \"Не беспокоить\" и отключить автоматические ответы?",
"modal.manual_status.auto_responder.message_offline": "Вы хотите установить статус \"Не в сети\" и отключить автоматические ответы?",
"modal.manual_status.auto_responder.message_online": "Вы хотите установить статус \"В сети\" и отключить автоматические ответы?",
"msg_typing.areTyping": "{users} и {last} печатают...",
"msg_typing.isTyping": "{user} печатает...",
"password_send.description": "Для сброса пароля введите email адрес, использованный при регистрации",
"password_send.error": "Пожалуйста, введите корректный email.",
"password_send.link": "Если аккаунт с таким email существует, то вы получите письмо с ссылкой для сброса пароля на:",
"permalink.show_dialog_warn.cancel": "Отменить",
"permalink.show_dialog_warn.join": "Присоединиться",
"permalink.show_dialog_warn.title": "Присоединиться к приватному каналу",
"post_body.check_for_out_of_channel_groups_mentions.message": "не получили уведомления от этого упоминания, потому что их нет в канале. Они не могут быть добавлены в канал, потому что они не являются членами связанных групп. Чтобы добавить их в этот канал, они должны быть добавлены в связанные группы.",
"post_body.check_for_out_of_channel_mentions.link.and": " и ",
"post_body.check_for_out_of_channel_mentions.link.private": "добавить пользователей в частный канал",
"post_body.check_for_out_of_channel_mentions.link.public": "добавить на канал",
"post_body.check_for_out_of_channel_mentions.message_last": "? Они увидят всю предыдущую историю сообщений.",
"post_body.check_for_out_of_channel_mentions.message.multiple": "были упомянуты, но они не на канале. Не хотите ли вы ",
"post_body.check_for_out_of_channel_mentions.message.one": "упомянули, но пользователь не на канале. Не хотите ли вы ",
"post_body.commentedOn": "Прокомментировано сообщение {name}{apostrophe}: ",
"post_body.deleted": "(сообщение удалено)",
"post_info.del": "Удалить",
"post_info.edit": "Изменить",
"post_info.system": "Система",
"post_message_view.edited": "(отредактировано)",
"posts_view.newMsg": "Новые сообщения",
"search_bar.search": "Поиск",
"status_dropdown.set_away": "Отошёл",
"status_dropdown.set_dnd": "Не беспокоить",
"status_dropdown.set_offline": "Не в сети",
"status_dropdown.set_online": "В сети",
"suggestion.mention.all": "Уведомляет всех на канале",
"suggestion.mention.channel": "Уведомляет всех на канале",
"suggestion.mention.channels": "Мои каналы",
"suggestion.mention.groups": "Групповые упоминания",
"suggestion.mention.here": "Уведомляет всех кто онлайн на канале",
"suggestion.mention.members": "Участники канала",
"suggestion.mention.morechannels": "Другие каналы",
"suggestion.mention.nonmembers": "Не в канале",
"suggestion.mention.special": "Особые упоминания",
"suggestion.mention.you": " (это вы)",
"suggestion.search.direct": "Личные сообщения",
"suggestion.search.private": "Приватные каналы",
"suggestion.search.public": "Публичные каналы",
"threads": "Обсуждения",
"threads.deleted": "Исходное сообщение удалено",
"threads.follow": "Следить",
"threads.following": "Следующий",
"threads.followMessage": "Подписаться на сообщение",
"threads.followThread": "Следить за обсуждением",
"threads.newReplies": "{count} {count, plural, one {новый ответ} few {новых ответа} other {новых ответов}}",
"threads.replies": "{count} {count, plural, one {ответ} few {ответа} other {ответов}}",
"threads.unfollowMessage": "Отписаться от сообщения",
"threads.unfollowThread": "Отменить подписку",
"user.settings.general.email": "Электронная почта",
"user.settings.general.firstName": "Имя",
"user.settings.general.lastName": "Фамилия",
"user.settings.general.nickname": "Псевдоним",
"user.settings.general.position": "Должность",
"user.settings.general.username": "Имя пользователя"
}
"about.date": "Дата сборки:",
"about.enterpriseEditione1": "Корпоративная редакция",
"about.enterpriseEditionLearn": "Подробнее о Корпоративной редакции читайте на ",
"about.enterpriseEditionSt": "Современное общение в вашей внутренней сети.",
"about.hash": "Хэш сборки:",
"about.hashee": "Хэш сборки EE:",
"about.teamEditionLearn": "Присоединяйтесь к сообществу Mattermost на ",
"about.teamEditionSt": "Всё общение вашей команды собрано в одном месте, с мгновенным поиском и доступом отовсюду.",
"about.teamEditiont0": "Командная редакция",
"about.teamEditiont1": "Корпоративная редакция",
"api.channel.add_guest.added": "{addedUsername} добавлен в канал как гость участником {username}.",
"api.channel.add_member.added": "{addedUsername} добавлен в канал участником {username}.",
"api.channel.guest_join_channel.post_and_forget": "{username} присоединился к каналу как гость.",
"apps.error": "Ошибка: {error}",
"apps.error.command.field_missing": "Обязательные поля отсутствуют: `{fieldName}`.",
"apps.error.command.same_channel": "Канал повторяется для поля `{fieldName}`: `{option}`.",
"apps.error.command.same_option": "Опция повторяется для поля `{fieldName}`: `{option}`.",
"apps.error.command.same_user": "Пользователь повторяется для поля `{fieldName}`: `{option}`.",
"apps.error.command.unknown_channel": "Неизвестный канал для поля `{fieldName}`: `{option}`.",
"apps.error.command.unknown_option": "Неизвестная опция для поля `{fieldName}`: `{option}`.",
"apps.error.command.unknown_user": "Неизвестный пользователь для поля `{fieldName}`: `{option}`.",
"apps.error.form.no_form": "`form` не определено.",
"apps.error.form.no_lookup": "`lookup` не задано.",
"apps.error.form.no_source": "`source` не определен.",
"apps.error.form.no_submit": "`submit` не определен",
"apps.error.form.refresh": "Произошла ошибка при извлечении выбранных полей. Свяжитесь с разработчиком приложения. Подробности: {details}",
"apps.error.form.refresh_no_refresh": "Вызывается \"Обновить\" для необновляемого поля.",
"apps.error.form.submit.pretext": "Произошла ошибка при отправке формы. Свяжитесь с разработчиком приложения. Подробности: {details}",
"apps.error.lookup.error_preparing_request": "Ошибка при подготовке запроса на поиск: {errorMessage}",
"apps.error.malformed_binding": "Эта привязка неправильно сформирована. Свяжитесь с разработчиком приложения.",
"apps.error.parser": "Ошибка разбора: {error}",
"apps.error.parser.execute_non_leaf": "Вы должны выбрать подкоманду.",
"apps.error.parser.missing_binding": "Отсутствуют привязки команд.",
"apps.error.parser.missing_field_value": "Значение поля отсутствует.",
"apps.error.parser.missing_list_end": "Ожидается токен закрытия списка.",
"apps.error.parser.missing_quote": "Ожидается парная двойная кавычка до конца строки ввода.",
"apps.error.parser.missing_source": "Форма не имеет ни отправки, ни источника.",
"apps.error.parser.missing_submit": "Нет вызова отправки в привязке или форме.",
"apps.error.parser.missing_tick": "Ожидается парный апостроф до конца строки ввода.",
"apps.error.parser.multiple_equal": "Множественные знаки `=` не допускаются.",
"apps.error.parser.no_argument_pos_x": "Невозможно идентифицировать аргумент.",
"apps.error.parser.no_bindings": "Нет привязки команды.",
"apps.error.parser.no_form": "Форма не найдена.",
"apps.error.parser.no_match": "`{command}`: нет совпадений в этой рабочей области.",
"apps.error.parser.no_slash_start": "Команда должна начинаться с `/`.",
"apps.error.parser.unexpected_character": "Неожиданный символ.",
"apps.error.parser.unexpected_comma": "Неожиданная запятая.",
"apps.error.parser.unexpected_error": "Неожиданная ошибка.",
"apps.error.parser.unexpected_flag": "Команда не принимает флаг `{flagName}`.",
"apps.error.parser.unexpected_squared_bracket": "Неожиданное открытие списка.",
"apps.error.parser.unexpected_state": "Недоступно: Неожиданное состояние в matchBinding: `{state}`.",
"apps.error.parser.unexpected_whitespace": "Недоступно: Неожиданные пробелы.",
"apps.error.responses.navigate.no_url": "Тип ответа `navigate`, но в ответ не был включен ни один url.",
"apps.error.responses.unexpected_error": "Получена неожиданная ошибка.",
"apps.error.responses.unknown_field_error": "Получена ошибка для неизвестного поля. Имя поля: `{field}`. Ошибка: `{error}`.",
"apps.error.responses.unknown_type": "Тип ответа приложения не поддерживается. Тип ответа: {type}.",
"apps.error.unknown": "Произошла неизвестная ошибка.",
"apps.suggestion.dynamic.error": "Ошибка динамического выбора",
"apps.suggestion.errors.parser_error": "Ошибка разбора",
"apps.suggestion.no_dynamic": "Нет данных для динамических предложений",
"apps.suggestion.no_static": "Нет подходящих вариантов.",
"apps.suggestion.no_suggestion": "Нет подходящих предложений.",
"archivedChannelMessage": "Вы просматриваете **архивированный канал**. Создание новых сообщений запрещено.",
"camera_type.photo.option": "Сделать фото",
"camera_type.title": "Выберите действие",
"camera_type.video.option": "Записать видео",
"center_panel.archived.closeChannel": "Закрыть канал",
"channel_info.header": "Заголовок:",
"channel_loader.someone": "Кто-то",
"channel_modal.descriptionHelp": "Опишите, как следует использовать этот канал.",
"channel_modal.header": "Заголовок",
"channel_modal.name": "Имя",
"channel_modal.optional": "(необязательно)",
"channel_modal.purpose": "Назначение",
"combined_system_message.added_to_channel.many_expanded": "{users} и {lastUser} были **добавлены на канал** пользователем {actor}.",
"combined_system_message.added_to_channel.one": "{firstUser} **приглашается на канал**. Кем: {actor}.",
"combined_system_message.added_to_channel.one_you": "Вы были **добавлены на канал** пользователем {actor}.",
"combined_system_message.added_to_channel.two": "{firstUser} и {secondUser} **приглашены в команду пользователем** {actor}.",
"combined_system_message.added_to_team.many_expanded": "{users} и {lastUser} были **добавлены в команду** пользователем {actor}.",
"combined_system_message.added_to_team.one": "{firstUser} **приглашается в команду** пользователем {actor}.",
"combined_system_message.added_to_team.one_you": "Вы были **добавлены в команду** пользователем {actor}.",
"combined_system_message.added_to_team.two": "{firstUser} и {secondUser} **добавлены в команду** пользователем {actor}.",
"combined_system_message.joined_channel.many_expanded": "{users} и {lastUser} **присоединились к каналу**.",
"combined_system_message.joined_channel.one": "{firstUser} - **выполнен вход на канал**.",
"combined_system_message.joined_channel.one_you": "Вы **подключились к каналу**.",
"combined_system_message.joined_channel.two": "{firstUser} и {secondUser} **присоединились к каналу**.",
"combined_system_message.joined_team.many_expanded": "{users} и {lastUser} **присоединились к команде**.",
"combined_system_message.joined_team.one": "{firstUser} **присоединяется к команде**.",
"combined_system_message.joined_team.one_you": "Вы **присоединились к команде**.",
"combined_system_message.joined_team.two": "{firstUser} и {secondUser} **присоединились к команде**.",
"combined_system_message.left_channel.many_expanded": "{users} и {lastUser} **покинули канал**.",
"combined_system_message.left_channel.one": "{firstUser} **покинул канал**.",
"combined_system_message.left_channel.one_you": "Вы **покинули канал**.",
"combined_system_message.left_channel.two": "{firstUser} и {secondUser} **покинули канал**.",
"combined_system_message.left_team.many_expanded": "{users} и {lastUser} **покинули команду**.",
"combined_system_message.left_team.one": "{firstUser} **покидает команду**.",
"combined_system_message.left_team.one_you": "Вы **покинули команду**.",
"combined_system_message.left_team.two": "{firstUser} и {secondUser} **покинули команду**.",
"combined_system_message.removed_from_channel.many_expanded": "{users} и {lastUser} **удалены с канала**.",
"combined_system_message.removed_from_channel.one": "{firstUser} был **удалён с канала**.",
"combined_system_message.removed_from_channel.one_you": "Вы были **удалены с канала**.",
"combined_system_message.removed_from_channel.two": "{firstUser} и {secondUser} были **удалены с канала**.",
"combined_system_message.removed_from_team.many_expanded": "{users} и {lastUser} **удалены из команды**.",
"combined_system_message.removed_from_team.one": "{firstUser} был **удалён из команды**.",
"combined_system_message.removed_from_team.one_you": "Вы были **удалены с канала**.",
"combined_system_message.removed_from_team.two": "{firstUser} и {secondUser} **удалены из команды**.",
"combined_system_message.you": "Вы",
"create_post.deactivated": "Вы просматриваете архивированный канал как деактивированный пользователь.",
"create_post.write": "Написать в {channelDisplayName}",
"custom_status.expiry_dropdown.custom": "Настраиваемое",
"custom_status.expiry_dropdown.date_and_time": "Дата и время",
"custom_status.expiry_dropdown.dont_clear": "Не очищать",
"custom_status.expiry_dropdown.four_hours": "4 часа",
"custom_status.expiry_dropdown.one_hour": "1 час",
"custom_status.expiry_dropdown.thirty_minutes": "30 минут",
"custom_status.expiry_dropdown.this_week": "На этой неделе",
"custom_status.expiry_dropdown.today": "Cегодня",
"custom_status.expiry_time.today": "Cегодня",
"custom_status.expiry_time.tomorrow": "Завтра",
"custom_status.expiry.at": "в",
"custom_status.expiry.until": "До",
"custom_status.failure_message": "Не удалось обновить статус. Попробуй еще раз",
"custom_status.suggestions.in_a_meeting": "На встрече",
"custom_status.suggestions.on_a_vacation": "В отпуске",
"custom_status.suggestions.out_for_lunch": "На обеде",
"custom_status.suggestions.out_sick": "На больничном",
"custom_status.suggestions.working_from_home": "Работаю из дома",
"date_separator.today": "Cегодня",
"date_separator.yesterday": "Вчера",
"edit_post.editPost": "Редактировать сообщение...",
"edit_post.save": "Сохранить",
"emoji_picker.activities": "Мероприятия",
"emoji_picker.animals-nature": "Животные и природа",
"emoji_picker.custom": "Настраиваемое",
"emoji_picker.flags": "Флаги",
"emoji_picker.food-drink": "Еда и напитки",
"emoji_picker.objects": "Объекты",
"emoji_picker.people-body": "Люди и тело",
"emoji_picker.searchResults": "Результаты поиска",
"emoji_picker.smileys-emotion": "Смайлы и эмоции",
"emoji_picker.symbols": "Символы",
"emoji_picker.travel-places": "Путешествия и места",
"emoji_skin.dark_skin_tone": "темный оттенок кожи",
"emoji_skin.default": "оттенок кожи по умолчанию",
"emoji_skin.light_skin_tone": "светлый оттенок кожи",
"emoji_skin.medium_dark_skin_tone": "средне-темный оттенок кожи",
"emoji_skin.medium_light_skin_tone": "средне-светлый оттенок кожи",
"emoji_skin.medium_skin_tone": "средний оттенок кожи",
"file_upload.fileAbove": "Файлы должны быть меньше {max}МБ",
"friendly_date.daysAgo": "{count} {count, plural, one {день} few{дня} other {дней}} назад",
"friendly_date.hoursAgo": "{count} {count, plural, one {час} few{часа} other {часов}} назад",
"friendly_date.minsAgo": "{count} {count, plural, one {минута} few{минуты} other {минут}} назад",
"friendly_date.monthsAgo": "{count} {count, plural, one {месяц} few{месяца} other {месяцев}} назад",
"friendly_date.now": "Сейчас",
"friendly_date.yearsAgo": "{count} {count, plural, one {год} few{года} other {лет}} назад",
"friendly_date.yesterday": "Вчера",
"gallery.footer.channel_name": "Поделились в {channelName}",
"gallery.open_file": "Открыть файл",
"get_post_link_modal.title": "Скопировать ссылку",
"global_threads.allThreads": "Все ваши обсуждения",
"global_threads.emptyThreads.message": "Здесь будут показаны все обсуждения, в которых вы упоминались или в которых вы участвовали, вместе с любыми обсуждениями, на которые вы подписаны.",
"global_threads.emptyThreads.title": "Пока нет подписок",
"global_threads.emptyUnreads.message": "Похоже, вы все догнали.",
"global_threads.emptyUnreads.title": "Нет непрочитанных цепочек",
"global_threads.markAllRead.cancel": "Отмена",
"global_threads.markAllRead.markRead": "Отметить как прочитанное",
"global_threads.markAllRead.message": "Это очистит любой непрочитанный статус для всех ваших цепочек, показанных здесь",
"global_threads.markAllRead.title": "Вы действительно хотите отметить все цепочки как прочитанные?",
"global_threads.options.mark_as_read": "Пометить как прочитанное",
"global_threads.options.open_in_channel": "Открыть в канале",
"global_threads.unreads": "Непрочитанные",
"last_users_message.added_to_channel.type": "**добавлены на канал**. Кем: {actor}.",
"last_users_message.added_to_team.type": "были **добавлены в команду** пользователем {actor}.",
"last_users_message.first": "{firstUser} и ",
"last_users_message.joined_channel.type": "**присоединился к каналу**.",
"last_users_message.joined_team.type": "присоединяется к команде.",
"last_users_message.left_channel.type": "**покинул канал**.",
"last_users_message.left_team.type": "**покинул команду**.",
"last_users_message.others": "{numOthers} других ",
"last_users_message.removed_from_channel.type": "были **удалены с канала**.",
"last_users_message.removed_from_team.type": "были **удалены из команды**.",
"login_mfa.tokenReq": "Пожалуйста, введите токен МФА",
"login.email": "Электронная почта",
"login.ldapUsername": "Имя пользователя AD/LDAP",
"login.or": "или",
"login.password": "Пароль",
"login.username": "Имя пользователя",
"mobile.about.appVersion": "Версия приложения: {version} (Сборка {number})",
"mobile.account.settings.save": "Сохранить",
"mobile.action_menu.select": "Выберите опцию",
"mobile.android.back_handler_exit": "Нажмите еще раз, чтобы выйти",
"mobile.android.photos_permission_denied_title": "{applicationName} хотело бы получить доступ к вашим фотографиям",
"mobile.camera_photo_permission_denied_title": "{applicationName} хотел бы получить доступ к вашей камере",
"mobile.channel_info.alertNo": "Нет",
"mobile.channel_info.alertYes": "Да",
"mobile.commands.error_title": "Ошибка при выполнении команды",
"mobile.components.select_server_view.connect": "Подключиться",
"mobile.components.select_server_view.enterServerUrl": "Введите адрес сервера",
"mobile.components.select_server_view.proceed": "Продолжить",
"mobile.create_channel": "Создать",
"mobile.custom_status.choose_emoji": "Выберите смайлик",
"mobile.custom_status.clear_after": "Очистить после",
"mobile.custom_status.modal_confirm": "Готово",
"mobile.display_settings.theme": "Тема",
"mobile.document_preview.failed_description": "Ошибка при открытии документа. Пожалуйста, убедитесь, что у вас есть приложение для просмотра {fileType} и попробуйте снова.\n",
"mobile.document_preview.failed_title": "Ошибка открытия документа",
"mobile.downloader.disabled_description": "Этот сервер не разрешает скачивать файлы. Пожалуйста, обратитесь к системному администратору за подробностями.\n",
"mobile.downloader.disabled_title": "Загрузки отключены",
"mobile.downloader.failed_description": "Ошибка загрузки файла. Пожалуйста, проверьте своё интернет соединение и попробуйте снова.\n",
"mobile.downloader.failed_title": "Ошибка загрузки",
"mobile.edit_channel": "Сохранить",
"mobile.edit_post.title": "Редактирование сообщения",
"mobile.error_handler.button": "Перезапустить",
"mobile.error_handler.description": "\nНажмите на кнопку Перезапустить, чтобы открыть приложение заново. После запуска, вы можете сообщить о проблеме через меню настроек.\n",
"mobile.error_handler.title": "Произошла непредвиденная ошибка",
"mobile.file_upload.disabled2": "Загрузка файлов с мобильного устройства отключена.",
"mobile.file_upload.max_warning": "Количество загрузок ограничено: не более {count} файлов.",
"mobile.files_paste.error_description": "Ошибка при отправке файлов. Пожалуйста, попробуйте снова.",
"mobile.files_paste.error_dismiss": "Отмена",
"mobile.files_paste.error_title": "Вставить не удалось",
"mobile.gallery.title": "{index} из {total}",
"mobile.ios.photos_permission_denied_title": "{applicationName} хотело бы получить доступ к вашим фотографиям",
"mobile.link.error.text": "Невозможно открыть ссылку.",
"mobile.link.error.title": "Ошибка",
"mobile.managed.blocked_by": "Заблокирован {vendor}",
"mobile.managed.exit": "Выход",
"mobile.managed.jailbreak": "Устройства с джейлбрейком не являются доверенными {vendor}, выйдите из приложения.",
"mobile.managed.not_secured.android": "Это устройство должно быть защищено с помощью блокировки экрана, чтобы использовать Mattermost.",
"mobile.managed.not_secured.ios": "Это устройство должно быть защищено паролем для использования Mattermost. \n\nПерейдите в Настройки > Face ID и пароль.",
"mobile.managed.not_secured.ios.touchId": "Это устройство должно быть защищено паролем для использования Mattermost.\n\nПерейдите в Настройки > Touch ID и пароль.",
"mobile.managed.secured_by": "Защищено {vendor}",
"mobile.managed.settings": "Перейти к настройкам",
"mobile.markdown.code.copy_code": "Скопировать код",
"mobile.markdown.code.plusMoreLines": "еще +{count, number} {count, plural, one {строка} few {строки} other {строк}}",
"mobile.markdown.image.too_large": "Изображение превышает максимальное разрешение {maxWidth} на {maxHeight}:",
"mobile.markdown.link.copy_url": "Скопировать URL",
"mobile.mention.copy_mention": "Скопировать упоминание",
"mobile.message_length.message": "Слишком длинное сообщение. Текущее количество знаков: {count}/{max}",
"mobile.message_length.message_split_left": "Сообщение превышает лимит символов",
"mobile.message_length.title": "Длина сообщения",
"mobile.microphone_permission_denied_description": "Чтобы принять участие в этом вызове, откройте «Настройки», чтобы предоставить Mattermost доступ к вашему микрофону.",
"mobile.microphone_permission_denied_title": "{applicationName} хочет получить доступ к вашему микрофону",
"mobile.oauth.failed_to_login": "Ваша попытка входа не удалась. Пожалуйста, попробуйте ещё раз.",
"mobile.oauth.failed_to_open_link": "Ссылка не открылась. Пожалуйста, попробуйте еще раз.",
"mobile.oauth.something_wrong": "Что-то пошло не так",
"mobile.oauth.try_again": "Попробовать ещё",
"mobile.open_gm.error": "Не удалось открыть групповое сообщение с этими пользователями. Пожалуйста, проверьте подключение и попробуйте заново.",
"mobile.permission_denied_dismiss": "Не разрешать",
"mobile.permission_denied_retry": "Параметры",
"mobile.post_info.add_reaction": "Добавить реакцию",
"mobile.post_info.copy_text": "Копировать текст",
"mobile.post_info.mark_unread": "Пометить как непрочитанное",
"mobile.post_info.pin": "Прикрепить сообщение",
"mobile.post_info.reply": "Ответить",
"mobile.post_info.unpin": "Открепить сообщение",
"mobile.post_pre_header.pinned": "Прикреплено",
"mobile.post_textbox.entire_channel_here.message": "Используя @here, Вы собираетесь отправлять уведомления {totalMembers, number} {totalMembers, plural, one {человеку} other {людям}}. Вы уверены, что хотите это сделать?",
"mobile.post_textbox.entire_channel_here.message.with_timezones": "Используя @here, вы собираетесь отправить уведомления {totalMembers, number} {totalMembers, plural, one {человеку} other {людям}} в {timezones, number} {timezones, plural, one {часовом поясе} other {часовых поясах}}. Вы уверены, что хотите это сделать?",
"mobile.post_textbox.entire_channel.cancel": "Отмена",
"mobile.post_textbox.entire_channel.confirm": "Подтвердить",
"mobile.post_textbox.entire_channel.message": "Используя @all или @channel, вы собираетесь отправлять уведомления {totalMembers, number} {totalMembers, plural, one {человеку} few {людям} other {человекам}}. Вы уверены, что хотите это сделать?",
"mobile.post_textbox.entire_channel.message.with_timezones": "Используя @all или @channel, вы собираетесь отправлять уведомления {totalMembers, number} {totalMembers, plural, one {человеку} other {людям}} в {timezones, number} {timezones, plural, one {часовом поясе} other {часовых поясах}}. Вы уверены, что хотите это сделать?",
"mobile.post_textbox.entire_channel.title": "Подтвердите отправку уведомления всему каналу",
"mobile.post_textbox.groups.title": "Подтвердите отправку уведомлений группам",
"mobile.post_textbox.uploadFailedDesc": "Некоторые вложения не были загружены на сервер. Вы уверены, что хотите отправить сообщение?",
"mobile.post_textbox.uploadFailedTitle": "Ошибка загрузки",
"mobile.post.cancel": "Отмена",
"mobile.post.delete_question": "Вы действительно хотите удалить запись?",
"mobile.post.delete_title": "Удалить пост",
"mobile.post.failed_delete": "Удалить сообщение",
"mobile.post.failed_retry": "Попробовать снова",
"mobile.posts_view.moreMsg": "Загрузить еще сообщения",
"mobile.privacy_link": "Политика конфиденциальности",
"mobile.push_notification_reply.button": "Отправить",
"mobile.push_notification_reply.placeholder": "Ответить...",
"mobile.push_notification_reply.title": "Ответить",
"mobile.rename_channel.display_name_maxLength": "Название канала не должно превышать {maxLength, number} символов",
"mobile.rename_channel.display_name_minLength": "Название канала должно быть не меньше, чем {minLength, number} символов",
"mobile.rename_channel.display_name_required": "Вы должны указать название канала",
"mobile.request.invalid_response": "Получен неверный ответ от сервера.",
"mobile.reset_status.alert_cancel": "Отмена",
"mobile.reset_status.title_ooo": "Выключить \"Не на работе\"?",
"mobile.routes.code": "{language} код",
"mobile.routes.code.noLanguage": "Код",
"mobile.routes.custom_status": "Установить статус",
"mobile.routes.table": "Таблица",
"mobile.routes.user_profile": "Профиль",
"mobile.search.jump": "Перейти к недавним сообщениям",
"mobile.server_link.error.text": "Ссылка не найдена на этом сервере.",
"mobile.server_link.error.title": "Ошибка ссылки",
"mobile.server_link.unreachable_channel.error": "Постоянная ссылка принадлежит к удалённому каналу или каналу, к которому у вас нет доступа.",
"mobile.server_link.unreachable_team.error": "Постоянная ссылка принадлежит к удалённой команде или команде, к которой у вас нет доступа.",
"mobile.server_upgrade.alert_description": "Эта версия сервера не поддерживается, и пользователи будут сталкиваться с проблемами совместимости, которые вызывают сбои или серьезные ошибки, нарушающие основные функции приложения. Требуется обновление до версии сервера {serverVersion} или новее.",
"mobile.server_upgrade.button": "Ок\"",
"mobile.server_upgrade.dismiss": "Отмена",
"mobile.server_upgrade.learn_more": "Узнать больше",
"mobile.server_upgrade.title": "Требуется обновление сервера",
"mobile.server_url.empty": "Пожалуйста, введите действительный URL-адрес сервера",
"mobile.server_url.invalid_format": "Адрес должен начинаться с http:// или https://",
"mobile.set_status.away": "Отошёл",
"mobile.set_status.dnd": "Не беспокоить",
"mobile.set_status.offline": "Не в сети",
"mobile.set_status.online": "В сети",
"mobile.storage_permission_denied_title": "{applicationName} хотело бы получить доступ к вашим файлам",
"mobile.suggestion.members": "Участники",
"mobile.system_message.channel_archived_message": "{username} архивировал канал",
"mobile.system_message.channel_unarchived_message": "{username} разархивировал канал",
"mobile.system_message.update_channel_displayname_message_and_forget.updated_from": "{username} сменил отображаемое имя канала с: {oldDisplayName} на: {newDisplayName}",
"mobile.system_message.update_channel_header_message_and_forget.removed": "{username} удалил заголовок канала (было: {oldHeader})",
"mobile.system_message.update_channel_header_message_and_forget.updated_from": "{username} изменил(а) заголовок канала с {oldHeader} на {newHeader}",
"mobile.system_message.update_channel_header_message_and_forget.updated_to": "{username} изменил(а) заголовок канала на {newHeader}",
"mobile.system_message.update_channel_purpose_message.removed": "{username} удалил заголовок канала (было: {oldPurpose})",
"mobile.system_message.update_channel_purpose_message.updated_from": "{username} изменил назначение канала с {oldPurpose} на {newPurpose}",
"mobile.system_message.update_channel_purpose_message.updated_to": "{username} установил назначение канала: {newPurpose}",
"mobile.tos_link": "Условия использования",
"mobile.unsupported_server.message": "Вложения, предварительный просмотр ссылок, реакции и встроенные данные могут отображаться некорректно. Если проблема не устраняется, обратитесь к системному администратору для обновления сервера Mattermost.",
"mobile.unsupported_server.ok": "Ок\"",
"mobile.unsupported_server.title": "Неподдерживаемая версия сервера",
"mobile.user_list.deactivated": "Деактивирован",
"modal.manual_status.auto_responder.message_": "Вы хотите установить статус \"{status}\" и отключить автоматические ответы?",
"modal.manual_status.auto_responder.message_away": "Вы хотите установить статус \"Отошёл\" и отключить автоматические ответы?",
"modal.manual_status.auto_responder.message_dnd": "Вы хотите установить статус \"Не беспокоить\" и отключить автоматические ответы?",
"modal.manual_status.auto_responder.message_offline": "Вы хотите установить статус \"Не в сети\" и отключить автоматические ответы?",
"modal.manual_status.auto_responder.message_online": "Вы хотите установить статус \"В сети\" и отключить автоматические ответы?",
"msg_typing.areTyping": "{users} и {last} печатают...",
"msg_typing.isTyping": "{user} печатает...",
"password_send.description": "Для сброса пароля введите email адрес, использованный при регистрации",
"password_send.error": "Пожалуйста, введите корректный email.",
"password_send.link": "Если аккаунт с таким email существует, то вы получите письмо с ссылкой для сброса пароля на:",
"permalink.show_dialog_warn.cancel": "Отменить",
"permalink.show_dialog_warn.join": "Присоединиться",
"permalink.show_dialog_warn.title": "Присоединиться к приватному каналу",
"post_body.check_for_out_of_channel_groups_mentions.message": "не получили уведомления от этого упоминания, потому что их нет в канале. Они не могут быть добавлены в канал, потому что они не являются членами связанных групп. Чтобы добавить их в этот канал, они должны быть добавлены в связанные группы.",
"post_body.check_for_out_of_channel_mentions.link.and": " и ",
"post_body.check_for_out_of_channel_mentions.link.private": "добавить пользователей в частный канал",
"post_body.check_for_out_of_channel_mentions.link.public": "добавить на канал",
"post_body.check_for_out_of_channel_mentions.message_last": "? Они увидят всю предыдущую историю сообщений.",
"post_body.check_for_out_of_channel_mentions.message.multiple": "были упомянуты, но они не на канале. Не хотите ли вы ",
"post_body.check_for_out_of_channel_mentions.message.one": "упомянули, но пользователь не на канале. Не хотите ли вы ",
"post_body.commentedOn": "Прокомментировано сообщение {name}{apostrophe}: ",
"post_body.deleted": "(сообщение удалено)",
"post_info.del": "Удалить",
"post_info.edit": "Изменить",
"post_info.system": "Система",
"post_message_view.edited": "(отредактировано)",
"posts_view.newMsg": "Новые сообщения",
"search_bar.search": "Поиск",
"status_dropdown.set_away": "Отошёл",
"status_dropdown.set_dnd": "Не беспокоить",
"status_dropdown.set_offline": "Не в сети",
"status_dropdown.set_online": "В сети",
"suggestion.mention.all": "Уведомляет всех на канале",
"suggestion.mention.channel": "Уведомляет всех на канале",
"suggestion.mention.channels": "Мои каналы",
"suggestion.mention.groups": "Групповые упоминания",
"suggestion.mention.here": "Уведомляет всех кто онлайн на канале",
"suggestion.mention.members": "Участники канала",
"suggestion.mention.morechannels": "Другие каналы",
"suggestion.mention.nonmembers": "Не в канале",
"suggestion.mention.special": "Особые упоминания",
"suggestion.mention.you": " (это вы)",
"suggestion.search.direct": "Личные сообщения",
"suggestion.search.private": "Приватные каналы",
"suggestion.search.public": "Публичные каналы",
"threads": "Обсуждения",
"threads.deleted": "Исходное сообщение удалено",
"threads.follow": "Следить",
"threads.following": "Следующий",
"threads.followMessage": "Подписаться на сообщение",
"threads.followThread": "Следить за обсуждением",
"threads.newReplies": "{count} {count, plural, one {новый ответ} few {новых ответа} other {новых ответов}}",
"threads.replies": "{count} {count, plural, one {ответ} few {ответа} other {ответов}}",
"threads.unfollowMessage": "Отписаться от сообщения",
"threads.unfollowThread": "Отменить подписку",
"user.settings.general.email": "Электронная почта",
"user.settings.general.firstName": "Имя",
"user.settings.general.lastName": "Фамилия",
"user.settings.general.nickname": "Псевдоним",
"user.settings.general.position": "Должность",
"user.settings.general.username": "Имя пользователя",
"account.your_profile": "Ваш профиль",
"account.settings": "Настройки",
"account.logout_from": "Выйдите из {serverName}",
"account.logout": "Выйти"
}

View File

@@ -1,382 +1,403 @@
{
"about.date": "Byggdatum:",
"about.enterpriseEditione1": "Enterprise-utgåva",
"about.enterpriseEditionLearn": "Läs mer om Enterprise-utgåvan på ",
"about.enterpriseEditionSt": "Modern kommunikation innanför din brandvägg.",
"about.hash": "Bygg-hash:",
"about.hashee": "EE bygg-hash:",
"about.teamEditionLearn": "Bli medlem i Mattermost community på ",
"about.teamEditionSt": "Hela gruppens kommunikation på ett ställe, direkt sökbart och tillgänglig överallt.",
"about.teamEditiont0": "Team-utgåva",
"about.teamEditiont1": "Enterprise-utgåva",
"api.channel.add_guest.added": "{addedUsername} tillagd till kanalen som gäst av {username}.",
"api.channel.add_member.added": "{addedUsername} tillagd i kanalen av {username}.",
"api.channel.guest_join_channel.post_and_forget": "{username} anslöt till kanalen som gäst.",
"apps.error": "Fel: {error}",
"apps.error.command.field_missing": "Nödvändiga fält saknas: `{fieldName}`.",
"apps.error.command.same_channel": "Kanal upprepas i fältet `{fieldName}`: `{option}`.",
"apps.error.command.same_option": "Alternativ upprepas i fältet `{fieldName}`: `{option}`.",
"apps.error.command.same_user": "Användarnamn upprepas i fältet `{fieldName}`: `{option}`.",
"apps.error.command.unknown_channel": "Okänd kanal för fält `{fieldName}`: `{option}`.",
"apps.error.command.unknown_option": "Okänt alternativ för fält `{fieldName}`: `{option}`.",
"apps.error.command.unknown_user": "Okänd användare för fält `{fieldName}`: `{option}`.",
"apps.error.form.no_form": "`form` är inte definierat.",
"apps.error.form.no_lookup": "`lookup` är inte definierat.",
"apps.error.form.no_source": "`source` är inte definierat.",
"apps.error.form.no_submit": "`submit` är inte definierat",
"apps.error.form.refresh": "Ett fel uppstod då de utvalda fälten skulle hämtas. Kontakta app-utvecklaren. Detaljer: {details}",
"apps.error.form.refresh_no_refresh": "Uppdatering efterfrågad på ett fält som inte kan uppdateras.",
"apps.error.form.submit.pretext": "Ett fel uppstod då modalen skulle skickas. Kontakta app-utvecklaren. Detaljer: {details}",
"apps.error.lookup.error_preparing_request": "Fel vid förberedelse av sökningsförfrågan: {errorMessage}",
"apps.error.malformed_binding": "Anslutningen är inte korrekt skapad. Kontakta app-utvecklaren.",
"apps.error.parser": "Fel vi tolkning: {error}",
"apps.error.parser.execute_non_leaf": "Du måste välja ett underkommando.",
"apps.error.parser.missing_binding": "Kommandokopplingar saknas.",
"apps.error.parser.missing_field_value": "Fältvärde saknas.",
"apps.error.parser.missing_list_end": "Förväntade en slutmarkering av listan.",
"apps.error.parser.missing_quote": "Förväntade ett matchande dubbelt citattecken i slutet av inmatningen.",
"apps.error.parser.missing_source": "Formuläret har varken submit eller source.",
"apps.error.parser.missing_submit": "Inget submit i anslutning eller formulär.",
"apps.error.parser.missing_tick": "Förväntade ett matchande citattecken i slutet av inmatningen.",
"apps.error.parser.multiple_equal": "Flera `=`-tecken är inte tillåtet.",
"apps.error.parser.no_argument_pos_x": "Kunde inte identifiera argument.",
"apps.error.parser.no_bindings": "Inga kommandobindningar.",
"apps.error.parser.no_form": "Inget formulär hittat.",
"apps.error.parser.no_match": "`{command}`: Inget matchande kommando hittades i den här arbetsytan.",
"apps.error.parser.no_slash_start": "Kommandot måste börja med ett `/`.",
"apps.error.parser.unexpected_character": "Oväntat tecken.",
"apps.error.parser.unexpected_comma": "Oväntat komma.",
"apps.error.parser.unexpected_error": "Oväntat fel.",
"apps.error.parser.unexpected_flag": "Kommandot accepterar inte flaggan `{flagName}`.",
"apps.error.parser.unexpected_squared_bracket": "Oväntad start på en lista.",
"apps.error.parser.unexpected_state": "Kan inte nås: Oväntad status i matchBinding: `{state}`.",
"apps.error.parser.unexpected_whitespace": "Kan inte nås: Oväntat mellanslag.",
"apps.error.responses.navigate.no_url": "Svarstypen är `navigate`, men ingen url finns i svaret.",
"apps.error.responses.unexpected_error": "Mottog ett oväntat fel.",
"apps.error.responses.unknown_field_error": "Tog emot ett fel för ett okänt fältnamn. Fältnamn: `{field}`. Fel: `{error}`.",
"apps.error.responses.unknown_type": "Appens svarstyp stöds inte. Svarstyp: {type}.",
"apps.error.unknown": "Ett okänt fel inträffade.",
"apps.suggestion.dynamic.error": "Dynamiskt urvalsfel",
"apps.suggestion.errors.parser_error": "Tolkningsfel",
"apps.suggestion.no_dynamic": "Inget data för dynamiska förslag mottogs",
"apps.suggestion.no_static": "Inga matchande alternativ.",
"apps.suggestion.no_suggestion": "Inget matchande förslag.",
"archivedChannelMessage": "Du tittar på en **arkiverad kanal**. Du kan inte skapa nya meddelanden här.",
"camera_type.photo.option": "Ta foto",
"camera_type.title": "Välj åtgärd",
"camera_type.video.option": "Spela in video",
"center_panel.archived.closeChannel": "Stäng kanalen",
"channel_info.header": "Kanalens sidhuvud:",
"channel_loader.someone": "Någon",
"channel_modal.descriptionHelp": "Beskriv hur kanalen är tänkt att användas.",
"channel_modal.header": "Sidhuvud",
"channel_modal.name": "Namn",
"channel_modal.optional": "(valfritt)",
"channel_modal.purpose": "Beskrivning",
"combined_system_message.added_to_channel.many_expanded": "{users} och {lastUser} blev **tillagda i kanalen** av {actor}.",
"combined_system_message.added_to_channel.one": "{firstUser} **tillagd till kanalen** av {actor}.",
"combined_system_message.added_to_channel.one_you": "Du är **tillagd i kanalen** av {actor}.",
"combined_system_message.added_to_channel.two": "{firstUser} och {secondUser} **tillagd i kanalen** av {actor}.",
"combined_system_message.added_to_team.many_expanded": "{users} och {lastUser} är **tillagd till teamet** av {actor}.",
"combined_system_message.added_to_team.one": "{firstUser} **tillagd till teamet** av {actor}.",
"combined_system_message.added_to_team.one_you": "Du **lades till i teamet** av {actor}.",
"combined_system_message.added_to_team.two": "{firstUser} och {secondUser} **lades till i teamet** av {actor}.",
"combined_system_message.joined_channel.many_expanded": "{users} och {lastUser} **anslöt till kanalen**.",
"combined_system_message.joined_channel.one": "{firstUser} **anslöt till kanalen**.",
"combined_system_message.joined_channel.one_you": "Du **anslöt till kanalen**.",
"combined_system_message.joined_channel.two": "{firstUser} och {secondUser} **anslöt till kanalen**.",
"combined_system_message.joined_team.many_expanded": "{users} och {lastUser} **gick med i teamet**.",
"combined_system_message.joined_team.one": "{firstUser} **gick med i teamet**.",
"combined_system_message.joined_team.one_you": "Du **gick med i teamet**.",
"combined_system_message.joined_team.two": "{firstUser} och {secondUser} **anslöt till teamet**.",
"combined_system_message.left_channel.many_expanded": "{users} och {lastUser} **lämnade kanalen**.",
"combined_system_message.left_channel.one": "{firstUser} **lämnade kanalen**.",
"combined_system_message.left_channel.one_you": "Du **lämnade kanalen**.",
"combined_system_message.left_channel.two": "{firstUser} och {secondUser} **lämnade kanalen**.",
"combined_system_message.left_team.many_expanded": "{users} och {lastUser} **lämnade teamet**.",
"combined_system_message.left_team.one": "{firstUser} **lämnade teamet**.",
"combined_system_message.left_team.one_you": "Du **lämnade teamet**.",
"combined_system_message.left_team.two": "{firstUser} och {secondUser} **lämnade teamet**.",
"combined_system_message.removed_from_channel.many_expanded": "{users} och{lastUser} **togs bort från kanalen**.",
"combined_system_message.removed_from_channel.one": "{firstUser} **togs bort från kanalen**.",
"combined_system_message.removed_from_channel.one_you": "Du **togs bort från kanalen**.",
"combined_system_message.removed_from_channel.two": "{firstUser} och {secondUser} **togs bort från kanalen**.",
"combined_system_message.removed_from_team.many_expanded": "{users} och {lastUser} **togs bort från kanalen**.",
"combined_system_message.removed_from_team.one": "{firstUser} **togs bort från kanalen**.",
"combined_system_message.removed_from_team.one_you": "Du **togs bort från teamet**.",
"combined_system_message.removed_from_team.two": "{firstUser} och {secondUser} **togs bort från teamet**.",
"combined_system_message.you": "dig",
"create_post.deactivated": "Du visar en arkiverad kanal med ett avstängt användarkonto.",
"create_post.write": "Skriv i kanalen {channelDisplayName}",
"custom_status.expiry_dropdown.custom": "Anpassad",
"custom_status.expiry_dropdown.date_and_time": "Datum och tid",
"custom_status.expiry_dropdown.dont_clear": "Rensa inte",
"custom_status.expiry_dropdown.four_hours": "4 timmar",
"custom_status.expiry_dropdown.one_hour": "1 timme",
"custom_status.expiry_dropdown.thirty_minutes": "30 minuter",
"custom_status.expiry_dropdown.this_week": "Denna vecka",
"custom_status.expiry_dropdown.today": "Idag",
"custom_status.expiry_time.today": "Idag",
"custom_status.expiry_time.tomorrow": "Imorgon",
"custom_status.expiry.at": "den",
"custom_status.expiry.until": "Till",
"custom_status.failure_message": "Statusuppdateringen misslyckades. Försök igen",
"custom_status.suggestions.in_a_meeting": "I möte",
"custom_status.suggestions.on_a_vacation": "På ledighet",
"custom_status.suggestions.out_for_lunch": "På lunch",
"custom_status.suggestions.out_sick": "Sjuk",
"custom_status.suggestions.working_from_home": "Arbetar hemifrån",
"date_separator.today": "Idag",
"date_separator.yesterday": "Igår",
"edit_post.editPost": "Redigera meddelandet...",
"edit_post.save": "Spara",
"emoji_picker.activities": "Aktiviteter",
"emoji_picker.animals-nature": "Djur & Natur",
"emoji_picker.custom": "Anpassad",
"emoji_picker.flags": "Flaggor",
"emoji_picker.food-drink": "Mat & Dryck",
"emoji_picker.objects": "Objekt",
"emoji_picker.people-body": "Människor & Kropp",
"emoji_picker.searchResults": "Sökresultat",
"emoji_picker.smileys-emotion": "Smileys & Känslor",
"emoji_picker.symbols": "Symboler",
"emoji_picker.travel-places": "Resa & Platser",
"emoji_skin.dark_skin_tone": "mörk hudfärg",
"emoji_skin.default": "standard hudfärg",
"emoji_skin.light_skin_tone": "ljus hudfärg",
"emoji_skin.medium_dark_skin_tone": "medelmörk hudfärg",
"emoji_skin.medium_light_skin_tone": "medelljus hudfärg",
"emoji_skin.medium_skin_tone": "mellan hudfärg",
"file_upload.fileAbove": "Filer måste vara mindre än {max}MB",
"friendly_date.daysAgo": "för {count} {count, plural, one {dag} other {dagar}} sedan",
"friendly_date.hoursAgo": "för {count} {count, plural, one {timme} other {timmar}} sedan",
"friendly_date.minsAgo": "för {count} {count, plural, one {minut} other {minuter}} sedan",
"friendly_date.monthsAgo": "för {count} {count, plural, one {månad} other {månader}} sedan",
"friendly_date.now": "Nu",
"friendly_date.yearsAgo": "för {count} {count, plural, one {år} other {år}} sedan",
"friendly_date.yesterday": "Igår",
"gallery.footer.channel_name": "Delad i {channelName}",
"gallery.open_file": "Öppna fil",
"get_post_link_modal.title": "Kopiera länk",
"global_threads.allThreads": "Alla dina trådar",
"global_threads.emptyThreads.message": "De trådar du nämns i, eller har deltagit i kommer visas här tillsammans med de trådar du följer.",
"global_threads.emptyThreads.title": "Du följer inga trådar ännu",
"global_threads.emptyUnreads.message": "Det ser ut som om du har kommit ikapp.",
"global_threads.emptyUnreads.title": "Inga olästa trådar",
"global_threads.markAllRead.cancel": "Avbryt",
"global_threads.markAllRead.markRead": "Markera som läst",
"global_threads.markAllRead.message": "Detta kommer att rensa oläst-status för alla dina trådar som visas här",
"global_threads.markAllRead.title": "Är du säker på att du vill markera alla trådar som lästa?",
"global_threads.options.mark_as_read": "Markera som läst",
"global_threads.options.open_in_channel": "Öppna i kanalen",
"global_threads.unreads": "Olästa",
"last_users_message.added_to_channel.type": "**lades till i kanalen** av {actor}.",
"last_users_message.added_to_team.type": "**lades till i teamet** av {actor}.",
"last_users_message.first": "{firstUser} och ",
"last_users_message.joined_channel.type": "**anslöt till kanalen**.",
"last_users_message.joined_team.type": "**anslöt till teamet**.",
"last_users_message.left_channel.type": "**lämnade kanalen**.",
"last_users_message.left_team.type": "**lämnade teamet**.",
"last_users_message.others": "{numOthers} andra ",
"last_users_message.removed_from_channel.type": "**togs bort från kanalen**.",
"last_users_message.removed_from_team.type": "**togs bort från teamet**.",
"login_mfa.tokenReq": "Ange ett MFA Token",
"login.email": "E-post",
"login.ldapUsername": "AD/LDAP användarnamn",
"login.or": "eller",
"login.password": "Lösenord",
"login.username": "Användarnamn",
"mobile.about.appVersion": "App-version: {version} (Build {number})",
"mobile.account.settings.save": "Spara",
"mobile.action_menu.select": "Välj ett alternativ",
"mobile.android.back_handler_exit": "Tryck tillbaka igen för att stänga",
"mobile.android.photos_permission_denied_title": "{applicationName} vill ha åtkomst till dina foton",
"mobile.camera_photo_permission_denied_title": "{applicationName} vill få åtkomst till din kamera",
"mobile.channel_info.alertNo": "Nej",
"mobile.channel_info.alertYes": "Ja",
"mobile.commands.error_title": "Fel när kommandot utfördes",
"mobile.components.select_server_view.connect": "Anslut",
"mobile.components.select_server_view.enterServerUrl": "Ange serveradress",
"mobile.components.select_server_view.proceed": "Fortsätt",
"mobile.create_channel": "Skapa",
"mobile.custom_status.choose_emoji": "Välj en emoji",
"mobile.custom_status.clear_after": "Rensa efter",
"mobile.custom_status.modal_confirm": "Klar",
"mobile.display_settings.theme": "Tema",
"mobile.document_preview.failed_description": "Ett fel inträffade när dokumentet skulle öppnas. Kontrollera att du har {fileType}-visare installerad och försök igen.\n",
"mobile.document_preview.failed_title": "Misslyckades att öppna dokument",
"mobile.downloader.disabled_description": "Nedladdning av filer är inaktiverat på denna server. Kontakta din systemadministratör för mer info.\n",
"mobile.downloader.disabled_title": "Nedladdning inaktiverat",
"mobile.downloader.failed_description": "Ett fel inträffade när filen skulle laddas ner. Kontrollera din anslutning till internet och försök igen.\n",
"mobile.downloader.failed_title": "Nedladdning misslyckades",
"mobile.edit_channel": "Spara",
"mobile.edit_post.title": "Editerar meddelande",
"mobile.error_handler.button": "Starta om",
"mobile.error_handler.description": "\nTryck Starta om för att öppna appen igen. Efter omstart kan du rapportera problemet från inställningsmenyn.\n",
"mobile.error_handler.title": "Ett oväntat fel uppstod",
"mobile.file_upload.disabled2": "Filuppladdning från mobil är inaktiverat.",
"mobile.file_upload.max_warning": "Uppladdning begränsad till max {count} filer.",
"mobile.files_paste.error_description": "Ett fel uppstod när filen/filerna klistrades in. Försök igen.",
"mobile.files_paste.error_dismiss": "Avvisa",
"mobile.files_paste.error_title": "Det gick inte att klistra",
"mobile.gallery.title": "{index} av {total}",
"mobile.ios.photos_permission_denied_title": "{applicationName} vill ha åtkomst till dina foton",
"mobile.link.error.text": "Kunde inte öppna länken.",
"mobile.link.error.title": "Fel",
"mobile.managed.blocked_by": "Blockerad av {vendor}",
"mobile.managed.exit": "Redigera",
"mobile.managed.jailbreak": "Din jailbrejkade enhet är inte betrodd av {vendor}. Avsluta appen.",
"mobile.managed.not_secured.android": "Enheten behöver säkras med skärmlås för att använda Mattermost.",
"mobile.managed.not_secured.ios": "Enheten behöver säkras med en passcode för att använda Mattermost.\n\nGå till Inställningar > Face ID & Passcode.",
"mobile.managed.not_secured.ios.touchId": "Enheten behöver säkras med en passcode för att använda Mattermost.\n\nGå till Inställningar > Touch ID & Passcode.",
"mobile.managed.secured_by": "Säkrad av {vendor}",
"mobile.managed.settings": "Gå till Inställningar",
"mobile.markdown.code.copy_code": "Kopiera kod",
"mobile.markdown.code.plusMoreLines": "+{count, number} mer {count, plural, one {rad} other {rader}}",
"mobile.markdown.image.too_large": "Bilden är större än maxstorleken ({maxWidth} x {maxHeight}):",
"mobile.markdown.link.copy_url": "Kopiera URL",
"mobile.mention.copy_mention": "Kopiera omnämnande",
"mobile.message_length.message": "Ditt meddelande är för långt. Nuvarande antal tecken: {max}/{count}",
"mobile.message_length.message_split_left": "Meddelandet överskrider teckenbegränsningen",
"mobile.message_length.title": "Meddelandelängd",
"mobile.microphone_permission_denied_description": "För att delta i samtalet, öppna Inställningar och ge Mattermost tillåtelse att använda mikrofonen.",
"mobile.microphone_permission_denied_title": "{applicationName} behöver åtkomst till din mikrofon",
"mobile.oauth.failed_to_login": "Inloggningen misslyckades. Försök igen.",
"mobile.oauth.failed_to_open_link": "Länken gick inte att öppna. Försök igen.",
"mobile.oauth.something_wrong": "Något gick fel",
"mobile.oauth.try_again": "Försök igen",
"mobile.open_gm.error": "Vi kunde inte öppna ett gruppmeddelande med de användarna. Kontrollera din nätanslutning och försök igen.",
"mobile.permission_denied_dismiss": "Tillåt inte",
"mobile.permission_denied_retry": "Inställningar",
"mobile.post_info.add_reaction": "Lägg till reaktion",
"mobile.post_info.copy_text": "Kopiera text",
"mobile.post_info.mark_unread": "Markera som oläst",
"mobile.post_info.pin": "Fäst i kanal",
"mobile.post_info.reply": "Svara",
"mobile.post_info.unpin": "\"o\"-nåla från kanalen",
"mobile.post_pre_header.pinned": "Fäst",
"mobile.post_textbox.entire_channel_here.message": "Genom att använda @here kommer du skicka notifieringar till {totalMembers, number} {totalMembers, plural, one {person} other {personer}}. Vill du göra det?",
"mobile.post_textbox.entire_channel_here.message.with_timezones": "Genom att använda @here kommer du skicka notifieringar till {totalMembers, number} {totalMembers, plural, one {person} other {personer}} i {timezones, number} {timezones, plural, one {tidszon} other {tidszoner}}. Vill du göra det?",
"mobile.post_textbox.entire_channel.cancel": "Avbryt",
"mobile.post_textbox.entire_channel.confirm": "Godkänn",
"mobile.post_textbox.entire_channel.message": "När du använder @all eller @channel kommer du skicka notifiering till {totalMembers, number} {totalMembers, plural, one {person} other {personer}}. Är du säker på att du vill göra det?",
"mobile.post_textbox.entire_channel.message.with_timezones": "När du använder @all eller @channel kommer du skicka notifiering till {totalMembers, number} {totalMembers, plural, one {person} other {personer}} i {timezones, number} {timezones, plural, one {tidzon} other {tidzoner}}. Är du säker på att du vill göra det?",
"mobile.post_textbox.entire_channel.title": "Bekräfta att skicka notifiering till alla i kanalen",
"mobile.post_textbox.groups.title": "Bekräfta att skicka notifiering till grupper",
"mobile.post_textbox.uploadFailedDesc": "Uppladdning av några bilagor till servern misslyckades. Är du säker på att du vill publicera meddelandet?",
"mobile.post_textbox.uploadFailedTitle": "Fel med bilagor",
"mobile.post.cancel": "Avbryt",
"mobile.post.delete_question": "Är du säker på att du vill radera detta meddelande?",
"mobile.post.delete_title": "Radera meddelanden",
"mobile.post.failed_delete": "Radera meddelande",
"mobile.post.failed_retry": "Försök igen",
"mobile.posts_view.moreMsg": "Fler nya meddelanden ovan",
"mobile.privacy_link": "Integritetspolicy",
"mobile.push_notification_reply.button": "Skicka",
"mobile.push_notification_reply.placeholder": "Skriv svar...",
"mobile.push_notification_reply.title": "Svara",
"mobile.rename_channel.display_name_maxLength": "Namnet på kanalen måste innehålla färre än {maxLength, number} tecken",
"mobile.rename_channel.display_name_minLength": "URL måste vara {minLength, number} eller fler tecken",
"mobile.rename_channel.display_name_required": "Namn på kanalen är obligatoriskt",
"mobile.request.invalid_response": "Mottog ett ogiltigt svar från servern.",
"mobile.reset_status.alert_cancel": "Avbryt",
"mobile.reset_status.title_ooo": "Inaktivera \"Ej på kontoret\"?",
"mobile.routes.code": "{language} kod",
"mobile.routes.code.noLanguage": "Kod",
"mobile.routes.custom_status": "Ange status",
"mobile.routes.table": "Tabell",
"mobile.routes.user_profile": "Profil",
"mobile.search.jump": "Hoppa till senaste meddelanden",
"mobile.server_link.error.text": "Länken kunde inte hittas på servern.",
"mobile.server_link.error.title": "Länk-fel",
"mobile.server_link.unreachable_channel.error": "Länken går till en kanal som antingen är raderad eller där du inte har behörighet.",
"mobile.server_link.unreachable_team.error": "Länken går till ett team som antingen är borttaget eller där du inte har behörighet.",
"mobile.server_upgrade.alert_description": "Den här serverversionen underhålls inte längre och användarna kan komma att utsättas för kompatibilitetsproblem som orsakar krascher eller buggar som stör appens grundläggande funktioner. Uppgradering till serverversion {serverVersion} eller högre krävs.",
"mobile.server_upgrade.button": "OK",
"mobile.server_upgrade.dismiss": "Avbryt",
"mobile.server_upgrade.learn_more": "Ta reda på mer",
"mobile.server_upgrade.title": "Serveruppgradering krävs",
"mobile.server_url.empty": "Ange en giltig server-URL",
"mobile.server_url.invalid_format": "Måste börja med http:// eller https://",
"mobile.set_status.away": "Tillfälligt borta",
"mobile.set_status.dnd": "Stör ej",
"mobile.set_status.offline": "Offline",
"mobile.set_status.online": "Ansluten",
"mobile.storage_permission_denied_title": "{applicationName} vill ha åtkomst till dina filer",
"mobile.suggestion.members": "Medlemmar",
"mobile.system_message.channel_archived_message": "{username} arkiverade kanalen",
"mobile.system_message.channel_unarchived_message": "{username} de-arkiverade kanalen",
"mobile.system_message.update_channel_displayname_message_and_forget.updated_from": "{username} uppdaterade kanalens namn från: {oldDisplayName} till: {newDisplayName}",
"mobile.system_message.update_channel_header_message_and_forget.removed": "{username} raderade kanalens rubrik (var tidigare {oldHeader})",
"mobile.system_message.update_channel_header_message_and_forget.updated_from": "{username} uppdaterade kanalens rubrik från: {oldHeader} till: {newHeader}",
"mobile.system_message.update_channel_header_message_and_forget.updated_to": "{username} uppdaterade kanalens rubrik till: {newHeader}",
"mobile.system_message.update_channel_purpose_message.removed": "{username} raderade kanalens syfte (var tidigare: {oldPurpose})",
"mobile.system_message.update_channel_purpose_message.updated_from": "{username} uppdaterade kanalens syfte från: {oldPurpose} till: {newPurpose}",
"mobile.system_message.update_channel_purpose_message.updated_to": "{username} uppdaterade kanalens syfte till: {newPurpose}",
"mobile.tos_link": "Användarvillkor",
"mobile.unsupported_server.message": "Bifogade filer, förhandsgranskning av länkar, reaktioner och inbäddat data kanske inte visas helt rätt. Om det fortsätter kontaktar du systemadministratören för att uppgradera Mattermost-servern.",
"mobile.unsupported_server.ok": "OK",
"mobile.unsupported_server.title": "Osupporterad serverversion",
"mobile.user_list.deactivated": "Avaktiverad",
"modal.manual_status.auto_responder.message_": "Vill du ändra din status till \"{status}\" och inaktivera Automatiska svar?",
"modal.manual_status.auto_responder.message_away": "Vill du ändra din status till \"Tillfälligt borta\" och inaktivera Automatiska svar?",
"modal.manual_status.auto_responder.message_dnd": "Vill du ändra din status till \"Stör ej\" och inaktivera automatiska svar?",
"modal.manual_status.auto_responder.message_offline": "Vill du ändra din status till \"Offline\" och inaktivera Automatiska svar?",
"modal.manual_status.auto_responder.message_online": "Vill du ändra din status till \"Online\" och inaktivera Automatiska svar?",
"msg_typing.areTyping": "{users} och {last} skriver...",
"msg_typing.isTyping": "{user} skriver...",
"password_send.description": "För att återställa ditt lösenord, ange e-postadressen du använde vid registreringen",
"password_send.error": "Var god ange en giltig e-postadress.",
"password_send.link": "Om kontot finns kommer ett mejl för lösenordsreset skickas till:",
"permalink.show_dialog_warn.cancel": "Avbryt",
"permalink.show_dialog_warn.join": "Gå med",
"permalink.show_dialog_warn.title": "Gå med i en privat kanal",
"post_body.check_for_out_of_channel_groups_mentions.message": "blev inte notifierade av omnämnandet eftersom de inte finns i kanalen. De är inte heller medlemmar i de grupper som länkats till kanalen.",
"post_body.check_for_out_of_channel_mentions.link.and": " och ",
"post_body.check_for_out_of_channel_mentions.link.private": "lägg till dem till denna privata kanal",
"post_body.check_for_out_of_channel_mentions.link.public": "lägg till dem till kanalen",
"post_body.check_for_out_of_channel_mentions.message_last": "? De kommer ha åtkomst till alla tidigare meddelanden.",
"post_body.check_for_out_of_channel_mentions.message.multiple": "blev omnämnda men de är inte i kanalen. Vill du ",
"post_body.check_for_out_of_channel_mentions.message.one": "var omnämnda men finns inte i kanalen. Vill du ",
"post_body.commentedOn": "Kommenterade {name}{apostrophe} meddelande: ",
"post_body.deleted": "(meddelande borttaget)",
"post_info.del": "Ta bort",
"post_info.edit": "Redigera",
"post_info.system": "System",
"post_message_view.edited": "(redigerad)",
"posts_view.newMsg": "Nya meddelanden",
"search_bar.search": "Sök",
"status_dropdown.set_away": "Tillfälligt borta",
"status_dropdown.set_dnd": "Stör ej",
"status_dropdown.set_offline": "Offline",
"status_dropdown.set_online": "Ansluten",
"suggestion.mention.all": "Notifierar alla i kanalen",
"suggestion.mention.channel": "Notifierar alla i kanalen",
"suggestion.mention.channels": "Mina kanaler",
"suggestion.mention.groups": "Gruppomnämnanden",
"suggestion.mention.here": "Notifierar alla anslutna i kanalen",
"suggestion.mention.members": "Medlemmar i kanal",
"suggestion.mention.morechannels": "Andra kanaler",
"suggestion.mention.nonmembers": "Ej i kanalen",
"suggestion.mention.special": "Speciella omnämnanden",
"suggestion.mention.you": " (du)",
"suggestion.search.direct": "Direktmeddelande",
"suggestion.search.private": "Privata kanaler",
"suggestion.search.public": "Publika kanaler",
"threads": "Trådar",
"threads.deleted": "Ursprungligt meddelande raderat",
"threads.follow": "Följ",
"threads.following": "Följer",
"threads.followMessage": "Följ meddelande",
"threads.followThread": "Följ tråden",
"threads.newReplies": "{count} nya {count, plural, one {svar} other {svar}}",
"threads.replies": "{count} {count, plural, one {svar} other {svar}}",
"threads.unfollowMessage": "Sluta följ meddelande",
"threads.unfollowThread": "Sluta följa tråden",
"user.settings.general.email": "E-post",
"user.settings.general.firstName": "Förnamn",
"user.settings.general.lastName": "Efternamn",
"user.settings.general.nickname": "Alias",
"user.settings.general.position": "Position",
"user.settings.general.username": "Användarnamn"
}
"about.date": "Byggdatum:",
"about.enterpriseEditione1": "Enterprise-utgåva",
"about.enterpriseEditionLearn": "Läs mer om Enterprise-utgåvan på ",
"about.enterpriseEditionSt": "Modern kommunikation innanför din brandvägg.",
"about.hash": "Bygg-hash:",
"about.hashee": "EE bygg-hash:",
"about.teamEditionLearn": "Bli medlem i Mattermost community på ",
"about.teamEditionSt": "Hela gruppens kommunikation på ett ställe, direkt sökbart och tillgänglig överallt.",
"about.teamEditiont0": "Team-utgåva",
"about.teamEditiont1": "Enterprise-utgåva",
"api.channel.add_guest.added": "{addedUsername} tillagd till kanalen som gäst av {username}.",
"api.channel.add_member.added": "{addedUsername} tillagd i kanalen av {username}.",
"api.channel.guest_join_channel.post_and_forget": "{username} anslöt till kanalen som gäst.",
"apps.error": "Fel: {error}",
"apps.error.command.field_missing": "Nödvändiga fält saknas: `{fieldName}`.",
"apps.error.command.same_channel": "Kanal upprepas i fältet `{fieldName}`: `{option}`.",
"apps.error.command.same_option": "Alternativ upprepas i fältet `{fieldName}`: `{option}`.",
"apps.error.command.same_user": "Användarnamn upprepas i fältet `{fieldName}`: `{option}`.",
"apps.error.command.unknown_channel": "Okänd kanal för fält `{fieldName}`: `{option}`.",
"apps.error.command.unknown_option": "Okänt alternativ för fält `{fieldName}`: `{option}`.",
"apps.error.command.unknown_user": "Okänd användare för fält `{fieldName}`: `{option}`.",
"apps.error.form.no_form": "`form` är inte definierat.",
"apps.error.form.no_lookup": "`lookup` är inte definierat.",
"apps.error.form.no_source": "`source` är inte definierat.",
"apps.error.form.no_submit": "`submit` är inte definierat",
"apps.error.form.refresh": "Ett fel uppstod då de utvalda fälten skulle hämtas. Kontakta app-utvecklaren. Detaljer: {details}",
"apps.error.form.refresh_no_refresh": "Uppdatering efterfrågad på ett fält som inte kan uppdateras.",
"apps.error.form.submit.pretext": "Ett fel uppstod då modalen skulle skickas. Kontakta app-utvecklaren. Detaljer: {details}",
"apps.error.lookup.error_preparing_request": "Fel vid förberedelse av sökningsförfrågan: {errorMessage}",
"apps.error.malformed_binding": "Anslutningen är inte korrekt skapad. Kontakta app-utvecklaren.",
"apps.error.parser": "Fel vi tolkning: {error}",
"apps.error.parser.execute_non_leaf": "Du måste välja ett underkommando.",
"apps.error.parser.missing_binding": "Kommandokopplingar saknas.",
"apps.error.parser.missing_field_value": "Fältvärde saknas.",
"apps.error.parser.missing_list_end": "Förväntade en slutmarkering av listan.",
"apps.error.parser.missing_quote": "Förväntade ett matchande dubbelt citattecken i slutet av inmatningen.",
"apps.error.parser.missing_source": "Formuläret har varken submit eller source.",
"apps.error.parser.missing_submit": "Inget submit i anslutning eller formulär.",
"apps.error.parser.missing_tick": "Förväntade ett matchande citattecken i slutet av inmatningen.",
"apps.error.parser.multiple_equal": "Flera `=`-tecken är inte tillåtet.",
"apps.error.parser.no_argument_pos_x": "Kunde inte identifiera argument.",
"apps.error.parser.no_bindings": "Inga kommandobindningar.",
"apps.error.parser.no_form": "Inget formulär hittat.",
"apps.error.parser.no_match": "`{command}`: Inget matchande kommando hittades i den här arbetsytan.",
"apps.error.parser.no_slash_start": "Kommandot måste börja med ett `/`.",
"apps.error.parser.unexpected_character": "Oväntat tecken.",
"apps.error.parser.unexpected_comma": "Oväntat komma.",
"apps.error.parser.unexpected_error": "Oväntat fel.",
"apps.error.parser.unexpected_flag": "Kommandot accepterar inte flaggan `{flagName}`.",
"apps.error.parser.unexpected_squared_bracket": "Oväntad start på en lista.",
"apps.error.parser.unexpected_state": "Kan inte nås: Oväntad status i matchBinding: `{state}`.",
"apps.error.parser.unexpected_whitespace": "Kan inte nås: Oväntat mellanslag.",
"apps.error.responses.navigate.no_url": "Svarstypen är `navigate`, men ingen url finns i svaret.",
"apps.error.responses.unexpected_error": "Mottog ett oväntat fel.",
"apps.error.responses.unknown_field_error": "Tog emot ett fel för ett okänt fältnamn. Fältnamn: `{field}`. Fel: `{error}`.",
"apps.error.responses.unknown_type": "Appens svarstyp stöds inte. Svarstyp: {type}.",
"apps.error.unknown": "Ett okänt fel inträffade.",
"apps.suggestion.dynamic.error": "Dynamiskt urvalsfel",
"apps.suggestion.errors.parser_error": "Tolkningsfel",
"apps.suggestion.no_dynamic": "Inget data för dynamiska förslag mottogs",
"apps.suggestion.no_static": "Inga matchande alternativ.",
"apps.suggestion.no_suggestion": "Inget matchande förslag.",
"archivedChannelMessage": "Du tittar på en **arkiverad kanal**. Du kan inte skapa nya meddelanden här.",
"camera_type.photo.option": "Ta foto",
"camera_type.title": "Välj åtgärd",
"camera_type.video.option": "Spela in video",
"center_panel.archived.closeChannel": "Stäng kanalen",
"channel_info.header": "Kanalens sidhuvud:",
"channel_loader.someone": "Någon",
"channel_modal.descriptionHelp": "Beskriv hur kanalen är tänkt att användas.",
"channel_modal.header": "Sidhuvud",
"channel_modal.name": "Namn",
"channel_modal.optional": "(valfritt)",
"channel_modal.purpose": "Beskrivning",
"combined_system_message.added_to_channel.many_expanded": "{users} och {lastUser} blev **tillagda i kanalen** av {actor}.",
"combined_system_message.added_to_channel.one": "{firstUser} **tillagd till kanalen** av {actor}.",
"combined_system_message.added_to_channel.one_you": "Du är **tillagd i kanalen** av {actor}.",
"combined_system_message.added_to_channel.two": "{firstUser} och {secondUser} **tillagd i kanalen** av {actor}.",
"combined_system_message.added_to_team.many_expanded": "{users} och {lastUser} är **tillagd till teamet** av {actor}.",
"combined_system_message.added_to_team.one": "{firstUser} **tillagd till teamet** av {actor}.",
"combined_system_message.added_to_team.one_you": "Du **lades till i teamet** av {actor}.",
"combined_system_message.added_to_team.two": "{firstUser} och {secondUser} **lades till i teamet** av {actor}.",
"combined_system_message.joined_channel.many_expanded": "{users} och {lastUser} **anslöt till kanalen**.",
"combined_system_message.joined_channel.one": "{firstUser} **anslöt till kanalen**.",
"combined_system_message.joined_channel.one_you": "Du **anslöt till kanalen**.",
"combined_system_message.joined_channel.two": "{firstUser} och {secondUser} **anslöt till kanalen**.",
"combined_system_message.joined_team.many_expanded": "{users} och {lastUser} **gick med i teamet**.",
"combined_system_message.joined_team.one": "{firstUser} **gick med i teamet**.",
"combined_system_message.joined_team.one_you": "Du **gick med i teamet**.",
"combined_system_message.joined_team.two": "{firstUser} och {secondUser} **anslöt till teamet**.",
"combined_system_message.left_channel.many_expanded": "{users} och {lastUser} **lämnade kanalen**.",
"combined_system_message.left_channel.one": "{firstUser} **lämnade kanalen**.",
"combined_system_message.left_channel.one_you": "Du **lämnade kanalen**.",
"combined_system_message.left_channel.two": "{firstUser} och {secondUser} **lämnade kanalen**.",
"combined_system_message.left_team.many_expanded": "{users} och {lastUser} **lämnade teamet**.",
"combined_system_message.left_team.one": "{firstUser} **lämnade teamet**.",
"combined_system_message.left_team.one_you": "Du **lämnade teamet**.",
"combined_system_message.left_team.two": "{firstUser} och {secondUser} **lämnade teamet**.",
"combined_system_message.removed_from_channel.many_expanded": "{users} och{lastUser} **togs bort från kanalen**.",
"combined_system_message.removed_from_channel.one": "{firstUser} **togs bort från kanalen**.",
"combined_system_message.removed_from_channel.one_you": "Du **togs bort från kanalen**.",
"combined_system_message.removed_from_channel.two": "{firstUser} och {secondUser} **togs bort från kanalen**.",
"combined_system_message.removed_from_team.many_expanded": "{users} och {lastUser} **togs bort från kanalen**.",
"combined_system_message.removed_from_team.one": "{firstUser} **togs bort från kanalen**.",
"combined_system_message.removed_from_team.one_you": "Du **togs bort från teamet**.",
"combined_system_message.removed_from_team.two": "{firstUser} och {secondUser} **togs bort från teamet**.",
"combined_system_message.you": "dig",
"create_post.deactivated": "Du visar en arkiverad kanal med ett avstängt användarkonto.",
"create_post.write": "Skriv i kanalen {channelDisplayName}",
"custom_status.expiry_dropdown.custom": "Anpassad",
"custom_status.expiry_dropdown.date_and_time": "Datum och tid",
"custom_status.expiry_dropdown.dont_clear": "Rensa inte",
"custom_status.expiry_dropdown.four_hours": "4 timmar",
"custom_status.expiry_dropdown.one_hour": "1 timme",
"custom_status.expiry_dropdown.thirty_minutes": "30 minuter",
"custom_status.expiry_dropdown.this_week": "Denna vecka",
"custom_status.expiry_dropdown.today": "Idag",
"custom_status.expiry_time.today": "Idag",
"custom_status.expiry_time.tomorrow": "Imorgon",
"custom_status.expiry.at": "den",
"custom_status.expiry.until": "Till",
"custom_status.failure_message": "Statusuppdateringen misslyckades. Försök igen",
"custom_status.suggestions.in_a_meeting": "I möte",
"custom_status.suggestions.on_a_vacation": "På ledighet",
"custom_status.suggestions.out_for_lunch": "På lunch",
"custom_status.suggestions.out_sick": "Sjuk",
"custom_status.suggestions.working_from_home": "Arbetar hemifrån",
"date_separator.today": "Idag",
"date_separator.yesterday": "Igår",
"edit_post.editPost": "Redigera meddelandet...",
"edit_post.save": "Spara",
"emoji_picker.activities": "Aktiviteter",
"emoji_picker.animals-nature": "Djur & Natur",
"emoji_picker.custom": "Anpassad",
"emoji_picker.flags": "Flaggor",
"emoji_picker.food-drink": "Mat & Dryck",
"emoji_picker.objects": "Objekt",
"emoji_picker.people-body": "Människor & Kropp",
"emoji_picker.searchResults": "Sökresultat",
"emoji_picker.smileys-emotion": "Smileys & Känslor",
"emoji_picker.symbols": "Symboler",
"emoji_picker.travel-places": "Resa & Platser",
"emoji_skin.dark_skin_tone": "mörk hudfärg",
"emoji_skin.default": "standard hudfärg",
"emoji_skin.light_skin_tone": "ljus hudfärg",
"emoji_skin.medium_dark_skin_tone": "medelmörk hudfärg",
"emoji_skin.medium_light_skin_tone": "medelljus hudfärg",
"emoji_skin.medium_skin_tone": "mellan hudfärg",
"file_upload.fileAbove": "Filer måste vara mindre än {max}MB",
"friendly_date.daysAgo": "för {count} {count, plural, one {dag} other {dagar}} sedan",
"friendly_date.hoursAgo": "för {count} {count, plural, one {timme} other {timmar}} sedan",
"friendly_date.minsAgo": "för {count} {count, plural, one {minut} other {minuter}} sedan",
"friendly_date.monthsAgo": "för {count} {count, plural, one {månad} other {månader}} sedan",
"friendly_date.now": "Nu",
"friendly_date.yearsAgo": "för {count} {count, plural, one {år} other {år}} sedan",
"friendly_date.yesterday": "Igår",
"gallery.footer.channel_name": "Delad i {channelName}",
"gallery.open_file": "Öppna fil",
"get_post_link_modal.title": "Kopiera länk",
"global_threads.allThreads": "Alla dina trådar",
"global_threads.emptyThreads.message": "De trådar du nämns i, eller har deltagit i kommer visas här tillsammans med de trådar du följer.",
"global_threads.emptyThreads.title": "Du följer inga trådar ännu",
"global_threads.emptyUnreads.message": "Det ser ut som om du har kommit ikapp.",
"global_threads.emptyUnreads.title": "Inga olästa trådar",
"global_threads.markAllRead.cancel": "Avbryt",
"global_threads.markAllRead.markRead": "Markera som läst",
"global_threads.markAllRead.message": "Detta kommer att rensa oläst-status för alla dina trådar som visas här",
"global_threads.markAllRead.title": "Är du säker på att du vill markera alla trådar som lästa?",
"global_threads.options.mark_as_read": "Markera som läst",
"global_threads.options.open_in_channel": "Öppna i kanalen",
"global_threads.unreads": "Olästa",
"last_users_message.added_to_channel.type": "**lades till i kanalen** av {actor}.",
"last_users_message.added_to_team.type": "**lades till i teamet** av {actor}.",
"last_users_message.first": "{firstUser} och ",
"last_users_message.joined_channel.type": "**anslöt till kanalen**.",
"last_users_message.joined_team.type": "**anslöt till teamet**.",
"last_users_message.left_channel.type": "**lämnade kanalen**.",
"last_users_message.left_team.type": "**lämnade teamet**.",
"last_users_message.others": "{numOthers} andra ",
"last_users_message.removed_from_channel.type": "**togs bort från kanalen**.",
"last_users_message.removed_from_team.type": "**togs bort från teamet**.",
"login_mfa.tokenReq": "Ange ett MFA Token",
"login.email": "E-post",
"login.ldapUsername": "AD/LDAP användarnamn",
"login.or": "eller",
"login.password": "Lösenord",
"login.username": "Användarnamn",
"mobile.about.appVersion": "App-version: {version} (Build {number})",
"mobile.account.settings.save": "Spara",
"mobile.action_menu.select": "Välj ett alternativ",
"mobile.android.back_handler_exit": "Tryck tillbaka igen för att stänga",
"mobile.android.photos_permission_denied_title": "{applicationName} vill ha åtkomst till dina foton",
"mobile.camera_photo_permission_denied_title": "{applicationName} vill få åtkomst till din kamera",
"mobile.channel_info.alertNo": "Nej",
"mobile.channel_info.alertYes": "Ja",
"mobile.commands.error_title": "Fel när kommandot utfördes",
"mobile.components.select_server_view.connect": "Anslut",
"mobile.components.select_server_view.enterServerUrl": "Ange serveradress",
"mobile.components.select_server_view.proceed": "Fortsätt",
"mobile.create_channel": "Skapa",
"mobile.custom_status.choose_emoji": "Välj en emoji",
"mobile.custom_status.clear_after": "Rensa efter",
"mobile.custom_status.modal_confirm": "Klar",
"mobile.display_settings.theme": "Tema",
"mobile.document_preview.failed_description": "Ett fel inträffade när dokumentet skulle öppnas. Kontrollera att du har {fileType}-visare installerad och försök igen.\n",
"mobile.document_preview.failed_title": "Misslyckades att öppna dokument",
"mobile.downloader.disabled_description": "Nedladdning av filer är inaktiverat på denna server. Kontakta din systemadministratör för mer info.\n",
"mobile.downloader.disabled_title": "Nedladdning inaktiverat",
"mobile.downloader.failed_description": "Ett fel inträffade när filen skulle laddas ner. Kontrollera din anslutning till internet och försök igen.\n",
"mobile.downloader.failed_title": "Nedladdning misslyckades",
"mobile.edit_channel": "Spara",
"mobile.edit_post.title": "Editerar meddelande",
"mobile.error_handler.button": "Starta om",
"mobile.error_handler.description": "\nTryck Starta om för att öppna appen igen. Efter omstart kan du rapportera problemet från inställningsmenyn.\n",
"mobile.error_handler.title": "Ett oväntat fel uppstod",
"mobile.file_upload.disabled2": "Filuppladdning från mobil är inaktiverat.",
"mobile.file_upload.max_warning": "Uppladdning begränsad till max {count} filer.",
"mobile.files_paste.error_description": "Ett fel uppstod när filen/filerna klistrades in. Försök igen.",
"mobile.files_paste.error_dismiss": "Avvisa",
"mobile.files_paste.error_title": "Det gick inte att klistra",
"mobile.gallery.title": "{index} av {total}",
"mobile.ios.photos_permission_denied_title": "{applicationName} vill ha åtkomst till dina foton",
"mobile.link.error.text": "Kunde inte öppna länken.",
"mobile.link.error.title": "Fel",
"mobile.managed.blocked_by": "Blockerad av {vendor}",
"mobile.managed.exit": "Redigera",
"mobile.managed.jailbreak": "Din jailbrejkade enhet är inte betrodd av {vendor}. Avsluta appen.",
"mobile.managed.not_secured.android": "Enheten behöver säkras med skärmlås för att använda Mattermost.",
"mobile.managed.not_secured.ios": "Enheten behöver säkras med en passcode för att använda Mattermost.\n\nGå till Inställningar > Face ID & Passcode.",
"mobile.managed.not_secured.ios.touchId": "Enheten behöver säkras med en passcode för att använda Mattermost.\n\nGå till Inställningar > Touch ID & Passcode.",
"mobile.managed.secured_by": "Säkrad av {vendor}",
"mobile.managed.settings": "Gå till Inställningar",
"mobile.markdown.code.copy_code": "Kopiera kod",
"mobile.markdown.code.plusMoreLines": "+{count, number} mer {count, plural, one {rad} other {rader}}",
"mobile.markdown.image.too_large": "Bilden är större än maxstorleken ({maxWidth} x {maxHeight}):",
"mobile.markdown.link.copy_url": "Kopiera URL",
"mobile.mention.copy_mention": "Kopiera omnämnande",
"mobile.message_length.message": "Ditt meddelande är för långt. Nuvarande antal tecken: {max}/{count}",
"mobile.message_length.message_split_left": "Meddelandet överskrider teckenbegränsningen",
"mobile.message_length.title": "Meddelandelängd",
"mobile.microphone_permission_denied_description": "För att delta i samtalet, öppna Inställningar och ge Mattermost tillåtelse att använda mikrofonen.",
"mobile.microphone_permission_denied_title": "{applicationName} behöver åtkomst till din mikrofon",
"mobile.oauth.failed_to_login": "Inloggningen misslyckades. Försök igen.",
"mobile.oauth.failed_to_open_link": "Länken gick inte att öppna. Försök igen.",
"mobile.oauth.something_wrong": "Något gick fel",
"mobile.oauth.try_again": "Försök igen",
"mobile.open_gm.error": "Vi kunde inte öppna ett gruppmeddelande med de användarna. Kontrollera din nätanslutning och försök igen.",
"mobile.permission_denied_dismiss": "Tillåt inte",
"mobile.permission_denied_retry": "Inställningar",
"mobile.post_info.add_reaction": "Lägg till reaktion",
"mobile.post_info.copy_text": "Kopiera text",
"mobile.post_info.mark_unread": "Markera som oläst",
"mobile.post_info.pin": "Fäst i kanal",
"mobile.post_info.reply": "Svara",
"mobile.post_info.unpin": "\"o\"-nåla från kanalen",
"mobile.post_pre_header.pinned": "Fäst",
"mobile.post_textbox.entire_channel_here.message": "Genom att använda @here kommer du skicka notifieringar till {totalMembers, number} {totalMembers, plural, one {person} other {personer}}. Vill du göra det?",
"mobile.post_textbox.entire_channel_here.message.with_timezones": "Genom att använda @here kommer du skicka notifieringar till {totalMembers, number} {totalMembers, plural, one {person} other {personer}} i {timezones, number} {timezones, plural, one {tidszon} other {tidszoner}}. Vill du göra det?",
"mobile.post_textbox.entire_channel.cancel": "Avbryt",
"mobile.post_textbox.entire_channel.confirm": "Godkänn",
"mobile.post_textbox.entire_channel.message": "När du använder @all eller @channel kommer du skicka notifiering till {totalMembers, number} {totalMembers, plural, one {person} other {personer}}. Är du säker på att du vill göra det?",
"mobile.post_textbox.entire_channel.message.with_timezones": "När du använder @all eller @channel kommer du skicka notifiering till {totalMembers, number} {totalMembers, plural, one {person} other {personer}} i {timezones, number} {timezones, plural, one {tidzon} other {tidzoner}}. Är du säker på att du vill göra det?",
"mobile.post_textbox.entire_channel.title": "Bekräfta att skicka notifiering till alla i kanalen",
"mobile.post_textbox.groups.title": "Bekräfta att skicka notifiering till grupper",
"mobile.post_textbox.uploadFailedDesc": "Uppladdning av några bilagor till servern misslyckades. Är du säker på att du vill publicera meddelandet?",
"mobile.post_textbox.uploadFailedTitle": "Fel med bilagor",
"mobile.post.cancel": "Avbryt",
"mobile.post.delete_question": "Är du säker på att du vill radera detta meddelande?",
"mobile.post.delete_title": "Radera meddelanden",
"mobile.post.failed_delete": "Radera meddelande",
"mobile.post.failed_retry": "Försök igen",
"mobile.posts_view.moreMsg": "Fler nya meddelanden ovan",
"mobile.privacy_link": "Integritetspolicy",
"mobile.push_notification_reply.button": "Skicka",
"mobile.push_notification_reply.placeholder": "Skriv svar...",
"mobile.push_notification_reply.title": "Svara",
"mobile.rename_channel.display_name_maxLength": "Namnet på kanalen måste innehålla färre än {maxLength, number} tecken",
"mobile.rename_channel.display_name_minLength": "URL måste vara {minLength, number} eller fler tecken",
"mobile.rename_channel.display_name_required": "Namn på kanalen är obligatoriskt",
"mobile.request.invalid_response": "Mottog ett ogiltigt svar från servern.",
"mobile.reset_status.alert_cancel": "Avbryt",
"mobile.reset_status.title_ooo": "Inaktivera \"Ej på kontoret\"?",
"mobile.routes.code": "{language} kod",
"mobile.routes.code.noLanguage": "Kod",
"mobile.routes.custom_status": "Ange status",
"mobile.routes.table": "Tabell",
"mobile.routes.user_profile": "Profil",
"mobile.search.jump": "Hoppa till senaste meddelanden",
"mobile.server_link.error.text": "Länken kunde inte hittas på servern.",
"mobile.server_link.error.title": "Länk-fel",
"mobile.server_link.unreachable_channel.error": "Länken går till en kanal som antingen är raderad eller där du inte har behörighet.",
"mobile.server_link.unreachable_team.error": "Länken går till ett team som antingen är borttaget eller där du inte har behörighet.",
"mobile.server_upgrade.alert_description": "Den här serverversionen underhålls inte längre och användarna kan komma att utsättas för kompatibilitetsproblem som orsakar krascher eller buggar som stör appens grundläggande funktioner. Uppgradering till serverversion {serverVersion} eller högre krävs.",
"mobile.server_upgrade.button": "OK",
"mobile.server_upgrade.dismiss": "Avbryt",
"mobile.server_upgrade.learn_more": "Ta reda på mer",
"mobile.server_upgrade.title": "Serveruppgradering krävs",
"mobile.server_url.empty": "Ange en giltig server-URL",
"mobile.server_url.invalid_format": "Måste börja med http:// eller https://",
"mobile.set_status.away": "Tillfälligt borta",
"mobile.set_status.dnd": "Stör ej",
"mobile.set_status.offline": "Offline",
"mobile.set_status.online": "Ansluten",
"mobile.storage_permission_denied_title": "{applicationName} vill ha åtkomst till dina filer",
"mobile.suggestion.members": "Medlemmar",
"mobile.system_message.channel_archived_message": "{username} arkiverade kanalen",
"mobile.system_message.channel_unarchived_message": "{username} de-arkiverade kanalen",
"mobile.system_message.update_channel_displayname_message_and_forget.updated_from": "{username} uppdaterade kanalens namn från: {oldDisplayName} till: {newDisplayName}",
"mobile.system_message.update_channel_header_message_and_forget.removed": "{username} raderade kanalens rubrik (var tidigare {oldHeader})",
"mobile.system_message.update_channel_header_message_and_forget.updated_from": "{username} uppdaterade kanalens rubrik från: {oldHeader} till: {newHeader}",
"mobile.system_message.update_channel_header_message_and_forget.updated_to": "{username} uppdaterade kanalens rubrik till: {newHeader}",
"mobile.system_message.update_channel_purpose_message.removed": "{username} raderade kanalens syfte (var tidigare: {oldPurpose})",
"mobile.system_message.update_channel_purpose_message.updated_from": "{username} uppdaterade kanalens syfte från: {oldPurpose} till: {newPurpose}",
"mobile.system_message.update_channel_purpose_message.updated_to": "{username} uppdaterade kanalens syfte till: {newPurpose}",
"mobile.tos_link": "Användarvillkor",
"mobile.unsupported_server.message": "Bifogade filer, förhandsgranskning av länkar, reaktioner och inbäddat data kanske inte visas helt rätt. Om det fortsätter kontaktar du systemadministratören för att uppgradera Mattermost-servern.",
"mobile.unsupported_server.ok": "OK",
"mobile.unsupported_server.title": "Osupporterad serverversion",
"mobile.user_list.deactivated": "Avaktiverad",
"modal.manual_status.auto_responder.message_": "Vill du ändra din status till \"{status}\" och inaktivera Automatiska svar?",
"modal.manual_status.auto_responder.message_away": "Vill du ändra din status till \"Tillfälligt borta\" och inaktivera Automatiska svar?",
"modal.manual_status.auto_responder.message_dnd": "Vill du ändra din status till \"Stör ej\" och inaktivera automatiska svar?",
"modal.manual_status.auto_responder.message_offline": "Vill du ändra din status till \"Offline\" och inaktivera Automatiska svar?",
"modal.manual_status.auto_responder.message_online": "Vill du ändra din status till \"Online\" och inaktivera Automatiska svar?",
"msg_typing.areTyping": "{users} och {last} skriver...",
"msg_typing.isTyping": "{user} skriver...",
"password_send.description": "För att återställa ditt lösenord, ange e-postadressen du använde vid registreringen",
"password_send.error": "Var god ange en giltig e-postadress.",
"password_send.link": "Om kontot finns kommer ett mejl för lösenordsreset skickas till:",
"permalink.show_dialog_warn.cancel": "Avbryt",
"permalink.show_dialog_warn.join": "Gå med",
"permalink.show_dialog_warn.title": "Gå med i en privat kanal",
"post_body.check_for_out_of_channel_groups_mentions.message": "blev inte notifierade av omnämnandet eftersom de inte finns i kanalen. De är inte heller medlemmar i de grupper som länkats till kanalen.",
"post_body.check_for_out_of_channel_mentions.link.and": " och ",
"post_body.check_for_out_of_channel_mentions.link.private": "lägg till dem till denna privata kanal",
"post_body.check_for_out_of_channel_mentions.link.public": "lägg till dem till kanalen",
"post_body.check_for_out_of_channel_mentions.message_last": "? De kommer ha åtkomst till alla tidigare meddelanden.",
"post_body.check_for_out_of_channel_mentions.message.multiple": "blev omnämnda men de är inte i kanalen. Vill du ",
"post_body.check_for_out_of_channel_mentions.message.one": "var omnämnda men finns inte i kanalen. Vill du ",
"post_body.commentedOn": "Kommenterade {name}{apostrophe} meddelande: ",
"post_body.deleted": "(meddelande borttaget)",
"post_info.del": "Ta bort",
"post_info.edit": "Redigera",
"post_info.system": "System",
"post_message_view.edited": "(redigerad)",
"posts_view.newMsg": "Nya meddelanden",
"search_bar.search": "Sök",
"status_dropdown.set_away": "Tillfälligt borta",
"status_dropdown.set_dnd": "Stör ej",
"status_dropdown.set_offline": "Offline",
"status_dropdown.set_online": "Ansluten",
"suggestion.mention.all": "Notifierar alla i kanalen",
"suggestion.mention.channel": "Notifierar alla i kanalen",
"suggestion.mention.channels": "Mina kanaler",
"suggestion.mention.groups": "Gruppomnämnanden",
"suggestion.mention.here": "Notifierar alla anslutna i kanalen",
"suggestion.mention.members": "Medlemmar i kanal",
"suggestion.mention.morechannels": "Andra kanaler",
"suggestion.mention.nonmembers": "Ej i kanalen",
"suggestion.mention.special": "Speciella omnämnanden",
"suggestion.mention.you": " (du)",
"suggestion.search.direct": "Direktmeddelande",
"suggestion.search.private": "Privata kanaler",
"suggestion.search.public": "Publika kanaler",
"threads": "Trådar",
"threads.deleted": "Ursprungligt meddelande raderat",
"threads.follow": "Följ",
"threads.following": "Följer",
"threads.followMessage": "Följ meddelande",
"threads.followThread": "Följ tråden",
"threads.newReplies": "{count} nya {count, plural, one {svar} other {svar}}",
"threads.replies": "{count} {count, plural, one {svar} other {svar}}",
"threads.unfollowMessage": "Sluta följ meddelande",
"threads.unfollowThread": "Sluta följa tråden",
"user.settings.general.email": "E-post",
"user.settings.general.firstName": "Förnamn",
"user.settings.general.lastName": "Efternamn",
"user.settings.general.nickname": "Alias",
"user.settings.general.position": "Position",
"user.settings.general.username": "Användarnamn",
"autocomplete_selector.unknown_channel": "Okänd kanal",
"apps.error.responses.unexpected_type": "Appens svarstyp var oväntat. Svarstyp: {type}",
"apps.error.responses.form.no_form": "Svarstypen är `form`, men inget formulär ingår i svaret.",
"apps.error.parser.empty_value": "Tomma värden är inte tillåtet.",
"alert.removed_from_team.title": "Borttagen från team",
"alert.removed_from_team.description": "Du har tagits bort från teamet {displayName}.",
"alert.removed_from_channel.title": "Borttagen från kanalen",
"alert.removed_from_channel.description": "Du har tagits bort från kanalen {displayName}.",
"alert.push_proxy.button": "Okej",
"alert.push_proxy_unknown.title": "Notifieringar kunde inte tas emot från den här servern",
"alert.push_proxy_unknown.description": "Den här servern kunde inte ta emot push-notiser av okänd anledning. Detta kommer att försöka igen nästa gång du ansluter.",
"alert.push_proxy_error.title": "Notifieringar kan inte tas emot från den här servern",
"alert.push_proxy_error.description": "På grund av serverns konfiguration kan notifieringar inte tas emot i mobilappen. Kontakta din systemadministratör för mer information.",
"alert.channel_deleted.title": "Arkiverad kanal",
"alert.channel_deleted.description": "Kanalen {displayName} har arkiverats.",
"advanced_settings.delete_data": "Radera dokument & data",
"account.your_profile": "Din profil",
"account.user_status.title": "Användarnärvaro",
"account.settings": "Inställningar",
"account.logout_from": "Logga ut från {serverName}",
"account.logout": "Logga ut"
}

View File

@@ -1,382 +1,383 @@
{
"about.date": "编译日期:",
"about.enterpriseEditione1": "企业版",
"about.enterpriseEditionLearn": "了解更多关于企业版 ",
"about.enterpriseEditionSt": "位于防火墙后的现代通讯方式。",
"about.hash": "编译哈希:",
"about.hashee": "企业版编译哈希:",
"about.teamEditionLearn": "加入 Mattermost 社区: ",
"about.teamEditionSt": "所有团队的通讯一站式解决,随时随地可搜索和访问。",
"about.teamEditiont0": "团队版",
"about.teamEditiont1": "企业版",
"api.channel.add_guest.added": "{addedUsername} 被 {username} 以访客身份添加到此频道。",
"api.channel.add_member.added": "{addedUsername} 被 {username} 添加到此频道。",
"api.channel.guest_join_channel.post_and_forget": "{username} 以访客身份加入频道。",
"apps.error": "错误:{error}",
"apps.error.command.field_missing": "缺少必填字段:`{fieldName}`。",
"apps.error.command.same_channel": "字段`{fieldName}`的频道重复:`{option}`。",
"apps.error.command.same_option": "字段`{fieldName}`的选项重复:`{option}`。",
"apps.error.command.same_user": "字段`{fieldName}`的用户重复:`{option}`。",
"apps.error.command.unknown_channel": "未知字段的频道 `{fieldName}``{option}`。",
"apps.error.command.unknown_option": "未知字段的选项 `{fieldName}``{option}`。",
"apps.error.command.unknown_user": "未知字段的用户 `{fieldName}``{option}`。",
"apps.error.form.no_form": "未定义`form`。",
"apps.error.form.no_lookup": "未定义`lookup`。",
"apps.error.form.no_source": "未定义`source`。",
"apps.error.form.no_submit": "未定义`submit`",
"apps.error.form.refresh": "提取选择的字段时出错。与应用程序开发者联系。详细信息:{details}",
"apps.error.form.refresh_no_refresh": "在无刷新字段上调用刷新。",
"apps.error.form.submit.pretext": "提交模态时出错。与应用程序开发人员联系。详细信息:{details}",
"apps.error.lookup.error_preparing_request": "准备查询请求时出错:{errorMessage}",
"apps.error.malformed_binding": "此绑定未正确形成。联系应用开发者。",
"apps.error.parser": "解析错误:{error}",
"apps.error.parser.execute_non_leaf": "您必须选择子命令。",
"apps.error.parser.missing_binding": "缺少指令绑定。",
"apps.error.parser.missing_field_value": "字段值丢失。",
"apps.error.parser.missing_list_end": "预期列表结束令牌。",
"apps.error.parser.missing_quote": "预期在输入结束之前有匹配的双引号。",
"apps.error.parser.missing_source": "表单没有 submit 或 source。",
"apps.error.parser.missing_submit": "没有绑定或表单中的提交调用。",
"apps.error.parser.missing_tick": "预期在输入结束之前有匹配的勾号。",
"apps.error.parser.multiple_equal": "不允许多个 `=` 符号。",
"apps.error.parser.no_argument_pos_x": "无法识别参数。",
"apps.error.parser.no_bindings": "没有命令绑定。",
"apps.error.parser.no_form": "未找到表单。",
"apps.error.parser.no_match": "`{command}`:在此工作空间中找不到匹配的命令。",
"apps.error.parser.no_slash_start": "命令必须以 `/` 开头。",
"apps.error.parser.unexpected_character": "未预料的字符。",
"apps.error.parser.unexpected_comma": "未预料的逗号。",
"apps.error.parser.unexpected_error": "意外的错误。",
"apps.error.parser.unexpected_flag": "命令不接受标志 `{flagName}`。",
"apps.error.parser.unexpected_squared_bracket": "未预料的列表打开。",
"apps.error.parser.unexpected_state": "无法访问:未预料的状态 matchBinding`{state}`。",
"apps.error.parser.unexpected_whitespace": "无法访问:未预料的空白。",
"apps.error.responses.navigate.no_url": "响应类型为“导航”,但响应中未包含网址。",
"apps.error.responses.unexpected_error": "收到未预料的错误。",
"apps.error.responses.unknown_field_error": "收到未知字段的错误。字段名称:`{field}`。错误:`{error}`。",
"apps.error.responses.unknown_type": "不支援应用响应的类型。响应类型:{type}。",
"apps.error.unknown": "发生未知错误。",
"apps.suggestion.dynamic.error": "动态选择错误",
"apps.suggestion.errors.parser_error": "解析错误",
"apps.suggestion.no_dynamic": "没有返回动态建议的数据",
"apps.suggestion.no_static": "没有匹配的选项。",
"apps.suggestion.no_suggestion": "没有匹配的建议。",
"archivedChannelMessage": "您正在查看**已归档的频道**。新消息无法被发送。",
"camera_type.photo.option": "拍摄照片",
"camera_type.title": "选择操作",
"camera_type.video.option": "录视频",
"center_panel.archived.closeChannel": "关闭频道",
"channel_info.header": "标题:",
"channel_loader.someone": "有人",
"channel_modal.descriptionHelp": "描述此频道如何被使用。",
"channel_modal.header": "标题",
"channel_modal.name": "名称",
"channel_modal.optional": "(可选)",
"channel_modal.purpose": "用途",
"combined_system_message.added_to_channel.many_expanded": "{actor} 添加了 {users} 以及 {lastUser} 至**此频道**。",
"combined_system_message.added_to_channel.one": "{actor} 添加了 {firstUser} 至**此频道**。",
"combined_system_message.added_to_channel.one_you": "您被 {actor} 添加至**此频道**。",
"combined_system_message.added_to_channel.two": "{actor} 添加了 {firstUser} 和 {secondUser} 至**此频道**。",
"combined_system_message.added_to_team.many_expanded": "{actor} 添加了 {users} 以及 {lastUser} 至**此团队**。",
"combined_system_message.added_to_team.one": "{actor} 添加了 {firstUser} 至**此团队**。",
"combined_system_message.added_to_team.one_you": "您被 {actor} 添加至**此团队**。",
"combined_system_message.added_to_team.two": "{actor} 添加了 {firstUser} 和 {secondUser} 至**此团队**。",
"combined_system_message.joined_channel.many_expanded": "{users} 以及 {lastUser} **加入了此频道**。",
"combined_system_message.joined_channel.one": "{firstUser} **加入了此频道**。",
"combined_system_message.joined_channel.one_you": "您**加入了频道**。",
"combined_system_message.joined_channel.two": "{firstUser} 和 {secondUser} **加入了此频道**。",
"combined_system_message.joined_team.many_expanded": "{users} 以及 {lastUser} **加入了此团队**。",
"combined_system_message.joined_team.one": "{firstUser} **加入了此团队**。",
"combined_system_message.joined_team.one_you": "您**加入了团队**。",
"combined_system_message.joined_team.two": "{firstUser} 和 {secondUser} **加入了此团队**。",
"combined_system_message.left_channel.many_expanded": "{users} 以及 {lastUser} **离开了此频道**。",
"combined_system_message.left_channel.one": "{firstUser} **离开了此频道**。",
"combined_system_message.left_channel.one_you": "您**离开了频道**。",
"combined_system_message.left_channel.two": "{firstUser} 和 {secondUser} **离开了此频道**。",
"combined_system_message.left_team.many_expanded": "{users} 以及 {lastUser} **离开了此团队**。",
"combined_system_message.left_team.one": "{firstUser} **离开了此团队**。",
"combined_system_message.left_team.one_you": "您**离开了团队**。",
"combined_system_message.left_team.two": "{firstUser} 以及 {secondUser} **离开了此团队**。",
"combined_system_message.removed_from_channel.many_expanded": "{users} 以及 {lastUser} **被移出此频道**。",
"combined_system_message.removed_from_channel.one": "{firstUser} **被移出此频道**。",
"combined_system_message.removed_from_channel.one_you": "您**被移出此频道**。",
"combined_system_message.removed_from_channel.two": "{firstUser} 以及 {secondUser} **被移出此频道**。",
"combined_system_message.removed_from_team.many_expanded": "{users} 以及 {lastUser} **被移出此团队**。",
"combined_system_message.removed_from_team.one": "{firstUser} **被移出此团队**。",
"combined_system_message.removed_from_team.one_you": "您**被移出此团队**。",
"combined_system_message.removed_from_team.two": "{firstUser} 和 {secondUser} **被移出此团队**。",
"combined_system_message.you": "您",
"create_post.deactivated": "您正在查看已注销用户的归档频道。",
"create_post.write": "写入到{channelDisplayName}",
"custom_status.expiry_dropdown.custom": "自定义",
"custom_status.expiry_dropdown.date_and_time": "日期和时间",
"custom_status.expiry_dropdown.dont_clear": "不清除",
"custom_status.expiry_dropdown.four_hours": "4 小时",
"custom_status.expiry_dropdown.one_hour": "1 小时",
"custom_status.expiry_dropdown.thirty_minutes": "30 分钟",
"custom_status.expiry_dropdown.this_week": "本周",
"custom_status.expiry_dropdown.today": "今天",
"custom_status.expiry_time.today": "今天",
"custom_status.expiry_time.tomorrow": "明天",
"custom_status.expiry.at": "于",
"custom_status.expiry.until": "至",
"custom_status.failure_message": "无法更新状态。再试一次",
"custom_status.suggestions.in_a_meeting": "在开会",
"custom_status.suggestions.on_a_vacation": "在度假",
"custom_status.suggestions.out_for_lunch": "在午餐",
"custom_status.suggestions.out_sick": "生病中",
"custom_status.suggestions.working_from_home": "居家办公",
"date_separator.today": "今天",
"date_separator.yesterday": "昨天",
"edit_post.editPost": "编辑信息...",
"edit_post.save": "保存",
"emoji_picker.activities": "活动",
"emoji_picker.animals-nature": "动物与自然",
"emoji_picker.custom": "自定义",
"emoji_picker.flags": "旗帜",
"emoji_picker.food-drink": "食物与饮料",
"emoji_picker.objects": "物品",
"emoji_picker.people-body": "人与身体",
"emoji_picker.searchResults": "搜索结果",
"emoji_picker.smileys-emotion": "笑脸与情感",
"emoji_picker.symbols": "符号",
"emoji_picker.travel-places": "旅游与地点",
"emoji_skin.dark_skin_tone": "深色肤色",
"emoji_skin.default": "默认肤色",
"emoji_skin.light_skin_tone": "浅肤色",
"emoji_skin.medium_dark_skin_tone": "中等深肤色",
"emoji_skin.medium_light_skin_tone": "中等浅肤色",
"emoji_skin.medium_skin_tone": "中等肤色",
"file_upload.fileAbove": "文件必须小于 {max}",
"friendly_date.daysAgo": "{count} 天前",
"friendly_date.hoursAgo": "{count} 小时前",
"friendly_date.minsAgo": "{count} 分钟前",
"friendly_date.monthsAgo": "{count} 个月前",
"friendly_date.now": "现在",
"friendly_date.yearsAgo": "{count} 年前",
"friendly_date.yesterday": "昨天",
"gallery.footer.channel_name": "在 {channelName} 中共享",
"gallery.open_file": "打开文件",
"get_post_link_modal.title": "复制链接",
"global_threads.allThreads": "你所有的主题",
"global_threads.emptyThreads.message": "您被提及或参与过的任何主题都将与您关注的任何主题一起显示在此处。",
"global_threads.emptyThreads.title": "还没有关注的主题",
"global_threads.emptyUnreads.message": "看起来你已经赶上了。",
"global_threads.emptyUnreads.title": "没有未读主题",
"global_threads.markAllRead.cancel": "取消",
"global_threads.markAllRead.markRead": "标为已读",
"global_threads.markAllRead.message": "这将清除此处显示的所有主题的任何未读状态",
"global_threads.markAllRead.title": "您确定要将所有主题都标记为已读吗?",
"global_threads.options.mark_as_read": "标为已读",
"global_threads.options.open_in_channel": "在频道中打开",
"global_threads.unreads": "未读",
"last_users_message.added_to_channel.type": "被 {actor} **添加至此频道**。",
"last_users_message.added_to_team.type": "被 {actor} **添加至此团队**。",
"last_users_message.first": "{firstUser} 和 ",
"last_users_message.joined_channel.type": "**加入了频道**。",
"last_users_message.joined_team.type": "**加入了团队**。",
"last_users_message.left_channel.type": "**离开了频道**。",
"last_users_message.left_team.type": "**离开了团队**。",
"last_users_message.others": "{numOthers} 其他人 ",
"last_users_message.removed_from_channel.type": "被**移出了此频道**。",
"last_users_message.removed_from_team.type": "被**移出了此团队**。",
"login_mfa.tokenReq": "请输入多重验证令牌",
"login.email": "电子邮件",
"login.ldapUsername": "AD/LDAP 用户名",
"login.or": "或",
"login.password": "密码",
"login.username": "用户名",
"mobile.about.appVersion": "应用版本:{version} (Build {number})",
"mobile.account.settings.save": "保存",
"mobile.action_menu.select": "选择选项",
"mobile.android.back_handler_exit": "再次点击返回以退出",
"mobile.android.photos_permission_denied_title": "{applicationName} 想要访问您的照片",
"mobile.camera_photo_permission_denied_title": "{applicationName}想要访问您的相机",
"mobile.channel_info.alertNo": "否",
"mobile.channel_info.alertYes": "是的",
"mobile.commands.error_title": "执行命令时出错",
"mobile.components.select_server_view.connect": "连接",
"mobile.components.select_server_view.enterServerUrl": "输入服务器网址",
"mobile.components.select_server_view.proceed": "继续",
"mobile.create_channel": "创建",
"mobile.custom_status.choose_emoji": "选择表情符",
"mobile.custom_status.clear_after": "清除于",
"mobile.custom_status.modal_confirm": "完成",
"mobile.display_settings.theme": "主题",
"mobile.document_preview.failed_description": "打开文档时遇到错误。请确定您已安装 {fileType} 查看器后再重试。\n",
"mobile.document_preview.failed_title": "打开文档失败",
"mobile.downloader.disabled_description": "文件下载在本服务器已停用。详情请联系您的系统管理员。\n",
"mobile.downloader.disabled_title": "下载已停用",
"mobile.downloader.failed_description": "下载文件时遇到错误。请检查您的网络连接后重试。\n",
"mobile.downloader.failed_title": "下载失败",
"mobile.edit_channel": "保存",
"mobile.edit_post.title": "编辑消息",
"mobile.error_handler.button": "重加载",
"mobile.error_handler.description": "\n点击重启动应用。重启后您可以在设定菜单汇报问题。\n",
"mobile.error_handler.title": "发生未知错误",
"mobile.file_upload.disabled2": "从手机上传文件被禁用。",
"mobile.file_upload.max_warning": "最多可上传 {count} 个文件。",
"mobile.files_paste.error_description": "粘贴文件时遇到错误。请重试。",
"mobile.files_paste.error_dismiss": "解除",
"mobile.files_paste.error_title": "粘贴失败",
"mobile.gallery.title": "{index}/{total}",
"mobile.ios.photos_permission_denied_title": "{applicationName} 想要访问您的照片",
"mobile.link.error.text": "无法打开链接。",
"mobile.link.error.title": "错误",
"mobile.managed.blocked_by": "被 {vendor} 封锁",
"mobile.managed.exit": "退出",
"mobile.managed.jailbreak": "越狱的设备不被 {vendor} 信任,请退出应用。",
"mobile.managed.not_secured.android": "此设备必须开启屏幕锁才能使用 Mattermost。",
"mobile.managed.not_secured.ios": "此设备必须开启密码锁才能使用 Mattermost。\n\n前往设置 > 面容 ID 与密码。",
"mobile.managed.not_secured.ios.touchId": "此设备必须开启密码锁才能使用 Mattermost。\n\n前往设置 > 面容 ID 与密码。",
"mobile.managed.secured_by": "被 {vendor} 安全保护",
"mobile.managed.settings": "前往设置",
"mobile.markdown.code.copy_code": "复制代码",
"mobile.markdown.code.plusMoreLines": "+{count, number} 行",
"mobile.markdown.image.too_large": "图片超过最大尺寸 {maxWidth}x{maxHeight}",
"mobile.markdown.link.copy_url": "复制网址",
"mobile.mention.copy_mention": "复制提及",
"mobile.message_length.message": "您的消息过长。目前字数:{max}/{count}",
"mobile.message_length.message_split_left": "消息超过字数限制",
"mobile.message_length.title": "消息长度",
"mobile.microphone_permission_denied_description": "若要参与此呼叫,请打开“设置”以授予对您的麦克风“授权使用”的权限。",
"mobile.microphone_permission_denied_title": "{applicationName} 想使用您的麦克风",
"mobile.oauth.failed_to_login": "登入失败。请重试。",
"mobile.oauth.failed_to_open_link": "打开链接失败。请重试。",
"mobile.oauth.something_wrong": "出现了故障",
"mobile.oauth.try_again": "重试",
"mobile.open_gm.error": "我们无法打开和这些用户的团体消息。请检查您的网络连接再尝试。",
"mobile.permission_denied_dismiss": "不允许",
"mobile.permission_denied_retry": "设定",
"mobile.post_info.add_reaction": "添加反应",
"mobile.post_info.copy_text": "复制文字",
"mobile.post_info.mark_unread": "标为未读",
"mobile.post_info.pin": "标注至频道",
"mobile.post_info.reply": "回复",
"mobile.post_info.unpin": "从频道取消标注",
"mobile.post_pre_header.pinned": "已标注",
"mobile.post_textbox.entire_channel_here.message": "使用 @here 您将发送通知至 {totalMembers, number} 人。您确定要这么做?",
"mobile.post_textbox.entire_channel_here.message.with_timezones": "使用 @here 您将发送通知至 {timezones, number} 个时区的 {totalMembers, number} 人。您确定要这么做?",
"mobile.post_textbox.entire_channel.cancel": "取消",
"mobile.post_textbox.entire_channel.confirm": "确认",
"mobile.post_textbox.entire_channel.message": "使用 @all 或 @channel 您将发送通知至 {totalMembers, number} 人。您确定要这么做?",
"mobile.post_textbox.entire_channel.message.with_timezones": "使用 @all 或 @channel 您将发送通知至 {timezones, number} 个时区的 {totalMembers, number} 人。您确定要这么做?",
"mobile.post_textbox.entire_channel.title": "确定发送通知到整个频道",
"mobile.post_textbox.groups.title": "确认发送推送给组",
"mobile.post_textbox.uploadFailedDesc": "一些附件上传失败,您确定发送此消息?",
"mobile.post_textbox.uploadFailedTitle": "附件失败",
"mobile.post.cancel": "取消",
"mobile.post.delete_question": "您确认要删除此消息?",
"mobile.post.delete_title": "删除消息",
"mobile.post.failed_delete": "删除消息",
"mobile.post.failed_retry": "重试",
"mobile.posts_view.moreMsg": "以上有更多新消息",
"mobile.privacy_link": "隐私政策",
"mobile.push_notification_reply.button": "发送",
"mobile.push_notification_reply.placeholder": "撰写回复...",
"mobile.push_notification_reply.title": "回复",
"mobile.rename_channel.display_name_maxLength": "频道名必须小于 {maxLength, number} 个字符",
"mobile.rename_channel.display_name_minLength": "频道名必须至少 {minLength, number} 个字符",
"mobile.rename_channel.display_name_required": "频道名为必填",
"mobile.request.invalid_response": "从服务器收到了无效回应。",
"mobile.reset_status.alert_cancel": "取消",
"mobile.reset_status.title_ooo": "停用 \"不在办公室\"",
"mobile.routes.code": "{language} 代码",
"mobile.routes.code.noLanguage": "代码",
"mobile.routes.custom_status": "设定状态",
"mobile.routes.table": "表格",
"mobile.routes.user_profile": "个人资料",
"mobile.search.jump": "转跳至最近的消息",
"mobile.server_link.error.text": "无法在此服务器找到该链接。",
"mobile.server_link.error.title": "链接错误",
"mobile.server_link.unreachable_channel.error": "此链接属于已删除的频道或者您没有权限访问的频道。",
"mobile.server_link.unreachable_team.error": "此链接属于已删除的团队或者您没有权限访问的团队。",
"mobile.server_upgrade.alert_description": "此服务器版本不受支持,用户将面临兼容性问题,这些问题会导致崩溃或严重的错误影响应用程序的核心功能。 需要升级到服务器版本 {serverVersion} 或更高。",
"mobile.server_upgrade.button": "确定",
"mobile.server_upgrade.dismiss": "解除",
"mobile.server_upgrade.learn_more": "了解更多",
"mobile.server_upgrade.title": "服务器需要更新",
"mobile.server_url.empty": "请输入有效的服务端网址",
"mobile.server_url.invalid_format": "每个 URL 必须以 http:// 或 https:// 开头",
"mobile.set_status.away": "离开",
"mobile.set_status.dnd": "请勿打扰",
"mobile.set_status.offline": "离线",
"mobile.set_status.online": "在线",
"mobile.storage_permission_denied_title": "{applicationName} 想要访问您的文件",
"mobile.suggestion.members": "成员",
"mobile.system_message.channel_archived_message": "{username} 已归档频道",
"mobile.system_message.channel_unarchived_message": "{username} 已取消归档频道",
"mobile.system_message.update_channel_displayname_message_and_forget.updated_from": "{username} 已更新频道显示名从 {oldDisplayName} 改为 {newDisplayName}",
"mobile.system_message.update_channel_header_message_and_forget.removed": "{username} 已移除频道标题 (原为:{oldHeader})",
"mobile.system_message.update_channel_header_message_and_forget.updated_from": "{username} 更新了频道标题从:{oldHeader} 到 {newHeader}",
"mobile.system_message.update_channel_header_message_and_forget.updated_to": "{username} 更新了频道标题至:{newHeader}",
"mobile.system_message.update_channel_purpose_message.removed": "{username} 移除了频道用途 (原为:{oldPurpose})",
"mobile.system_message.update_channel_purpose_message.updated_from": "{username} 更新了频道用途从:{oldPurpose} 到 {newPurpose}",
"mobile.system_message.update_channel_purpose_message.updated_to": "{username} 更新了频道用途至:{newPurpose}",
"mobile.tos_link": "服务条款",
"mobile.unsupported_server.message": "附件、链接预览、互动以及内嵌数据可能无法正确显示。如果此问题持续发生,请联系您的系统管理员以升级 Mattermost 服务器。",
"mobile.unsupported_server.ok": "确定",
"mobile.unsupported_server.title": "不支持的服务端版本",
"mobile.user_list.deactivated": "已停用",
"modal.manual_status.auto_responder.message_": "你想切换您的状态到 \"{status}\" 并停用自动回复吗?",
"modal.manual_status.auto_responder.message_away": "你想切换您的状态到 \"离开\" 并停用自动回复吗?",
"modal.manual_status.auto_responder.message_dnd": "你想切换您的状态到 \"请勿打扰\" 并停用自动回复吗?",
"modal.manual_status.auto_responder.message_offline": "你想切换您的状态到 \"离线\" 并停用自动回复吗?",
"modal.manual_status.auto_responder.message_online": "你想切换您的状态到 \"在线\" 并停用自动回复吗?",
"msg_typing.areTyping": "{users}和{last}正在输入...",
"msg_typing.isTyping": "{user}正在输入...",
"password_send.description": "重置您的密码,输入您用于注册的电子邮件地址",
"password_send.error": "请输入一个有效的电子邮件地址。",
"password_send.link": "如果账户存在,密码重置邮件将会被发送到:",
"permalink.show_dialog_warn.cancel": "取消",
"permalink.show_dialog_warn.join": "加入",
"permalink.show_dialog_warn.title": "加入私有频道",
"post_body.check_for_out_of_channel_groups_mentions.message": "未收到此提及因为他们不在此频道。同时他们也不是此频道关联组的成员。",
"post_body.check_for_out_of_channel_mentions.link.and": " 以及 ",
"post_body.check_for_out_of_channel_mentions.link.private": "添加他们到此私有频道",
"post_body.check_for_out_of_channel_mentions.link.public": "添加他们到频道",
"post_body.check_for_out_of_channel_mentions.message_last": "? 他们将可以查看所有消息历史。",
"post_body.check_for_out_of_channel_mentions.message.multiple": "未收到此提及因为他们不在此频道。您是否想要 ",
"post_body.check_for_out_of_channel_mentions.message.one": "未收到此提及因为他们不在此频道。您是否想要 ",
"post_body.commentedOn": "在{name}{apostrophe}的消息评论: ",
"post_body.deleted": "(消息被删除)",
"post_info.del": "删除",
"post_info.edit": "编辑",
"post_info.system": "系统",
"post_message_view.edited": "(已编辑)",
"posts_view.newMsg": "新消息",
"search_bar.search": "搜索",
"status_dropdown.set_away": "离开",
"status_dropdown.set_dnd": "请勿打扰",
"status_dropdown.set_offline": "离线",
"status_dropdown.set_online": "在线",
"suggestion.mention.all": "通知此频道所有人",
"suggestion.mention.channel": "通知此频道所有人",
"suggestion.mention.channels": "我的频道",
"suggestion.mention.groups": "组提及",
"suggestion.mention.here": "通知所有在此频道在线的人",
"suggestion.mention.members": "频道成员",
"suggestion.mention.morechannels": "其他频道",
"suggestion.mention.nonmembers": "不在频道中",
"suggestion.mention.special": "特别提及",
"suggestion.mention.you": " (您)",
"suggestion.search.direct": "私信",
"suggestion.search.private": "私有频道",
"suggestion.search.public": "公共频道",
"threads": "主题",
"threads.deleted": "原文已删除",
"threads.follow": "关注",
"threads.following": "关注中",
"threads.followMessage": "关注消息",
"threads.followThread": "关注主题",
"threads.newReplies": "{count} 个新回复",
"threads.replies": "{count} 个回复",
"threads.unfollowMessage": "取消关注消息",
"threads.unfollowThread": "取消关注主题",
"user.settings.general.email": "电子邮件",
"user.settings.general.firstName": "名字",
"user.settings.general.lastName": "姓氏",
"user.settings.general.nickname": "昵称",
"user.settings.general.position": "职位",
"user.settings.general.username": "用户名"
}
"about.date": "编译日期:",
"about.enterpriseEditione1": "企业版",
"about.enterpriseEditionLearn": "了解更多关于企业版 ",
"about.enterpriseEditionSt": "位于防火墙后的现代通讯方式。",
"about.hash": "编译哈希:",
"about.hashee": "企业版编译哈希:",
"about.teamEditionLearn": "加入 Mattermost 社区: ",
"about.teamEditionSt": "所有团队的通讯一站式解决,随时随地可搜索和访问。",
"about.teamEditiont0": "团队版",
"about.teamEditiont1": "企业版",
"api.channel.add_guest.added": "{addedUsername} 被 {username} 以访客身份添加到此频道。",
"api.channel.add_member.added": "{addedUsername} 被 {username} 添加到此频道。",
"api.channel.guest_join_channel.post_and_forget": "{username} 以访客身份加入频道。",
"apps.error": "错误:{error}",
"apps.error.command.field_missing": "缺少必填字段:`{fieldName}`。",
"apps.error.command.same_channel": "字段`{fieldName}`的频道重复:`{option}`。",
"apps.error.command.same_option": "字段`{fieldName}`的选项重复:`{option}`。",
"apps.error.command.same_user": "字段`{fieldName}`的用户重复:`{option}`。",
"apps.error.command.unknown_channel": "未知字段的频道 `{fieldName}``{option}`。",
"apps.error.command.unknown_option": "未知字段的选项 `{fieldName}``{option}`。",
"apps.error.command.unknown_user": "未知字段的用户 `{fieldName}``{option}`。",
"apps.error.form.no_form": "未定义`form`。",
"apps.error.form.no_lookup": "未定义`lookup`。",
"apps.error.form.no_source": "未定义`source`。",
"apps.error.form.no_submit": "未定义`submit`",
"apps.error.form.refresh": "提取选择的字段时出错。与应用程序开发者联系。详细信息:{details}",
"apps.error.form.refresh_no_refresh": "在无刷新字段上调用刷新。",
"apps.error.form.submit.pretext": "提交模态时出错。与应用程序开发人员联系。详细信息:{details}",
"apps.error.lookup.error_preparing_request": "准备查询请求时出错:{errorMessage}",
"apps.error.malformed_binding": "此绑定未正确形成。联系应用开发者。",
"apps.error.parser": "解析错误:{error}",
"apps.error.parser.execute_non_leaf": "您必须选择子命令。",
"apps.error.parser.missing_binding": "缺少指令绑定。",
"apps.error.parser.missing_field_value": "字段值丢失。",
"apps.error.parser.missing_list_end": "预期列表结束令牌。",
"apps.error.parser.missing_quote": "预期在输入结束之前有匹配的双引号。",
"apps.error.parser.missing_source": "表单没有 submit 或 source。",
"apps.error.parser.missing_submit": "没有绑定或表单中的提交调用。",
"apps.error.parser.missing_tick": "预期在输入结束之前有匹配的勾号。",
"apps.error.parser.multiple_equal": "不允许多个 `=` 符号。",
"apps.error.parser.no_argument_pos_x": "无法识别参数。",
"apps.error.parser.no_bindings": "没有命令绑定。",
"apps.error.parser.no_form": "未找到表单。",
"apps.error.parser.no_match": "`{command}`:在此工作空间中找不到匹配的命令。",
"apps.error.parser.no_slash_start": "命令必须以 `/` 开头。",
"apps.error.parser.unexpected_character": "未预料的字符。",
"apps.error.parser.unexpected_comma": "未预料的逗号。",
"apps.error.parser.unexpected_error": "意外的错误。",
"apps.error.parser.unexpected_flag": "命令不接受标志 `{flagName}`。",
"apps.error.parser.unexpected_squared_bracket": "未预料的列表打开。",
"apps.error.parser.unexpected_state": "无法访问:未预料的状态 matchBinding`{state}`。",
"apps.error.parser.unexpected_whitespace": "无法访问:未预料的空白。",
"apps.error.responses.navigate.no_url": "响应类型为“导航”,但响应中未包含网址。",
"apps.error.responses.unexpected_error": "收到未预料的错误。",
"apps.error.responses.unknown_field_error": "收到未知字段的错误。字段名称:`{field}`。错误:`{error}`。",
"apps.error.responses.unknown_type": "不支援应用响应的类型。响应类型:{type}。",
"apps.error.unknown": "发生未知错误。",
"apps.suggestion.dynamic.error": "动态选择错误",
"apps.suggestion.errors.parser_error": "解析错误",
"apps.suggestion.no_dynamic": "没有返回动态建议的数据",
"apps.suggestion.no_static": "没有匹配的选项。",
"apps.suggestion.no_suggestion": "没有匹配的建议。",
"archivedChannelMessage": "您正在查看**已归档的频道**。新消息无法被发送。",
"camera_type.photo.option": "拍摄照片",
"camera_type.title": "选择操作",
"camera_type.video.option": "录视频",
"center_panel.archived.closeChannel": "关闭频道",
"channel_info.header": "标题:",
"channel_loader.someone": "有人",
"channel_modal.descriptionHelp": "描述此频道如何被使用。",
"channel_modal.header": "标题",
"channel_modal.name": "名称",
"channel_modal.optional": "(可选)",
"channel_modal.purpose": "用途",
"combined_system_message.added_to_channel.many_expanded": "{actor} 添加了 {users} 以及 {lastUser} 至**此频道**。",
"combined_system_message.added_to_channel.one": "{actor} 添加了 {firstUser} 至**此频道**。",
"combined_system_message.added_to_channel.one_you": "您被 {actor} 添加至**此频道**。",
"combined_system_message.added_to_channel.two": "{actor} 添加了 {firstUser} 和 {secondUser} 至**此频道**。",
"combined_system_message.added_to_team.many_expanded": "{actor} 添加了 {users} 以及 {lastUser} 至**此团队**。",
"combined_system_message.added_to_team.one": "{actor} 添加了 {firstUser} 至**此团队**。",
"combined_system_message.added_to_team.one_you": "您被 {actor} 添加至**此团队**。",
"combined_system_message.added_to_team.two": "{actor} 添加了 {firstUser} 和 {secondUser} 至**此团队**。",
"combined_system_message.joined_channel.many_expanded": "{users} 以及 {lastUser} **加入了此频道**。",
"combined_system_message.joined_channel.one": "{firstUser} **加入了此频道**。",
"combined_system_message.joined_channel.one_you": "您**加入了频道**。",
"combined_system_message.joined_channel.two": "{firstUser} 和 {secondUser} **加入了此频道**。",
"combined_system_message.joined_team.many_expanded": "{users} 以及 {lastUser} **加入了此团队**。",
"combined_system_message.joined_team.one": "{firstUser} **加入了此团队**。",
"combined_system_message.joined_team.one_you": "您**加入了团队**。",
"combined_system_message.joined_team.two": "{firstUser} 和 {secondUser} **加入了此团队**。",
"combined_system_message.left_channel.many_expanded": "{users} 以及 {lastUser} **离开了此频道**。",
"combined_system_message.left_channel.one": "{firstUser} **离开了此频道**。",
"combined_system_message.left_channel.one_you": "您**离开了频道**。",
"combined_system_message.left_channel.two": "{firstUser} 和 {secondUser} **离开了此频道**。",
"combined_system_message.left_team.many_expanded": "{users} 以及 {lastUser} **离开了此团队**。",
"combined_system_message.left_team.one": "{firstUser} **离开了此团队**。",
"combined_system_message.left_team.one_you": "您**离开了团队**。",
"combined_system_message.left_team.two": "{firstUser} 以及 {secondUser} **离开了此团队**。",
"combined_system_message.removed_from_channel.many_expanded": "{users} 以及 {lastUser} **被移出此频道**。",
"combined_system_message.removed_from_channel.one": "{firstUser} **被移出此频道**。",
"combined_system_message.removed_from_channel.one_you": "您**被移出此频道**。",
"combined_system_message.removed_from_channel.two": "{firstUser} 以及 {secondUser} **被移出此频道**。",
"combined_system_message.removed_from_team.many_expanded": "{users} 以及 {lastUser} **被移出此团队**。",
"combined_system_message.removed_from_team.one": "{firstUser} **被移出此团队**。",
"combined_system_message.removed_from_team.one_you": "您**被移出此团队**。",
"combined_system_message.removed_from_team.two": "{firstUser} 和 {secondUser} **被移出此团队**。",
"combined_system_message.you": "您",
"create_post.deactivated": "您正在查看已注销用户的归档频道。",
"create_post.write": "写入到{channelDisplayName}",
"custom_status.expiry_dropdown.custom": "自定义",
"custom_status.expiry_dropdown.date_and_time": "日期和时间",
"custom_status.expiry_dropdown.dont_clear": "不清除",
"custom_status.expiry_dropdown.four_hours": "4 小时",
"custom_status.expiry_dropdown.one_hour": "1 小时",
"custom_status.expiry_dropdown.thirty_minutes": "30 分钟",
"custom_status.expiry_dropdown.this_week": "本周",
"custom_status.expiry_dropdown.today": "今天",
"custom_status.expiry_time.today": "今天",
"custom_status.expiry_time.tomorrow": "明天",
"custom_status.expiry.at": "于",
"custom_status.expiry.until": "至",
"custom_status.failure_message": "无法更新状态。再试一次",
"custom_status.suggestions.in_a_meeting": "在开会",
"custom_status.suggestions.on_a_vacation": "在度假",
"custom_status.suggestions.out_for_lunch": "在午餐",
"custom_status.suggestions.out_sick": "生病中",
"custom_status.suggestions.working_from_home": "居家办公",
"date_separator.today": "今天",
"date_separator.yesterday": "昨天",
"edit_post.editPost": "编辑信息...",
"edit_post.save": "保存",
"emoji_picker.activities": "活动",
"emoji_picker.animals-nature": "动物与自然",
"emoji_picker.custom": "自定义",
"emoji_picker.flags": "旗帜",
"emoji_picker.food-drink": "食物与饮料",
"emoji_picker.objects": "物品",
"emoji_picker.people-body": "人与身体",
"emoji_picker.searchResults": "搜索结果",
"emoji_picker.smileys-emotion": "笑脸与情感",
"emoji_picker.symbols": "符号",
"emoji_picker.travel-places": "旅游与地点",
"emoji_skin.dark_skin_tone": "深色肤色",
"emoji_skin.default": "默认肤色",
"emoji_skin.light_skin_tone": "浅肤色",
"emoji_skin.medium_dark_skin_tone": "中等深肤色",
"emoji_skin.medium_light_skin_tone": "中等浅肤色",
"emoji_skin.medium_skin_tone": "中等肤色",
"file_upload.fileAbove": "文件必须小于 {max}",
"friendly_date.daysAgo": "{count} 天前",
"friendly_date.hoursAgo": "{count} 小时前",
"friendly_date.minsAgo": "{count} 分钟前",
"friendly_date.monthsAgo": "{count} 个月前",
"friendly_date.now": "现在",
"friendly_date.yearsAgo": "{count} 年前",
"friendly_date.yesterday": "昨天",
"gallery.footer.channel_name": "在 {channelName} 中共享",
"gallery.open_file": "打开文件",
"get_post_link_modal.title": "复制链接",
"global_threads.allThreads": "你所有的主题",
"global_threads.emptyThreads.message": "您被提及或参与过的任何主题都将与您关注的任何主题一起显示在此处。",
"global_threads.emptyThreads.title": "还没有关注的主题",
"global_threads.emptyUnreads.message": "看起来你已经赶上了。",
"global_threads.emptyUnreads.title": "没有未读主题",
"global_threads.markAllRead.cancel": "取消",
"global_threads.markAllRead.markRead": "标为已读",
"global_threads.markAllRead.message": "这将清除此处显示的所有主题的任何未读状态",
"global_threads.markAllRead.title": "您确定要将所有主题都标记为已读吗?",
"global_threads.options.mark_as_read": "标为已读",
"global_threads.options.open_in_channel": "在频道中打开",
"global_threads.unreads": "未读",
"last_users_message.added_to_channel.type": "被 {actor} **添加至此频道**。",
"last_users_message.added_to_team.type": "被 {actor} **添加至此团队**。",
"last_users_message.first": "{firstUser} 和 ",
"last_users_message.joined_channel.type": "**加入了频道**。",
"last_users_message.joined_team.type": "**加入了团队**。",
"last_users_message.left_channel.type": "**离开了频道**。",
"last_users_message.left_team.type": "**离开了团队**。",
"last_users_message.others": "{numOthers} 其他人 ",
"last_users_message.removed_from_channel.type": "被**移出了此频道**。",
"last_users_message.removed_from_team.type": "被**移出了此团队**。",
"login_mfa.tokenReq": "请输入多重验证令牌",
"login.email": "电子邮件",
"login.ldapUsername": "AD/LDAP 用户名",
"login.or": "或",
"login.password": "密码",
"login.username": "用户名",
"mobile.about.appVersion": "应用版本:{version} (Build {number})",
"mobile.account.settings.save": "保存",
"mobile.action_menu.select": "选择选项",
"mobile.android.back_handler_exit": "再次点击返回以退出",
"mobile.android.photos_permission_denied_title": "{applicationName} 想要访问您的照片",
"mobile.camera_photo_permission_denied_title": "{applicationName}想要访问您的相机",
"mobile.channel_info.alertNo": "否",
"mobile.channel_info.alertYes": "是的",
"mobile.commands.error_title": "执行命令时出错",
"mobile.components.select_server_view.connect": "连接",
"mobile.components.select_server_view.enterServerUrl": "输入服务器网址",
"mobile.components.select_server_view.proceed": "继续",
"mobile.create_channel": "创建",
"mobile.custom_status.choose_emoji": "选择表情符",
"mobile.custom_status.clear_after": "清除于",
"mobile.custom_status.modal_confirm": "完成",
"mobile.display_settings.theme": "主题",
"mobile.document_preview.failed_description": "打开文档时遇到错误。请确定您已安装 {fileType} 查看器后再重试。\n",
"mobile.document_preview.failed_title": "打开文档失败",
"mobile.downloader.disabled_description": "文件下载在本服务器已停用。详情请联系您的系统管理员。\n",
"mobile.downloader.disabled_title": "下载已停用",
"mobile.downloader.failed_description": "下载文件时遇到错误。请检查您的网络连接后重试。\n",
"mobile.downloader.failed_title": "下载失败",
"mobile.edit_channel": "保存",
"mobile.edit_post.title": "编辑消息",
"mobile.error_handler.button": "重加载",
"mobile.error_handler.description": "\n点击重启动应用。重启后您可以在设定菜单汇报问题。\n",
"mobile.error_handler.title": "发生未知错误",
"mobile.file_upload.disabled2": "从手机上传文件被禁用。",
"mobile.file_upload.max_warning": "最多可上传 {count} 个文件。",
"mobile.files_paste.error_description": "粘贴文件时遇到错误。请重试。",
"mobile.files_paste.error_dismiss": "解除",
"mobile.files_paste.error_title": "粘贴失败",
"mobile.gallery.title": "{index}/{total}",
"mobile.ios.photos_permission_denied_title": "{applicationName} 想要访问您的照片",
"mobile.link.error.text": "无法打开链接。",
"mobile.link.error.title": "错误",
"mobile.managed.blocked_by": "被 {vendor} 封锁",
"mobile.managed.exit": "退出",
"mobile.managed.jailbreak": "越狱的设备不被 {vendor} 信任,请退出应用。",
"mobile.managed.not_secured.android": "此设备必须开启屏幕锁才能使用 Mattermost。",
"mobile.managed.not_secured.ios": "此设备必须开启密码锁才能使用 Mattermost。\n\n前往设置 > 面容 ID 与密码。",
"mobile.managed.not_secured.ios.touchId": "此设备必须开启密码锁才能使用 Mattermost。\n\n前往设置 > 面容 ID 与密码。",
"mobile.managed.secured_by": "被 {vendor} 安全保护",
"mobile.managed.settings": "前往设置",
"mobile.markdown.code.copy_code": "复制代码",
"mobile.markdown.code.plusMoreLines": "+{count, number} 行",
"mobile.markdown.image.too_large": "图片超过最大尺寸 {maxWidth}x{maxHeight}",
"mobile.markdown.link.copy_url": "复制网址",
"mobile.mention.copy_mention": "复制提及",
"mobile.message_length.message": "您的消息过长。目前字数:{max}/{count}",
"mobile.message_length.message_split_left": "消息超过字数限制",
"mobile.message_length.title": "消息长度",
"mobile.microphone_permission_denied_description": "若要参与此呼叫,请打开“设置”以授予对您的麦克风“授权使用”的权限。",
"mobile.microphone_permission_denied_title": "{applicationName} 想使用您的麦克风",
"mobile.oauth.failed_to_login": "登入失败。请重试。",
"mobile.oauth.failed_to_open_link": "打开链接失败。请重试。",
"mobile.oauth.something_wrong": "出现了故障",
"mobile.oauth.try_again": "重试",
"mobile.open_gm.error": "我们无法打开和这些用户的团体消息。请检查您的网络连接再尝试。",
"mobile.permission_denied_dismiss": "不允许",
"mobile.permission_denied_retry": "设定",
"mobile.post_info.add_reaction": "添加反应",
"mobile.post_info.copy_text": "复制文字",
"mobile.post_info.mark_unread": "标为未读",
"mobile.post_info.pin": "标注至频道",
"mobile.post_info.reply": "回复",
"mobile.post_info.unpin": "从频道取消标注",
"mobile.post_pre_header.pinned": "已标注",
"mobile.post_textbox.entire_channel_here.message": "使用 @here 您将发送通知至 {totalMembers, number} 人。您确定要这么做?",
"mobile.post_textbox.entire_channel_here.message.with_timezones": "使用 @here 您将发送通知至 {timezones, number} 个时区的 {totalMembers, number} 人。您确定要这么做?",
"mobile.post_textbox.entire_channel.cancel": "取消",
"mobile.post_textbox.entire_channel.confirm": "确认",
"mobile.post_textbox.entire_channel.message": "使用 @all 或 @channel 您将发送通知至 {totalMembers, number} 人。您确定要这么做?",
"mobile.post_textbox.entire_channel.message.with_timezones": "使用 @all 或 @channel 您将发送通知至 {timezones, number} 个时区的 {totalMembers, number} 人。您确定要这么做?",
"mobile.post_textbox.entire_channel.title": "确定发送通知到整个频道",
"mobile.post_textbox.groups.title": "确认发送推送给组",
"mobile.post_textbox.uploadFailedDesc": "一些附件上传失败,您确定发送此消息?",
"mobile.post_textbox.uploadFailedTitle": "附件失败",
"mobile.post.cancel": "取消",
"mobile.post.delete_question": "您确认要删除此消息?",
"mobile.post.delete_title": "删除消息",
"mobile.post.failed_delete": "删除消息",
"mobile.post.failed_retry": "重试",
"mobile.posts_view.moreMsg": "以上有更多新消息",
"mobile.privacy_link": "隐私政策",
"mobile.push_notification_reply.button": "发送",
"mobile.push_notification_reply.placeholder": "撰写回复...",
"mobile.push_notification_reply.title": "回复",
"mobile.rename_channel.display_name_maxLength": "频道名必须小于 {maxLength, number} 个字符",
"mobile.rename_channel.display_name_minLength": "频道名必须至少 {minLength, number} 个字符",
"mobile.rename_channel.display_name_required": "频道名为必填",
"mobile.request.invalid_response": "从服务器收到了无效回应。",
"mobile.reset_status.alert_cancel": "取消",
"mobile.reset_status.title_ooo": "停用 \"不在办公室\"",
"mobile.routes.code": "{language} 代码",
"mobile.routes.code.noLanguage": "代码",
"mobile.routes.custom_status": "设定状态",
"mobile.routes.table": "表格",
"mobile.routes.user_profile": "个人资料",
"mobile.search.jump": "转跳至最近的消息",
"mobile.server_link.error.text": "无法在此服务器找到该链接。",
"mobile.server_link.error.title": "链接错误",
"mobile.server_link.unreachable_channel.error": "此链接属于已删除的频道或者您没有权限访问的频道。",
"mobile.server_link.unreachable_team.error": "此链接属于已删除的团队或者您没有权限访问的团队。",
"mobile.server_upgrade.alert_description": "此服务器版本不受支持,用户将面临兼容性问题,这些问题会导致崩溃或严重的错误影响应用程序的核心功能。 需要升级到服务器版本 {serverVersion} 或更高。",
"mobile.server_upgrade.button": "确定",
"mobile.server_upgrade.dismiss": "解除",
"mobile.server_upgrade.learn_more": "了解更多",
"mobile.server_upgrade.title": "服务器需要更新",
"mobile.server_url.empty": "请输入有效的服务端网址",
"mobile.server_url.invalid_format": "每个 URL 必须以 http:// 或 https:// 开头",
"mobile.set_status.away": "离开",
"mobile.set_status.dnd": "请勿打扰",
"mobile.set_status.offline": "离线",
"mobile.set_status.online": "在线",
"mobile.storage_permission_denied_title": "{applicationName} 想要访问您的文件",
"mobile.suggestion.members": "成员",
"mobile.system_message.channel_archived_message": "{username} 已归档频道",
"mobile.system_message.channel_unarchived_message": "{username} 已取消归档频道",
"mobile.system_message.update_channel_displayname_message_and_forget.updated_from": "{username} 已更新频道显示名从 {oldDisplayName} 改为 {newDisplayName}",
"mobile.system_message.update_channel_header_message_and_forget.removed": "{username} 已移除频道标题 (原为:{oldHeader})",
"mobile.system_message.update_channel_header_message_and_forget.updated_from": "{username} 更新了频道标题从:{oldHeader} 到 {newHeader}",
"mobile.system_message.update_channel_header_message_and_forget.updated_to": "{username} 更新了频道标题至:{newHeader}",
"mobile.system_message.update_channel_purpose_message.removed": "{username} 移除了频道用途 (原为:{oldPurpose})",
"mobile.system_message.update_channel_purpose_message.updated_from": "{username} 更新了频道用途从:{oldPurpose} 到 {newPurpose}",
"mobile.system_message.update_channel_purpose_message.updated_to": "{username} 更新了频道用途至:{newPurpose}",
"mobile.tos_link": "服务条款",
"mobile.unsupported_server.message": "附件、链接预览、互动以及内嵌数据可能无法正确显示。如果此问题持续发生,请联系您的系统管理员以升级 Mattermost 服务器。",
"mobile.unsupported_server.ok": "确定",
"mobile.unsupported_server.title": "不支持的服务端版本",
"mobile.user_list.deactivated": "已停用",
"modal.manual_status.auto_responder.message_": "你想切换您的状态到 \"{status}\" 并停用自动回复吗?",
"modal.manual_status.auto_responder.message_away": "你想切换您的状态到 \"离开\" 并停用自动回复吗?",
"modal.manual_status.auto_responder.message_dnd": "你想切换您的状态到 \"请勿打扰\" 并停用自动回复吗?",
"modal.manual_status.auto_responder.message_offline": "你想切换您的状态到 \"离线\" 并停用自动回复吗?",
"modal.manual_status.auto_responder.message_online": "你想切换您的状态到 \"在线\" 并停用自动回复吗?",
"msg_typing.areTyping": "{users}和{last}正在输入...",
"msg_typing.isTyping": "{user}正在输入...",
"password_send.description": "重置您的密码,输入您用于注册的电子邮件地址",
"password_send.error": "请输入一个有效的电子邮件地址。",
"password_send.link": "如果账户存在,密码重置邮件将会被发送到:",
"permalink.show_dialog_warn.cancel": "取消",
"permalink.show_dialog_warn.join": "加入",
"permalink.show_dialog_warn.title": "加入私有频道",
"post_body.check_for_out_of_channel_groups_mentions.message": "未收到此提及因为他们不在此频道。同时他们也不是此频道关联组的成员。",
"post_body.check_for_out_of_channel_mentions.link.and": " 以及 ",
"post_body.check_for_out_of_channel_mentions.link.private": "添加他们到此私有频道",
"post_body.check_for_out_of_channel_mentions.link.public": "添加他们到频道",
"post_body.check_for_out_of_channel_mentions.message_last": "? 他们将可以查看所有消息历史。",
"post_body.check_for_out_of_channel_mentions.message.multiple": "未收到此提及因为他们不在此频道。您是否想要 ",
"post_body.check_for_out_of_channel_mentions.message.one": "未收到此提及因为他们不在此频道。您是否想要 ",
"post_body.commentedOn": "在{name}{apostrophe}的消息评论: ",
"post_body.deleted": "(消息被删除)",
"post_info.del": "删除",
"post_info.edit": "编辑",
"post_info.system": "系统",
"post_message_view.edited": "(已编辑)",
"posts_view.newMsg": "新消息",
"search_bar.search": "搜索",
"status_dropdown.set_away": "离开",
"status_dropdown.set_dnd": "请勿打扰",
"status_dropdown.set_offline": "离线",
"status_dropdown.set_online": "在线",
"suggestion.mention.all": "通知此频道所有人",
"suggestion.mention.channel": "通知此频道所有人",
"suggestion.mention.channels": "我的频道",
"suggestion.mention.groups": "组提及",
"suggestion.mention.here": "通知所有在此频道在线的人",
"suggestion.mention.members": "频道成员",
"suggestion.mention.morechannels": "其他频道",
"suggestion.mention.nonmembers": "不在频道中",
"suggestion.mention.special": "特别提及",
"suggestion.mention.you": " (您)",
"suggestion.search.direct": "私信",
"suggestion.search.private": "私有频道",
"suggestion.search.public": "公共频道",
"threads": "主题",
"threads.deleted": "原文已删除",
"threads.follow": "关注",
"threads.following": "关注中",
"threads.followMessage": "关注消息",
"threads.followThread": "关注主题",
"threads.newReplies": "{count} 个新回复",
"threads.replies": "{count} 个回复",
"threads.unfollowMessage": "取消关注消息",
"threads.unfollowThread": "取消关注主题",
"user.settings.general.email": "电子邮件",
"user.settings.general.firstName": "名字",
"user.settings.general.lastName": "姓氏",
"user.settings.general.nickname": "昵称",
"user.settings.general.position": "职位",
"user.settings.general.username": "用户名",
"login.forgot": "忘记密码?"
}

View File

@@ -1095,7 +1095,7 @@
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = 428;
CURRENT_PROJECT_VERSION = 429;
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
ENABLE_BITCODE = NO;
HEADER_SEARCH_PATHS = (
@@ -1139,7 +1139,7 @@
CODE_SIGN_ENTITLEMENTS = Mattermost/Mattermost.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = 428;
CURRENT_PROJECT_VERSION = 429;
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
ENABLE_BITCODE = NO;
HEADER_SEARCH_PATHS = (
@@ -1282,7 +1282,7 @@
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 428;
CURRENT_PROJECT_VERSION = 429;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
GCC_C_LANGUAGE_STANDARD = gnu11;
@@ -1333,7 +1333,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 428;
CURRENT_PROJECT_VERSION = 429;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = UQ8HT4Q2XM;
GCC_C_LANGUAGE_STANDARD = gnu11;

View File

@@ -37,7 +37,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>428</string>
<string>429</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<key>LSRequiresIPhoneOS</key>

View File

@@ -21,7 +21,7 @@
<key>CFBundleShortVersionString</key>
<string>2.0.0</string>
<key>CFBundleVersion</key>
<string>428</string>
<string>429</string>
<key>UIAppFonts</key>
<array>
<string>OpenSans-Bold.ttf</string>

View File

@@ -21,7 +21,7 @@
<key>CFBundleShortVersionString</key>
<string>2.0.0</string>
<key>CFBundleVersion</key>
<string>428</string>
<string>429</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>