summaryrefslogtreecommitdiffstats
path: root/webpack.config.js
blob: 3851e8e8934219c4bbe408906f757b756920240d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
import fastGlob from 'fast-glob';
import wrapAnsi from 'wrap-ansi';
import AddAssetPlugin from 'add-asset-webpack-plugin';
import LicenseCheckerWebpackPlugin from 'license-checker-webpack-plugin';
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
import MonacoWebpackPlugin from 'monaco-editor-webpack-plugin';
import VueLoader from 'vue-loader';
import EsBuildLoader from 'esbuild-loader';
import {parse, dirname} from 'path';
import webpack from 'webpack';
import {fileURLToPath} from 'url';

const {VueLoaderPlugin} = VueLoader;
const {ESBuildMinifyPlugin} = EsBuildLoader;
const {SourceMapDevToolPlugin} = webpack;
const glob = (pattern) => fastGlob.sync(pattern, {
  cwd: dirname(fileURLToPath(new URL(import.meta.url))),
  absolute: true,
});

const themes = {};
for (const path of glob('web_src/less/themes/*.less')) {
  themes[parse(path).name] = [path];
}

const isProduction = process.env.NODE_ENV !== 'development';

const filterCssImport = (url, ...args) => {
  const cssFile = args[1] || args[0]; // resourcePath is 2nd argument for url and 3rd for import
  const importedFile = url.replace(/[?#].+/, '').toLowerCase();

  if (cssFile.includes('fomantic')) {
    if (/brand-icons/.test(importedFile)) return false;
    if (/(eot|ttf|otf|woff|svg)$/.test(importedFile)) return false;
  }

  if (cssFile.includes('font-awesome') && /(eot|ttf|otf|woff|svg)$/.test(importedFile)) {
    return false;
  }

  return true;
};

export default {
  mode: isProduction ? 'production' : 'development',
  entry: {
    index: [
      fileURLToPath(new URL('web_src/js/jquery.js', import.meta.url)),
      fileURLToPath(new URL('web_src/fomantic/build/semantic.js', import.meta.url)),
      fileURLToPath(new URL('web_src/js/index.js', import.meta.url)),
      fileURLToPath(new URL('node_modules/easymde/dist/easymde.min.css', import.meta.url)),
      fileURLToPath(new URL('web_src/fomantic/build/semantic.css', import.meta.url)),
      fileURLToPath(new URL('web_src/less/misc.css', import.meta.url)),
      fileURLToPath(new URL('web_src/less/index.less', import.meta.url)),
    ],
    swagger: [
      fileURLToPath(new URL('web_src/js/standalone/swagger.js', import.meta.url)),
      fileURLToPath(new URL('web_src/less/standalone/swagger.less', import.meta.url)),
    ],
    serviceworker: [
      fileURLToPath(new URL('web_src/js/serviceworker.js', import.meta.url)),
    ],
    'eventsource.sharedworker': [
      fileURLToPath(new URL('web_src/js/features/eventsource.sharedworker.js', import.meta.url)),
    ],
    ...themes,
  },
  devtool: false,
  output: {
    path: fileURLToPath(new URL('public', import.meta.url)),
    filename: ({chunk}) => {
      // serviceworker can only manage assets below it's script's directory so
      // we have to put it in / instead of /js/
      return chunk.name === 'serviceworker' ? '[name].js' : 'js/[name].js';
    },
    chunkFilename: ({chunk}) => {
      const language = (/monaco.*languages?_.+?_(.+?)_/.exec(chunk.id) || [])[1];
      return language ? `js/monaco-language-${language.toLowerCase()}.js` : `js/[name].js`;
    },
  },
  optimization: {
    minimize: isProduction,
    minimizer: [
      new ESBuildMinifyPlugin({
        target: 'es2015',
        minify: true,
        css: true,
        legalComments: 'none',
      }),
    ],
    splitChunks: {
      chunks: 'async',
      name: (_, chunks) => chunks.map((item) => item.name).join('-'),
    },
    moduleIds: 'named',
    chunkIds: 'named',
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        exclude: /node_modules/,
        loader: 'vue-loader',
      },
      {
        test: /\.worker\.js$/,
        exclude: /monaco/,
        use: [
          {
            loader: 'worker-loader',
            options: {
              inline: 'no-fallback',
            },
          },
        ],
      },
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'esbuild-loader',
            options: {
              target: 'es2015'
            },
          },
        ],
      },
      {
        test: /.css$/i,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
          },
          {
            loader: 'css-loader',
            options: {
              sourceMap: true,
              url: {filter: filterCssImport},
              import: {filter: filterCssImport},
            },
          },
        ],
      },
      {
        test: /.less$/i,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
          },
          {
            loader: 'css-loader',
            options: {
              sourceMap: true,
              importLoaders: 1,
              url: {filter: filterCssImport},
              import: {filter: filterCssImport},
            },
          },
          {
            loader: 'less-loader',
            options: {
              sourceMap: true,
            },
          },
        ],
      },
      {
        test: /\.svg$/,
        include: fileURLToPath(new URL('public/img/svg', import.meta.url)),
        type: 'asset/source',
      },
      {
        test: /\.(ttf|woff2?)$/,
        type: 'asset/resource',
        generator: {
          filename: 'fonts/[name][ext]',
        }
      },
      {
        test: /\.png$/i,
        type: 'asset/resource',
        generator: {
          filename: 'img/webpack/[name][ext]',
        }
      },
    ],
  },
  plugins: [
    new VueLoaderPlugin(),
    new MiniCssExtractPlugin({
      filename: 'css/[name].css',
      chunkFilename: 'css/[name].css',
    }),
    new SourceMapDevToolPlugin({
      filename: '[file].map',
      include: [
        'js/index.js',
        'css/index.css',
      ],
    }),
    new MonacoWebpackPlugin({
      filename: 'js/monaco-[name].worker.js',
    }),
    isProduction ? new LicenseCheckerWebpackPlugin({
      outputFilename: 'js/licenses.txt',
      outputWriter: ({dependencies}) => {
        const line = '-'.repeat(80);
        return dependencies.map((module) => {
          const {name, version, licenseName, licenseText} = module;
          const body = wrapAnsi(licenseText || '', 80);
          return `${line}\n${name}@${version} - ${licenseName}\n${line}\n${body}`;
        }).join('\n');
      },
      override: {
        'jquery.are-you-sure@*': {licenseName: 'MIT'},
      },
      allow: '(Apache-2.0 OR BSD-2-Clause OR BSD-3-Clause OR MIT OR ISC)',
      ignore: [
        'font-awesome',
      ],
    }) : new AddAssetPlugin('js/licenses.txt', `Licenses are disabled during development`),
  ],
  performance: {
    hints: false,
    maxEntrypointSize: Infinity,
    maxAssetSize: Infinity,
  },
  resolve: {
    symlinks: false,
    alias: {
      vue$: 'vue/dist/vue.esm.js', // needed because vue's default export is the runtime only
    },
  },
  watchOptions: {
    ignored: [
      'node_modules/**',
    ],
  },
  stats: {
    assetsSort: 'name',
    assetsSpace: Infinity,
    cached: false,
    cachedModules: false,
    children: false,
    chunkModules: false,
    chunkOrigins: false,
    chunksSort: 'name',
    colors: true,
    entrypoints: false,
    excludeAssets: [
      /^js\/monaco-language-.+\.js$/,
      !isProduction && /^js\/licenses.txt$/,
    ].filter((item) => !!item),
    groupAssetsByChunk: false,
    groupAssetsByEmitStatus: false,
    groupAssetsByInfo: false,
    groupModulesByAttributes: false,
    modules: false,
    reasons: false,
    runtimeModules: false,
  },
};
ption value='chore/add-deprecation-date'>chore/add-deprecation-date Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
aboutsummaryrefslogtreecommitdiffstats
path: root/apps/workflowengine/l10n/ar.json
blob: ed5940cd37b1552631bcd568708b98740b5d96c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
{ "translations": {
    "The given operator is invalid" : "المُعامل المُعطى غير مقبول",
    "The given regular expression is invalid" : "التعبير النظامي RE  المُعطى غير مقبول",
    "The given file size is invalid" : "حجم الملف المُعطى غير مقبول",
    "The given tag id is invalid" : "اللصيقة tag المُعطاة غير مقبولة",
    "The given IP range is invalid" : "نطاق العنوان IP المُعطى غير مقبول.",
    "The given IP range is not valid for IPv4" : "نطاق العنوان IP المُعطى غير مقبول بالنسبة لـ IPv4.",
    "The given IP range is not valid for IPv6" : "نطاق العنوان IP المُعطى غير مقبول بالنسبة لـ IPv6.",
    "The given time span is invalid" : "الفترة الزمنية المُعطاة غير مقبولة",
    "The given start time is invalid" : "وقت البداية المُعطى غير مقبول.",
    "The given end time is invalid" : "وقت النهاية المُعطى غير مقبول.",
    "The given group does not exist" : "المجموعة المُعطاة غير موجودة.",
    "File" : "ملف",
    "File created" : "ملف مُنشأ",
    "File updated" : "ملف مُحدّث",
    "File renamed" : "ملف مُعاد تسميته",
    "File deleted" : "ملف محذوف",
    "File accessed" : "ملف تم الوصول إليه",
    "File copied" : "ملف منسوخ",
    "Tag assigned" : "لصيقة مُسندة",
    "Someone" : "شخصٌ ما",
    "%s created %s" : "%s مُنشأ %s",
    "%s modified %s" : "%s مُعدّل %s",
    "%s deleted %s" : "%s مُلغىً %s",
    "%s accessed %s" : "%s تم الوصول إليه %s",
    "%s renamed %s" : "%s مُعاد تسميته %s",
    "%s copied %s" : "%s منسوخ %s",
    "%s assigned %s to %s" : "%s مُسند %s إلى %s",
    "Operation #%s does not exist" : "العملية #%s غير موجودة",
    "Entity %s does not exist" : "الكيان %s غير موجود",
    "Entity %s is invalid" : "الكيان %s غير مقبول",
    "No events are chosen." : "لم يتم اختيار أي أحدث.",
    "Entity %s has no event %s" : "الكيان %s ليس له أحداث %s",
    "Operation %s does not exist" : "العملية %s غير موجودة",
    "Operation %s is invalid" : "العملية%sغير موجودة",
    "At least one check needs to be provided" : "يجب تقديم اختيار واحد على الأقل",
    "The provided operation data is too long" : "تشغيل البيانات المطلوب كبير جدا",
    "Invalid check provided" : "الاختيار المقدم غير صالح",
    "Check %s does not exist" : "تحقق من%s غير موجود",
    "Check %s is invalid" : "تحقق من%sغير صالح",
    "Check %s is not allowed with this entity" : "التحقق من %s غير مسموح به مع هذا الكيان",
    "The provided check value is too long" : "قيمة التحقق المقدمة طويلة جدًا",
    "Check #%s does not exist" : "تحقق من#%s غير موجود",
    "Check %s is invalid or does not exist" : "التحقق من %s فهو غير صالح أو غير موجود",
    "Flow" : "تدفُّق Flow",
    "Nextcloud workflow engine" : "محرك سير عمل نكست كلود",
    "Select a filter" : "اختر عامل تصفية",
    "Select a comparator" : "اختر أساس المقارنة",
    "Remove filter" : "إزالة الفلتر",
    "Select a file type" : "اختر نوع الملف",
    "e.g. httpd/unix-directory" : "على سبيل المثال httpd/unix-directory",
    "Folder" : "مجلد",
    "Images" : "صور",
    "Office documents" : "مستندات المكتب",
    "PDF documents" : "مستندات PDF",
    "Custom MIME type" : "نوع MIME مخصص",
    "Custom mimetype" : "أنواع ملفات مخصصة",
    "Please enter a valid time span" : "الرجاء إدخال نطاق زمني صالح",
    "Select a request URL" : "حدد عنوان URL الخاص بالطلب",
    "Files WebDAV" : "ملفات  WebDAV",
    "Custom URL" : "عنوان URL مخصص",
    "Select a user agent" : "اختر وكيل مستخدم",
    "Android client" : "عميل أندرويد",
    "iOS client" : "عميل نظام التشغيل  iOS",
    "Desktop client" : "تطبيق سطح المكتب",
    "Thunderbird & Outlook addons" : "إضافات ثندربيرد و أوت لوك",
    "Custom user agent" : "وكيل مستخدم مخصص",
    "Select a trigger" : "حدد مشغل",
    "At least one event must be selected" : "يجب اختيار حدث واحد على الأقل",
    "Add new flow" : "إضافة مسار دفق جديد",
    "When" : "متى",
    "and" : "و",
    "Add a new filter" : "إضافة فلتر جديد",
    "Cancel" : "إلغاء",
    "Delete" : "حذف ",
    "The configuration is invalid" : "التكوين غير صالح",
    "Active" : "فعال",
    "Save" : "حفظ",
    "Available flows" : "مسارات الدفق المتاحة",
    "For details on how to write your own flow, check out the development documentation." : "للحصول على تفاصيل حول كيفية كتابة مسارات الدفق الخاص بك، تحقق من وثائق التطوير.",
    "More flows" : "المزيد من مسارات الدفق",
    "Browse the App Store" : "إستعرض متجر التطبيقات",
    "Show less" : "عرض أقل",
    "Show more" : "عرض المزيد",
    "Configured flows" : "مسار الدفق المُعد",
    "Your flows" : "مسار الدفق الخاص بك",
    "matches" : "متوافق",
    "does not match" : "غير متوافق",
    "is" : "يكون",
    "is not" : "ليس",
    "File name" : "اسم ملف",
    "File MIME type" : "ملف من النوع MIME",
    "File size (upload)" : "حجم الملف (الرفع)",
    "less" : "أقل",
    "less or equals" : "أقل من أو يساوي",
    "greater or equals" : "أكبر أو يساوي",
    "greater" : "أكبر من",
    "Request remote address" : "العنوان البعيد الخاص بالطلب",
    "matches IPv4" : "متوافق مع بروتوكول الانترنت الاصدار الرابع \"IPv4\"",
    "does not match IPv4" : "غير متوافق مع بروتوكول الانترنت الاصدار الرابع \"IPv4\"",
    "matches IPv6" : "متوافق مع بروتوكول الانترنت الاصدار السادس \"IPv6\"",
    "does not match IPv6" : "غير متوافق مع بروتوكول الانترنت الاصدار الرابع \"IPv6\"",
    "File system tag" : "وسم ملف النظام",
    "is tagged with" : "موسومة بـ",
    "is not tagged with" : "غير موسومة بـ",
    "Request URL" : "عنوان محدد موقع الموارد المُوحّد \"URL\" الخاص بالطلب",
    "Request time" : "وقت الطلب",
    "between" : "بين",
    "not between" : "ليس بين",
    "Request user agent" : "وكيل المستخدم الخاص بالطلب",
    "User group membership" : "عضوية مجموعة المستخدمين",
    "is member of" : "عضو فى",
    "is not member of" : "ليس عضو فى",
    "Predefined URLs" : "عناوين URLs المحددة مسبقا",
    "Others" : "آخرون"
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
}