summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NOTICE.txt1698
-rw-r--r--app/apptestlib.go23
-rw-r--r--app/command_invite.go10
-rw-r--r--app/command_invite_test.go7
-rw-r--r--app/notification.go13
-rw-r--r--app/notification_test.go52
-rw-r--r--app/web_hub.go15
-rw-r--r--cmd/commands/user.go6
-rw-r--r--cmd/commands/user_test.go12
-rw-r--r--i18n/de.json54
-rw-r--r--i18n/en.json12
-rw-r--r--i18n/es.json14
-rw-r--r--i18n/fr.json194
-rw-r--r--i18n/it.json14
-rw-r--r--i18n/ja.json16
-rw-r--r--i18n/ko.json180
-rw-r--r--i18n/nl.json10
-rw-r--r--i18n/pl.json10
-rw-r--r--i18n/pt-BR.json34
-rw-r--r--i18n/ru.json100
-rw-r--r--i18n/tr.json56
-rw-r--r--i18n/zh-CN.json18
-rw-r--r--i18n/zh-TW.json52
-rw-r--r--mlog/default.go50
-rw-r--r--mlog/global.go10
-rw-r--r--mlog/global_test.go143
-rw-r--r--mlog/log.go23
-rw-r--r--web/context.go12
28 files changed, 1190 insertions, 1648 deletions
diff --git a/NOTICE.txt b/NOTICE.txt
index 08f555694..59a7ca436 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -8,278 +8,9 @@ This document includes a list of open source components used in Mattermost Serve
---
-This product contains a modified portion of 'jquery-dragster', a drag and drop listener
-by Jan Martin.
+## goexif
-* HOMEPAGE:
- * https://github.com/catmanjan/jquery-dragster
-
-* LICENSE:
-
-The MIT License (MIT)
-
-Copyright (c) 2015 Jan Martin
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
----
-
-This product contains a modified portion of 'golang-lru', a golang LRU cache by hashicorp,
-based on Groupcache by Google Inc.
-
-* HOMEPAGE:
- * https://github.com/hashicorp/golang-lru
-
-* LICENSE:
-
-This Source Code Form is subject to the terms of the Mozilla Public License, v.2.0. If a
-copy of the MPL was not distributed with this file, You can obtain one at
-http://mozilla.org/MPL/2.0/.
-
----
-
-This product contains a modified portion of 'golang-freetype', a port of the Freetype
-font rasterizer (www.freetype.org) to the Go programming.
-
-Portions of this software are copyright © 2010 The FreeType Project (www.freetype.org).
-All rights reserved.
-
-* HOMEPAGE:
- * http://www.freetype.org
-
-* LICENSE:
-
- The FreeType Project LICENSE
- ----------------------------
-
- 2006-Jan-27
-
- Copyright 1996-2002, 2006 by
- David Turner, Robert Wilhelm, and Werner Lemberg
-
-
-
-Introduction
-============
-
- The FreeType Project is distributed in several archive packages;
- some of them may contain, in addition to the FreeType font engine,
- various tools and contributions which rely on, or relate to, the
- FreeType Project.
-
- This license applies to all files found in such packages, and
- which do not fall under their own explicit license. The license
- affects thus the FreeType font engine, the test programs,
- documentation and makefiles, at the very least.
-
- This license was inspired by the BSD, Artistic, and IJG
- (Independent JPEG Group) licenses, which all encourage inclusion
- and use of free software in commercial and freeware products
- alike. As a consequence, its main points are that:
-
- o We don't promise that this software works. However, we will be
- interested in any kind of bug reports. (`as is' distribution)
-
- o You can use this software for whatever you want, in parts or
- full form, without having to pay us. (`royalty-free' usage)
-
- o You may not pretend that you wrote this software. If you use
- it, or only parts of it, in a program, you must acknowledge
- somewhere in your documentation that you have used the
- FreeType code. (`credits')
-
- We specifically permit and encourage the inclusion of this
- software, with or without modifications, in commercial products.
- We disclaim all warranties covering The FreeType Project and
- assume no liability related to The FreeType Project.
-
-
- Finally, many people asked us for a preferred form for a
- credit/disclaimer to use in compliance with this license. We thus
- encourage you to use the following text:
-
- """
- Portions of this software are copyright � <year> The FreeType
- Project (www.freetype.org). All rights reserved.
- """
-
- Please replace <year> with the value from the FreeType version you
- actually use.
-
-
-Legal Terms
-===========
-
-0. Definitions
---------------
-
- Throughout this license, the terms `package', `FreeType Project',
- and `FreeType archive' refer to the set of files originally
- distributed by the authors (David Turner, Robert Wilhelm, and
- Werner Lemberg) as the `FreeType Project', be they named as alpha,
- beta or final release.
-
- `You' refers to the licensee, or person using the project, where
- `using' is a generic term including compiling the project's source
- code as well as linking it to form a `program' or `executable'.
- This program is referred to as `a program using the FreeType
- engine'.
-
- This license applies to all files distributed in the original
- FreeType Project, including all source code, binaries and
- documentation, unless otherwise stated in the file in its
- original, unmodified form as distributed in the original archive.
- If you are unsure whether or not a particular file is covered by
- this license, you must contact us to verify this.
-
- The FreeType Project is copyright (C) 1996-2000 by David Turner,
- Robert Wilhelm, and Werner Lemberg. All rights reserved except as
- specified below.
-
-1. No Warranty
---------------
-
- THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS
- BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO
- USE, OF THE FREETYPE PROJECT.
-
-2. Redistribution
------------------
-
- This license grants a worldwide, royalty-free, perpetual and
- irrevocable right and license to use, execute, perform, compile,
- display, copy, create derivative works of, distribute and
- sublicense the FreeType Project (in both source and object code
- forms) and derivative works thereof for any purpose; and to
- authorize others to exercise some or all of the rights granted
- herein, subject to the following conditions:
-
- o Redistribution of source code must retain this license file
- (`FTL.TXT') unaltered; any additions, deletions or changes to
- the original files must be clearly indicated in accompanying
- documentation. The copyright notices of the unaltered,
- original files must be preserved in all copies of source
- files.
-
- o Redistribution in binary form must provide a disclaimer that
- states that the software is based in part of the work of the
- FreeType Team, in the distribution documentation. We also
- encourage you to put an URL to the FreeType web page in your
- documentation, though this isn't mandatory.
-
- These conditions apply to any software derived from or based on
- the FreeType Project, not just the unmodified files. If you use
- our work, you must acknowledge us. However, no fee need be paid
- to us.
-
-3. Advertising
---------------
-
- Neither the FreeType authors and contributors nor you shall use
- the name of the other for commercial, advertising, or promotional
- purposes without specific prior written permission.
-
- We suggest, but do not require, that you use one or more of the
- following phrases to refer to this software in your documentation
- or advertising materials: `FreeType Project', `FreeType Engine',
- `FreeType library', or `FreeType Distribution'.
-
- As you have not signed this license, you are not required to
- accept it. However, as the FreeType Project is copyrighted
- material, only this license, or another one contracted with the
- authors, grants you the right to use, distribute, and modify it.
- Therefore, by using, distributing, or modifying the FreeType
- Project, you indicate that you understand and accept all the terms
- of this license.
-
-4. Contacts
------------
-
- There are two mailing lists related to FreeType:
-
- o freetype@nongnu.org
-
- Discusses general use and applications of FreeType, as well as
- future and wanted additions to the library and distribution.
- If you are looking for support, start in this list if you
- haven't found anything to help you in the documentation.
-
- o freetype-devel@nongnu.org
-
- Discusses bugs, as well as engine internals, design issues,
- specific licenses, porting, etc.
-
- Our home page can be found at
-
- http://www.freetype.org
-
---- end of FTL.TXT ---
-
----
-
-This product contains a modified portion of 'gemoji', a collection of emoji images and names by Apple Inc. and other contributors.
-
-* HOMEPAGE:
- * https://github.com/github/gemoji/blob/master/LICENSE
-
-* LICENSE:
-
-octocat, squirrel, shipit
-Copyright (c) 2013 GitHub Inc. All rights reserved.
-
-bowtie, neckbeard, fu
-Copyright (c) 2013 37signals, LLC. All rights reserved.
-
-feelsgood, finnadie, goberserk, godmode, hurtrealbad, rage 1-4, suspect
-Copyright (c) 2013 id Software. All rights reserved.
-
-trollface
-Copyright (c) 2013 whynne@deviantart. All rights reserved.
-
-All other images
-Copyright (c) 2013 Apple Inc. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this
-software and associated documentation files (the "Software"), to deal in the Software
-without restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be included in all copies
-or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
----
-
-This product contains a modified portion of 'goexif', which provides decoding of basic exif and tiff encoded data.
-
-by Robert Carlsen & Contributors
+This product contains a modified portion of 'goexif', which provides decoding of basic exif and tiff encoded data, built by Robert Carlsen & Contributors.
* HOMEPAGE:
* https://github.com/rwcarlsen/goexif
@@ -312,70 +43,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
-This product contains a modified portion of 'graphics-go', an implementation of basic image manipulation operations in the Go programming language.
-
-by The Graphics-Go Authors
-
-* HOMEPAGE:
- * https://code.google.com/p/graphics-go/
-
-* LICENSE:
-
-Copyright (c) 2011 The Graphics-Go Authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
----
-
-This product contains a modified portion of 'babel-es6-polyfill', a pure ES6 polyfill for Babel that only includes standardised features.
-
-by Jason Berry
-
-* HOMEPAGE:
- * https://github.com/JasonBerry/babel-es6-polyfill
-
-* LICENSE:
-
-Copyright (c) 2015 Jason Berry
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
----
-
-This product contains a modified portion of 'go-ldap', basic LDAP v3 functionality for the GO programming language.
+## ldap
-by The Go Authors
+This product contains a modified portion of 'go-ldap', basic LDAP v3 functionality for the GO programming language, built by The Go Authors.
* HOMEPAGE:
* https://github.com/go-ldap/ldap
@@ -412,105 +82,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
-This product contains a modified portion of 'Google Fonts', various Open Source fonts for use on the web.
+## go-i18n
-by Google Inc.
-
-* HOMEPAGE:
- * https://www.google.com/fonts
-
-* LICENSE:
-
-# Code licensed under the Apache 2.0 License:
-
-Copyright 2011 Google Inc.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
-# Fonts licensed under CC-BY 3.0:
-
-CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.
-License
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
-
-1. Definitions
-
-"Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.
-"Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License.
-"Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership.
-"Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.
-"Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast.
-"Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work.
-"You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
-"Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images.
-"Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.
-
-2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws.
-
-3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
-
-to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections;
-to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";
-to Distribute and Publicly Perform the Work including as incorporated in Collections; and,
-to Distribute and Publicly Perform Adaptations.
-For the avoidance of doubt:
-
-Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License;
-Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and,
-Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License.
-The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved.
-
-4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
-
-You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested.
-If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.
-Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise.
-
-5. Representations, Warranties and Disclaimer
-
-UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-
-6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. Termination
-
-This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
-Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
-
-8. Miscellaneous
-
-Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
-Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
-If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
-This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
-The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law.
-
-Creative Commons Notice
-
-Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor.
-
-Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of this License.
-
-Creative Commons may be contacted at https://creativecommons.org/.
-
----
-
-This product contains a modified portion of 'go-i18n', a Go package and a command that translates Go programs into multiple languages
-by Nick Snyder.
+This product contains a modified portion of 'go-i18n', a Go package and a command that translates Go programs into multiple languages, built by Nick Snyder.
* HOMEPAGE:
* https://github.com/nicksnyder/go-i18n
@@ -539,7 +113,9 @@ THE SOFTWARE.
---
-This product contains a modified portion of 'dgoogauth', a go implementation of the Google Authenticator library by Damian Gryski.
+## dgoogauth
+
+This product contains a modified portion of 'dgoogauth', a go implementation of the Google Authenticator library, built by Damian Gryski.
* HOMEPAGE:
* https://github.com/dgryski/dgoogauth
@@ -562,71 +138,7 @@ limitations under the License.
---
-This product contains a modified portion of 'fbjs', a collection of JavaScript utilities by Facebook, Inc.
-
-* HOMEPAGE:
- * https://github.com/facebook/fbjs
-
-* LICENSE:
-
-BSD License
-
-For fbjs software
-
-Copyright (c) 2013-present, Facebook, Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- * Neither the name Facebook nor the names of its contributors may be used to
- endorse or promote products derived from this software without specific
- prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
----
-
-This product contains a modified portion of 'marked', a full-featured markdown parser and compiler, written in JavaScript. Built for speed by Christopher Jeffrey.
-
-* HOMEPAGE:
- * https://github.com/chjj/marked
-
-* LICENSE:
-
-The MIT License (MIT)
-
-Copyright (c) 2011-2014, Christopher Jeffrey.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-No attribution is required by products that make use of this software.
-
----
+## gziphandler
This product contains a modified portion of 'gziphandler', a tiny Go package which wraps HTTP handlers to transparently gzip the response body, for clients which support it by The New York Times Company.
@@ -653,7 +165,9 @@ limitations under the License.
---
-This product contains a modified portion of 'handlers', a collection of handlers (aka "HTTP middleware") for use with Go's net/http package (or any framework supporting http.Handler) by The Gorilla Handlers Authors.
+## handlers
+
+This product contains a modified portion of 'handlers', a collection of handlers (aka "HTTP middleware") for use with Go's net/http package (or any framework supporting http.Handler), built by The Gorilla Handlers Authors.
* HOMEPAGE:
* https://github.com/gorilla/handlers
@@ -685,30 +199,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
-This product contains a modified portion of 'log4go', an unmaintained fork, left only so it doesn't break imports by Kyle Lemons.
-
-* HOMEPAGE:
- * https://github.com/alecthomas/log4go
-
-* LICENSE:
-
-Copyright (c) 2010, Kyle Lemons <kyle@kylelemons.net>. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
----
+## imaging
-This product contains a modified portion of 'manners', a package imaging providing basic image manipulation functions (resize, rotate, flip, crop, etc.) by Grigory Dryapak.
+This product contains a modified portion of 'imaging', a package imaging providing basic image manipulation functions (resize, rotate, flip, crop, etc.), built by Grigory Dryapak.
* HOMEPAGE:
* https://github.com/disintegration/imaging
@@ -739,39 +232,9 @@ SOFTWARE.
---
-This product contains a modified portion of 'gorp', to save time, minimize the drudgery of getting data in and out of the database, and help code focus on algorithms, not infrastructure by James Cooper.
-
-* HOMEPAGE:
- * https://github.com/go-gorp/gorp
-
-* LICENSE:
-
-The MIT License (MIT)
+## mysql
-Copyright (c) 2012 James Cooper <james@bitmechanic.com>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
----
-
-This product contains a modified portion of 'mysql', a lightweight and fast MySQL driver for Go's (golang) database/sql package by Mozilla Public.
+This product contains a modified portion of 'mysql', a lightweight and fast MySQL driver for Go's (golang) database/sql package, built by Mozilla Public.
* HOMEPAGE:
* https://github.com/go-sql-driver/mysql
@@ -1154,44 +617,9 @@ Exhibit B - "Incompatible With Secondary Licenses" Notice
---
-This product contains a modified portion of 'context', a golang registry for global request variables by Rodrigo Moraes.
-
-* HOMEPAGE:
- * https://github.com/gorilla/context
-
-* LICENSE:
-
-Copyright (c) 2012 Rodrigo Moraes. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
----
+## mux
-This product contains a modified portion of 'mux', a powerful URL router and dispatcher for golang by Rodrigo Moraes.
+This product contains a modified portion of 'mux', a powerful URL router and dispatcher for golang, built by Rodrigo Moraes.
* HOMEPAGE:
* https://github.com/gorilla/mux
@@ -1228,7 +656,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
-This product contains a modified portion of 'websocket', a WebSocket implementation for Go by The Gorilla WebSocket Authors.
+## websocket
+
+This product contains a modified portion of 'websocket', a WebSocket implementation for Go, built by The Gorilla WebSocket Authors.
* HOMEPAGE:
* https://github.com/gorilla/websocket
@@ -1262,7 +692,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
## pq
-This product contains a modified portion of 'pq', a Pure Go Postgres driver for database/sql by Blake Mizerany and Contributors.
+This product contains a modified portion of 'pq', a Pure Go Postgres driver for database/sql, built by Blake Mizerany and Contributors.
* HOMEPAGE:
* https://github.com/lib/pq
@@ -1284,7 +714,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SO
---
-This product contains a modified portion of 'durafmt', a Go library that formats time.Duration strings into a human readable format by Wesley Hill.
+## durafmt
+
+This product contains a modified portion of 'durafmt', a Go library that formats time.Duration strings into a human readable format, built by Wesley Hill.
* HOMEPAGE:
* https://github.com/hako/durafmt
@@ -1313,6 +745,8 @@ SOFTWARE.
---
+## uuid
+
This product contains a modified portion of 'uuid', a package generates and inspects UUIDs based on RFC 412 and DCE 1.1: Authentication and Security Services by Google Inc.
* HOMEPAGE:
@@ -1350,10 +784,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
+## yaml
+
This product contains a modified portion of 'yaml', a YAML support for the Go language by Canonical Inc.
* HOMEPAGE:
- * https://gopkg.in/yaml.v2
+ * https://github.com/go-yaml/yaml/tree/v2.2.1
* LICENSE:
@@ -1548,36 +984,12 @@ Library.
---
-This product contains a modified portion of 'throttled', a package store offering a memory-based and a Redis-based throttled by Martin Angers.
-
-* HOMEPAGE:
- * http://gopkg.in/throttled/throttled.v1/store
-
-* LICENSE:
-
-Copyright (c) 2014, Martin Angers
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
----
+## throttled
This product contains a modified portion of 'throttled', a package throttled implementing different throttling strategies for controlling access to HTTP handlers by Martin Angers and Contributors.
* HOMEPAGE:
- * http://gopkg.in/throttled/throttled.v1
+ * https://github.com/throttled/throttled/tree/v1.0.0
* LICENSE:
@@ -1600,10 +1012,12 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
+## fsnotify
+
This product contains a modified portion of 'fsnotify', to utilize golang.org/x/sys rather than syscall from the standard library by The Go Authors and fsnotify Authors.
* HOMEPAGE:
- * http://gopkg.in/fsnotify.v1
+ * https://github.com/fsnotify/fsnotify/tree/v1.4.7
* LICENSE:
@@ -1638,234 +1052,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
-## asn1-ber
-
-This product contains a modified portion of 'asn1-ber', an ASN1 BER Encoding / Decoding Library for the GO programming language by The Go Authors.
-
-* HOMEPAGE:
- * http://gopkg.in/asn1-ber.v1
-
-* LICENSE:
-
-Copyright (c) 2012 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
----
-
-## redigo
-
-This product contains a modified portion of 'redigo', a Go client for the Redis database.
-
-* HOMEPAGE:
- * https://github.com/garyburd/redigo
-
-* LICENSE:
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
----
-
## crypto
-This product contains a modified portion of 'crypto', a set of Go cryptographic libraries.
+This product contains a modified portion of 'crypto', a set of Go cryptographic libraries, built by Go.
* HOMEPAGE:
* https://github.com/golang/crypto
@@ -1905,7 +1094,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
## image
-This product contains a modified portion of 'image', a set of Go image libraries.
+This product contains a modified portion of 'image', a set of Go image libraries, built by Go.
* HOMEPAGE:
* https://github.com/golang/image
@@ -1940,119 +1129,9 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
---
-## rsc
-
-This product contains a modified portion of 'rsc', a random source code library from Google
-
-* HOMEPAGE:
- * https://code.google.com/archive/p/rsc/
-
-* LICENSE:
-
-Copyright (c) <YEAR>, <OWNER>
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
----
-
-## mattermost-driver-javascript
-
-This product contains a modified portion of 'mattermost-driver-javascript', a Javascript library for interacting with the Mattermost API.
-
-* HOMEPAGE:
- * https://github.com/mattermost/mattermost-driver-javascript
-
-* LICENSE:
-
-Copyright 2016-present Mattermost
-
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
-
-http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
-
----
-
-This product contains a modified portion of 'osext', providing a function that returns an absolute path to the current program executable, built by kardianos.
-
-* HOMEPAGE:
- * https://github.com/kardianos/osext
-
-* LICENSE:
-
-Copyright (c) 2012 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
----
-
-This product contains a modified portion of 'go-saml', a SAML client library for Go written by RobotsAndPencils.
-
-* HOMEPAGE:
- * https://github.com/RobotsAndPencils/go-saml
-
-* LICENSE:
-
-The MIT License (MIT)
-
-Copyright (c) 2015 Robots and Pencils
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
----
+## minio-go
This product contains a modified portion of 'minio-go', a Golang Client SDK providing simple APIs to access any Amazon S3 compatible object storage server, built by Minio.
@@ -2241,6 +1320,8 @@ This product contains a modified portion of 'minio-go', a Golang Client SDK prov
---
+## graceful
+
This product contains a modified portion of 'graceful', a Go package enabling graceful shutdown of an http.Handler server, built by Tyler Bunnell.
* HOMEPAGE:
@@ -2272,127 +1353,7 @@ SOFTWARE.
---
-This product contains a modified portion of ‘manners’ a polite webserver for Go, built by Braintree, a division of PayPal, Inc.
-
-* HOMEPAGE:
- * https://github.com/braintree/manners
-
-* LICENSE:
-
-Copyright (c) 2014 Braintree, a division of PayPal, Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
----
-
-This product contains a modified portion of ‘perks’ which contains the Go package quantile that computes approximate quantiles over an unbounded data stream within low memory and CPU bounds, built by Blake Mizerany.
-
-* HOMEPAGE:
- * https://github.com/beorn7/perks
-
-* LICENSE:
-
-Copyright (C) 2013 Blake Mizerany
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
----
-
-This product contains a modified portion of ‘protobuf’ for Go support for Protocol Buffers, built by The Go Authors.
-
-* HOMEPAGE:
- * https://github.com/golang/protobuf
-
-* LICENSE:
-
-Go support for Protocol Buffers - Google's data interchange format
-
-Copyright 2010 The Go Authors. All rights reserved.
-https://github.com/golang/protobuf
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
----
-
-This product contains a modified portion of ‘golang_protobuf_extensions’ which provides various Protocol Buffer extensions, built by matttproud.
-
-* HOMEPAGE:
- * https://github.com/matttproud/golang_protobuf_extensions
-
-* LICENSE:
-
-# Code licensed under the Apache 2.0 License:
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
----
+## cobra
This product contains a modified portion of ‘cobra’, a Commander for modern Go CLI interactions, built by spf13.
@@ -2417,6 +1378,8 @@ limitations under the License.
---
+## client_golang
+
This product contains modified portions of Prometheus ‘client_golang’, which is the Go library for Prometheus. Prometheus is a systems and service monitoring system, started by Matt T. Proud and Julius Volz in 2012.
* HOMEPAGE:
@@ -2438,78 +1401,11 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
----
-
-This product contains modified portions of Prometheus ‘client_model’, which provides data model artifacts for Prometheus. Prometheus is a systems and service monitoring system, started by Matt T. Proud and Julius Volz in 2012.
-
-* HOMEPAGE:
- * https://github.com/prometheus/client_model
-
-* LICENSE:
-
-# Code licensed under the Apache 2.0 License:
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
----
-
-This product contains modified portions of Prometheus ‘common’, which is the part of the Prometheus project that contains Go libraries that are shared across Prometheus components and libraries. Prometheus is a systems and service monitoring system, started by Matt T. Proud and Julius Volz in 2012.
-
-* HOMEPAGE:
- * https://github.com/prometheus/common
-
-* LICENSE:
-
-# Code licensed under the Apache 2.0 License:
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
----
-
-This product contains modified portions of Prometheus ‘procfs’, which is the part of the Prometheus project that provides functions to retrieve system, kernel and process metrics from the pseudo-filesystem proc. Prometheus is a systems and service monitoring system, started by Matt T. Proud and Julius Volz in 2012.
-
-* HOMEPAGE:
- * https://github.com/prometheus/procfs
-
-* LICENSE:
-
-# Code licensed under the Apache 2.0 License:
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-
----
-This product contains a modified portion of 'go-opengraph', for parsing OpenGraph data from HTML into regular structures by Vitaly Dyatlov.
+## go-opengraph
+
+This product contains a modified portion of 'go-opengraph', for parsing OpenGraph data from HTML into regular structures, built by Vitaly Dyatlov.
* HOMEPAGE:
* https://github.com/dyatlov/go-opengraph
@@ -2540,7 +1436,9 @@ SOFTWARE.
----
-This product contains a modified portion of `viper` for handling configuration in Go programs. Built by Steve Francia.
+## viper
+
+This product contains a modified portion of `viper` for handling configuration in Go programs, built by Steve Francia.
* HOMEPAGE:
* https://github.com/spf13/viper
@@ -2571,7 +1469,9 @@ SOFTWARE.
----
-This product contains a modified version of `gomail` for sending emails. Built by Alexandre Cesaro.
+## gomail
+
+This product contains a modified version of `gomail` for sending emails, built by Alexandre Cesaro.
* HOMEPAGE:
* https://github.com/go-gomail/gomail
@@ -2601,47 +1501,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
----
-This product contains a modified version of `fsnotify` for file system notifications. Built by the Go Authors and the fsnotify Authors.
-
-* HOMEPAGE:
- * https://github.com/fsnotify/fsnotify
-
-* LICENSE:
-
-Copyright (c) 2012 The Go Authors. All rights reserved.
-Copyright (c) 2012 fsnotify Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-----
-
## analytics-go
-This product contains a modified portion of `analytics-go`, a segment analytics client for Go by Segment.
+This product contains a modified portion of `analytics-go`, a segment analytics client for Go, built by Segment.
* HOMEPAGE:
* https://github.com/segmentio/analytics-go
@@ -2654,7 +1516,7 @@ MIT license
## html2text
-This product contains a modified portion of 'html2text', an HTML to raw text converter by Carlos Tadeu Panato Junior, based on `html2text` by Jay Taylor.
+This product contains a modified portion of 'html2text', an HTML to raw text converter by Carlos Tadeu Panato Junior based on `html2text`, built by Jay Taylor.
* HOMEPAGE
* https://github.com/mattermost/html2text
@@ -2687,7 +1549,7 @@ SOFTWARE.
## elastic
-This product contains a modified portion of `elastic`, an Elasticsearch client for the Go programming language by Oliver Eilhard.
+This product contains a modified portion of `elastic`, an Elasticsearch client for the Go programming language, built by Oliver Eilhard.
* HOMEPAGE
* https://github.com/olivere/elastic
@@ -2719,7 +1581,7 @@ IN THE SOFTWARE.
## redis
-This product contains a modified portion of `redis`, a type-safe Redis client for Golang, by go-redis.
+This product contains a modified portion of `redis`, a type-safe Redis client for Golang, built by go-redis.
* HOMEPAGE
* https://github.com/go-redis/redis
@@ -2756,7 +1618,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
## testify
-This product contains a modified portion of testify, a Golang toolkit providing tools for testifying that code behaves as intended.
+This product contains a modified portion of testify, a Golang toolkit providing tools for testifying that code behaves as intended, built by Stretchr, Inc.
* HOMEPAGE
* https://github.com/stretchr/testify
@@ -2788,40 +1650,6 @@ OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
-## html2text
-
-This product contains a modified portion of `html2text`, a Golang library for HTML to plaintext conversion.
-
-* HOMEPAGE
- * https://github.com/mattermost/html2text
-
-* LICENSE
-
-The MIT License (MIT)
-
-Copyright (c) 2015 Jay Taylor
-Modified work: Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
----
-
## uasurfer
This product contains a modified portion of `uasurfer`, a Golang library for parsing User-Agent strings, built by Avocet.
@@ -3027,7 +1855,7 @@ This product contains a modified portion of `uasurfer`, a Golang library for par
## fake
-Fake is a fake data generator for Go (Golang), heavily inspired by the forgery and ffaker Ruby gems, built by Dmitry Afanasyev.
+This product contains a modified portion of 'fake', a fake data generator for Go (Golang), heavily inspired by the forgery and ffaker Ruby gems, built by Dmitry Afanasyev.
* HOMEPAGE:
* https://github.com/icrowley/fake
@@ -3060,7 +1888,7 @@ SOFTWARE.
## memberlist
-memberlist is a Go library that manages cluster membership and member failure detection using a gossip based protocol, built by HashiCorp.
+This product contains a modified portion of 'memberlist', a Go library that manages cluster membership and member failure detection using a gossip based protocol, built by HashiCorp.
* HOMEPAGE
* github.com/hashicorp/memberlist
@@ -3425,7 +2253,7 @@ Exhibit B - “Incompatible With Secondary Licenses” Notice
## gorp
-This product contains Go Relational Persistence, an ORM-ish library for Go.
+This product contains a modified portion of 'gorp', a Go Relational Persistence and an ORM-ish library for Go, built by go-gorp.
* HOMEPAGE
* github.com/mattermost/gorp
@@ -3459,7 +2287,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
## errors
-Package errors provides simple error handling primitives, built by pkg.
+This product contains a modified portion of 'errors', a package that provides simple error handling primitives, built by pkg.
* HOMEPAGE
* github.com/pkg/errors
@@ -3491,3 +2319,405 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
---
+
+## schema
+
+This product contains a modified portion of 'schema', a package gorilla/schema that fills a struct with form values, built by Gorilla web toolkit.
+
+* HOMEPAGE
+ * github.com/gorilla/schema
+
+* LICENSE
+
+Copyright (c) 2012 Rodrigo Moraes. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+---
+
+## rsc
+
+This product contains a modified portion of 'rsc', a fork of Russ Cox's code.google.com/p/rsc, built by Russ Cox.
+
+* HOMEPAGE
+ * github.com/mattermost/rsc
+
+* LICENSE
+
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+---
+
+## lumberjack
+
+This product contains a modified portion of 'lumberjack', a Go package for writing logs to rolling files, built by Nate Finch.
+
+* HOMEPAGE
+ * https://github.com/natefinch/lumberjack
+
+* LICENSE
+
+The MIT License (MIT)
+
+Copyright (c) 2014 Nate Finch
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+---
+
+## zap
+
+This product contains a modified portion of 'zap', a package that provides fast, structured, leveled logging; built by Uber Golang.
+
+* HOMEPAGE
+ * https://github.com/uber-go/zap
+
+* LICENSE
+
+Copyright (c) 2016-2017 Uber Technologies, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+---
+
+## net
+
+This product contains a modified portion of 'net', a package that provides supplementary Go networking libraries, built by Go.
+
+* HOMEPAGE
+ * https://github.com/golang/net
+
+* LICENSE
+
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+---
+
+## sys
+
+This product contains a modified portion of 'sys', Go packages for low-level interactions with the operating system, built by Go.
+
+* HOMEPAGE
+ * https://github.com/golang/sys
+
+* LICENSE
+
+Copyright (c) 2009 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+---
+
+## freetype
+
+This product contains a modified portion of 'freetype', a port of the Freetype
+font rasterizer (www.freetype.org) to the Go programming.
+
+Portions of this software are copyright © 2010 The FreeType Project (www.freetype.org).
+All rights reserved.
+
+* HOMEPAGE:
+ * http://www.freetype.org and https://github.com/golang/freetype
+
+* LICENSE:
+
+ The FreeType Project LICENSE
+ ----------------------------
+
+ 2006-Jan-27
+
+ Copyright 1996-2002, 2006 by
+ David Turner, Robert Wilhelm, and Werner Lemberg
+
+
+
+Introduction
+============
+
+ The FreeType Project is distributed in several archive packages;
+ some of them may contain, in addition to the FreeType font engine,
+ various tools and contributions which rely on, or relate to, the
+ FreeType Project.
+
+ This license applies to all files found in such packages, and
+ which do not fall under their own explicit license. The license
+ affects thus the FreeType font engine, the test programs,
+ documentation and makefiles, at the very least.
+
+ This license was inspired by the BSD, Artistic, and IJG
+ (Independent JPEG Group) licenses, which all encourage inclusion
+ and use of free software in commercial and freeware products
+ alike. As a consequence, its main points are that:
+
+ o We don't promise that this software works. However, we will be
+ interested in any kind of bug reports. (`as is' distribution)
+
+ o You can use this software for whatever you want, in parts or
+ full form, without having to pay us. (`royalty-free' usage)
+
+ o You may not pretend that you wrote this software. If you use
+ it, or only parts of it, in a program, you must acknowledge
+ somewhere in your documentation that you have used the
+ FreeType code. (`credits')
+
+ We specifically permit and encourage the inclusion of this
+ software, with or without modifications, in commercial products.
+ We disclaim all warranties covering The FreeType Project and
+ assume no liability related to The FreeType Project.
+
+
+ Finally, many people asked us for a preferred form for a
+ credit/disclaimer to use in compliance with this license. We thus
+ encourage you to use the following text:
+
+ """
+ Portions of this software are copyright � <year> The FreeType
+ Project (www.freetype.org). All rights reserved.
+ """
+
+ Please replace <year> with the value from the FreeType version you
+ actually use.
+
+
+Legal Terms
+===========
+
+0. Definitions
+--------------
+
+ Throughout this license, the terms `package', `FreeType Project',
+ and `FreeType archive' refer to the set of files originally
+ distributed by the authors (David Turner, Robert Wilhelm, and
+ Werner Lemberg) as the `FreeType Project', be they named as alpha,
+ beta or final release.
+
+ `You' refers to the licensee, or person using the project, where
+ `using' is a generic term including compiling the project's source
+ code as well as linking it to form a `program' or `executable'.
+ This program is referred to as `a program using the FreeType
+ engine'.
+
+ This license applies to all files distributed in the original
+ FreeType Project, including all source code, binaries and
+ documentation, unless otherwise stated in the file in its
+ original, unmodified form as distributed in the original archive.
+ If you are unsure whether or not a particular file is covered by
+ this license, you must contact us to verify this.
+
+ The FreeType Project is copyright (C) 1996-2000 by David Turner,
+ Robert Wilhelm, and Werner Lemberg. All rights reserved except as
+ specified below.
+
+1. No Warranty
+--------------
+
+ THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO
+ USE, OF THE FREETYPE PROJECT.
+
+2. Redistribution
+-----------------
+
+ This license grants a worldwide, royalty-free, perpetual and
+ irrevocable right and license to use, execute, perform, compile,
+ display, copy, create derivative works of, distribute and
+ sublicense the FreeType Project (in both source and object code
+ forms) and derivative works thereof for any purpose; and to
+ authorize others to exercise some or all of the rights granted
+ herein, subject to the following conditions:
+
+ o Redistribution of source code must retain this license file
+ (`FTL.TXT') unaltered; any additions, deletions or changes to
+ the original files must be clearly indicated in accompanying
+ documentation. The copyright notices of the unaltered,
+ original files must be preserved in all copies of source
+ files.
+
+ o Redistribution in binary form must provide a disclaimer that
+ states that the software is based in part of the work of the
+ FreeType Team, in the distribution documentation. We also
+ encourage you to put an URL to the FreeType web page in your
+ documentation, though this isn't mandatory.
+
+ These conditions apply to any software derived from or based on
+ the FreeType Project, not just the unmodified files. If you use
+ our work, you must acknowledge us. However, no fee need be paid
+ to us.
+
+3. Advertising
+--------------
+
+ Neither the FreeType authors and contributors nor you shall use
+ the name of the other for commercial, advertising, or promotional
+ purposes without specific prior written permission.
+
+ We suggest, but do not require, that you use one or more of the
+ following phrases to refer to this software in your documentation
+ or advertising materials: `FreeType Project', `FreeType Engine',
+ `FreeType library', or `FreeType Distribution'.
+
+ As you have not signed this license, you are not required to
+ accept it. However, as the FreeType Project is copyrighted
+ material, only this license, or another one contracted with the
+ authors, grants you the right to use, distribute, and modify it.
+ Therefore, by using, distributing, or modifying the FreeType
+ Project, you indicate that you understand and accept all the terms
+ of this license.
+
+4. Contacts
+-----------
+
+ There are two mailing lists related to FreeType:
+
+ o freetype@nongnu.org
+
+ Discusses general use and applications of FreeType, as well as
+ future and wanted additions to the library and distribution.
+ If you are looking for support, start in this list if you
+ haven't found anything to help you in the documentation.
+
+ o freetype-devel@nongnu.org
+
+ Discusses bugs, as well as engine internals, design issues,
+ specific licenses, porting, etc.
+
+ Our home page can be found at
+
+ http://www.freetype.org
+
+--- end of FTL.TXT ---
diff --git a/app/apptestlib.go b/app/apptestlib.go
index 626e932e8..b245ddabf 100644
--- a/app/apptestlib.go
+++ b/app/apptestlib.go
@@ -227,6 +227,29 @@ func (me *TestHelper) createChannel(team *model.Team, channelType string) *model
return channel
}
+func (me *TestHelper) createChannelWithAnotherUser(team *model.Team, channelType, userId string) *model.Channel {
+ id := model.NewId()
+
+ channel := &model.Channel{
+ DisplayName: "dn_" + id,
+ Name: "name_" + id,
+ Type: channelType,
+ TeamId: team.Id,
+ CreatorId: userId,
+ }
+
+ utils.DisableDebugLogForTest()
+ var err *model.AppError
+ if channel, err = me.App.CreateChannel(channel, true); err != nil {
+ mlog.Error(err.Error())
+
+ time.Sleep(time.Second)
+ panic(err)
+ }
+ utils.EnableDebugLogForTest()
+ return channel
+}
+
func (me *TestHelper) CreateDmChannel(user *model.User) *model.Channel {
utils.DisableDebugLogForTest()
var err *model.AppError
diff --git a/app/command_invite.go b/app/command_invite.go
index 4b76c0c45..54cf2da02 100644
--- a/app/command_invite.go
+++ b/app/command_invite.go
@@ -79,10 +79,18 @@ func (me *InviteProvider) DoCommand(a *App, args *model.CommandArgs, message str
return &model.CommandResponse{Text: args.T("api.command_invite.permission.app_error", map[string]interface{}{"User": userProfile.Username, "Channel": channelToJoin.Name}), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
}
- if channelToJoin.Type == model.CHANNEL_PRIVATE && !a.SessionHasPermissionToChannel(args.Session, channelToJoin.Id, model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS) {
+ // Check if the user who wants to add another is trying to add in a pvt channel, but does not have permission
+ // but is in the channel
+ _, err = a.GetChannelMember(channelToJoin.Id, args.UserId)
+ if channelToJoin.Type == model.CHANNEL_PRIVATE && !a.SessionHasPermissionToChannel(args.Session, channelToJoin.Id, model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS) && err == nil {
return &model.CommandResponse{Text: args.T("api.command_invite.permission.app_error", map[string]interface{}{"User": userProfile.Username, "Channel": channelToJoin.Name}), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
}
+ // In this case just check if is a pvt channel and user has permission
+ if channelToJoin.Type == model.CHANNEL_PRIVATE && !a.SessionHasPermissionToChannel(args.Session, channelToJoin.Id, model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS) {
+ return &model.CommandResponse{Text: args.T("api.command_invite.private_channel.app_error", map[string]interface{}{"Channel": channelToJoin.Name}), ResponseType: model.COMMAND_RESPONSE_TYPE_EPHEMERAL}
+ }
+
// Check if user is already in the channel
_, err = a.GetChannelMember(channelToJoin.Id, userProfile.Id)
if err == nil {
diff --git a/app/command_invite_test.go b/app/command_invite_test.go
index c46bc4628..0d1db4a07 100644
--- a/app/command_invite_test.go
+++ b/app/command_invite_test.go
@@ -18,6 +18,7 @@ func TestInviteProvider(t *testing.T) {
channel := th.createChannel(th.BasicTeam, model.CHANNEL_OPEN)
privateChannel := th.createChannel(th.BasicTeam, model.CHANNEL_PRIVATE)
dmChannel := th.CreateDmChannel(th.BasicUser2)
+ privateChannel2 := th.createChannelWithAnotherUser(th.BasicTeam, model.CHANNEL_PRIVATE, th.BasicUser2.Id)
basicUser3 := th.CreateUser()
th.LinkUserToTeam(basicUser3, th.BasicTeam)
@@ -36,6 +37,7 @@ func TestInviteProvider(t *testing.T) {
userAndDisplayChannel := "@" + th.BasicUser2.Username + " ~" + channel.DisplayName + " "
userAndPrivateChannel := "@" + th.BasicUser2.Username + " ~" + privateChannel.Name
userAndDMChannel := "@" + basicUser3.Username + " ~" + dmChannel.Name
+ userAndInvalidPrivate := "@" + basicUser3.Username + " ~" + privateChannel2.Name
tests := []struct {
desc string
@@ -97,6 +99,11 @@ func TestInviteProvider(t *testing.T) {
expected: "api.command_invite.directchannel.app_error",
msg: userAndDMChannel,
},
+ {
+ desc: "try to add a user to a privante channel with no permission",
+ expected: "api.command_invite.private_channel.app_error",
+ msg: userAndInvalidPrivate,
+ },
}
for _, test := range tests {
diff --git a/app/notification.go b/app/notification.go
index 7198de764..4bdc6c94f 100644
--- a/app/notification.go
+++ b/app/notification.go
@@ -919,12 +919,13 @@ func GetExplicitMentions(message string, keywords map[string][]string) *Explicit
// remove trailing '.', as that is the end of a sentence
foundWithSuffix := false
-
- for strings.HasSuffix(word, ".") {
- word = strings.TrimSuffix(word, ".")
- if checkForMention(word) {
- foundWithSuffix = true
- break
+ for _, suffixPunctuation := range []string{".", ":"} {
+ for strings.HasSuffix(word, suffixPunctuation) {
+ word = strings.TrimSuffix(word, suffixPunctuation)
+ if checkForMention(word) {
+ foundWithSuffix = true
+ break
+ }
}
}
diff --git a/app/notification_test.go b/app/notification_test.go
index 3b8b4adf5..818ad1d9d 100644
--- a/app/notification_test.go
+++ b/app/notification_test.go
@@ -148,6 +148,16 @@ func TestGetExplicitMentions(t *testing.T) {
OtherPotentialMentions: []string{"user"},
},
},
+ "OnePersonWithColonAtEnd": {
+ Message: "this is a message for @user:",
+ Keywords: map[string][]string{"this": {id1}},
+ Expected: &ExplicitMentions{
+ MentionedUserIds: map[string]bool{
+ id1: true,
+ },
+ OtherPotentialMentions: []string{"user"},
+ },
+ },
"MultiplePeopleWithOneWord": {
Message: "this is a message for @user",
Keywords: map[string][]string{"@user": {id1, id2}},
@@ -188,6 +198,18 @@ func TestGetExplicitMentions(t *testing.T) {
ChannelMentioned: true,
},
},
+
+ "ChannelWithColonAtEnd": {
+ Message: "this is a message for @channel:",
+ Keywords: map[string][]string{"@channel": {id1, id2}},
+ Expected: &ExplicitMentions{
+ MentionedUserIds: map[string]bool{
+ id1: true,
+ id2: true,
+ },
+ ChannelMentioned: true,
+ },
+ },
"CapitalizedChannel": {
Message: "this is an message for @cHaNNeL",
Keywords: map[string][]string{"@channel": {id1, id2}},
@@ -210,6 +232,17 @@ func TestGetExplicitMentions(t *testing.T) {
AllMentioned: true,
},
},
+ "AllWithColonAtEnd": {
+ Message: "this is a message for @all:",
+ Keywords: map[string][]string{"@all": {id1, id2}},
+ Expected: &ExplicitMentions{
+ MentionedUserIds: map[string]bool{
+ id1: true,
+ id2: true,
+ },
+ AllMentioned: true,
+ },
+ },
"CapitalizedAll": {
Message: "this is an message for @ALL",
Keywords: map[string][]string{"@all": {id1, id2}},
@@ -230,6 +263,15 @@ func TestGetExplicitMentions(t *testing.T) {
},
},
},
+ "AtUserWithColonAtEnd": {
+ Message: "this is a message for @user:",
+ Keywords: map[string][]string{"@user": {id1}},
+ Expected: &ExplicitMentions{
+ MentionedUserIds: map[string]bool{
+ id1: true,
+ },
+ },
+ },
"AtUserWithPeriodAtEndOfSentence": {
Message: "this is a message for @user.period.",
Keywords: map[string][]string{"@user.period": {id1}},
@@ -248,6 +290,15 @@ func TestGetExplicitMentions(t *testing.T) {
},
},
},
+ "UserWithColonAtEnd": {
+ Message: "this is a message for user:",
+ Keywords: map[string][]string{"user": {id1}},
+ Expected: &ExplicitMentions{
+ MentionedUserIds: map[string]bool{
+ id1: true,
+ },
+ },
+ },
"PotentialOutOfChannelUser": {
Message: "this is an message for @potential and @user",
Keywords: map[string][]string{"@user": {id1}},
@@ -452,6 +503,7 @@ func TestGetExplicitMentionsAtHere(t *testing.T) {
"\\@here\\": true,
"|@here|": true,
";@here;": true,
+ "@here:": true,
":@here:": false, // This case shouldn't trigger a mention since it follows the format of reactions e.g. :word:
"'@here'": true,
"\"@here\"": true,
diff --git a/app/web_hub.go b/app/web_hub.go
index f69645f50..2ce78b5ef 100644
--- a/app/web_hub.go
+++ b/app/web_hub.go
@@ -177,8 +177,9 @@ func (a *App) Publish(message *model.WebSocketEvent) {
func (a *App) PublishSkipClusterSend(message *model.WebSocketEvent) {
if message.Broadcast.UserId != "" {
- if len(a.Hubs) != 0 {
- a.GetHubForUserId(message.Broadcast.UserId).Broadcast(message)
+ hub := a.GetHubForUserId(message.Broadcast.UserId)
+ if hub != nil {
+ hub.Broadcast(message)
}
} else {
for _, hub := range a.Hubs {
@@ -299,8 +300,9 @@ func (a *App) InvalidateCacheForUserSkipClusterSend(userId string) {
a.Srv.Store.User().InvalidateProfilesInChannelCacheByUser(userId)
a.Srv.Store.User().InvalidatProfileCacheForUser(userId)
- if len(a.Hubs) != 0 {
- a.GetHubForUserId(userId).InvalidateUser(userId)
+ hub := a.GetHubForUserId(userId)
+ if hub != nil {
+ hub.InvalidateUser(userId)
}
}
@@ -322,8 +324,9 @@ func (a *App) InvalidateCacheForWebhookSkipClusterSend(webhookId string) {
}
func (a *App) InvalidateWebConnSessionCacheForUser(userId string) {
- if len(a.Hubs) != 0 {
- a.GetHubForUserId(userId).InvalidateUser(userId)
+ hub := a.GetHubForUserId(userId)
+ if hub != nil {
+ hub.InvalidateUser(userId)
}
}
diff --git a/cmd/commands/user.go b/cmd/commands/user.go
index da3fb454b..7397cfb2e 100644
--- a/cmd/commands/user.go
+++ b/cmd/commands/user.go
@@ -422,6 +422,10 @@ func updateUserEmailCmdF(command *cobra.Command, args []string) error {
}
defer a.Shutdown()
+ if len(args) != 2 {
+ return errors.New("Expected two arguments. See help text for details.")
+ }
+
newEmail := args[1]
if !model.IsValidEmail(newEmail) {
@@ -440,7 +444,7 @@ func updateUserEmailCmdF(command *cobra.Command, args []string) error {
user.Email = newEmail
_, errUpdate := a.UpdateUser(user, true)
if errUpdate != nil {
- return errUpdate
+ return errors.New(errUpdate.Message)
}
return nil
diff --git a/cmd/commands/user_test.go b/cmd/commands/user_test.go
index a1081c5d3..8691ac803 100644
--- a/cmd/commands/user_test.go
+++ b/cmd/commands/user_test.go
@@ -104,7 +104,19 @@ func TestChangeUserEmail(t *testing.T) {
// should fail because using an invalid email
require.Error(t, cmd.RunCommand(t, "user", "email", th.BasicUser.Username, "wrong$email.com"))
+ // should fail because missing one parameter
+ require.Error(t, cmd.RunCommand(t, "user", "email", th.BasicUser.Username))
+
+ // should fail because missing both parameters
+ require.Error(t, cmd.RunCommand(t, "user", "email"))
+
+ // should fail because have more than 2 parameters
+ require.Error(t, cmd.RunCommand(t, "user", "email", th.BasicUser.Username, "new@email.com", "extra!"))
+
// should fail because user not found
require.Error(t, cmd.RunCommand(t, "user", "email", "invalidUser", newEmail))
+ // should fail because email already in use
+ require.Error(t, cmd.RunCommand(t, "user", "email", th.BasicUser.Username, th.BasicUser2.Email))
+
}
diff --git a/i18n/de.json b/i18n/de.json
index 09f87dc22..df7f4ab21 100644
--- a/i18n/de.json
+++ b/i18n/de.json
@@ -217,11 +217,11 @@
},
{
"id": "api.channel.convert_channel_to_private.default_channel_error",
- "translation": "This default channel cannot be converted into a private channel."
+ "translation": "Dieser Standard-Kanal kann nicht in einen privaten Kanal umgewandelt werden."
},
{
"id": "api.channel.convert_channel_to_private.private_channel_error",
- "translation": "The channel requested to convert is already a private channel."
+ "translation": "Der umzuwandelnde Kanal ist bereits ein privater Kanal."
},
{
"id": "api.channel.create_channel.direct_channel.app_error",
@@ -792,11 +792,11 @@
},
{
"id": "api.command_invite.desc",
- "translation": "Invite a user to a channel"
+ "translation": "Benutzer in einen Kanal einladen"
},
{
"id": "api.command_invite.directchannel.app_error",
- "translation": "Sie können keinen Benutzer aus einem Direktnachrichtenkanal entfernen."
+ "translation": "Sie können keinen Benutzer einem Direktnachrichtenkanal hinzufügen."
},
{
"id": "api.command_invite.fail.app_error",
@@ -804,11 +804,11 @@
},
{
"id": "api.command_invite.hint",
- "translation": "@[username] ~[channel]"
+ "translation": "@[Benutzername] ~[Kanal]"
},
{
"id": "api.command_invite.missing_message.app_error",
- "translation": "Missing Username and Channel."
+ "translation": "Benutzername und Kanal fehlen."
},
{
"id": "api.command_invite.missing_user.app_error",
@@ -816,19 +816,19 @@
},
{
"id": "api.command_invite.name",
- "translation": "invite"
+ "translation": "einladen"
},
{
"id": "api.command_invite.permission.app_error",
- "translation": "You don't have enough permissions to add {{.User}} in {{.Channel}}."
+ "translation": "Sie haben nicht die nötigen Berechtigungen um {{.User}} dem Kanal {{.Channel}} hinzuzufügen."
},
{
"id": "api.command_invite.success",
- "translation": "{{.User}} added to {{.Channel}} channel."
+ "translation": "{{.User}} wurde dem Kanal {{.Channel}} hinzugefügt."
},
{
"id": "api.command_invite.user_already_in_channel.app_error",
- "translation": "{{.User}} is already in the channel."
+ "translation": "{{.User}} ist bereits im Kanal."
},
{
"id": "api.command_join.desc",
@@ -960,11 +960,11 @@
},
{
"id": "api.command_mute.no_channel.error",
- "translation": "Konnte den Kanal {{.Channel}} nicht finden. Bitte nutzen Sie den [Kanal-Handle](https://about.mattermost.com/default-channel-handle-documentation), um Kanäle zu identifizieren."
+ "translation": "Konnte den Kanal nicht finden. Bitte nutzen Sie den [Kanal-Handle](https://about.mattermost.com/default-channel-handle-documentation), um Kanäle zu identifizieren."
},
{
"id": "api.command_mute.not_member.error",
- "translation": "Could not mute channel {{.Channel}} as you are not a member."
+ "translation": "Kanal {{.Channel}} konnte nicht stumm geschaltet werden, da Sie kein Mitglied sind."
},
{
"id": "api.command_mute.success_mute",
@@ -2436,7 +2436,7 @@
},
{
"id": "api.team.remove_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "Ein Fehler ist beim Aufrufen des Teams aufgetreten"
},
{
"id": "api.team.remove_user_from_team.missing.app_error",
@@ -2496,7 +2496,7 @@
},
{
"id": "api.team.team_icon.update.app_error",
- "translation": "An error occurred updating the team icon"
+ "translation": "Ein Fehler ist beim Aktualisieren des Teamsymbols aufgetreten"
},
{
"id": "api.team.update_member_roles.not_a_member",
@@ -2860,7 +2860,7 @@
},
{
"id": "api.user.create_user.missing_token.app_error",
- "translation": "Missing Token."
+ "translation": "Fehlendes Token."
},
{
"id": "api.user.create_user.no_open_server",
@@ -2912,7 +2912,7 @@
},
{
"id": "api.user.get_profile_image.not_found.app_error",
- "translation": "Unable to get profile image, user not found."
+ "translation": "Profilbild konnte nicht abgerufen werden, Benutzer nicht gefunden."
},
{
"id": "api.user.init.debug",
@@ -3308,7 +3308,7 @@
},
{
"id": "app.admin.test_email.failure",
- "translation": "Connection unsuccessful: {{.Error}}"
+ "translation": "Verbindung nicht erfolgreich: {{.Error}}"
},
{
"id": "app.channel.create_channel.no_team_id.app_error",
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "Kann extrahiertes Plugin nicht aktivieren. Plugin könnte schon existieren und aktiviert sein."
+ "translation": "Extrahiertes Plugin konnte nicht aktiviert werden."
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "Konnte aktive Plugins nicht ermitteln"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "Plugin-ID muss kürzer als {{.Max}} Zeichen sein."
- },
- {
"id": "app.plugin.install.app_error",
"translation": "Konnte Plugin nicht installieren."
},
@@ -3859,6 +3855,10 @@
"translation": "Konnte Plugin nicht installieren. Ein Plugin mit der selben ID ist bereits installiert."
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "Plugin-Id muss aus mindestens {{.Min}} und maximal {{.Max}} Zeichen bestehen und zu {{.Regex}} passen."
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "Konnte Manifest des extrahierten Plugins nicht abrufen"
},
@@ -6576,7 +6576,7 @@
},
{
"id": "store.sql_preference.cleanup_flags_batch.app_error",
- "translation": "Es ist ein Fehler beim permanenten Löschen des Stapels von Flags aufgetreten"
+ "translation": "Es ist ein Fehler beim permanenten Löschen des Stapels von Markierungen aufgetreten"
},
{
"id": "store.sql_preference.delete.app_error",
@@ -6692,7 +6692,7 @@
},
{
"id": "store.sql_role.permanent_delete_all.app_error",
- "translation": "We could not permanently delete all the roles"
+ "translation": "Es konnten nicht alle Rollen permanent gelöscht werden"
},
{
"id": "store.sql_role.save.insert.app_error",
@@ -6812,7 +6812,7 @@
},
{
"id": "store.sql_system.permanent_delete_by_name.app_error",
- "translation": "We could not permanently delete the system table entry"
+ "translation": "System-Tabelleneintrag konnte nicht permanent gelöscht werden"
},
{
"id": "store.sql_system.save.app_error",
@@ -7384,7 +7384,7 @@
},
{
"id": "utils.mail.send_mail.from_address.app_error",
- "translation": "Error setting \"From Address\""
+ "translation": "Fehler beim Setzen von \"Absenderadresse\""
},
{
"id": "utils.mail.send_mail.msg.app_error",
@@ -7400,7 +7400,7 @@
},
{
"id": "utils.mail.send_mail.to_address.app_error",
- "translation": "Error setting \"To Address\""
+ "translation": "Fehler beim Setzen von \"Empfängeradresse\""
},
{
"id": "utils.mail.test.configured.error",
diff --git a/i18n/en.json b/i18n/en.json
index d42c6a544..0f3dacd95 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -823,6 +823,10 @@
"translation": "You don't have enough permissions to add {{.User}} in {{.Channel}}."
},
{
+ "id": "api.command_invite.private_channel.app_error",
+ "translation": "Could not find the channel {{.Channel}}. Please use the channel handle to identify channels."
+ },
+ {
"id": "api.command_invite.success",
"translation": "{{.User}} added to {{.Channel}} channel."
},
@@ -3847,10 +3851,6 @@
"translation": "Unable to get active plugins"
},
{
- "id": "app.plugin.invalid_id.app_error",
- "translation": "Plugin Id must be at least {{.Min}} characters, at most {{.Max}} characters and match {{.Regex}}."
- },
- {
"id": "app.plugin.install.app_error",
"translation": "Unable to install plugin."
},
@@ -3859,6 +3859,10 @@
"translation": "Unable to install plugin. A plugin with the same ID is already installed."
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "Plugin Id must be at least {{.Min}} characters, at most {{.Max}} characters and match {{.Regex}}."
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "Unable to find manifest for extracted plugin"
},
diff --git a/i18n/es.json b/i18n/es.json
index b22a62bbc..0fb44ec97 100644
--- a/i18n/es.json
+++ b/i18n/es.json
@@ -2436,7 +2436,7 @@
},
{
"id": "api.team.remove_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "Ocurrió un error al obtener el equipo"
},
{
"id": "api.team.remove_user_from_team.missing.app_error",
@@ -2496,7 +2496,7 @@
},
{
"id": "api.team.team_icon.update.app_error",
- "translation": "An error occurred updating the team icon"
+ "translation": "Ocurrió un error al actualizar el icono del equipo"
},
{
"id": "api.team.update_member_roles.not_a_member",
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "No se puede activar el plugin extraído. Puede que el plugin ya exista y esté activo."
+ "translation": "No se puede activar el complemento extraído."
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "No se puede obtener los complementos activos"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "Id del Plugin debe tener menos de {{.Max}} caracteres."
- },
- {
"id": "app.plugin.install.app_error",
"translation": "No se puede instalar el plugin."
},
@@ -3859,6 +3855,10 @@
"translation": "No se puede instalar el plugin. Un plugin con el mismo ID ya está instalado."
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "El Id del complemento debe tener al menos {{.Min}} caracteres y un máximo de {{.Max}} caracteres que coincidan con {{.Regex}}."
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "No se puede encontrar el manifiesto del plugin extraído"
},
diff --git a/i18n/fr.json b/i18n/fr.json
index 700b1b856..c408bc60d 100644
--- a/i18n/fr.json
+++ b/i18n/fr.json
@@ -109,15 +109,15 @@
},
{
"id": "api.admin.test_s3.missing_s3_bucket",
- "translation": "S3 Bucket is required"
+ "translation": "Un Bucket S3 est requis"
},
{
"id": "api.admin.test_s3.missing_s3_endpoint",
- "translation": "S3 Endpoint is required"
+ "translation": "Un noeud (endpoint) S3 est requis"
},
{
"id": "api.admin.test_s3.missing_s3_region",
- "translation": "S3 Region is required"
+ "translation": "Une région S3 est requise"
},
{
"id": "api.admin.upload_brand_image.array.app_error",
@@ -217,11 +217,11 @@
},
{
"id": "api.channel.convert_channel_to_private.default_channel_error",
- "translation": "This default channel cannot be converted into a private channel."
+ "translation": "Le canal par défaut ne peut pas être converti en un canal privé."
},
{
"id": "api.channel.convert_channel_to_private.private_channel_error",
- "translation": "The channel requested to convert is already a private channel."
+ "translation": "Le canal que vous essayez de convertir est déjà un canal privé."
},
{
"id": "api.channel.create_channel.direct_channel.app_error",
@@ -788,15 +788,15 @@
},
{
"id": "api.command_invite.channel.error",
- "translation": "Could not find the channel {{.Channel}}. Please use the [channel handle](https://about.mattermost.com/default-channel-handle-documentation) to identify channels."
+ "translation": "Impossible de trouver le canal {{.Channel}}. Veuillez utiliser l'[identifiant de canal](https://about.mattermost.com/default-channel-handle-documentation) pour identifier les canaux."
},
{
"id": "api.command_invite.desc",
- "translation": "Invite a user to a channel"
+ "translation": "Inviter un utilisateur à rejoindre un canal"
},
{
"id": "api.command_invite.directchannel.app_error",
- "translation": "Vous ne pouvez pas retirer un utilisateur d'un canal de messages personnels."
+ "translation": "Vous ne pouvez pas ajouter un utilisateur dans un canal de messages personnels."
},
{
"id": "api.command_invite.fail.app_error",
@@ -804,31 +804,31 @@
},
{
"id": "api.command_invite.hint",
- "translation": "@[username] ~[channel]"
+ "translation": "@[nom d'utilisateur] ~[canal]"
},
{
"id": "api.command_invite.missing_message.app_error",
- "translation": "Missing Username and Channel."
+ "translation": "Nom d'utilisateur et canal manquants."
},
{
"id": "api.command_invite.missing_user.app_error",
- "translation": "Utilisateur introuvable"
+ "translation": "Utilisateur introuvable."
},
{
"id": "api.command_invite.name",
- "translation": "invite"
+ "translation": "Inviter"
},
{
"id": "api.command_invite.permission.app_error",
- "translation": "You don't have enough permissions to add {{.User}} in {{.Channel}}."
+ "translation": "Vous n'avez pas les permissions nécessaires pour ajouter {{.User}} dans {{.Channel}}."
},
{
"id": "api.command_invite.success",
- "translation": "{{.User}} added to {{.Channel}} channel."
+ "translation": "{{.User}} a été ajouté dans {{.Channel}}."
},
{
"id": "api.command_invite.user_already_in_channel.app_error",
- "translation": "{{.User}} is already in the channel."
+ "translation": "{{.User}} est déjà membre de ce canal."
},
{
"id": "api.command_join.desc",
@@ -840,7 +840,7 @@
},
{
"id": "api.command_join.hint",
- "translation": "~[channel]"
+ "translation": "~[canal]"
},
{
"id": "api.command_join.list.app_error",
@@ -944,43 +944,43 @@
},
{
"id": "api.command_mute.desc",
- "translation": "Turns off desktop, email and push notifications for the current channel or the [channel] specified."
+ "translation": "Désactive les notifications de bureau, par e-mail et push pour le canal actuel ou pour le canal [channel]."
},
{
"id": "api.command_mute.error",
- "translation": "Could not find the channel {{.Channel}}. Please use the [channel handle](https://about.mattermost.com/default-channel-handle-documentation) to identify channels."
+ "translation": "Impossible de trouver le canal {{.Channel}}. Veuillez utiliser l'[identifiant de canal](https://about.mattermost.com/default-channel-handle-documentation) pour identifier les canaux."
},
{
"id": "api.command_mute.hint",
- "translation": "~[channel]"
+ "translation": "~[canal]"
},
{
"id": "api.command_mute.name",
- "translation": "mute"
+ "translation": "sourdine"
},
{
"id": "api.command_mute.no_channel.error",
- "translation": "Could not find the specified channel. Please use the [channel handle](https://about.mattermost.com/default-channel-handle-documentation) to identify channels."
+ "translation": "Impossible de trouver le canal spécifié. Veuillez utiliser l'[identifiant de canal](https://about.mattermost.com/default-channel-handle-documentation) pour identifier les canaux."
},
{
"id": "api.command_mute.not_member.error",
- "translation": "Could not mute channel {{.Channel}} as you are not a member."
+ "translation": "Impossible de mettre en sourdine le canal {{.Channel}}, car vous n'êtes pas membre de celui-ci."
},
{
"id": "api.command_mute.success_mute",
- "translation": "You will not receive notifications for {{.Channel}} until channel mute is turned off."
+ "translation": "Vous ne recevrez pas de notifications pour le canal {{.Channel}} jusqu'à ce que vous désactiviez le mode sourdine."
},
{
"id": "api.command_mute.success_mute_direct_msg",
- "translation": "You will not receive notifications for this channel until channel mute is turned off."
+ "translation": "Vous ne recevrez pas de notifications pour ce canal jusqu'à ce que vous désactiviez le mode sourdine."
},
{
"id": "api.command_mute.success_unmute",
- "translation": "{{.Channel}} is no longer muted."
+ "translation": "{{.Channel}} n'est plus en sourdine."
},
{
"id": "api.command_mute.success_unmute_direct_msg",
- "translation": "This channel is no longer muted."
+ "translation": "Ce canal n'est plus en sourdine."
},
{
"id": "api.command_offline.desc",
@@ -1478,7 +1478,7 @@
},
{
"id": "api.file.upload_file.incorrect_number_of_files.app_error",
- "translation": "Unable to upload files. Incorrect number of files specified."
+ "translation": "Impossible d'envoyer des fichiers. Le nombre de fichiers spécifié est incorrect."
},
{
"id": "api.file.upload_file.large_image.app_error",
@@ -1750,11 +1750,11 @@
},
{
"id": "api.post.check_for_out_of_channel_mentions.message.multiple",
- "translation": "{{.Usernames}} et {{.LastUsername}} ont été mentionnés, mais, ne faisant pas partie de ce canal, ils ne recevront pas de notifications."
+ "translation": "@{{.Usernames}} et @{{.LastUsername}} ont été mentionnés, mais, ne faisant pas partie de ce canal, ils ne recevront pas de notifications."
},
{
"id": "api.post.check_for_out_of_channel_mentions.message.one",
- "translation": "{{.Username}} a été mentionné(e), mais, ne faisant pas partie de ce canal, ne recevra pas de notification."
+ "translation": "@{{.Username}} a été mentionné(e), mais, ne faisant pas partie de ce canal, il/elle ne recevra pas de notification."
},
{
"id": "api.post.create_post.attach_files.error",
@@ -1920,7 +1920,7 @@
},
{
"id": "api.post.send_notifications_and_forget.push_image_only_no_channel",
- "translation": " a envoyé un ou plusieurs fichiers dans "
+ "translation": " a envoyé un ou plusieurs fichiers"
},
{
"id": "api.post.send_notifications_and_forget.push_in",
@@ -2036,7 +2036,7 @@
},
{
"id": "api.roles.patch_roles.license.error",
- "translation": "Your current license does not support advanced permissions."
+ "translation": "Votre licence actuelle ne supporte pas les permissions avancées."
},
{
"id": "api.saml.save_certificate.app_error",
@@ -2048,11 +2048,11 @@
},
{
"id": "api.server.start_server.forward80to443.disabled_while_using_lets_encrypt",
- "translation": "Must enable Forward80To443 when using LetsEncrypt"
+ "translation": "Vous devez activer l'option Forward80To443 pour pouvoir utiliser LetsEncrypt"
},
{
"id": "api.server.start_server.forward80to443.enabled_but_listening_on_wrong_port",
- "translation": "Cannot forward port 80 to port 443 while listening on port %s: disable Forward80To443 if using a proxy server"
+ "translation": "Impossible de rediriger le port 80 sur le port 443 alors que le serveur écoute sur le port %s : désactivez l'option Forward80To443 si vous utilisez un serveur de proxy"
},
{
"id": "api.server.start_server.listening.info",
@@ -2420,11 +2420,11 @@
},
{
"id": "api.team.move_channel.post.error",
- "translation": "Impossible de publier la description du canal"
+ "translation": "Impossible de publier le message indiquant que le canal a été déplacé."
},
{
"id": "api.team.move_channel.success",
- "translation": "This channel has been moved to this team from %v."
+ "translation": "Ce canal a été déplacé vers cette équipe par %v."
},
{
"id": "api.team.permanent_delete_team.attempting.warn",
@@ -2436,7 +2436,7 @@
},
{
"id": "api.team.remove_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "Une erreur s'est produite lors de la récupération de l'équipe"
},
{
"id": "api.team.remove_user_from_team.missing.app_error",
@@ -2448,27 +2448,27 @@
},
{
"id": "api.team.set_team_icon.array.app_error",
- "translation": "Aucune image transmise dans la requête"
+ "translation": "Tableau vide dans le paramètre 'image' de la requête"
},
{
"id": "api.team.set_team_icon.decode.app_error",
- "translation": "Could not decode team icon"
+ "translation": "Impossible de décoder l'icône d'équipe."
},
{
"id": "api.team.set_team_icon.decode_config.app_error",
- "translation": "Could not decode team icon metadata"
+ "translation": "Impossible de décoder les métadonnées de l'icône d'équipe"
},
{
"id": "api.team.set_team_icon.encode.app_error",
- "translation": "Could not encode team icon"
+ "translation": "Impossible d'encoder l'icône d'équipe"
},
{
"id": "api.team.set_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "Une erreur s'est produite lors de la récupération de l'équipe"
},
{
"id": "api.team.set_team_icon.no_file.app_error",
- "translation": "Pas de fichier dans le paramètre \"image\" de la requête"
+ "translation": "Pas de fichier dans le paramètre 'image' de la requête"
},
{
"id": "api.team.set_team_icon.open.app_error",
@@ -2480,15 +2480,15 @@
},
{
"id": "api.team.set_team_icon.storage.app_error",
- "translation": "Impossible d'envoyer le fichier. Le stockage d'images n'est pas configuré."
+ "translation": "Impossible d'envoyer l'icône d'équipe. Le stockage d'images n'est pas configuré."
},
{
"id": "api.team.set_team_icon.too_large.app_error",
- "translation": "Impossible d'envoyer le fichier. Le fichier est trop volumineux."
+ "translation": "Impossible d'envoyer l'icône d'équipe. Le fichier est trop volumineux."
},
{
"id": "api.team.set_team_icon.write_file.app_error",
- "translation": "Could not save team icon"
+ "translation": "Impossible d'enregistrer l'icône d'équipe"
},
{
"id": "api.team.signup_team.email_disabled.app_error",
@@ -2496,7 +2496,7 @@
},
{
"id": "api.team.team_icon.update.app_error",
- "translation": "An error occurred updating the team icon"
+ "translation": "Une erreur est survenue lors du changement d'icône d'équipe."
},
{
"id": "api.team.update_member_roles.not_a_member",
@@ -2860,7 +2860,7 @@
},
{
"id": "api.user.create_user.missing_token.app_error",
- "translation": "Missing Token."
+ "translation": "Jeton manquant."
},
{
"id": "api.user.create_user.no_open_server",
@@ -2912,7 +2912,7 @@
},
{
"id": "api.user.get_profile_image.not_found.app_error",
- "translation": "Unable to get profile image, user not found."
+ "translation": "Impossible de récupérer l'image de profil, utilisateur introuvable."
},
{
"id": "api.user.init.debug",
@@ -3244,7 +3244,7 @@
},
{
"id": "api.webhook.incoming.error",
- "translation": "Could not decode the multipart payload of incoming webhook."
+ "translation": "Impossible de décoder la charge utile multipart du webhook entrant."
},
{
"id": "api.webhook.init.debug",
@@ -3308,7 +3308,7 @@
},
{
"id": "app.admin.test_email.failure",
- "translation": "Connection unsuccessful: {{.Error}}"
+ "translation": "La connexion n'a pas pu être établie : {{.Error}}"
},
{
"id": "app.channel.create_channel.no_team_id.app_error",
@@ -3812,11 +3812,11 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "Impossible d'activer le plugin extrait. Il se peut qu'il existe déjà et soit déjà activé."
+ "translation": "Impossible d'activer le plugin extrait."
},
{
"id": "app.plugin.cluster.save_config.app_error",
- "translation": "The plugin configuration in your config.json file must be updated manually when using ReadOnlyConfig with clustering enabled."
+ "translation": "La configuration du plugin dans votre fichier config.json doit être mise à jour manuellement lorsque vous utilisez l'option ReadOnlyConfig alors que le clustering est activé."
},
{
"id": "app.plugin.config.app_error",
@@ -3828,7 +3828,7 @@
},
{
"id": "app.plugin.disabled.app_error",
- "translation": "Plugins have been disabled. Please check your logs for details."
+ "translation": "Les plugins ont été désactivés. Veuillez consulter vos journaux (logs) pour plus d'information."
},
{
"id": "app.plugin.extract.app_error",
@@ -3847,10 +3847,6 @@
"translation": "Impossible de récupérer les plugins actifs"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "L'Id de plugin doit faire moins de {{.Max}} caractères."
- },
- {
"id": "app.plugin.install.app_error",
"translation": "Impossible d'installer le plugin."
},
@@ -3859,6 +3855,10 @@
"translation": "Impossible d'installer le plugin. Un plugin avec le même ID est déjà installé."
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "L'identifiant du plugin doit contenir au moins {{.Min}} caractères, au plus {{.Max}} caractères et correspondre à la {{.Regex}}."
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "Impossible de trouver le manifeste pour le plugin extrait"
},
@@ -3880,7 +3880,7 @@
},
{
"id": "app.role.check_roles_exist.role_not_found",
- "translation": "The provided role does not exist"
+ "translation": "Le rôle spécifié n'existe pas"
},
{
"id": "app.team.join_user_to_team.max_accounts.app_error",
@@ -3888,15 +3888,15 @@
},
{
"id": "app.timezones.failed_deserialize.app_error",
- "translation": "Failed to deserialize Timezone config file={{.Filename}}, err={{.Error}}"
+ "translation": "Impossible de désérialiser le fichier de configuration du fuseau horaire={{.Filename}}, err={{.Error}}"
},
{
"id": "app.timezones.load_config.app_error",
- "translation": "Timezone config file does not exists file={{.Filename}}"
+ "translation": "Le fichier de configuration du fuseau horaire n'existe pas {{.Filename}}"
},
{
"id": "app.timezones.read_config.app_error",
- "translation": "Failed to read Timezone config file={{.Filename}}, err={{.Error}}"
+ "translation": "Impossible de lire le ficher de configuration du fuseau horaire={{.Filename}}, err={{.Error}}"
},
{
"id": "app.user_access_token.disabled",
@@ -4120,11 +4120,11 @@
},
{
"id": "ent.compliance.run_limit.warning",
- "translation": "Compliance export warning for job '{{.JobName}}' too many rows returned truncating to 30,000 at '{{.FilePath}}'"
+ "translation": "Avertissement de conformité d'exportation pour le job '{{.JobName}}' : trop de lignes retournées, tronqué à 30 000 pour '{{.FilePath}}'"
},
{
"id": "ent.compliance.run_started.info",
- "translation": "L'export de compatibilité a démarré pour le job '{{.JobName}}' à '{{.FilePath}}'"
+ "translation": "La conformité d'exportation a démarré pour le job '{{.JobName}}' à '{{.FilePath}}'"
},
{
"id": "ent.data_retention.generic.license.error",
@@ -4380,15 +4380,15 @@
},
{
"id": "ent.migration.migratetosaml.email_already_used_by_other_user",
- "translation": "Email already used by another SAML user."
+ "translation": "L'adresse e-mail est déja utilisée par un autre utilisateur SAML."
},
{
"id": "ent.migration.migratetosaml.user_not_found_in_users_mapping_file",
- "translation": "User not found in the users file."
+ "translation": "Utilisateur introuvable dans le fichier utilisateurs."
},
{
"id": "ent.migration.migratetosaml.username_already_used_by_other_user",
- "translation": "Username already used by another Mattermost user."
+ "translation": "Nom d'utilisateur déjà utilisé par un autre utilisateur de Mattermost."
},
{
"id": "ent.saml.attribute.app_error",
@@ -4656,7 +4656,7 @@
},
{
"id": "model.channel_member.is_valid.mute_value.app_error",
- "translation": "Invalid muting value"
+ "translation": "Valeur de sourdine invalide"
},
{
"id": "model.channel_member.is_valid.notify_level.app_error",
@@ -4672,7 +4672,7 @@
},
{
"id": "model.channel_member.is_valid.unread_level.app_error",
- "translation": "Niveau pour marquer comme non-lu invalide"
+ "translation": "Niveau pour marquer comme non lu invalide"
},
{
"id": "model.channel_member.is_valid.user_id.app_error",
@@ -5100,11 +5100,11 @@
},
{
"id": "model.config.is_valid.message_export.export_type.app_error",
- "translation": "Message export job ExportFormat must be one of either 'actiance' or 'globalrelay'"
+ "translation": "Le paramètre ExportFormat de la tâche d'exportation de messages doit être « actiance » ou « globalrelay »"
},
{
"id": "model.config.is_valid.message_export.export_type.app_error",
- "translation": "Message export job ExportFormat must be one of either 'actiance' or 'globalrelay'"
+ "translation": "Le paramètre ExportFormat de la tâche d'exportation de messages doit être « actiance » ou « globalrelay »"
},
{
"id": "model.config.is_valid.message_export.file_location.app_error",
@@ -5116,27 +5116,27 @@
},
{
"id": "model.config.is_valid.message_export.global_relay.config_missing.app_error",
- "translation": "Message export job ExportFormat is set to 'globalrelay', but GlobalRelaySettings are missing"
+ "translation": "Le paramètre ExportFormat de la tâche d'exportation de messages est définie sur « globalrelay », mais le paramètre GlobalRelaySettings est manquant"
},
{
"id": "model.config.is_valid.message_export.global_relay.customer_type.app_error",
- "translation": "Message export GlobalRelaySettings.CustomerType must be set to one of either 'A9' or 'A10'"
+ "translation": "Le paramètre GlobalRelaySettings.CustomerType de la tâche d'exportation de messages doit être « A9 » ou « A10 »"
},
{
"id": "model.config.is_valid.message_export.global_relay.email_address.app_error",
- "translation": "Message export job GlobalRelaySettings.EmailAddress must be set to a valid email address"
+ "translation": "Le paramètre GlobalRelaySettings.EmailAddress de la tâche d'exportation de messages doit être une adresse e-mail valide"
},
{
"id": "model.config.is_valid.message_export.global_relay.smtp_password.app_error",
- "translation": "Message export job GlobalRelaySettings.SmtpPassword must be set"
+ "translation": "Le paramètre GlobalRelaySettings.SmtpPassword de la tâche d'exportation de messages doit être défini"
},
{
"id": "model.config.is_valid.message_export.global_relay.smtp_username.app_error",
- "translation": "Message export job GlobalRelaySettings.SmtpUsername must be set"
+ "translation": "Le paramètre GlobalRelaySettings.SmtpUsername de la tâche d'exportation de messages doit être défini"
},
{
"id": "model.config.is_valid.message_export.global_relay_email_address.app_error",
- "translation": "Message export job GlobalRelayEmailAddress must be set to a valid email address"
+ "translation": "Le paramètre GlobalRelayEmailAddress de la tâche d'exportation de messages doit être une adresse e-mail valide"
},
{
"id": "model.config.is_valid.password_length.app_error",
@@ -5268,7 +5268,7 @@
},
{
"id": "model.config.is_valid.websocket_url.app_error",
- "translation": "URL de site invalide. Il doit s'agir d'une URL valide et commencer par http:// ou https://."
+ "translation": "L'URL websocket doit être une URL valide et commencer par ws:// ou wss://."
},
{
"id": "model.config.is_valid.write_timeout.app_error",
@@ -6124,11 +6124,11 @@
},
{
"id": "store.sql_channel.update.exists.app_error",
- "translation": "Un canal avec ce pseudonyme existe déjà"
+ "translation": "Un canal avec cet identifiant existe déjà"
},
{
"id": "store.sql_channel.update.previously.app_error",
- "translation": "Un canal avec ce pseudonyme a déjà été créé"
+ "translation": "Un canal avec cet identifiant a déjà été créé"
},
{
"id": "store.sql_channel.update.updating.app_error",
@@ -6544,15 +6544,15 @@
},
{
"id": "store.sql_post.query_max_post_size.error",
- "translation": "We couldn't determine the maximum supported post size"
+ "translation": "Impossible de déterminer la taille maximale supportée pour les publications"
},
{
"id": "store.sql_post.query_max_post_size.max_post_size_bytes",
- "translation": "Post.Message supports at most %d characters (%d bytes)"
+ "translation": "Post.Message supporte au maximum %d caractères (%d octets)"
},
{
"id": "store.sql_post.query_max_post_size.unrecognized_driver",
- "translation": "No implementation found to determine the maximum supported post size"
+ "translation": "Aucune implémentation trouvée pour déterminer la taille maximale supportée pour les publications"
},
{
"id": "store.sql_post.save.app_error",
@@ -6680,31 +6680,31 @@
},
{
"id": "store.sql_role.get.app_error",
- "translation": "Impossible de récupérer le message"
+ "translation": "Impossible de récupérer le rôle"
},
{
"id": "store.sql_role.get_by_name.app_error",
- "translation": "Impossible de récupérer le message"
+ "translation": "Impossible de récupérer le rôle"
},
{
"id": "store.sql_role.get_by_names.app_error",
- "translation": "Impossible de récupérer le message"
+ "translation": "Impossible de récupérer les rôles"
},
{
"id": "store.sql_role.permanent_delete_all.app_error",
- "translation": "We could not permanently delete all the roles"
+ "translation": "Impossible de supprimer définitivement tous les rôles"
},
{
"id": "store.sql_role.save.insert.app_error",
- "translation": "Unable to save new role"
+ "translation": "Impossible de sauvegarder le nouveau rôle"
},
{
"id": "store.sql_role.save.invalid_role.app_error",
- "translation": "The role was not valid"
+ "translation": "Le rôle est invalide"
},
{
"id": "store.sql_role.save.update.app_error",
- "translation": "Impossible de récupérer le message"
+ "translation": "Impossible de modifier le rôle"
},
{
"id": "store.sql_session.analytics_session_count.app_error",
@@ -6812,7 +6812,7 @@
},
{
"id": "store.sql_system.permanent_delete_by_name.app_error",
- "translation": "We could not permanently delete the system table entry"
+ "translation": "Impossible de supprimer définitivement l'entrée de la table système"
},
{
"id": "store.sql_system.save.app_error",
@@ -7288,11 +7288,11 @@
},
{
"id": "utils.file.list_directory.local.app_error",
- "translation": "Une erreur s'est produite lors de l'affichage du répertoire du système de fichier local du serveur."
+ "translation": "Une erreur s'est produite lors de l'affichage du dossier à partir du système de stockage local du serveur."
},
{
"id": "utils.file.list_directory.s3.app_error",
- "translation": "Une erreur s'est produite lors de l'affichage du répertoire S3."
+ "translation": "Une erreur s'est produite lors de l'affichage du dossier à partir de S3."
},
{
"id": "utils.file.remove_directory.configured.app_error",
@@ -7300,11 +7300,11 @@
},
{
"id": "utils.file.remove_directory.local.app_error",
- "translation": "Une erreur s'est produite lors de la suppression du répertoire du stockage local du serveur."
+ "translation": "Une erreur s'est produite lors de la suppression du dossier à partir du système de stockage local du serveur."
},
{
"id": "utils.file.remove_directory.s3.app_error",
- "translation": "Une erreur s'est produite lors de la suppression du répertoire de S3."
+ "translation": "Une erreur s'est produite lors de la suppression du dossier à partir de S3."
},
{
"id": "utils.file.remove_file.configured.app_error",
@@ -7376,7 +7376,7 @@
},
{
"id": "utils.mail.sendMail.attachments.write_error",
- "translation": "Failed to write attachment to email"
+ "translation": "Impossible d'attacher le fichier joint à l'e-mail"
},
{
"id": "utils.mail.send_mail.close.app_error",
@@ -7384,7 +7384,7 @@
},
{
"id": "utils.mail.send_mail.from_address.app_error",
- "translation": "Error setting \"From Address\""
+ "translation": "Impossible de définir l'adresse source"
},
{
"id": "utils.mail.send_mail.msg.app_error",
@@ -7400,7 +7400,7 @@
},
{
"id": "utils.mail.send_mail.to_address.app_error",
- "translation": "Error setting \"To Address\""
+ "translation": "Impossible de définir l'adresse de destination"
},
{
"id": "utils.mail.test.configured.error",
diff --git a/i18n/it.json b/i18n/it.json
index 422fe5c32..a96329287 100644
--- a/i18n/it.json
+++ b/i18n/it.json
@@ -2436,7 +2436,7 @@
},
{
"id": "api.team.remove_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "Si è verificato un errore recuperando il gruppo"
},
{
"id": "api.team.remove_user_from_team.missing.app_error",
@@ -2496,7 +2496,7 @@
},
{
"id": "api.team.team_icon.update.app_error",
- "translation": "An error occurred updating the team icon"
+ "translation": "Si è verificato un errore aggiornando l'icona del gruppo"
},
{
"id": "api.team.update_member_roles.not_a_member",
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "Impossibile attivare il plugin estratto. Il plugin può essere già disponibile e dev'essere attivato."
+ "translation": "Impossibile attivate il plugin estratto."
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "Impossibile trovare i plugin attivi"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "L'ID del plugin deve contenere meno di {{.Max}} caratteri."
- },
- {
"id": "app.plugin.install.app_error",
"translation": "Impossibile installare il plugin."
},
@@ -3859,6 +3855,10 @@
"translation": "Impossibile installare il plugin. Un plugin con lo stesso ID è già installato."
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "L'id del plugin deve essere lungo almeno {{.Min}} caratteri, al massimo {{.Max}} caratteri e corrispondere a {{.Regex}}."
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "Impossibile trovare il manifest del plugin estratto"
},
diff --git a/i18n/ja.json b/i18n/ja.json
index f3db111ae..2458d7c09 100644
--- a/i18n/ja.json
+++ b/i18n/ja.json
@@ -517,7 +517,7 @@
},
{
"id": "api.command_away.name",
- "translation": "離席"
+ "translation": "離席中"
},
{
"id": "api.command_away.success",
@@ -2436,7 +2436,7 @@
},
{
"id": "api.team.remove_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "チームの取得中にエラーが発生しました"
},
{
"id": "api.team.remove_user_from_team.missing.app_error",
@@ -2496,7 +2496,7 @@
},
{
"id": "api.team.team_icon.update.app_error",
- "translation": "An error occurred updating the team icon"
+ "translation": "チームアイコンの取得中にエラーが発生しました"
},
{
"id": "api.team.update_member_roles.not_a_member",
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "抽出されたプラグインを有効化できませんでした。プラグインが既に存在し、有効化されている可能性があります。"
+ "translation": "抽出されたプラグインを有効化できませんでした。"
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "有効なプラグインを取得できませんでした"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "プラグインIDは{{.Max}}文字未満でなくてはなりません。"
- },
- {
"id": "app.plugin.install.app_error",
"translation": "プラグインをインストールできません。"
},
@@ -3859,6 +3855,10 @@
"translation": "プラグインをインストールできません。同じIDを持つプラグインがすでにインストールされています。"
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "プラグインIDは {{.Min}} 文字以上 {{.Max}} 文字以下で、{{.Regex}}にマッチしなければなりません。"
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "抽出されたプラグインのマニフェストが見付かりませんでした"
},
diff --git a/i18n/ko.json b/i18n/ko.json
index f8dae9567..cd5e8b9dd 100644
--- a/i18n/ko.json
+++ b/i18n/ko.json
@@ -217,11 +217,11 @@
},
{
"id": "api.channel.convert_channel_to_private.default_channel_error",
- "translation": "This default channel cannot be converted into a private channel."
+ "translation": "이 기본 채널은 전용 채널로 변환할 수 없습니다."
},
{
"id": "api.channel.convert_channel_to_private.private_channel_error",
- "translation": "The channel requested to convert is already a private channel."
+ "translation": "변환하기 위해 요청 된 채널은 이미 개인 채널입니다."
},
{
"id": "api.channel.create_channel.direct_channel.app_error",
@@ -557,7 +557,7 @@
},
{
"id": "api.command_channel_purpose.channel.app_error",
- "translation": "현재 채널을 찾는 중 오류가 발생하였습니다."
+ "translation": "채널 조회 중 오류가 발생하였습니다."
},
{
"id": "api.command_channel_purpose.desc",
@@ -569,11 +569,11 @@
},
{
"id": "api.command_channel_purpose.hint",
- "translation": "[text]"
+ "translation": "[문자]"
},
{
"id": "api.command_channel_purpose.message.app_error",
- "translation": "메시지는 /echo 명령어와 함께 제공되어야 합니다."
+ "translation": "/purpose 명령어를 사용해서 메세지를 작성하세요."
},
{
"id": "api.command_channel_purpose.name",
@@ -601,7 +601,7 @@
},
{
"id": "api.command_channel_rename.hint",
- "translation": "[text]"
+ "translation": "[문자]"
},
{
"id": "api.command_channel_rename.message.app_error",
@@ -637,7 +637,7 @@
},
{
"id": "api.command_code.hint",
- "translation": "[text]"
+ "translation": "[문자]"
},
{
"id": "api.command_code.message.app_error",
@@ -733,11 +733,11 @@
},
{
"id": "api.command_groupmsg.group_fail.app_error",
- "translation": "메시지 암호화 중 오류가 발생하였습니다."
+ "translation": "그룹 메시지 생성 중 오류가 발생하였습니다."
},
{
"id": "api.command_groupmsg.hint",
- "translation": "@[username1],@[username2] 'message'"
+ "translation": "@[username1],@[username2] '메시지'"
},
{
"id": "api.command_groupmsg.invalid_user.app_error",
@@ -752,7 +752,7 @@
},
{
"id": "api.command_groupmsg.list.app_error",
- "translation": "사용자 제거 중 오류가 발생하였습니다."
+ "translation": "사용자 조회 중 오류가 발생하였습니다."
},
{
"id": "api.command_groupmsg.max_users.app_error",
@@ -764,7 +764,7 @@
},
{
"id": "api.command_groupmsg.missing.app_error",
- "translation": "사용자를 찾을 수 없습니다"
+ "translation": "해당 사용자를 찾을 수 없습니다."
},
{
"id": "api.command_groupmsg.name",
@@ -772,7 +772,7 @@
},
{
"id": "api.command_groupmsg.success",
- "translation": "메세지를 보낸 유저."
+ "translation": "메세지를 보낸 사용자 목록"
},
{
"id": "api.command_help.desc",
@@ -784,51 +784,51 @@
},
{
"id": "api.command_invite.channel.app_error",
- "translation": "현재 채널을 찾는 중 오류가 발생하였습니다."
+ "translation": "현재 채널 조회 중 오류가 발생하였습니다."
},
{
"id": "api.command_invite.channel.error",
- "translation": "Could not find the channel {{.Channel}}. Please use the [channel handle](https://about.mattermost.com/default-channel-handle-documentation) to identify channels."
+ "translation": "{{.Channel}} 채널을 찾을 수 없습니다. 채널을 식별하려면 [채널 핸들] (https://about.mattermost.com/default-channel-handle-documentation) 을 사용하세요."
},
{
"id": "api.command_invite.desc",
- "translation": "Invite a user to a channel"
+ "translation": "사용자를 채널에 초대 합니다."
},
{
"id": "api.command_invite.directchannel.app_error",
- "translation": "개인 메시지 채널에서 다른 사용자를 제거할 수 없습니다."
+ "translation": "Direct Message 채널에서 사용자를 추가할 수 없습니다."
},
{
"id": "api.command_invite.fail.app_error",
- "translation": "채널에 참가하는 중 오류가 발생했습니다."
+ "translation": "채널에 가입 중 오류가 발생했습니다."
},
{
"id": "api.command_invite.hint",
- "translation": "@[username] ~[channel]"
+ "translation": "@[사용자 이름] ~[채널]"
},
{
"id": "api.command_invite.missing_message.app_error",
- "translation": "Missing Username and Channel."
+ "translation": "사용자 이름 및 채널이 없습니다."
},
{
"id": "api.command_invite.missing_user.app_error",
- "translation": "사용자를 찾을 수 없습니다"
+ "translation": "해당 사용자를 찾을 수 없습니다"
},
{
"id": "api.command_invite.name",
- "translation": "invite"
+ "translation": "초대"
},
{
"id": "api.command_invite.permission.app_error",
- "translation": "You don't have enough permissions to add {{.User}} in {{.Channel}}."
+ "translation": "{{.Channel}} 에 {{.User}}를 추가할 권한이 없습니다."
},
{
"id": "api.command_invite.success",
- "translation": "{{.User}} added to {{.Channel}} channel."
+ "translation": "{{.Channel}} 채널에 {{.User}} 가 추가되었습니다."
},
{
"id": "api.command_invite.user_already_in_channel.app_error",
- "translation": "{{.User}} is already in the channel."
+ "translation": "채널에 이미 {{.User}} 가 있습니다."
},
{
"id": "api.command_join.desc",
@@ -840,7 +840,7 @@
},
{
"id": "api.command_join.hint",
- "translation": "~[channel]"
+ "translation": "~[채널]"
},
{
"id": "api.command_join.list.app_error",
@@ -868,15 +868,15 @@
},
{
"id": "api.command_leave.fail.app_error",
- "translation": "채널에 참가하는 중 오류가 발생했습니다."
+ "translation": "채널에서 나가는 중 오류가 발생했습니다."
},
{
"id": "api.command_leave.list.app_error",
- "translation": "채널 목록을 나열하는 중 오류가 발생하였습니다."
+ "translation": "채널 목록을 조회하는 중 오류가 발생하였습니다."
},
{
"id": "api.command_leave.missing.app_error",
- "translation": "채널을 찾을 수 없습니다"
+ "translation": "해당 채널을 찾을 수 없습니다"
},
{
"id": "api.command_leave.name",
@@ -944,15 +944,15 @@
},
{
"id": "api.command_mute.desc",
- "translation": "Turns off desktop, email and push notifications for the current channel or the [channel] specified."
+ "translation": "지정된 현재 채널 또는[채널]에 대해 데스크 톱, 이메일 및 푸시 알림 기능을 해제합니다."
},
{
"id": "api.command_mute.error",
- "translation": "Could not find the channel {{.Channel}}. Please use the [channel handle](https://about.mattermost.com/default-channel-handle-documentation) to identify channels."
+ "translation": "채널{{.Channel}} 을(를) 찾을 수 없습니다. 채널을 식별하려면[채널 핸들](https://about.mattermost.com/default-channel-handle-documentation) 을 사용하십시오."
},
{
"id": "api.command_mute.hint",
- "translation": "~[channel]"
+ "translation": "~[채널]"
},
{
"id": "api.command_mute.name",
@@ -960,27 +960,27 @@
},
{
"id": "api.command_mute.no_channel.error",
- "translation": "Could not find the specified channel. Please use the [channel handle](https://about.mattermost.com/default-channel-handle-documentation) to identify channels."
+ "translation": "지정한 채널을 찾을 수 없습니다. 채널을 식별하려면[채널 핸들](https://about.mattermost.com/default-channel-handle-documentation)을 사용하십시오."
},
{
"id": "api.command_mute.not_member.error",
- "translation": "Could not mute channel {{.Channel}} as you are not a member."
+ "translation": "사용자가 멤버가 아니기 때문에 채널 {{.Channel}}의 음을 소거할 수 없습니다."
},
{
"id": "api.command_mute.success_mute",
- "translation": "You will not receive notifications for {{.Channel}} until channel mute is turned off."
+ "translation": "채널 음소거가 해제될 때까지{{.Channel}}에 대한 알림을 받지 못 합니다."
},
{
"id": "api.command_mute.success_mute_direct_msg",
- "translation": "You will not receive notifications for this channel until channel mute is turned off."
+ "translation": "채널 음소거를 끄지 않으면 이 채널에 대한 알림을 받지 못 합니다."
},
{
"id": "api.command_mute.success_unmute",
- "translation": "{{.Channel}} is no longer muted."
+ "translation": "{{.Channel}} 이 더 이상 음소거가 상태가 아닙니다."
},
{
"id": "api.command_mute.success_unmute_direct_msg",
- "translation": "This channel is no longer muted."
+ "translation": "이 채널은 더 이상 음소거 상태가 아닙니다."
},
{
"id": "api.command_offline.desc",
@@ -1024,11 +1024,11 @@
},
{
"id": "api.command_remove.message.app_error",
- "translation": "메시지는 /echo 명령어와 함께 제공되어야 합니다."
+ "translation": "/remove 혹은 /kick 명령어를 사용해서 메시지를 작성하세요."
},
{
"id": "api.command_remove.missing.app_error",
- "translation": "사용자를 찾을 수 없습니다"
+ "translation": "해당 사용자를 찾을 수 없습니다"
},
{
"id": "api.command_remove.name",
@@ -1036,7 +1036,7 @@
},
{
"id": "api.command_remove.permission.app_error",
- "translation": "당신은 채널 머릿말을 수정할 권한을 가지고 있지 않습니다."
+ "translation": "멤버 삭제를 위한 적합한 권한을 가지고 있지 않습니다."
},
{
"id": "api.command_remove.user_not_in_channel",
@@ -1048,7 +1048,7 @@
},
{
"id": "api.command_search.hint",
- "translation": "[text]"
+ "translation": "[문자]"
},
{
"id": "api.command_search.name",
@@ -1080,7 +1080,7 @@
},
{
"id": "api.command_shortcuts.unsupported.app_error",
- "translation": "당신의 기기에서는 검색 명령을 지원하지 않습니다"
+ "translation": "해당 기기에서 단축키를 지원하지 않습니다."
},
{
"id": "api.command_shrug.desc",
@@ -1096,7 +1096,7 @@
},
{
"id": "api.compliance.init.debug",
- "translation": "명령어 API 경로 초기화 중"
+ "translation": "API 경로 초기화 중"
},
{
"id": "api.config.client.old_format.app_error",
@@ -1176,7 +1176,7 @@
},
{
"id": "api.deprecated.init.debug",
- "translation": "명령어 API 경로 초기화 중"
+ "translation": "삭제 API 경로 초기화 중"
},
{
"id": "api.email_batching.add_notification_email_to_batch.channel_full.app_error",
@@ -1200,7 +1200,7 @@
},
{
"id": "api.email_batching.render_batched_post.direct_message",
- "translation": "Direct Message from "
+ "translation": "로부터 직접 메시지"
},
{
"id": "api.email_batching.render_batched_post.go_to_post",
@@ -1208,11 +1208,11 @@
},
{
"id": "api.email_batching.render_batched_post.group_message",
- "translation": "Group Message from "
+ "translation": "로부터 그룹 메세지"
},
{
"id": "api.email_batching.render_batched_post.notification",
- "translation": "Notification from "
+ "translation": "로부터 공지"
},
{
"id": "api.email_batching.render_batched_post.sender.app_error",
@@ -1330,7 +1330,7 @@
},
{
"id": "api.file.get_file_preview.no_preview.app_error",
- "translation": "파일 미리보기 이미지가 없습니다."
+ "translation": "해당 파일은 미리보기 기능이 없습니다."
},
{
"id": "api.file.get_file_thumbnail.no_thumbnail.app_error",
@@ -1342,7 +1342,7 @@
},
{
"id": "api.file.get_info_for_request.storage.app_error",
- "translation": "파일의 정보를 가져올 수 없습니다. 이미지 저장소가 설정되지 않았습니다."
+ "translation": "파일 정보를 가져올 수 없습니다. 이미지 저장소를 설정하세요."
},
{
"id": "api.file.get_public_file_old.storage.app_error",
@@ -1538,15 +1538,15 @@
},
{
"id": "api.incoming_webhook.disabled.app_error",
- "translation": "Incoming webhook은 관리자가 사용할 수 없게 설정했습니다."
+ "translation": "시스템 관리자 권한으로 Incoming webhooks를 설정해야 합니다."
},
{
"id": "api.incoming_webhook.invalid_username.app_error",
- "translation": "잘못된 유저이름입니다."
+ "translation": "유효하지 않은 사용자 이름"
},
{
"id": "api.ldap.init.debug",
- "translation": "파일 API 경로 초기화 중"
+ "translation": "LDAP API 경로 초기화 중"
},
{
"id": "api.license.add_license.array.app_error",
@@ -1586,7 +1586,7 @@
},
{
"id": "api.license.client.old_format.app_error",
- "translation": "사용자 설정을 위한 새로운 형식은 아직 지원되지 않습니다. 명령문에서 format=old 를 명시해 주세요."
+ "translation": "클라이언트 라이선스를 위한 새로운 형식은 아직 지원하지 않습니다. 명령문에서 format=old 를 명시해 주세요."
},
{
"id": "api.license.init.debug",
@@ -1630,7 +1630,7 @@
},
{
"id": "api.oauth.delete.permissions.app_error",
- "translation": "OAuth2 앱을 삭제하기에 적절하지 않은 권한"
+ "translation": "OAuth2 App 삭제를 위한 부적합한 권한"
},
{
"id": "api.oauth.get_access_token.bad_client_id.app_error",
@@ -1694,7 +1694,7 @@
},
{
"id": "api.oauth.init.debug",
- "translation": "oauth API 경로 초기화 중"
+ "translation": "OAuth API 경로 초기화 중"
},
{
"id": "api.oauth.invalid_state_token.app_error",
@@ -1738,23 +1738,23 @@
},
{
"id": "api.plugin.upload.array.app_error",
- "translation": "File array is empty in multipart/form request"
+ "translation": "파일의 배열이 in multipart/from request 비어있습니다."
},
{
"id": "api.plugin.upload.file.app_error",
- "translation": "Unable to open file in multipart/form request"
+ "translation": "파일을 in multipart/from request 열 수 없습니다."
},
{
"id": "api.plugin.upload.no_file.app_error",
- "translation": "Missing file in multipart/form request"
+ "translation": "in multipart/form request 파일이 누락되었습니다."
},
{
"id": "api.post.check_for_out_of_channel_mentions.message.multiple",
- "translation": "{{.Usernames}}, {{.LastUsername}} 이 멘션되었으나, 그들은 이 채널에 속하지 않기 때문에 알림을 받지 못했습니다."
+ "translation": "@{{.Usernames}} 와 @{{.LastUsername}} 에게 메시지는 전달했디만, 이 채널에 속하지 않기 때문에 알림을 받지 못했습니다."
},
{
"id": "api.post.check_for_out_of_channel_mentions.message.one",
- "translation": "{{.Username}}이 멘션되었으나, 그는 이 채널에 속하지 않기 때문에 알림을 받지 못했습니다."
+ "translation": "@{{.Username}} 에게 메시지는 전달했지만, 이 채널에 속하지 않기 때문에 알림을 받지 못했습니다."
},
{
"id": "api.post.create_post.attach_files.error",
@@ -1818,7 +1818,7 @@
},
{
"id": "api.post.do_action.action_id.app_error",
- "translation": "잘못된 클라이언트 ID"
+ "translation": "유효하지 않은 액션 ID"
},
{
"id": "api.post.do_action.action_integration.app_error",
@@ -1868,7 +1868,7 @@
},
{
"id": "api.post.link_preview_disabled.app_error",
- "translation": "시스템 관리자가 개인 링크들 저장을 할 수 없도록 했습니다."
+ "translation": "시스템 관리자 권한으로 Link previews를 활성화시키세요."
},
{
"id": "api.post.make_direct_channel_visible.get_2_members.error",
@@ -1896,7 +1896,7 @@
},
{
"id": "api.post.send_notifications_and_forget.clear_push_notification.debug",
- "translation": "Clearing push notification to %v with channel_id %v"
+ "translation": "채널 ID %v 에 있는 %v 에게 전달한 푸쉬 메시지 삭제 중"
},
{
"id": "api.post.send_notifications_and_forget.files.error",
@@ -1904,7 +1904,7 @@
},
{
"id": "api.post.send_notifications_and_forget.get_teams.error",
- "translation": "Failed to get teams when sending cross-team DM user_id=%v, err=%v"
+ "translation": "타 팀 사용자 (user_id=%v) 에게 DM 발송 중 팀 정보 조회 실패, err=%v"
},
{
"id": "api.post.send_notifications_and_forget.mention_subject",
@@ -1912,15 +1912,15 @@
},
{
"id": "api.post.send_notifications_and_forget.push_image_only",
- "translation": " uploaded one or more files in "
+ "translation": "하나 이상의 파일이 업로드 되었습니다."
},
{
"id": "api.post.send_notifications_and_forget.push_image_only_dm",
- "translation": " uploaded one or more files in a direct message"
+ "translation": " 다이렉트 메시지에 하나 이상의 파일 업로드"
},
{
"id": "api.post.send_notifications_and_forget.push_image_only_no_channel",
- "translation": " uploaded one or more files"
+ "translation": "하나 이상의 파일 업로드"
},
{
"id": "api.post.send_notifications_and_forget.push_in",
@@ -1928,11 +1928,11 @@
},
{
"id": "api.post.send_notifications_and_forget.push_mention",
- "translation": " mentioned you in "
+ "translation": "~에서 메시지 전송~"
},
{
"id": "api.post.send_notifications_and_forget.push_mention_no_channel",
- "translation": " mentioned you in "
+ "translation": "~에서 메시지 전송"
},
{
"id": "api.post.send_notifications_and_forget.push_message",
@@ -1940,15 +1940,15 @@
},
{
"id": "api.post.send_notifications_and_forget.push_non_mention",
- "translation": " posted in "
+ "translation": "~에서 게시"
},
{
"id": "api.post.send_notifications_and_forget.push_non_mention_no_channel",
- "translation": " posted a message"
+ "translation": "메세지 게시"
},
{
"id": "api.post.send_notifications_and_forget.push_notification.error",
- "translation": "Failed to send push device_id={{.DeviceId}}, err={{.Error}}"
+ "translation": "device_id={{.DeviceId}} 에 푸쉬 전달 실패, err={{.Error}}"
},
{
"id": "api.post.send_notifications_and_forget.sent",
@@ -1956,7 +1956,7 @@
},
{
"id": "api.post.update_mention_count_and_forget.update_error",
- "translation": "Failed to update mention count, post_id=%v channel_id=%v err=%v"
+ "translation": "멘션 수 변경 실패, post_id=%v channel_id=%v err=%v"
},
{
"id": "api.post.update_post.find.app_error",
@@ -1968,7 +1968,7 @@
},
{
"id": "api.post.update_post.permissions_denied.app_error",
- "translation": "새로운 팀을 생성할 수 없습니다. 시스템 관리자에게 문의해보세요."
+ "translation": "게시 수정이 불가합니다. 시스템 관리자에게 문의하세요."
},
{
"id": "api.post.update_post.permissions_details.app_error",
@@ -1976,7 +1976,7 @@
},
{
"id": "api.post.update_post.permissions_time_limit.app_error",
- "translation": "Post edit is only allowed for {{.timeLimit}} seconds. Please ask your systems administrator for details."
+ "translation": "게시 수정은 {{.timeLimit}} 초 동안만 가능합니다. 상세한 내용은 시스템 관리자에게 문의하세요."
},
{
"id": "api.post.update_post.system_message.app_error",
@@ -2008,35 +2008,35 @@
},
{
"id": "api.reaction.delete_reaction.mismatched_channel_id.app_error",
- "translation": "Failed to delete reaction because channel ID does not match post ID in the URL"
+ "translation": "URL에 있는 채널 ID 가 게시글 ID 와 맞지 않기 때문에 리액션 삭제 실패"
},
{
"id": "api.reaction.init.debug",
- "translation": "관리자 API 경로 초기화 중"
+ "translation": "리액션 API 경로 초기화 중"
},
{
"id": "api.reaction.list_reactions.mismatched_channel_id.app_error",
- "translation": "Failed to get reactions because channel ID does not match post ID in the URL"
+ "translation": "URL 에서 채널 ID와 게시글 ID가 맞지 않아서 리액션 조회 실패"
},
{
"id": "api.reaction.save_reaction.invalid.app_error",
- "translation": "Reaction is not valid."
+ "translation": "리액션이 유효하지 않습니다."
},
{
"id": "api.reaction.save_reaction.mismatched_channel_id.app_error",
- "translation": "Failed to save reaction because channel ID does not match post ID in the URL"
+ "translation": "URL 에서 채널 ID와 게시글 ID가 맞지 않아서 리액션 저장 실패"
},
{
"id": "api.reaction.save_reaction.user_id.app_error",
- "translation": "You cannot save reaction for the other user."
+ "translation": "타 사용자에 대한 리액션 저장을 할 수 없습니다."
},
{
"id": "api.reaction.send_reaction_event.post.app_error",
- "translation": "Failed to get post when sending websocket event for reaction"
+ "translation": "리액션에 대한 웹소켓 이벤트 발송 중 게시글 조회 실패"
},
{
"id": "api.roles.patch_roles.license.error",
- "translation": "Your current license does not support advanced permissions."
+ "translation": "지금 라이선스는 고급 퍼미션을 지원하지 않습니다."
},
{
"id": "api.saml.save_certificate.app_error",
@@ -2048,11 +2048,11 @@
},
{
"id": "api.server.start_server.forward80to443.disabled_while_using_lets_encrypt",
- "translation": "Must enable Forward80To443 when using LetsEncrypt"
+ "translation": "LetsEncrypt를 사용하는 경우 Forward80To443 기능 활성화 필요"
},
{
"id": "api.server.start_server.forward80to443.enabled_but_listening_on_wrong_port",
- "translation": "Cannot forward port 80 to port 443 while listening on port %s: disable Forward80To443 if using a proxy server"
+ "translation": "%s 포트에서 수신하는 중, 포트 80에서 포트 443으로 전환하지 못했습니다. 프록시 서버 사용 중인 경우 Forward80To443 옵션을 비활성화 해 주세요."
},
{
"id": "api.server.start_server.listening.info",
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "Unable to activate extracted plugin. Plugin may already exist and be activated."
+ "translation": "Unable to activate extracted plugin."
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "Unable to get active plugins"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "Plugin Id must be less than {{.Max}} characters."
- },
- {
"id": "app.plugin.install.app_error",
"translation": "Unable to install plugin."
},
@@ -3859,6 +3855,10 @@
"translation": "Unable to install plugin. A plugin with the same ID is already installed."
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "Plugin Id must be at least {{.Min}} characters, at most {{.Max}} characters and match {{.Regex}}."
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "Unable to find manifest for extracted plugin"
},
diff --git a/i18n/nl.json b/i18n/nl.json
index 93c2d7485..1294dae85 100644
--- a/i18n/nl.json
+++ b/i18n/nl.json
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "Unable to activate extracted plugin. Plugin may already exist and be activated."
+ "translation": "Unable to activate extracted plugin."
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "Unable to get active plugins"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "Plugin Id must be less than {{.Max}} characters."
- },
- {
"id": "app.plugin.install.app_error",
"translation": "Unable to install plugin."
},
@@ -3859,6 +3855,10 @@
"translation": "Unable to install plugin. A plugin with the same ID is already installed."
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "Plugin Id must be at least {{.Min}} characters, at most {{.Max}} characters and match {{.Regex}}."
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "Unable to find manifest for extracted plugin"
},
diff --git a/i18n/pl.json b/i18n/pl.json
index 808ba034c..3f03eabb6 100644
--- a/i18n/pl.json
+++ b/i18n/pl.json
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "Unable to activate extracted plugin. Plugin may already exist and be activated."
+ "translation": "Unable to activate extracted plugin."
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "Nie udało się skasować reakcji"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "Plugin Id must be less than {{.Max}} characters."
- },
- {
"id": "app.plugin.install.app_error",
"translation": "Unable to install plugin."
},
@@ -3859,6 +3855,10 @@
"translation": "Unable to install plugin. A plugin with the same ID is already installed."
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "Plugin Id must be at least {{.Min}} characters, at most {{.Max}} characters and match {{.Regex}}."
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "Unable to find manifest for extracted plugin"
},
diff --git a/i18n/pt-BR.json b/i18n/pt-BR.json
index 64b63b80f..290bea915 100644
--- a/i18n/pt-BR.json
+++ b/i18n/pt-BR.json
@@ -217,11 +217,11 @@
},
{
"id": "api.channel.convert_channel_to_private.default_channel_error",
- "translation": "This default channel cannot be converted into a private channel."
+ "translation": "O canal padrão não pode ser convertido em um canal privado."
},
{
"id": "api.channel.convert_channel_to_private.private_channel_error",
- "translation": "The channel requested to convert is already a private channel."
+ "translation": "O canal selecionado para conversão já é um canal privado."
},
{
"id": "api.channel.create_channel.direct_channel.app_error",
@@ -792,7 +792,7 @@
},
{
"id": "api.command_invite.desc",
- "translation": "Invite a user to a channel"
+ "translation": "Convide um usuário para o canal"
},
{
"id": "api.command_invite.directchannel.app_error",
@@ -808,7 +808,7 @@
},
{
"id": "api.command_invite.missing_message.app_error",
- "translation": "Missing Username and Channel."
+ "translation": "Faltando Nome do Usuário e Canal."
},
{
"id": "api.command_invite.missing_user.app_error",
@@ -2436,7 +2436,7 @@
},
{
"id": "api.team.remove_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "Ocorreu um erro ao obter a equipe"
},
{
"id": "api.team.remove_user_from_team.missing.app_error",
@@ -2496,7 +2496,7 @@
},
{
"id": "api.team.team_icon.update.app_error",
- "translation": "An error occurred updating the team icon"
+ "translation": "Ocorreu um erro ao atualizar o ícone da equipe"
},
{
"id": "api.team.update_member_roles.not_a_member",
@@ -2912,7 +2912,7 @@
},
{
"id": "api.user.get_profile_image.not_found.app_error",
- "translation": "Unable to get profile image, user not found."
+ "translation": "Não foi possível retornar a image de perfil, usuário não encontrado."
},
{
"id": "api.user.init.debug",
@@ -3308,7 +3308,7 @@
},
{
"id": "app.admin.test_email.failure",
- "translation": "Connection unsuccessful: {{.Error}}"
+ "translation": "Conexão sem sucesso: {{.Error}}"
},
{
"id": "app.channel.create_channel.no_team_id.app_error",
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "Não foi possível ativar o plugin extraído. O plugin já pode existir e estar ativado."
+ "translation": "Não foi possível ativar o plugin extraído."
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "Não é possível obter os plugins ativos"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "Id do plugin deve ter menos de {{.Max}} caracteres."
- },
- {
"id": "app.plugin.install.app_error",
"translation": "Não foi possível instalar o plugin."
},
@@ -3859,6 +3855,10 @@
"translation": "Não foi possível instalar o plugin. Um plugin como o mesmo ID já está instalado."
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "O Id do Plugin deve ter pelo menos {{.Min}} caracteres, e no máximo {{.Max}} caracteres e ser válido com {{.Regex}}."
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "Não foi possível encontrar o manifesto para o plugin extraído"
},
@@ -6692,7 +6692,7 @@
},
{
"id": "store.sql_role.permanent_delete_all.app_error",
- "translation": "We could not permanently delete all the roles"
+ "translation": "Não podemos apagar permanentemente todas as funções"
},
{
"id": "store.sql_role.save.insert.app_error",
@@ -6812,7 +6812,7 @@
},
{
"id": "store.sql_system.permanent_delete_by_name.app_error",
- "translation": "We could not permanently delete the system table entry"
+ "translation": "Não podemos apagar permanentemente as entradas da tabela do sistema"
},
{
"id": "store.sql_system.save.app_error",
@@ -7384,7 +7384,7 @@
},
{
"id": "utils.mail.send_mail.from_address.app_error",
- "translation": "Error setting \"From Address\""
+ "translation": "Erro em configurar \"From Address\""
},
{
"id": "utils.mail.send_mail.msg.app_error",
@@ -7400,7 +7400,7 @@
},
{
"id": "utils.mail.send_mail.to_address.app_error",
- "translation": "Error setting \"To Address\""
+ "translation": "Erro em configurar \"To Address\""
},
{
"id": "utils.mail.test.configured.error",
diff --git a/i18n/ru.json b/i18n/ru.json
index b75ca719a..445d4a9f9 100644
--- a/i18n/ru.json
+++ b/i18n/ru.json
@@ -217,11 +217,11 @@
},
{
"id": "api.channel.convert_channel_to_private.default_channel_error",
- "translation": "This default channel cannot be converted into a private channel."
+ "translation": "Канал по умолчанию не может быть преобразован в частный. "
},
{
"id": "api.channel.convert_channel_to_private.private_channel_error",
- "translation": "The channel requested to convert is already a private channel."
+ "translation": "Канал, запрошенный для преобразования, уже является частным каналом."
},
{
"id": "api.channel.create_channel.direct_channel.app_error",
@@ -257,7 +257,7 @@
},
{
"id": "api.channel.delete_channel.archived",
- "translation": "%v переместил канал в архив."
+ "translation": "%v архивация канала."
},
{
"id": "api.channel.delete_channel.cannot.app_error",
@@ -788,11 +788,11 @@
},
{
"id": "api.command_invite.channel.error",
- "translation": "Could not find the channel {{.Channel}}. Please use the [channel handle](https://about.mattermost.com/default-channel-handle-documentation) to identify channels."
+ "translation": "Не удалось найти канал {{.Channel}}. Для идентификации каналов используйте [название канала] (https://about.mattermost.com/default-channel-handle-documentation)."
},
{
"id": "api.command_invite.desc",
- "translation": "Invite a user to a channel"
+ "translation": "Пригласить пользователя в канал"
},
{
"id": "api.command_invite.directchannel.app_error",
@@ -800,35 +800,35 @@
},
{
"id": "api.command_invite.fail.app_error",
- "translation": "Во время присоединения к каналу произошла ошибка."
+ "translation": "При подключении к каналу произошла ошибка."
},
{
"id": "api.command_invite.hint",
- "translation": "@[username] ~[channel]"
+ "translation": "@[имя пользователя] ~[канал]"
},
{
"id": "api.command_invite.missing_message.app_error",
- "translation": "Missing Username and Channel."
+ "translation": "Отсутствует имя пользователя и канал."
},
{
"id": "api.command_invite.missing_user.app_error",
- "translation": "Не удалось найти пользователя"
+ "translation": "Мы не смогли найти пользователя."
},
{
"id": "api.command_invite.name",
- "translation": "invite"
+ "translation": "Пригласить"
},
{
"id": "api.command_invite.permission.app_error",
- "translation": "You don't have enough permissions to add {{.User}} in {{.Channel}}."
+ "translation": "У вас недостаточно прав для добавления {{.User}} в {{.Channel}}."
},
{
"id": "api.command_invite.success",
- "translation": "{{.User}} added to {{.Channel}} channel."
+ "translation": "{{.User}} добавлен в канал {{.Channel}}."
},
{
"id": "api.command_invite.user_already_in_channel.app_error",
- "translation": "{{.User}} is already in the channel."
+ "translation": "{{.User}} уже находится в канале."
},
{
"id": "api.command_join.desc",
@@ -840,7 +840,7 @@
},
{
"id": "api.command_join.hint",
- "translation": "~[channel]"
+ "translation": "канал"
},
{
"id": "api.command_join.list.app_error",
@@ -944,43 +944,43 @@
},
{
"id": "api.command_mute.desc",
- "translation": "Turns off desktop, email and push notifications for the current channel or the [channel] specified."
+ "translation": "Отключить уведомления на рабочем столе, электронной почте и push для текущего или указанного канала [канала]."
},
{
"id": "api.command_mute.error",
- "translation": "Could not find the channel {{.Channel}}. Please use the [channel handle](https://about.mattermost.com/default-channel-handle-documentation) to identify channels."
+ "translation": "Не удалось найти канал {{.Channel}}. Пожалуйста, используйте [дескриптор канала] (https://about.mattermost.com/default-channel-handle-documentation) для идентификации каналов."
},
{
"id": "api.command_mute.hint",
- "translation": "~[channel]"
+ "translation": "канал"
},
{
"id": "api.command_mute.name",
- "translation": "mute"
+ "translation": "выкл"
},
{
"id": "api.command_mute.no_channel.error",
- "translation": "Could not find the specified channel. Please use the [channel handle](https://about.mattermost.com/default-channel-handle-documentation) to identify channels."
+ "translation": "Не удалось найти указанный канал. Пожалуйста, используйте [дескриптор канала] (https://about.mattermost.com/default-channel-handle-documentation) для идентификации каналов."
},
{
"id": "api.command_mute.not_member.error",
- "translation": "Could not mute channel {{.Channel}} as you are not a member."
+ "translation": "Не удалось отключить канал {{.Channel}}, поскольку вы не являетесь его членом."
},
{
"id": "api.command_mute.success_mute",
- "translation": "You will not receive notifications for {{.Channel}} until channel mute is turned off."
+ "translation": "Вы не будете получать уведомления для {{.Channel}} до тех пор, пока отключен звук."
},
{
"id": "api.command_mute.success_mute_direct_msg",
- "translation": "You will not receive notifications for this channel until channel mute is turned off."
+ "translation": "Вы не будете получать уведомления для этого канала до тех пор, пока отключен звук."
},
{
"id": "api.command_mute.success_unmute",
- "translation": "{{.Channel}} is no longer muted."
+ "translation": "{{.Channel}} больше не отключен."
},
{
"id": "api.command_mute.success_unmute_direct_msg",
- "translation": "This channel is no longer muted."
+ "translation": "Этот канал больше не отключен."
},
{
"id": "api.command_offline.desc",
@@ -1478,7 +1478,7 @@
},
{
"id": "api.file.upload_file.incorrect_number_of_files.app_error",
- "translation": "Unable to upload files. Incorrect number of files specified."
+ "translation": "Не удалось загрузить файлы. Неверное количество указанных файлов."
},
{
"id": "api.file.upload_file.large_image.app_error",
@@ -1916,7 +1916,7 @@
},
{
"id": "api.post.send_notifications_and_forget.push_image_only_dm",
- "translation": " Загружены один или несколько файлов для сообщения"
+ "translation": " Загружены один или несколько файлов для текущего сообщения"
},
{
"id": "api.post.send_notifications_and_forget.push_image_only_no_channel",
@@ -2048,11 +2048,11 @@
},
{
"id": "api.server.start_server.forward80to443.disabled_while_using_lets_encrypt",
- "translation": "Must enable Forward80To443 when using LetsEncrypt"
+ "translation": "Необходимо перенаправлять 80 на 443 при использовании LetsEncrypt"
},
{
"id": "api.server.start_server.forward80to443.enabled_but_listening_on_wrong_port",
- "translation": "Cannot forward port 80 to port 443 while listening on port %s: disable Forward80To443 if using a proxy server"
+ "translation": "Не удается переправить порт 80 на порт 443 во время прослушивания порта %s: отключить переадресацию 80 до 443 при использовании прокси-сервера"
},
{
"id": "api.server.start_server.listening.info",
@@ -2100,7 +2100,7 @@
},
{
"id": "api.slackimport.slack_add_bot_user.unable_import",
- "translation": "Unable to import the Integration/Slack Bot user {{.Username}}.\r\n"
+ "translation": "Не удалось импортировать пользователя Integration / Slack Bot {{.Username}}.\r\n"
},
{
"id": "api.slackimport.slack_add_channels.added",
@@ -2436,7 +2436,7 @@
},
{
"id": "api.team.remove_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "Произошла ошибка при подключении команды"
},
{
"id": "api.team.remove_user_from_team.missing.app_error",
@@ -2452,19 +2452,19 @@
},
{
"id": "api.team.set_team_icon.decode.app_error",
- "translation": "Could not decode team icon"
+ "translation": "Не удалось декодировать поток."
},
{
"id": "api.team.set_team_icon.decode_config.app_error",
- "translation": "Could not decode team icon metadata"
+ "translation": "Не удалось декодировать метаданные поток команды"
},
{
"id": "api.team.set_team_icon.encode.app_error",
- "translation": "Could not encode team icon"
+ "translation": "Не удалось закодировать поток."
},
{
"id": "api.team.set_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "Произошла ошибка при подключении команды"
},
{
"id": "api.team.set_team_icon.no_file.app_error",
@@ -2472,7 +2472,7 @@
},
{
"id": "api.team.set_team_icon.open.app_error",
- "translation": "Не могу открыть файл изображения"
+ "translation": "Не удалось открыть файл"
},
{
"id": "api.team.set_team_icon.parse.app_error",
@@ -2488,7 +2488,7 @@
},
{
"id": "api.team.set_team_icon.write_file.app_error",
- "translation": "Could not save team icon"
+ "translation": "Не удалось установить значок"
},
{
"id": "api.team.signup_team.email_disabled.app_error",
@@ -2496,7 +2496,7 @@
},
{
"id": "api.team.team_icon.update.app_error",
- "translation": "An error occurred updating the team icon"
+ "translation": "Во время создания метки произошла ошибка:"
},
{
"id": "api.team.update_member_roles.not_a_member",
@@ -2680,11 +2680,11 @@
},
{
"id": "api.templates.user_access_token_body.info",
- "translation": "A personal access token was added to your account on {{ .SiteURL }}. They can be used to access {{.SiteName}} with your account.<br>If this change wasn't initiated by you, please contact your system administrator."
+ "translation": "В ваш аккаунт добавлен токен доступа. {{.SiteURL}}. Они могут использоваться для доступа к {{.SiteName}} в вашей учетной записи. <br> Если это изменение не было инициировано вами, обратитесь к системному администратору."
},
{
"id": "api.templates.user_access_token_body.title",
- "translation": "Personal access token added to your account"
+ "translation": "Личный ключ доступа, добавленный в вашу учетную запись"
},
{
"id": "api.templates.user_access_token_subject",
@@ -2860,7 +2860,7 @@
},
{
"id": "api.user.create_user.missing_token.app_error",
- "translation": "Missing Token."
+ "translation": "Отсутствует токен."
},
{
"id": "api.user.create_user.no_open_server",
@@ -2912,7 +2912,7 @@
},
{
"id": "api.user.get_profile_image.not_found.app_error",
- "translation": "Unable to get profile image, user not found."
+ "translation": "Не удалось получить изображение профиля, пользователь не найден."
},
{
"id": "api.user.init.debug",
@@ -3052,7 +3052,7 @@
},
{
"id": "api.user.send_user_access_token.error",
- "translation": "Во время отправки сообщения с токеном доступа произошли ошибки"
+ "translation": "Не удалось отправить сообщение «Личный доступ по токенам»"
},
{
"id": "api.user.send_verify_email_and_forget.failed.error",
@@ -3244,7 +3244,7 @@
},
{
"id": "api.webhook.incoming.error",
- "translation": "Could not decode the multipart payload of incoming webhook."
+ "translation": "Не удалось декодировать многостраничную полезную нагрузку входящего вебхука"
},
{
"id": "api.webhook.init.debug",
@@ -3308,7 +3308,7 @@
},
{
"id": "app.admin.test_email.failure",
- "translation": "Connection unsuccessful: {{.Error}}"
+ "translation": "Соединение неудачно: {{.Error}}"
},
{
"id": "app.channel.create_channel.no_team_id.app_error",
@@ -3496,7 +3496,7 @@
},
{
"id": "app.import.validate_direct_channel_import_data.unknown_favoriter.error",
- "translation": "Direct channel can only be favorited by members. \"{{.Username}}\" is not a member."
+ "translation": "Текущий канал может быть добавлен в избранное только членами команды. \"{{.Username}}\" не является членом данной команды."
},
{
"id": "app.import.validate_direct_post_import_data.channel_members_required.error",
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "Unable to activate extracted plugin. Plugin may already exist and be activated."
+ "translation": "Unable to activate extracted plugin."
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "Не удалось получить активные плагины"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "Plugin Id must be less than {{.Max}} characters."
- },
- {
"id": "app.plugin.install.app_error",
"translation": "Unable to install plugin."
},
@@ -3859,6 +3855,10 @@
"translation": "Unable to install plugin. A plugin with the same ID is already installed."
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "Plugin Id must be at least {{.Min}} characters, at most {{.Max}} characters and match {{.Regex}}."
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "Unable to find manifest for extracted plugin"
},
diff --git a/i18n/tr.json b/i18n/tr.json
index 39287f339..852bebad2 100644
--- a/i18n/tr.json
+++ b/i18n/tr.json
@@ -217,11 +217,11 @@
},
{
"id": "api.channel.convert_channel_to_private.default_channel_error",
- "translation": "This default channel cannot be converted into a private channel."
+ "translation": "Bu varsayılan kanal özel bir kanala dönüştürülemez."
},
{
"id": "api.channel.convert_channel_to_private.private_channel_error",
- "translation": "The channel requested to convert is already a private channel."
+ "translation": "Dönüştürmek istediğiniz kanal zaten özel bir kanal."
},
{
"id": "api.channel.create_channel.direct_channel.app_error",
@@ -788,19 +788,19 @@
},
{
"id": "api.command_invite.channel.error",
- "translation": "{{.Channel}} kanalı belirlenemedi. Lütfen kanalları belirtmek için [channel handle](https://about.mattermost.com/default-channel-handle-documentation) kullanın."
+ "translation": "{{.Channel}} kanalı belirlenemedi. Lütfen kanalları belirtmek için [channel handle] kullanın (https://about.mattermost.com/default-channel-handle-documentation)."
},
{
"id": "api.command_invite.desc",
- "translation": "Invite a user to a channel"
+ "translation": "Bir kanala bir kullanıcı çağır"
},
{
"id": "api.command_invite.directchannel.app_error",
- "translation": "Bir kişiyi doğrudan ileti kanalından çıkaramazsınız."
+ "translation": "Bir kişiyi doğrudan ileti kanalına ekleyemezsiniz."
},
{
"id": "api.command_invite.fail.app_error",
- "translation": "Kanala katılınılırken bir sorun çıktı."
+ "translation": "Kanala katılma sırasında bir sorun çıktı."
},
{
"id": "api.command_invite.hint",
@@ -808,7 +808,7 @@
},
{
"id": "api.command_invite.missing_message.app_error",
- "translation": "Missing Username and Channel."
+ "translation": "Kullanıcı Adı ya da Kanal eksik."
},
{
"id": "api.command_invite.missing_user.app_error",
@@ -816,19 +816,19 @@
},
{
"id": "api.command_invite.name",
- "translation": "invite"
+ "translation": "çağır"
},
{
"id": "api.command_invite.permission.app_error",
- "translation": "You don't have enough permissions to add {{.User}} in {{.Channel}}."
+ "translation": "{{.User}} kullanıcısını {{.Channel}} kanalına eklemek için yeterli izinleriniz yok."
},
{
"id": "api.command_invite.success",
- "translation": "{{.User}} added to {{.Channel}} channel."
+ "translation": "{{.User}} kullanıcısı {{.Channel}} kanalına eklendi."
},
{
"id": "api.command_invite.user_already_in_channel.app_error",
- "translation": "{{.User}} is already in the channel."
+ "translation": "{{.User}} zaten kanalda."
},
{
"id": "api.command_join.desc",
@@ -960,11 +960,11 @@
},
{
"id": "api.command_mute.no_channel.error",
- "translation": "{{.Channel}} kanalı belirlenemedi. Lütfen kanalları belirtmek için [channel handle](https://about.mattermost.com/default-channel-handle-documentation) kullanın."
+ "translation": "Belirtilen kanal bulunamadı. Lütfen kanalları belirtmek için [channel handle] kullanın (https://about.mattermost.com/default-channel-handle-documentation)."
},
{
"id": "api.command_mute.not_member.error",
- "translation": "Could not mute channel {{.Channel}} as you are not a member."
+ "translation": "Üyesi olmadığınızdan {{.Channel}} kanalının bildirimlerini kapatamazsınız."
},
{
"id": "api.command_mute.success_mute",
@@ -2436,7 +2436,7 @@
},
{
"id": "api.team.remove_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "Takım alınırken bir sorun çıktı"
},
{
"id": "api.team.remove_user_from_team.missing.app_error",
@@ -2496,7 +2496,7 @@
},
{
"id": "api.team.team_icon.update.app_error",
- "translation": "An error occurred updating the team icon"
+ "translation": "Takım simgesi güncellenirken bir sorun çıktı"
},
{
"id": "api.team.update_member_roles.not_a_member",
@@ -2628,7 +2628,7 @@
},
{
"id": "api.templates.reset_body.info",
- "translation": "Parolanızı sıfırlamak için aşağıdaki \"Parolayı Sıfırla\" üzerine tıklayın.<br>Parola sıfırlama isteğinde bulunmadıysanız bu e-posta yoksayın böylece parolanız değiştirilmez. Parola sıfırlama bağlantısı 24 saat sonra geçersiz olur."
+ "translation": "Parolanızı sıfırlamak için aşağıdaki \"Parolayı Sıfırla\" üzerine tıklayın.<br>Parola sıfırlama isteğinde bulunmadıysanız bu e-posta yok sayın böylece parolanız değiştirilmez. Parola sıfırlama bağlantısı 24 saat sonra geçersiz olur."
},
{
"id": "api.templates.reset_body.title",
@@ -2860,7 +2860,7 @@
},
{
"id": "api.user.create_user.missing_token.app_error",
- "translation": "Missing Token."
+ "translation": "Kod Eksik."
},
{
"id": "api.user.create_user.no_open_server",
@@ -2912,7 +2912,7 @@
},
{
"id": "api.user.get_profile_image.not_found.app_error",
- "translation": "Unable to get profile image, user not found."
+ "translation": "Profil görseli alınamadı, kullanıcı bulunamadı."
},
{
"id": "api.user.init.debug",
@@ -3308,7 +3308,7 @@
},
{
"id": "app.admin.test_email.failure",
- "translation": "Connection unsuccessful: {{.Error}}"
+ "translation": "Bağlantı kurulamadı: {{.Error}}"
},
{
"id": "app.channel.create_channel.no_team_id.app_error",
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "Ayıklanan uygulama eki etkinleştirilemedi. Uygulama eki zaten var ve etkinleştirilmiş olabilir."
+ "translation": "Ayıklanan uygulama eki etkinleştirilemedi."
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "Etkin uygulama ekleri alınamadı"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "Uygulama eki kodu {{.Max}} karakterden kısa olmalıdır."
- },
- {
"id": "app.plugin.install.app_error",
"translation": "Uygulama eki kurulamadı."
},
@@ -3859,6 +3855,10 @@
"translation": "Uygulama eki kurulamadı. Aynı kodu taşıyan bir uygulama eki zaten var."
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "Uygulama eki kodu {{.Min}} ile {{.Max}} karakter arasında olmalı ve {{.Regex}}. ile uyumlu olmalıdır."
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "Ayıklanan uygulama eki bilgi dosyası bulunamadı"
},
@@ -6692,7 +6692,7 @@
},
{
"id": "store.sql_role.permanent_delete_all.app_error",
- "translation": "We could not permanently delete all the roles"
+ "translation": "Tüm roller kalıcı olarak silinemedi"
},
{
"id": "store.sql_role.save.insert.app_error",
@@ -6812,7 +6812,7 @@
},
{
"id": "store.sql_system.permanent_delete_by_name.app_error",
- "translation": "We could not permanently delete the system table entry"
+ "translation": "Sistem tablosu kaydı kalıcı olarak silinemedi"
},
{
"id": "store.sql_system.save.app_error",
@@ -7384,7 +7384,7 @@
},
{
"id": "utils.mail.send_mail.from_address.app_error",
- "translation": "Error setting \"From Address\""
+ "translation": "\"Kimden\" adresi ayarlanırken sorun çıktı"
},
{
"id": "utils.mail.send_mail.msg.app_error",
@@ -7400,7 +7400,7 @@
},
{
"id": "utils.mail.send_mail.to_address.app_error",
- "translation": "Error setting \"To Address\""
+ "translation": "\"Kime\" adresi ayarlanırken sorun çıktı"
},
{
"id": "utils.mail.test.configured.error",
diff --git a/i18n/zh-CN.json b/i18n/zh-CN.json
index dc0042cbf..4c9a11deb 100644
--- a/i18n/zh-CN.json
+++ b/i18n/zh-CN.json
@@ -685,7 +685,7 @@
},
{
"id": "api.command_echo.delay.app_error",
- "translation": "延迟必须在10000秒内"
+ "translation": "延迟必须在 10000 秒内"
},
{
"id": "api.command_echo.desc",
@@ -2436,7 +2436,7 @@
},
{
"id": "api.team.remove_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "获取团队时发生错误"
},
{
"id": "api.team.remove_user_from_team.missing.app_error",
@@ -2496,7 +2496,7 @@
},
{
"id": "api.team.team_icon.update.app_error",
- "translation": "An error occurred updating the team icon"
+ "translation": "更新团队图标时发生错误"
},
{
"id": "api.team.update_member_roles.not_a_member",
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "无法激活揭开的插件。插件可能已存在并已激活。"
+ "translation": "无法激活解压的插件。"
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "无法获取已启动的插件"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "插件 Id 必须小于 {{.Max}} 个字符。"
- },
- {
"id": "app.plugin.install.app_error",
"translation": "无法安装插件。"
},
@@ -3859,6 +3855,10 @@
"translation": "无法安装插件。已存在相同 ID 的插件。"
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "插件 Id 必须至少 {{.Min}} 个字符,最多 {{.Max}} 个字符并匹配 {{.Regex}}。"
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "无法在解压的插件里找到 manifest 档"
},
@@ -4120,7 +4120,7 @@
},
{
"id": "ent.compliance.run_limit.warning",
- "translation": "任务'{{.JobName}}'的导出审核警告:'{{.FilePath}}'过多行返回截断至第30,000行"
+ "translation": "任务 '{{.JobName}}' 的导出审核警告:'{{.FilePath}}' 过多行返回截断至第 3,0000 行"
},
{
"id": "ent.compliance.run_started.info",
diff --git a/i18n/zh-TW.json b/i18n/zh-TW.json
index 8b32404a1..c76f097ba 100644
--- a/i18n/zh-TW.json
+++ b/i18n/zh-TW.json
@@ -217,11 +217,11 @@
},
{
"id": "api.channel.convert_channel_to_private.default_channel_error",
- "translation": "This default channel cannot be converted into a private channel."
+ "translation": "預設頻道不能轉換為私人頻道。"
},
{
"id": "api.channel.convert_channel_to_private.private_channel_error",
- "translation": "The channel requested to convert is already a private channel."
+ "translation": "要求轉換的頻道已為私人頻道。"
},
{
"id": "api.channel.create_channel.direct_channel.app_error",
@@ -792,11 +792,11 @@
},
{
"id": "api.command_invite.desc",
- "translation": "Invite a user to a channel"
+ "translation": "邀請使用者至頻道"
},
{
"id": "api.command_invite.directchannel.app_error",
- "translation": "無法將成員從直接通訊頻道中移除。"
+ "translation": "無法新增成員至直接通訊頻道。"
},
{
"id": "api.command_invite.fail.app_error",
@@ -804,11 +804,11 @@
},
{
"id": "api.command_invite.hint",
- "translation": "@[username] ~[channel]"
+ "translation": "@[使用者] ~[頻道]"
},
{
"id": "api.command_invite.missing_message.app_error",
- "translation": "Missing Username and Channel."
+ "translation": "缺少使用者名稱跟頻道。"
},
{
"id": "api.command_invite.missing_user.app_error",
@@ -816,19 +816,19 @@
},
{
"id": "api.command_invite.name",
- "translation": "invite"
+ "translation": "邀請"
},
{
"id": "api.command_invite.permission.app_error",
- "translation": "You don't have enough permissions to add {{.User}} in {{.Channel}}."
+ "translation": "沒有足夠的權限將 {{.User}} 新增至 {{.Channel}}。"
},
{
"id": "api.command_invite.success",
- "translation": "{{.User}} added to {{.Channel}} channel."
+ "translation": "已將 {{.User}} 新增至 {{.Channel}} 頻道。"
},
{
"id": "api.command_invite.user_already_in_channel.app_error",
- "translation": "{{.User}} is already in the channel."
+ "translation": "{{.User}} 已在頻道當中。"
},
{
"id": "api.command_join.desc",
@@ -960,11 +960,11 @@
},
{
"id": "api.command_mute.no_channel.error",
- "translation": "找不到頻道 {{.Channel}}. 請用[頻道識別](https://about.mattermost.com/default-channel-handle-documentation)以分辨頻道。"
+ "translation": "找不到特定的頻道。 請用[頻道識別](https://about.mattermost.com/default-channel-handle-documentation)以分辨頻道。"
},
{
"id": "api.command_mute.not_member.error",
- "translation": "Could not mute channel {{.Channel}} as you are not a member."
+ "translation": "由於不是頻道成員,無法對頻道 {{.Channel}} 靜音。"
},
{
"id": "api.command_mute.success_mute",
@@ -2436,7 +2436,7 @@
},
{
"id": "api.team.remove_team_icon.get_team.app_error",
- "translation": "An error occurred getting the team"
+ "translation": "取得團隊時發生錯誤"
},
{
"id": "api.team.remove_user_from_team.missing.app_error",
@@ -2496,7 +2496,7 @@
},
{
"id": "api.team.team_icon.update.app_error",
- "translation": "An error occurred updating the team icon"
+ "translation": "更新團隊時發生錯誤"
},
{
"id": "api.team.update_member_roles.not_a_member",
@@ -2860,7 +2860,7 @@
},
{
"id": "api.user.create_user.missing_token.app_error",
- "translation": "Missing Token."
+ "translation": "缺少 Token。"
},
{
"id": "api.user.create_user.no_open_server",
@@ -2912,7 +2912,7 @@
},
{
"id": "api.user.get_profile_image.not_found.app_error",
- "translation": "Unable to get profile image, user not found."
+ "translation": "無法取得個人圖像,找不到使用者。"
},
{
"id": "api.user.init.debug",
@@ -3308,7 +3308,7 @@
},
{
"id": "app.admin.test_email.failure",
- "translation": "Connection unsuccessful: {{.Error}}"
+ "translation": "連線失敗:{{.Error}}"
},
{
"id": "app.channel.create_channel.no_team_id.app_error",
@@ -3812,7 +3812,7 @@
},
{
"id": "app.plugin.activate.app_error",
- "translation": "無法啟動已解開的模組。模組可能已存在並已啟動。"
+ "translation": "無法啟用已解開的模組。"
},
{
"id": "app.plugin.cluster.save_config.app_error",
@@ -3847,10 +3847,6 @@
"translation": "無法取得啟用的模組"
},
{
- "id": "app.plugin.id_length.app_error",
- "translation": "模組 ID 必須少於 {{.Max}} 字元。"
- },
- {
"id": "app.plugin.install.app_error",
"translation": "無法安裝模組。"
},
@@ -3859,6 +3855,10 @@
"translation": "無法安裝模組。已安裝了相同 ID 的模組。"
},
{
+ "id": "app.plugin.invalid_id.app_error",
+ "translation": "模組 ID 至少需 {{.Min}} 字元,最多可為 {{.Max}} 且符合 {{.Regex}}。"
+ },
+ {
"id": "app.plugin.manifest.app_error",
"translation": "已解開的模組中找不到資訊清單"
},
@@ -6692,7 +6692,7 @@
},
{
"id": "store.sql_role.permanent_delete_all.app_error",
- "translation": "We could not permanently delete all the roles"
+ "translation": "無法永久刪除所有的角色"
},
{
"id": "store.sql_role.save.insert.app_error",
@@ -6812,7 +6812,7 @@
},
{
"id": "store.sql_system.permanent_delete_by_name.app_error",
- "translation": "We could not permanently delete the system table entry"
+ "translation": "無法永久刪除系統表單當中的項目"
},
{
"id": "store.sql_system.save.app_error",
@@ -7384,7 +7384,7 @@
},
{
"id": "utils.mail.send_mail.from_address.app_error",
- "translation": "Error setting \"From Address\""
+ "translation": "無法設定寄件人地址"
},
{
"id": "utils.mail.send_mail.msg.app_error",
@@ -7400,7 +7400,7 @@
},
{
"id": "utils.mail.send_mail.to_address.app_error",
- "translation": "Error setting \"To Address\""
+ "translation": "無法設定收件人地址"
},
{
"id": "utils.mail.test.configured.error",
diff --git a/mlog/default.go b/mlog/default.go
new file mode 100644
index 000000000..366d22f88
--- /dev/null
+++ b/mlog/default.go
@@ -0,0 +1,50 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+package mlog
+
+import (
+ "encoding/json"
+ "fmt"
+)
+
+// defaultLog manually encodes the log to STDOUT, providing a basic, default logging implementation
+// before mlog is fully configured.
+func defaultLog(level, msg string, fields ...Field) {
+ log := struct {
+ Level string `json:"level"`
+ Message string `json:"msg"`
+ Fields []Field `json:"fields,omitempty"`
+ }{
+ level,
+ msg,
+ fields,
+ }
+
+ if b, err := json.Marshal(log); err != nil {
+ fmt.Printf(`{"level":"error","msg":"failed to encode log message"}%s`, "\n")
+ } else {
+ fmt.Printf("%s\n", b)
+ }
+}
+
+func defaultDebugLog(msg string, fields ...Field) {
+ defaultLog("debug", msg, fields...)
+}
+
+func defaultInfoLog(msg string, fields ...Field) {
+ defaultLog("info", msg, fields...)
+}
+
+func defaultWarnLog(msg string, fields ...Field) {
+ defaultLog("warn", msg, fields...)
+}
+
+func defaultErrorLog(msg string, fields ...Field) {
+ defaultLog("error", msg, fields...)
+}
+
+func defaultCriticalLog(msg string, fields ...Field) {
+ // We map critical to error in zap, so be consistent.
+ defaultLog("error", msg, fields...)
+}
diff --git a/mlog/global.go b/mlog/global.go
index 91d5858a4..36dd51afb 100644
--- a/mlog/global.go
+++ b/mlog/global.go
@@ -35,8 +35,8 @@ func GloballyEnableDebugLogForTest() {
globalLogger.consoleLevel.SetLevel(zapcore.DebugLevel)
}
-var Debug LogFunc
-var Info LogFunc
-var Warn LogFunc
-var Error LogFunc
-var Critical LogFunc
+var Debug LogFunc = defaultDebugLog
+var Info LogFunc = defaultInfoLog
+var Warn LogFunc = defaultWarnLog
+var Error LogFunc = defaultErrorLog
+var Critical LogFunc = defaultCriticalLog
diff --git a/mlog/global_test.go b/mlog/global_test.go
new file mode 100644
index 000000000..c0ac022d0
--- /dev/null
+++ b/mlog/global_test.go
@@ -0,0 +1,143 @@
+package mlog_test
+
+import (
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "regexp"
+ "strings"
+ "testing"
+
+ "github.com/stretchr/testify/require"
+
+ "github.com/mattermost/mattermost-server/mlog"
+)
+
+func TestLoggingBeforeInitialized(t *testing.T) {
+ require.NotPanics(t, func() {
+ // None of these should segfault before mlog is globally configured
+ mlog.Info("info log")
+ mlog.Debug("debug log")
+ mlog.Warn("warning log")
+ mlog.Error("error log")
+ mlog.Critical("critical log")
+ })
+}
+
+func TestLoggingAfterInitialized(t *testing.T) {
+ testCases := []struct {
+ Description string
+ LoggerConfiguration *mlog.LoggerConfiguration
+ ExpectedLogs []string
+ }{
+ {
+ "file logging, json, debug",
+ &mlog.LoggerConfiguration{
+ EnableConsole: false,
+ EnableFile: true,
+ FileJson: true,
+ FileLevel: mlog.LevelDebug,
+ },
+ []string{
+ `{"level":"debug","ts":0,"caller":"mlog/global_test.go:0","msg":"real debug log"}`,
+ `{"level":"info","ts":0,"caller":"mlog/global_test.go:0","msg":"real info log"}`,
+ `{"level":"warn","ts":0,"caller":"mlog/global_test.go:0","msg":"real warning log"}`,
+ `{"level":"error","ts":0,"caller":"mlog/global_test.go:0","msg":"real error log"}`,
+ `{"level":"error","ts":0,"caller":"mlog/global_test.go:0","msg":"real critical log"}`,
+ },
+ },
+ {
+ "file logging, json, error",
+ &mlog.LoggerConfiguration{
+ EnableConsole: false,
+ EnableFile: true,
+ FileJson: true,
+ FileLevel: mlog.LevelError,
+ },
+ []string{
+ `{"level":"error","ts":0,"caller":"mlog/global_test.go:0","msg":"real error log"}`,
+ `{"level":"error","ts":0,"caller":"mlog/global_test.go:0","msg":"real critical log"}`,
+ },
+ },
+ {
+ "file logging, non-json, debug",
+ &mlog.LoggerConfiguration{
+ EnableConsole: false,
+ EnableFile: true,
+ FileJson: false,
+ FileLevel: mlog.LevelDebug,
+ },
+ []string{
+ `TIME debug mlog/global_test.go:0 real debug log`,
+ `TIME info mlog/global_test.go:0 real info log`,
+ `TIME warn mlog/global_test.go:0 real warning log`,
+ `TIME error mlog/global_test.go:0 real error log`,
+ `TIME error mlog/global_test.go:0 real critical log`,
+ },
+ },
+ {
+ "file logging, non-json, error",
+ &mlog.LoggerConfiguration{
+ EnableConsole: false,
+ EnableFile: true,
+ FileJson: false,
+ FileLevel: mlog.LevelError,
+ },
+ []string{
+ `TIME error mlog/global_test.go:0 real error log`,
+ `TIME error mlog/global_test.go:0 real critical log`,
+ },
+ },
+ }
+
+ for _, testCase := range testCases {
+ t.Run(testCase.Description, func(t *testing.T) {
+ var filePath string
+ if testCase.LoggerConfiguration.EnableFile {
+ tempDir, err := ioutil.TempDir(os.TempDir(), "TestLoggingAfterInitialized")
+ require.NoError(t, err)
+ defer os.Remove(tempDir)
+
+ filePath = filepath.Join(tempDir, "file.log")
+ testCase.LoggerConfiguration.FileLocation = filePath
+ }
+
+ logger := mlog.NewLogger(testCase.LoggerConfiguration)
+ mlog.InitGlobalLogger(logger)
+
+ mlog.Debug("real debug log")
+ mlog.Info("real info log")
+ mlog.Warn("real warning log")
+ mlog.Error("real error log")
+ mlog.Critical("real critical log")
+
+ if testCase.LoggerConfiguration.EnableFile {
+ logs, err := ioutil.ReadFile(filePath)
+ require.NoError(t, err)
+
+ actual := strings.TrimSpace(string(logs))
+
+ if testCase.LoggerConfiguration.FileJson {
+ reTs := regexp.MustCompile(`"ts":[0-9\.]+`)
+ reCaller := regexp.MustCompile(`"caller":"([^"]+):[0-9\.]+"`)
+ actual = reTs.ReplaceAllString(actual, `"ts":0`)
+ actual = reCaller.ReplaceAllString(actual, `"caller":"$1:0"`)
+ } else {
+ actualRows := strings.Split(actual, "\n")
+ for i, actualRow := range actualRows {
+ actualFields := strings.Split(actualRow, "\t")
+ if len(actualFields) > 3 {
+ actualFields[0] = "TIME"
+ reCaller := regexp.MustCompile(`([^"]+):[0-9\.]+`)
+ actualFields[2] = reCaller.ReplaceAllString(actualFields[2], "$1:0")
+ actualRows[i] = strings.Join(actualFields, "\t")
+ }
+ }
+
+ actual = strings.Join(actualRows, "\n")
+ }
+ require.Equal(t, testCase.ExpectedLogs, strings.Split(actual, "\n"))
+ }
+ })
+ }
+}
diff --git a/mlog/log.go b/mlog/log.go
index 28f7408c4..c3261459b 100644
--- a/mlog/log.go
+++ b/mlog/log.go
@@ -63,6 +63,16 @@ func getZapLevel(level string) zapcore.Level {
}
}
+func makeEncoder(json bool) zapcore.Encoder {
+ encoderConfig := zap.NewProductionEncoderConfig()
+ if json {
+ return zapcore.NewJSONEncoder(encoderConfig)
+ }
+
+ encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
+ return zapcore.NewConsoleEncoder(encoderConfig)
+}
+
func NewLogger(config *LoggerConfiguration) *Logger {
cores := []zapcore.Core{}
logger := &Logger{
@@ -70,18 +80,9 @@ func NewLogger(config *LoggerConfiguration) *Logger {
fileLevel: zap.NewAtomicLevelAt(getZapLevel(config.FileLevel)),
}
- encoderConfig := zap.NewProductionEncoderConfig()
- var encoder zapcore.Encoder
- if config.ConsoleJson {
- encoder = zapcore.NewJSONEncoder(encoderConfig)
- } else {
- encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
- encoder = zapcore.NewConsoleEncoder(encoderConfig)
- }
-
if config.EnableConsole {
writer := zapcore.Lock(os.Stdout)
- core := zapcore.NewCore(encoder, writer, logger.consoleLevel)
+ core := zapcore.NewCore(makeEncoder(config.ConsoleJson), writer, logger.consoleLevel)
cores = append(cores, core)
}
@@ -91,7 +92,7 @@ func NewLogger(config *LoggerConfiguration) *Logger {
MaxSize: 100,
Compress: true,
})
- core := zapcore.NewCore(encoder, writer, logger.fileLevel)
+ core := zapcore.NewCore(makeEncoder(config.FileJson), writer, logger.fileLevel)
cores = append(cores, core)
}
diff --git a/web/context.go b/web/context.go
index bf7cfcb8d..711d241ae 100644
--- a/web/context.go
+++ b/web/context.go
@@ -49,10 +49,9 @@ func (c *Context) LogAuditWithUserId(userId, extraInfo string) {
}
func (c *Context) LogError(err *model.AppError) {
-
// Filter out 404s, endless reconnects and browser compatibility errors
if err.StatusCode == http.StatusNotFound ||
- (c.Path == "/api/v3/users/websocket" && err.StatusCode == 401) ||
+ (c.Path == "/api/v3/users/websocket" && err.StatusCode == http.StatusUnauthorized) ||
err.Id == "web.check_browser_compatibility.app_error" {
c.LogDebug(err)
} else {
@@ -62,8 +61,13 @@ func (c *Context) LogError(err *model.AppError) {
}
func (c *Context) LogInfo(err *model.AppError) {
- mlog.Info(fmt.Sprintf("%v:%v code=%v rid=%v uid=%v ip=%v %v [details: %v]", c.Path, err.Where, err.StatusCode,
- c.RequestId, c.Session.UserId, c.IpAddress, err.SystemMessage(utils.TDefault), err.DetailedError), mlog.String("user_id", c.Session.UserId))
+ // Filter out 401s
+ if err.StatusCode == http.StatusUnauthorized {
+ c.LogDebug(err)
+ } else {
+ mlog.Info(fmt.Sprintf("%v:%v code=%v rid=%v uid=%v ip=%v %v [details: %v]", c.Path, err.Where, err.StatusCode,
+ c.RequestId, c.Session.UserId, c.IpAddress, err.SystemMessage(utils.TDefault), err.DetailedError), mlog.String("user_id", c.Session.UserId))
+ }
}
func (c *Context) LogDebug(err *model.AppError) {