├── .github
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── FUNDING.yml
├── SECURITY.md
├── renovate.json
└── workflows
│ ├── ci.yaml
│ └── stale.yml
├── .gitignore
├── .php-cs-fixer.php
├── CHANGELOG.md
├── LICENSE
├── README.md
├── bin
├── prepare-commit
└── update-translations
├── composer.json
├── docs
├── .gitignore
├── README.md
├── config.rb
├── deploy.sh
├── font-selection.json
├── lib
│ ├── multilang.rb
│ ├── nesting_unique_head.rb
│ ├── toc_data.rb
│ └── unique_head.rb
└── source
│ ├── fonts
│ ├── slate.eot
│ ├── slate.svg
│ ├── slate.ttf
│ ├── slate.woff
│ └── slate.woff2
│ ├── images
│ ├── logo.png
│ └── navbar.png
│ ├── includes
│ └── _errors.md
│ ├── index.html.md
│ ├── javascripts
│ ├── all.js
│ ├── all_nosearch.js
│ ├── app
│ │ ├── _lang.js
│ │ ├── _search.js
│ │ └── _toc.js
│ └── lib
│ │ ├── _energize.js
│ │ ├── _imagesloaded.min.js
│ │ ├── _jquery.highlight.js
│ │ ├── _jquery.js
│ │ └── _lunr.js
│ ├── layouts
│ └── layout.erb
│ └── stylesheets
│ ├── _icon-font.scss
│ ├── _normalize.scss
│ ├── _rtl.scss
│ ├── _variables.scss
│ ├── print.css.scss
│ └── screen.css.scss
├── phpstan.neon
├── phpunit.xml.dist
├── src
├── Adapter
│ ├── AbstractAdapter.php
│ ├── AdapterInterface.php
│ ├── AdapterQuery.php
│ ├── ArrayAdapter.php
│ ├── Doctrine
│ │ ├── Event
│ │ │ └── ORMAdapterQueryEvent.php
│ │ ├── FetchJoinORMAdapter.php
│ │ ├── ORM
│ │ │ ├── AutomaticQueryBuilder.php
│ │ │ ├── QueryBuilderProcessorInterface.php
│ │ │ └── SearchCriteriaProvider.php
│ │ ├── ORMAdapter.php
│ │ └── ORMAdapterEvents.php
│ ├── Elasticsearch
│ │ └── ElasticaAdapter.php
│ ├── MongoDB
│ │ └── MongoDBAdapter.php
│ ├── ResultSet.php
│ └── ResultSetInterface.php
├── Column
│ ├── AbstractColumn.php
│ ├── BoolColumn.php
│ ├── DateTimeColumn.php
│ ├── MapColumn.php
│ ├── NumberColumn.php
│ ├── TextColumn.php
│ ├── TwigColumn.php
│ └── TwigStringColumn.php
├── DataTable.php
├── DataTableEvents.php
├── DataTableFactory.php
├── DataTableRendererInterface.php
├── DataTableState.php
├── DataTableTypeInterface.php
├── DataTablesBundle.php
├── DependencyInjection
│ ├── Compiler
│ │ └── LocatorRegistrationPass.php
│ ├── Configuration.php
│ ├── DataTablesExtension.php
│ └── Instantiator.php
├── Event
│ ├── DataTableEvent.php
│ ├── DataTablePostResponseEvent.php
│ ├── DataTablePreResponseEvent.php
│ └── DataTableResponseEvent.php
├── Exception
│ ├── InvalidArgumentException.php
│ ├── InvalidConfigurationException.php
│ ├── InvalidStateException.php
│ ├── MissingDependencyException.php
│ └── UnknownDataTableExporterException.php
├── Exporter
│ ├── AbstractDataTableExporter.php
│ ├── Csv
│ │ └── CsvExporter.php
│ ├── DataTableExporterCollection.php
│ ├── DataTableExporterEvents.php
│ ├── DataTableExporterInterface.php
│ ├── DataTableExporterManager.php
│ ├── Event
│ │ └── DataTableExporterResponseEvent.php
│ └── Excel
│ │ ├── ExcelExporter.php
│ │ └── ExcelOpenSpoutExporter.php
├── Filter
│ ├── AbstractFilter.php
│ ├── ChoiceFilter.php
│ └── TextFilter.php
├── Resources
│ ├── config
│ │ └── services.xml
│ ├── public
│ │ └── js
│ │ │ └── datatables.js
│ ├── translations
│ │ ├── DataTablesCDN.af.yml
│ │ ├── DataTablesCDN.ar.yml
│ │ ├── DataTablesCDN.az.yml
│ │ ├── DataTablesCDN.be.yml
│ │ ├── DataTablesCDN.bg.yml
│ │ ├── DataTablesCDN.bn.yml
│ │ ├── DataTablesCDN.ca.yml
│ │ ├── DataTablesCDN.cs.yml
│ │ ├── DataTablesCDN.cy.yml
│ │ ├── DataTablesCDN.da.yml
│ │ ├── DataTablesCDN.de.yml
│ │ ├── DataTablesCDN.el.yml
│ │ ├── DataTablesCDN.en.yml
│ │ ├── DataTablesCDN.es.yml
│ │ ├── DataTablesCDN.et.yml
│ │ ├── DataTablesCDN.eu.yml
│ │ ├── DataTablesCDN.fa.yml
│ │ ├── DataTablesCDN.fi.yml
│ │ ├── DataTablesCDN.fr.yml
│ │ ├── DataTablesCDN.ga.yml
│ │ ├── DataTablesCDN.gl.yml
│ │ ├── DataTablesCDN.gu.yml
│ │ ├── DataTablesCDN.he.yml
│ │ ├── DataTablesCDN.hi.yml
│ │ ├── DataTablesCDN.hr.yml
│ │ ├── DataTablesCDN.hu.yml
│ │ ├── DataTablesCDN.hy.yml
│ │ ├── DataTablesCDN.id.yml
│ │ ├── DataTablesCDN.is.yml
│ │ ├── DataTablesCDN.it.yml
│ │ ├── DataTablesCDN.ja.yml
│ │ ├── DataTablesCDN.ka.yml
│ │ ├── DataTablesCDN.ko.yml
│ │ ├── DataTablesCDN.lt.yml
│ │ ├── DataTablesCDN.lv.yml
│ │ ├── DataTablesCDN.mk.yml
│ │ ├── DataTablesCDN.mn.yml
│ │ ├── DataTablesCDN.ms.yml
│ │ ├── DataTablesCDN.nb.yml
│ │ ├── DataTablesCDN.ne.yml
│ │ ├── DataTablesCDN.nl.yml
│ │ ├── DataTablesCDN.nn.yml
│ │ ├── DataTablesCDN.pl.yml
│ │ ├── DataTablesCDN.ps.yml
│ │ ├── DataTablesCDN.pt.yml
│ │ ├── DataTablesCDN.ro.yml
│ │ ├── DataTablesCDN.ru.yml
│ │ ├── DataTablesCDN.si.yml
│ │ ├── DataTablesCDN.sk.yml
│ │ ├── DataTablesCDN.sl.yml
│ │ ├── DataTablesCDN.sq.yml
│ │ ├── DataTablesCDN.sr.yml
│ │ ├── DataTablesCDN.sv.yml
│ │ ├── DataTablesCDN.sw.yml
│ │ ├── DataTablesCDN.ta.yml
│ │ ├── DataTablesCDN.te.yml
│ │ ├── DataTablesCDN.th.yml
│ │ ├── DataTablesCDN.tr.yml
│ │ ├── DataTablesCDN.uk.yml
│ │ ├── DataTablesCDN.ur.yml
│ │ ├── DataTablesCDN.uz.yml
│ │ ├── DataTablesCDN.vi.yml
│ │ ├── DataTablesCDN.zh.yml
│ │ ├── messages.af.yml
│ │ ├── messages.am.yml
│ │ ├── messages.ar.yml
│ │ ├── messages.az.yml
│ │ ├── messages.be.yml
│ │ ├── messages.bg.yml
│ │ ├── messages.bn.yml
│ │ ├── messages.ca.yml
│ │ ├── messages.cn.yml
│ │ ├── messages.cs.yml
│ │ ├── messages.cy.yml
│ │ ├── messages.da.yml
│ │ ├── messages.de.yml
│ │ ├── messages.el.yml
│ │ ├── messages.en.yml
│ │ ├── messages.eo.yml
│ │ ├── messages.es.yml
│ │ ├── messages.et.yml
│ │ ├── messages.eu.yml
│ │ ├── messages.fa.yml
│ │ ├── messages.fr.yml
│ │ ├── messages.ga.yml
│ │ ├── messages.gl.yml
│ │ ├── messages.gu.yml
│ │ ├── messages.he.yml
│ │ ├── messages.hi.yml
│ │ ├── messages.hr.yml
│ │ ├── messages.hy.yml
│ │ ├── messages.id.yml
│ │ ├── messages.is.yml
│ │ ├── messages.it.yml
│ │ ├── messages.ja.yml
│ │ ├── messages.ka.yml
│ │ ├── messages.kk.yml
│ │ ├── messages.km.yml
│ │ ├── messages.ko.yml
│ │ ├── messages.ku.yml
│ │ ├── messages.ky.yml
│ │ ├── messages.lo.yml
│ │ ├── messages.lt.yml
│ │ ├── messages.lv.yml
│ │ ├── messages.mk.yml
│ │ ├── messages.mn.yml
│ │ ├── messages.ms.yml
│ │ ├── messages.nb.yml
│ │ ├── messages.ne.yml
│ │ ├── messages.nl.yml
│ │ ├── messages.nn.yml
│ │ ├── messages.pl.yml
│ │ ├── messages.ps.yml
│ │ ├── messages.pt.yml
│ │ ├── messages.ro.yml
│ │ ├── messages.ru.yml
│ │ ├── messages.si.yml
│ │ ├── messages.sk.yml
│ │ ├── messages.sl.yml
│ │ ├── messages.sq.yml
│ │ ├── messages.sr.yml
│ │ ├── messages.sr_Latn.yml
│ │ ├── messages.sv.yml
│ │ ├── messages.sw.yml
│ │ ├── messages.ta.yml
│ │ ├── messages.te.yml
│ │ ├── messages.th.yml
│ │ ├── messages.tr.yml
│ │ ├── messages.ua.yml
│ │ ├── messages.uk.yml
│ │ ├── messages.ur.yml
│ │ ├── messages.uz.yml
│ │ ├── messages.vi.yml
│ │ └── messages.zh.yml
│ └── views
│ │ ├── Column
│ │ └── twig_string.html.twig
│ │ ├── Filter
│ │ ├── select.html.twig
│ │ ├── select.js.twig
│ │ ├── text.html.twig
│ │ └── text.js.twig
│ │ ├── datatable_html.html.twig
│ │ └── datatable_js.html.twig
└── Twig
│ ├── DataTablesExtension.php
│ └── TwigRenderer.php
└── tests
├── Fixtures
├── .gitignore
├── AppBundle
│ ├── AppBundle.php
│ ├── Controller
│ │ ├── CustomQueryController.php
│ │ ├── ExporterController.php
│ │ ├── GroupedController.php
│ │ ├── HomeController.php
│ │ ├── ORMAdapterEventsController.php
│ │ ├── PlainController.php
│ │ ├── ServiceController.php
│ │ ├── TranslationController.php
│ │ └── TypeController.php
│ ├── DataTable
│ │ ├── Adapter
│ │ │ └── CustomORMAdapter.php
│ │ ├── Exporter
│ │ │ └── TxtExporter.php
│ │ └── Type
│ │ │ ├── CustomQueryTableType.php
│ │ │ ├── Grouped2TableType.php
│ │ │ ├── GroupedTableType.php
│ │ │ ├── RegularPersonTableType.php
│ │ │ └── ServicePersonTableType.php
│ ├── Entity
│ │ ├── Company.php
│ │ ├── Employee.php
│ │ └── Person.php
│ └── Resources
│ │ └── views
│ │ ├── buttons.html.twig
│ │ ├── exporter.html.twig
│ │ ├── home.html.twig
│ │ ├── lastname_cell.html.twig
│ │ └── table.html.twig
├── AppKernel.php
├── config.yml
├── routing.yml
└── services.yml
├── Functional
├── Adapter
│ └── Doctrine
│ │ └── ORMAdapterEventsTest.php
├── Exporter
│ ├── Csv
│ │ └── CsvExporterTest.php
│ ├── Event
│ │ └── DataTableExporterResponseEventTest.php
│ └── Excel
│ │ ├── ExcelExporterTest.php
│ │ └── ExcelOpenSpoutExporterTest.php
└── FunctionalTest.php
├── Unit
├── Adapter
│ ├── DoctrineTest.php
│ ├── ElasticaTest.php
│ └── ORMAdapterTest.php
├── AdapterTest.php
├── ColumnTest.php
├── DataTableTest.php
├── DependencyInjectionTest.php
├── Exporter
│ ├── DataTableExporterCollectionTest.php
│ ├── DataTableExporterManagerTest.php
│ ├── ExcelExporterTest.php
│ └── ExcelOpenSpoutExporterTest.php
├── FilterTest.php
├── Helper
│ └── InvalidEvent.php
└── TwigTest.php
├── known-deprecations
└── phpunit-bootstrap.php
/.github/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | Contributions are **welcome** and will be credited.
4 |
5 | We accept contributions via Pull Requests on [Github](https://github.com/omines/datatables-bundle).
6 | Follow [good standards](http://www.phptherightway.com/), include tests with proper coverage, and run
7 | `vendor/bin/php-cs-fixer fix` before committing.
8 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: curry684
4 |
5 | # patreon: # Replace with a single Patreon username
6 | # open_collective: # Replace with a single Open Collective username
7 | # ko_fi: # Replace with a single Ko-fi username
8 | # tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
9 | # community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
10 | # liberapay: # Replace with a single Liberapay username
11 | # issuehunt: # Replace with a single IssueHunt username
12 | # otechie: # Replace with a single Otechie username
13 | # lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
14 | # custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
15 |
--------------------------------------------------------------------------------
/.github/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Reporting Security Issues
2 |
3 | To report a security issue, please use the GitHub Security Advisory ["Report a Vulnerability"](https://github.com/omines/datatables-bundle/security/advisories/new) tab.
4 |
5 | The team will send a response indicating the next steps in handling your report. After the initial reply to your report, the security team will keep you informed of the progress towards a fix and full announcement, and may ask for additional information or guidance.
6 |
7 | Report security bugs in third-party modules to the person or team maintaining the module.
8 |
--------------------------------------------------------------------------------
/.github/renovate.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": [
3 | "config:base",
4 | "schedule:monthly",
5 | ":preserveSemverRanges"
6 | ],
7 | "bundler": {
8 | "enabled": false
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/.github/workflows/stale.yml:
--------------------------------------------------------------------------------
1 | # This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
2 | #
3 | # You can adjust the behavior by modifying this file.
4 | # For more information, see:
5 | # https://github.com/actions/stale
6 | name: Mark stale issues and pull requests
7 |
8 | on:
9 | schedule:
10 | - cron: '43 22 * * *'
11 |
12 | jobs:
13 | stale:
14 |
15 | runs-on: ubuntu-latest
16 | permissions:
17 | issues: write
18 | pull-requests: write
19 |
20 | steps:
21 | - uses: actions/stale@v9
22 | with:
23 | repo-token: ${{ secrets.GITHUB_TOKEN }}
24 | stale-issue-message: 'Stale issue message'
25 | stale-pr-message: 'Stale pull request message'
26 | stale-issue-label: 'no-issue-activity'
27 | stale-pr-label: 'no-pr-activity'
28 | days-before-stale: 90
29 | days-before-close: 30
30 |
31 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /.*.cache
2 | /.idea
3 | /build
4 | /composer.lock
5 | /tmp
6 | /vendor
7 | /tests/Fixtures/var/
8 | *~
9 |
--------------------------------------------------------------------------------
/.php-cs-fixer.php:
--------------------------------------------------------------------------------
1 | files()
13 | ->name('*.php')
14 | ->in(__DIR__.'/src')
15 | ->in(__DIR__.'/tests')->exclude('Fixtures/var')
16 | ;
17 |
18 | $config = new PhpCsFixer\Config();
19 | return $config
20 | ->setRiskyAllowed(true)
21 | ->setRules([
22 | '@Symfony' => true,
23 |
24 | 'declare_strict_types' => true,
25 | 'strict_param' => true,
26 | 'strict_comparison' => true,
27 | 'array_syntax' => ['syntax' => 'short'],
28 | 'concat_space' => ['spacing' => 'one'],
29 | 'header_comment' => ['header' => $header, 'location' => 'after_open'],
30 |
31 | 'mb_str_functions' => true,
32 | //'ordered_class_elements' => true,
33 | 'ordered_imports' => true,
34 | 'phpdoc_align' => false,
35 | 'phpdoc_separation' => false,
36 | 'phpdoc_var_without_name' => false,
37 | ])
38 | ->setFinder($finder)
39 | ;
40 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 and beyond, Omines Internetbureau B.V.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/bin/prepare-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 | cd $(dirname $0)/..
4 |
5 | export APP_ENV=test
6 | export APP_DEBUG=1
7 | export PHP_CS_FIXER_IGNORE_ENV=true
8 | export XDEBUG_MODE=coverage
9 |
10 | vendor/bin/php-cs-fixer fix
11 | vendor/bin/phpstan
12 |
13 | # Clear cache manually to avoid locking up with corrupted container
14 | rm -rf tests/Fixtures/var/cache/test
15 | php -d "zend.assertions=1" vendor/bin/phpunit --testdox --coverage-text \
16 | --coverage-xml=build/coverage/coverage-xml --log-junit=build/coverage/junit.xml
17 |
18 | echo "All good, ready for commit!"
19 |
--------------------------------------------------------------------------------
/docs/.gitignore:
--------------------------------------------------------------------------------
1 | *.gem
2 | *.rbc
3 | .bundle
4 | .config
5 | coverage
6 | InstalledFiles
7 | lib/bundler/man
8 | pkg
9 | rdoc
10 | spec/reports
11 | test/tmp
12 | test/version_tmp
13 | tmp
14 | *.DS_STORE
15 | build/
16 | .cache
17 | .vagrant
18 | .sass-cache
19 |
20 | # YARD artifacts
21 | .yardoc
22 | _yardoc
23 | doc/
24 | .idea/
25 |
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | Maintainers with push privileges on `gh-pages` branch can update the
2 | documentation by running:
3 | ```
4 | ./deploy.sh
5 | ```
6 |
--------------------------------------------------------------------------------
/docs/config.rb:
--------------------------------------------------------------------------------
1 | # Unique header generation
2 | require './lib/unique_head.rb'
3 |
4 | # Markdown
5 | set :markdown_engine, :redcarpet
6 | set :markdown,
7 | fenced_code_blocks: true,
8 | smartypants: true,
9 | disable_indented_code_blocks: true,
10 | prettify: true,
11 | strikethrough: true,
12 | tables: true,
13 | with_toc_data: true,
14 | no_intra_emphasis: true,
15 | renderer: UniqueHeadCounter
16 |
17 | # Assets
18 | set :css_dir, 'stylesheets'
19 | set :js_dir, 'javascripts'
20 | set :images_dir, 'images'
21 | set :fonts_dir, 'fonts'
22 |
23 | # Activate the syntax highlighter
24 | activate :syntax
25 | ready do
26 | require './lib/multilang.rb'
27 | end
28 |
29 | activate :sprockets
30 |
31 | activate :autoprefixer do |config|
32 | config.browsers = ['last 2 version', 'Firefox ESR']
33 | config.cascade = false
34 | config.inline = true
35 | end
36 |
37 | # Github pages require relative links
38 | activate :relative_assets
39 | set :relative_links, true
40 |
41 | # Build Configuration
42 | configure :build do
43 | activate :asset_hash
44 | # If you're having trouble with Middleman hanging, commenting
45 | # out the following two lines has been known to help
46 | activate :minify_css
47 | activate :minify_javascript
48 | # activate :relative_assets
49 | # activate :asset_hash
50 | # activate :gzip
51 | end
52 |
53 | # Deploy Configuration
54 | # If you want Middleman to listen on a different port, you can set that below
55 | set :port, 4567
56 |
57 | helpers do
58 | require './lib/toc_data.rb'
59 | end
60 |
--------------------------------------------------------------------------------
/docs/lib/multilang.rb:
--------------------------------------------------------------------------------
1 | module Multilang
2 | def block_code(code, full_lang_name)
3 | if full_lang_name
4 | parts = full_lang_name.split('--')
5 | rouge_lang_name = (parts) ? parts[0] : "" # just parts[0] here causes null ref exception when no language specified
6 | super(code, rouge_lang_name).sub("highlight #{rouge_lang_name}") do |match|
7 | match + " tab-" + full_lang_name
8 | end
9 | else
10 | super(code, full_lang_name)
11 | end
12 | end
13 | end
14 |
15 | require 'middleman-core/renderers/redcarpet'
16 | Middleman::Renderers::MiddlemanRedcarpetHTML.send :include, Multilang
17 |
--------------------------------------------------------------------------------
/docs/lib/nesting_unique_head.rb:
--------------------------------------------------------------------------------
1 | # Nested unique header generation
2 | require 'middleman-core/renderers/redcarpet'
3 |
4 | class NestingUniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML
5 | def initialize
6 | super
7 | @@headers_history = {} if !defined?(@@headers_history)
8 | end
9 |
10 | def header(text, header_level)
11 | friendly_text = text.gsub(/<[^>]*>/,"").parameterize
12 | @@headers_history[header_level] = text.parameterize
13 |
14 | if header_level > 1
15 | for i in (header_level - 1).downto(1)
16 | friendly_text.prepend("#{@@headers_history[i]}-") if @@headers_history.key?(i)
17 | end
18 | end
19 |
20 | return "#{text}"
21 | end
22 | end
23 |
--------------------------------------------------------------------------------
/docs/lib/toc_data.rb:
--------------------------------------------------------------------------------
1 | require 'nokogiri'
2 |
3 | def toc_data(page_content)
4 | html_doc = Nokogiri::HTML::DocumentFragment.parse(page_content)
5 |
6 | # get a flat list of headers
7 | headers = []
8 | html_doc.css('h1, h2, h3').each do |header|
9 | headers.push({
10 | id: header.attribute('id').to_s,
11 | content: header.children,
12 | title: header.children.to_s.gsub(/<[^>]*>/, ''),
13 | level: header.name[1].to_i,
14 | children: []
15 | })
16 | end
17 |
18 | [3,2].each do |header_level|
19 | header_to_nest = nil
20 | headers = headers.reject do |header|
21 | if header[:level] == header_level
22 | header_to_nest[:children].push header if header_to_nest
23 | true
24 | else
25 | header_to_nest = header if header[:level] < header_level
26 | false
27 | end
28 | end
29 | end
30 | headers
31 | end
32 |
--------------------------------------------------------------------------------
/docs/lib/unique_head.rb:
--------------------------------------------------------------------------------
1 | # Unique header generation
2 | require 'middleman-core/renderers/redcarpet'
3 | require 'digest'
4 | class UniqueHeadCounter < Middleman::Renderers::MiddlemanRedcarpetHTML
5 | def initialize
6 | super
7 | @head_count = {}
8 | end
9 | def header(text, header_level)
10 | friendly_text = text.gsub(/<[^>]*>/,"").parameterize
11 | if friendly_text.strip.length == 0
12 | # Looks like parameterize removed the whole thing! It removes many unicode
13 | # characters like Chinese and Russian. To get a unique URL, let's just
14 | # URI escape the whole header
15 | friendly_text = Digest::SHA1.hexdigest(text)[0,10]
16 | end
17 | @head_count[friendly_text] ||= 0
18 | @head_count[friendly_text] += 1
19 | if @head_count[friendly_text] > 1
20 | friendly_text += "-#{@head_count[friendly_text]}"
21 | end
22 | return "#{text}"
23 | end
24 | end
25 |
--------------------------------------------------------------------------------
/docs/source/fonts/slate.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/fonts/slate.eot
--------------------------------------------------------------------------------
/docs/source/fonts/slate.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/fonts/slate.ttf
--------------------------------------------------------------------------------
/docs/source/fonts/slate.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/fonts/slate.woff
--------------------------------------------------------------------------------
/docs/source/fonts/slate.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/fonts/slate.woff2
--------------------------------------------------------------------------------
/docs/source/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/images/logo.png
--------------------------------------------------------------------------------
/docs/source/images/navbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/omines/datatables-bundle/9cce090d8b85def6a9ffb84273eff39ca21e00ce/docs/source/images/navbar.png
--------------------------------------------------------------------------------
/docs/source/includes/_errors.md:
--------------------------------------------------------------------------------
1 | # Errors
2 |
3 |
6 |
7 | The Kittn API uses the following error codes:
8 |
9 |
10 | Error Code | Meaning
11 | ---------- | -------
12 | 400 | Bad Request -- Your request is invalid.
13 | 401 | Unauthorized -- Your API key is wrong.
14 | 403 | Forbidden -- The kitten requested is hidden for administrators only.
15 | 404 | Not Found -- The specified kitten could not be found.
16 | 405 | Method Not Allowed -- You tried to access a kitten with an invalid method.
17 | 406 | Not Acceptable -- You requested a format that isn't json.
18 | 410 | Gone -- The kitten requested has been removed from our servers.
19 | 418 | I'm a teapot.
20 | 429 | Too Many Requests -- You're requesting too many kittens! Slow down!
21 | 500 | Internal Server Error -- We had a problem with our server. Try again later.
22 | 503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later.
23 |
--------------------------------------------------------------------------------
/docs/source/javascripts/all.js:
--------------------------------------------------------------------------------
1 | //= require ./all_nosearch
2 | //= require ./app/_search
3 |
--------------------------------------------------------------------------------
/docs/source/javascripts/all_nosearch.js:
--------------------------------------------------------------------------------
1 | //= require ./lib/_energize
2 | //= require ./app/_toc
3 | //= require ./app/_lang
4 |
5 | $(function() {
6 | loadToc($('#toc'), '.toc-link', '.toc-list-h2', 10);
7 | setupLanguages($('body').data('languages'));
8 | $('.content').imagesLoaded( function() {
9 | window.recacheHeights();
10 | window.refreshToc();
11 | });
12 | });
13 |
14 | window.onpopstate = function() {
15 | activateLanguage(getLanguageFromQueryString());
16 | };
17 |
--------------------------------------------------------------------------------
/docs/source/stylesheets/_icon-font.scss:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'slate';
3 | src:font-url('slate.eot?-syv14m');
4 | src:font-url('slate.eot?#iefix-syv14m') format('embedded-opentype'),
5 | font-url('slate.woff2?-syv14m') format('woff2'),
6 | font-url('slate.woff?-syv14m') format('woff'),
7 | font-url('slate.ttf?-syv14m') format('truetype'),
8 | font-url('slate.svg?-syv14m#slate') format('svg');
9 | font-weight: normal;
10 | font-style: normal;
11 | }
12 |
13 | %icon {
14 | font-family: 'slate';
15 | speak: none;
16 | font-style: normal;
17 | font-weight: normal;
18 | font-variant: normal;
19 | text-transform: none;
20 | line-height: 1;
21 | }
22 |
23 | %icon-exclamation-sign {
24 | @extend %icon;
25 | content: "\e600";
26 | }
27 | %icon-info-sign {
28 | @extend %icon;
29 | content: "\e602";
30 | }
31 | %icon-ok-sign {
32 | @extend %icon;
33 | content: "\e606";
34 | }
35 | %icon-search {
36 | @extend %icon;
37 | content: "\e607";
38 | }
39 |
--------------------------------------------------------------------------------
/phpstan.neon:
--------------------------------------------------------------------------------
1 | parameters:
2 | level: 8
3 | paths:
4 | - src
5 | ignoreErrors:
6 | - '#FetchJoinORMOptions contains unresolvable type#'
7 |
8 | # New PHPStan 2 errors
9 | - { identifier: missingType.generics }
10 | excludePaths:
11 | # We're not really testing these 2 barely supported adapters
12 | - src/Adapter/Elasticsearch
13 | - src/Adapter/MongoDB
14 |
15 |
--------------------------------------------------------------------------------
/phpunit.xml.dist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | ./tests/
17 |
18 |
19 |
20 |
21 | ./src/
22 |
23 |
24 | ./src/Adapter/MongoDB
25 | ./src/Adapter/Elasticsearch
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/src/Adapter/AdapterInterface.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | interface AdapterInterface
23 | {
24 | /**
25 | * Provides initial configuration to the adapter.
26 | *
27 | * @param array $options Adapter specific options array
28 | */
29 | public function configure(array $options): void;
30 |
31 | /**
32 | * Processes a datatable's state into a result set fit for further processing.
33 | */
34 | public function getData(DataTableState $state, bool $raw = false): ResultSetInterface;
35 | }
36 |
--------------------------------------------------------------------------------
/src/Adapter/AdapterQuery.php:
--------------------------------------------------------------------------------
1 |
22 | */
23 | class AdapterQuery
24 | {
25 | private ?int $totalRows;
26 | private ?int $filteredRows;
27 | private ?string $identifierPropertyPath = null;
28 |
29 | /** @var array */
30 | private array $data;
31 |
32 | public function __construct(private readonly DataTableState $state)
33 | {
34 | }
35 |
36 | public function getState(): DataTableState
37 | {
38 | return $this->state;
39 | }
40 |
41 | public function getTotalRows(): ?int
42 | {
43 | return $this->totalRows;
44 | }
45 |
46 | public function setTotalRows(?int $totalRows): static
47 | {
48 | $this->totalRows = $totalRows;
49 |
50 | return $this;
51 | }
52 |
53 | public function getFilteredRows(): ?int
54 | {
55 | return $this->filteredRows;
56 | }
57 |
58 | public function setFilteredRows(?int $filteredRows): static
59 | {
60 | $this->filteredRows = $filteredRows;
61 |
62 | return $this;
63 | }
64 |
65 | public function getIdentifierPropertyPath(): ?string
66 | {
67 | return $this->identifierPropertyPath;
68 | }
69 |
70 | public function setIdentifierPropertyPath(?string $identifierPropertyPath): static
71 | {
72 | $this->identifierPropertyPath = $identifierPropertyPath;
73 |
74 | return $this;
75 | }
76 |
77 | /**
78 | * @template T
79 | * @param T $default
80 | * @return T|mixed
81 | */
82 | public function get(string $key, mixed $default = null): mixed
83 | {
84 | return $this->data[$key] ?? $default;
85 | }
86 |
87 | public function set(string $key, mixed $value): void
88 | {
89 | $this->data[$key] = $value;
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/src/Adapter/Doctrine/Event/ORMAdapterQueryEvent.php:
--------------------------------------------------------------------------------
1 |
20 | */
21 | class ORMAdapterQueryEvent extends Event
22 | {
23 | protected Query $query;
24 |
25 | public function __construct(Query $query)
26 | {
27 | $this->query = $query;
28 | }
29 |
30 | public function getQuery(): Query
31 | {
32 | return $this->query;
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/src/Adapter/Doctrine/ORM/QueryBuilderProcessorInterface.php:
--------------------------------------------------------------------------------
1 |
22 | */
23 | interface QueryBuilderProcessorInterface
24 | {
25 | public function process(QueryBuilder $queryBuilder, DataTableState $state): void;
26 | }
27 |
--------------------------------------------------------------------------------
/src/Adapter/Doctrine/ORMAdapterEvents.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | final class ORMAdapterEvents
21 | {
22 | /**
23 | * The PRE_QUERY event is dispatched after the QueryBuilder
24 | * built the Query and before the iteration starts.
25 | *
26 | * It can be useful to configure the cache.
27 | *
28 | * @Event("Omines\DataTablesBundle\Adapter\Doctrine\Event\ORMAdapterQueryEvent")
29 | */
30 | public const PRE_QUERY = 'omines_datatables.ormadapter.pre_query';
31 | }
32 |
--------------------------------------------------------------------------------
/src/Adapter/ResultSet.php:
--------------------------------------------------------------------------------
1 |
17 | *
18 | * @phpstan-type Row array<(int|string), mixed>
19 | *
20 | * (Note: when using ArrayAdapter, the Row keys may be integers instead of strings.)
21 | */
22 | class ResultSet implements ResultSetInterface
23 | {
24 | /**
25 | * @param \Iterator $data
26 | */
27 | public function __construct(
28 | private readonly \Iterator $data,
29 | private readonly int $totalRows,
30 | private readonly int $totalFilteredRows,
31 | ) {
32 | }
33 |
34 | public function getTotalRecords(): int
35 | {
36 | return $this->totalRows;
37 | }
38 |
39 | public function getTotalDisplayRecords(): int
40 | {
41 | return $this->totalFilteredRows;
42 | }
43 |
44 | public function getData(): \Iterator
45 | {
46 | return $this->data;
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/src/Adapter/ResultSetInterface.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | interface ResultSetInterface
21 | {
22 | /**
23 | * Retrieves the total number of accessible records in the original data.
24 | */
25 | public function getTotalRecords(): int;
26 |
27 | /**
28 | * Retrieves the number of records available after applying filters.
29 | */
30 | public function getTotalDisplayRecords(): int;
31 |
32 | /**
33 | * Returns the raw data in the result set.
34 | */
35 | public function getData(): \Iterator;
36 | }
37 |
--------------------------------------------------------------------------------
/src/Column/BoolColumn.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | class BoolColumn extends AbstractColumn
23 | {
24 | public function normalize(mixed $value): string
25 | {
26 | if (null === $value) {
27 | return $this->getNullValue();
28 | }
29 |
30 | return ((bool) $value) ? $this->getTrueValue() : $this->getFalseValue();
31 | }
32 |
33 | protected function configureOptions(OptionsResolver $resolver): static
34 | {
35 | parent::configureOptions($resolver);
36 |
37 | $resolver
38 | ->setDefault(
39 | 'rightExpr',
40 | function ($value) {
41 | return mb_trim(mb_strtolower($value)) === $this->getTrueValue();
42 | }
43 | );
44 |
45 | $resolver
46 | ->setDefault('trueValue', 'true')
47 | ->setDefault('falseValue', 'false')
48 | ->setDefault('nullValue', 'null')
49 | ->setAllowedTypes('trueValue', 'string')
50 | ->setAllowedTypes('falseValue', 'string')
51 | ->setAllowedTypes('nullValue', 'string')
52 | ;
53 |
54 | return $this;
55 | }
56 |
57 | public function getTrueValue(): string
58 | {
59 | return $this->options['trueValue'];
60 | }
61 |
62 | public function getFalseValue(): string
63 | {
64 | return $this->options['falseValue'];
65 | }
66 |
67 | public function getNullValue(): string
68 | {
69 | return $this->options['nullValue'];
70 | }
71 |
72 | public function isValidForSearch(mixed $value): bool
73 | {
74 | $value = mb_trim(mb_strtolower($value));
75 |
76 | return ($value === $this->getTrueValue()) || ($value === $this->getFalseValue());
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/src/Column/DateTimeColumn.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | class DateTimeColumn extends AbstractColumn
23 | {
24 | public function normalize(mixed $value): mixed
25 | {
26 | if (null === $value) {
27 | return $this->options['nullValue'];
28 | }
29 |
30 | if (!$value instanceof \DateTimeInterface) {
31 | if (!empty($this->options['createFromFormat'])) {
32 | $value = \DateTime::createFromFormat($this->options['createFromFormat'], (string) $value);
33 | if (false === $value) {
34 | $errors = \DateTime::getLastErrors();
35 | throw new \RuntimeException($errors ? implode(', ', $errors['errors'] ?: $errors['warnings']) : 'DateTime conversion failed for unknown reasons');
36 | }
37 | } else {
38 | $value = new \DateTime((string) $value);
39 | }
40 | }
41 |
42 | return $value->format($this->options['format']);
43 | }
44 |
45 | protected function configureOptions(OptionsResolver $resolver): static
46 | {
47 | parent::configureOptions($resolver);
48 |
49 | $resolver
50 | ->setDefaults([
51 | 'createFromFormat' => '',
52 | 'format' => 'c',
53 | 'nullValue' => '',
54 | ])
55 | ->setAllowedTypes('createFromFormat', 'string')
56 | ->setAllowedTypes('format', 'string')
57 | ->setAllowedTypes('nullValue', 'string')
58 | ;
59 |
60 | return $this;
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/src/Column/MapColumn.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | class MapColumn extends TextColumn
23 | {
24 | public function normalize(mixed $value): string
25 | {
26 | return parent::normalize($this->options['map'][$value] ?? $this->options['default'] ?? $value);
27 | }
28 |
29 | protected function configureOptions(OptionsResolver $resolver): static
30 | {
31 | parent::configureOptions($resolver);
32 |
33 | $resolver
34 | ->setDefaults([
35 | 'default' => null,
36 | 'map' => null,
37 | ])
38 | ->setAllowedTypes('default', ['null', 'string'])
39 | ->setAllowedTypes('map', 'array')
40 | ->setRequired('map')
41 | ;
42 |
43 | return $this;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/Column/NumberColumn.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | class NumberColumn extends AbstractColumn
23 | {
24 | public function normalize(mixed $value): string
25 | {
26 | $value = (string) $value;
27 | if (is_numeric($value)) {
28 | return $value;
29 | }
30 |
31 | return $this->isRaw() ? $value : (string) floatval($value);
32 | }
33 |
34 | protected function configureOptions(OptionsResolver $resolver): static
35 | {
36 | parent::configureOptions($resolver);
37 |
38 | $resolver
39 | ->setDefault('raw', false)
40 | ->setAllowedTypes('raw', 'bool')
41 | ;
42 |
43 | return $this;
44 | }
45 |
46 | public function isRaw(): bool
47 | {
48 | return $this->options['raw'];
49 | }
50 |
51 | public function isValidForSearch(mixed $value): bool
52 | {
53 | return is_numeric($value);
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/src/Column/TextColumn.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | class TextColumn extends AbstractColumn
23 | {
24 | public function normalize(mixed $value): string
25 | {
26 | $value = (string) $value;
27 |
28 | return $this->isRaw() ? $value : htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE);
29 | }
30 |
31 | protected function configureOptions(OptionsResolver $resolver): static
32 | {
33 | parent::configureOptions($resolver);
34 |
35 | $resolver
36 | ->setDefault('operator', 'LIKE')
37 | ->setDefault(
38 | 'rightExpr',
39 | function ($value) {
40 | return '%' . $value . '%';
41 | }
42 | );
43 |
44 | $resolver
45 | ->setDefault('raw', false)
46 | ->setAllowedTypes('raw', 'bool')
47 | ;
48 |
49 | return $this;
50 | }
51 |
52 | public function isRaw(): bool
53 | {
54 | return $this->options['raw'];
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/src/Column/TwigColumn.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | class TwigColumn extends AbstractColumn
25 | {
26 | protected readonly Environment $twig;
27 |
28 | public function __construct(?Environment $twig = null)
29 | {
30 | if (null === $twig) {
31 | throw new MissingDependencyException('You must have TwigBundle installed to use ' . static::class);
32 | }
33 | $this->twig = $twig;
34 | }
35 |
36 | protected function render($value, $context): mixed
37 | {
38 | return $this->twig->render($this->getTemplate(), [
39 | 'row' => $context,
40 | 'value' => $value,
41 | 'column' => $this,
42 | ]);
43 | }
44 |
45 | public function normalize(mixed $value): mixed
46 | {
47 | return $value;
48 | }
49 |
50 | protected function configureOptions(OptionsResolver $resolver): static
51 | {
52 | parent::configureOptions($resolver);
53 |
54 | $resolver
55 | ->setRequired('template')
56 | ->setAllowedTypes('template', 'string')
57 | ->setDefault('operator', 'LIKE')
58 | ->setDefault(
59 | 'rightExpr',
60 | function ($value) {
61 | return '%' . $value . '%';
62 | }
63 | );
64 |
65 | return $this;
66 | }
67 |
68 | public function getTemplate(): string
69 | {
70 | return $this->options['template'];
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/src/Column/TwigStringColumn.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | class TwigStringColumn extends TwigColumn
25 | {
26 | public function __construct(?Environment $twig = null)
27 | {
28 | parent::__construct($twig);
29 |
30 | if (!$this->twig->hasExtension(StringLoaderExtension::class)) {
31 | throw new MissingDependencyException('You must have StringLoaderExtension enabled to use ' . self::class);
32 | }
33 | }
34 |
35 | protected function render($value, $context): mixed
36 | {
37 | return $this->twig->render('@DataTables/Column/twig_string.html.twig', [
38 | 'column' => $this,
39 | 'column_template' => $this->getTemplate(),
40 | 'row' => $context,
41 | 'value' => $value,
42 | ]);
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/src/DataTableEvents.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | final class DataTableEvents
21 | {
22 | /**
23 | * The PRE_RESPONSE event is dispatched right before the response
24 | * is generated to allow any last-minute changes based on the table state.
25 | *
26 | * @Event("Omines\DataTablesBundle\Event\DataTablePreResponseEvent")
27 | */
28 | public const PRE_RESPONSE = 'omines_datatables.pre_response';
29 |
30 | /**
31 | * The POST_RESPONSE event is dispatched right after the response
32 | * is generated but before it is returned.
33 | *
34 | * @Event("Omines\DataTablesBundle\Event\DataTablePostResponseEvent")
35 | */
36 | public const POST_RESPONSE = 'omines_datatables.post_response';
37 | }
38 |
--------------------------------------------------------------------------------
/src/DataTableRendererInterface.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | interface DataTableRendererInterface
21 | {
22 | /**
23 | * Provides the HTML layout of the configured datatable.
24 | *
25 | * @param array $parameters
26 | */
27 | public function renderDataTable(DataTable $dataTable, string $template, array $parameters): string;
28 | }
29 |
--------------------------------------------------------------------------------
/src/DataTableTypeInterface.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | interface DataTableTypeInterface
21 | {
22 | /**
23 | * @param array $options
24 | */
25 | public function configure(DataTable $dataTable, array $options): void;
26 | }
27 |
--------------------------------------------------------------------------------
/src/DataTablesBundle.php:
--------------------------------------------------------------------------------
1 |
25 | */
26 | class DataTablesBundle extends Bundle
27 | {
28 | public function build(ContainerBuilder $container): void
29 | {
30 | parent::build($container);
31 |
32 | $container->addCompilerPass(new LocatorRegistrationPass());
33 | }
34 |
35 | public function getContainerExtension(): ?ExtensionInterface
36 | {
37 | return new DataTablesExtension();
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/DependencyInjection/Compiler/LocatorRegistrationPass.php:
--------------------------------------------------------------------------------
1 |
30 | */
31 | class LocatorRegistrationPass implements CompilerPassInterface
32 | {
33 | public function process(ContainerBuilder $container): void
34 | {
35 | $container->getDefinition(Instantiator::class)
36 | ->setArguments([[
37 | AdapterInterface::class => $this->registerLocator($container, 'adapter'),
38 | AbstractColumn::class => $this->registerLocator($container, 'column'),
39 | DataTableTypeInterface::class => $this->registerLocator($container, 'type'),
40 | DataTableExporterInterface::class => $this->registerLocator($container, 'exporter'),
41 | ]]);
42 | }
43 |
44 | private function registerLocator(ContainerBuilder $container, string $baseTag): Definition
45 | {
46 | $types = [];
47 | foreach ($container->findTaggedServiceIds("datatables.{$baseTag}") as $serviceId => $tag) {
48 | $types[$serviceId] = new Reference($serviceId);
49 | }
50 |
51 | return $container
52 | ->register("datatables.{$baseTag}_locator", ServiceLocator::class)
53 | ->addTag('container.service_locator')
54 | ->setPublic(false)
55 | ->setArguments([$types])
56 | ;
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/src/DependencyInjection/DataTablesExtension.php:
--------------------------------------------------------------------------------
1 |
29 | */
30 | class DataTablesExtension extends Extension
31 | {
32 | public function load(array $configs, ContainerBuilder $container): void
33 | {
34 | $configuration = new Configuration();
35 | $config = $this->processConfiguration($configuration, $configs);
36 |
37 | $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
38 | $loader->load('services.xml');
39 |
40 | $container->setAlias('datatables.renderer', $config['renderer']);
41 | unset($config['renderer']);
42 |
43 | $container->setParameter('datatables.config', $config);
44 |
45 | $container->registerForAutoconfiguration(AbstractColumn::class)
46 | ->addTag('datatables.column')
47 | ->setShared(false);
48 | $container->registerForAutoconfiguration(AbstractFilter::class)
49 | ->addTag('datatables.filter')
50 | ->setShared(false);
51 | $container->registerForAutoconfiguration(AdapterInterface::class)
52 | ->addTag('datatables.adapter')
53 | ->setShared(false);
54 | $container->registerForAutoconfiguration(DataTableTypeInterface::class)
55 | ->addTag('datatables.type');
56 | $container->registerForAutoconfiguration(DataTableExporterInterface::class)
57 | ->addTag('datatables.exporter');
58 | }
59 |
60 | public function getAlias(): string
61 | {
62 | // Default would underscore the camelcase unintuitively
63 | return 'datatables';
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/src/Event/DataTableEvent.php:
--------------------------------------------------------------------------------
1 |
22 | */
23 | abstract class DataTableEvent extends Event
24 | {
25 | /**
26 | * DataTableEvent constructor.
27 | */
28 | public function __construct(
29 | protected readonly DataTable $table,
30 | ) {
31 | }
32 |
33 | public function getTable(): DataTable
34 | {
35 | return $this->table;
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/Event/DataTablePostResponseEvent.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | class DataTablePostResponseEvent extends DataTableResponseEvent
21 | {
22 | }
23 |
--------------------------------------------------------------------------------
/src/Event/DataTablePreResponseEvent.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | class DataTablePreResponseEvent extends DataTableResponseEvent
21 | {
22 | }
23 |
--------------------------------------------------------------------------------
/src/Event/DataTableResponseEvent.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | abstract class DataTableResponseEvent extends DataTableEvent
23 | {
24 | public function getResponse(): Response
25 | {
26 | return $this->table->getResponse();
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/Exception/InvalidArgumentException.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | class InvalidArgumentException extends \InvalidArgumentException
21 | {
22 | }
23 |
--------------------------------------------------------------------------------
/src/Exception/InvalidConfigurationException.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | class InvalidConfigurationException extends \RuntimeException
21 | {
22 | }
23 |
--------------------------------------------------------------------------------
/src/Exception/InvalidStateException.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | class InvalidStateException extends \RuntimeException
21 | {
22 | }
23 |
--------------------------------------------------------------------------------
/src/Exception/MissingDependencyException.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | class MissingDependencyException extends \LogicException
21 | {
22 | }
23 |
--------------------------------------------------------------------------------
/src/Exception/UnknownDataTableExporterException.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | class UnknownDataTableExporterException extends \Exception
23 | {
24 | /**
25 | * UnknownDataTableExporterException constructor.
26 | *
27 | * @param string $name The name of the DataTable exporter that cannot be found
28 | * @param \Traversable $referencedExporters Available DataTable exporters
29 | */
30 | public function __construct(string $name, \Traversable $referencedExporters)
31 | {
32 | $format = <<formatReferencedExporters($referencedExporters)));
39 | }
40 |
41 | /**
42 | * @param \Traversable $referencedExporters
43 | */
44 | private function formatReferencedExporters(\Traversable $referencedExporters): string
45 | {
46 | $names = [];
47 |
48 | /** @var DataTableExporterInterface $exporter */
49 | foreach ($referencedExporters as $exporter) {
50 | $names[] = sprintf('"%s"', $exporter->getName());
51 | }
52 |
53 | return implode(', ', $names);
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/src/Exporter/AbstractDataTableExporter.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | class CsvExporter extends AbstractDataTableExporter
23 | {
24 | #[\Override]
25 | public function export(array $columnNames, \Iterator $data, array $columnOptions): \SplFileInfo
26 | {
27 | $filePath = sys_get_temp_dir() . '/' . uniqid('dt') . '.csv';
28 |
29 | if (false === ($file = fopen($filePath, 'w'))) {
30 | throw new \RuntimeException('Failed to create temporary file at ' . $filePath); // @codeCoverageIgnore
31 | }
32 |
33 | fputcsv($file, $columnNames, escape: '\\');
34 |
35 | foreach ($data as $row) {
36 | fputcsv($file, array_map('strip_tags', $row), escape: '\\');
37 | }
38 |
39 | fclose($file);
40 |
41 | return new \SplFileInfo($filePath);
42 | }
43 |
44 | public function getMimeType(): string
45 | {
46 | return 'text/csv';
47 | }
48 |
49 | public function getName(): string
50 | {
51 | return 'csv';
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/Exporter/DataTableExporterCollection.php:
--------------------------------------------------------------------------------
1 |
22 | */
23 | class DataTableExporterCollection
24 | {
25 | /** @var \Traversable */
26 | private \Traversable $exporters;
27 |
28 | /**
29 | * @param \Traversable $exporters
30 | */
31 | public function __construct(\Traversable $exporters)
32 | {
33 | $this->exporters = $exporters;
34 | }
35 |
36 | /**
37 | * Finds a DataTable exporter that matches the given name.
38 | *
39 | * @throws UnknownDataTableExporterException when the exporter with the given name cannot be found
40 | */
41 | public function getByName(string $name): DataTableExporterInterface
42 | {
43 | foreach ($this->exporters as $exporter) {
44 | if ($exporter->getName() === $name) {
45 | return $exporter;
46 | }
47 | }
48 |
49 | throw new UnknownDataTableExporterException($name, $this->exporters);
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/Exporter/DataTableExporterEvents.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | final class DataTableExporterEvents
21 | {
22 | /**
23 | * The PRE_RESPONSE event is dispatched before sending
24 | * the BinaryFileResponse to the user.
25 | *
26 | * Note that the file is accessible through the Response object.
27 | * Both the file and the Response can be modified before being sent.
28 | *
29 | * @Event("Omines\DataTablesBundle\Exporter\Event\DataTableExporterResponseEvent")
30 | */
31 | public const PRE_RESPONSE = 'omines_datatables.exporter.pre_response';
32 | }
33 |
--------------------------------------------------------------------------------
/src/Exporter/DataTableExporterInterface.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | interface DataTableExporterInterface
23 | {
24 | /**
25 | * Exports the data from the DataTable to a file.
26 | *
27 | * @param list $columnNames
28 | * @param list> $columnOptions the parsed options for each column
29 | */
30 | public function export(array $columnNames, \Iterator $data, array $columnOptions): \SplFileInfo;
31 |
32 | /**
33 | * The MIME type of the exported file.
34 | */
35 | public function getMimeType(): string;
36 |
37 | /**
38 | * A unique name to identify the exporter.
39 | */
40 | public function getName(): string;
41 |
42 | /**
43 | * Configures the per-column options available for the exporter.
44 | *
45 | * The manager will resolve the options using the options array set in
46 | * `exporterOptions` of AbstractColumn.
47 | */
48 | public function configureColumnOptions(OptionsResolver $resolver): void;
49 |
50 | /**
51 | * Returns whether the exporter supports non-string data.
52 | *
53 | * The exporter should convert input types to the appropriate output types (e.g. an
54 | * int becomes a number type in Excel). Non-supported types should be cast to a
55 | * string.
56 | *
57 | * When this is true, `AbstractColumn::normalize()` and `AbstractColumn::render()`
58 | * will not be called.
59 | */
60 | public function supportsRawData(): bool;
61 | }
62 |
--------------------------------------------------------------------------------
/src/Exporter/Event/DataTableExporterResponseEvent.php:
--------------------------------------------------------------------------------
1 |
22 | */
23 | class DataTableExporterResponseEvent extends Event
24 | {
25 | /** @var BinaryFileResponse */
26 | private $response;
27 |
28 | /**
29 | * DataTableExporterResponseEvent constructor.
30 | */
31 | public function __construct(BinaryFileResponse $response)
32 | {
33 | $this->response = $response;
34 | }
35 |
36 | public function getResponse(): BinaryFileResponse
37 | {
38 | return $this->response;
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/Filter/AbstractFilter.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | protected array $options = [];
23 |
24 | public function __construct()
25 | {
26 | // Initialize the options with the default values set on the OptionsResolver
27 | $this->set([]);
28 | }
29 |
30 | /**
31 | * @param array $options
32 | */
33 | public function set(array $options): static
34 | {
35 | $resolver = new OptionsResolver();
36 | $this->configureOptions($resolver);
37 | $this->options = $resolver->resolve($options);
38 |
39 | return $this;
40 | }
41 |
42 | protected function configureOptions(OptionsResolver $resolver): static
43 | {
44 | $resolver->setRequired([
45 | 'template_html',
46 | 'template_js',
47 | ]);
48 |
49 | return $this;
50 | }
51 |
52 | public function getTemplateHtml(): string
53 | {
54 | return $this->options['template_html'];
55 | }
56 |
57 | public function getTemplateJs(): string
58 | {
59 | return $this->options['template_js'];
60 | }
61 |
62 | abstract public function isValidValue(mixed $value): bool;
63 | }
64 |
--------------------------------------------------------------------------------
/src/Filter/ChoiceFilter.php:
--------------------------------------------------------------------------------
1 | setDefaults([
25 | 'template_html' => '@DataTables/Filter/select.html.twig',
26 | 'template_js' => '@DataTables/Filter/select.js.twig',
27 | 'placeholder' => null,
28 | 'choices' => [],
29 | ])
30 | ->setAllowedTypes('placeholder', ['null', 'string'])
31 | ->setAllowedTypes('choices', ['array']);
32 |
33 | return $this;
34 | }
35 |
36 | public function getPlaceholder(): ?string
37 | {
38 | return $this->options['placeholder'];
39 | }
40 |
41 | /**
42 | * @return string[]
43 | */
44 | public function getChoices(): array
45 | {
46 | return $this->options['choices'];
47 | }
48 |
49 | public function isValidValue(mixed $value): bool
50 | {
51 | return array_key_exists($value, $this->getChoices());
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/Filter/TextFilter.php:
--------------------------------------------------------------------------------
1 | setDefaults([
25 | 'template_html' => '@DataTables/Filter/text.html.twig',
26 | 'template_js' => '@DataTables/Filter/text.js.twig',
27 | 'placeholder' => null,
28 | ])
29 | ->setAllowedTypes('placeholder', ['null', 'string']);
30 |
31 | return $this;
32 | }
33 |
34 | public function getPlaceholder(): ?string
35 | {
36 | return $this->options['placeholder'];
37 | }
38 |
39 | public function isValidValue(mixed $value): bool
40 | {
41 | return true;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.af.yml:
--------------------------------------------------------------------------------
1 | file: Afrikaans.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ar.yml:
--------------------------------------------------------------------------------
1 | file: Arabic.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.az.yml:
--------------------------------------------------------------------------------
1 | file: Azerbaijan.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.be.yml:
--------------------------------------------------------------------------------
1 | file: Belarusian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.bg.yml:
--------------------------------------------------------------------------------
1 | file: Bulgarian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.bn.yml:
--------------------------------------------------------------------------------
1 | file: Bangla.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ca.yml:
--------------------------------------------------------------------------------
1 | file: Catalan.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.cs.yml:
--------------------------------------------------------------------------------
1 | file: Czech.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.cy.yml:
--------------------------------------------------------------------------------
1 | file: Welsh.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.da.yml:
--------------------------------------------------------------------------------
1 | file: Danish.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.de.yml:
--------------------------------------------------------------------------------
1 | file: German.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.el.yml:
--------------------------------------------------------------------------------
1 | file: Greek.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.en.yml:
--------------------------------------------------------------------------------
1 | file: English.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.es.yml:
--------------------------------------------------------------------------------
1 | file: Spanish.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.et.yml:
--------------------------------------------------------------------------------
1 | file: Estonian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.eu.yml:
--------------------------------------------------------------------------------
1 | file: Basque.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.fa.yml:
--------------------------------------------------------------------------------
1 | file: Persian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.fi.yml:
--------------------------------------------------------------------------------
1 | file: Finnish.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.fr.yml:
--------------------------------------------------------------------------------
1 | file: French.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ga.yml:
--------------------------------------------------------------------------------
1 | file: Irish.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.gl.yml:
--------------------------------------------------------------------------------
1 | file: Galician.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.gu.yml:
--------------------------------------------------------------------------------
1 | file: Gujarati.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.he.yml:
--------------------------------------------------------------------------------
1 | file: Hebrew.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.hi.yml:
--------------------------------------------------------------------------------
1 | file: Hindi.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.hr.yml:
--------------------------------------------------------------------------------
1 | file: Croatian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.hu.yml:
--------------------------------------------------------------------------------
1 | file: Hungarian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.hy.yml:
--------------------------------------------------------------------------------
1 | file: Armenian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.id.yml:
--------------------------------------------------------------------------------
1 | file: Indonesian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.is.yml:
--------------------------------------------------------------------------------
1 | file: Icelandic.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.it.yml:
--------------------------------------------------------------------------------
1 | file: Italian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ja.yml:
--------------------------------------------------------------------------------
1 | file: Japanese.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ka.yml:
--------------------------------------------------------------------------------
1 | file: Georgian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ko.yml:
--------------------------------------------------------------------------------
1 | file: Korean.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.lt.yml:
--------------------------------------------------------------------------------
1 | file: Lithuanian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.lv.yml:
--------------------------------------------------------------------------------
1 | file: Latvian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.mk.yml:
--------------------------------------------------------------------------------
1 | file: Macedonian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.mn.yml:
--------------------------------------------------------------------------------
1 | file: Mongolian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ms.yml:
--------------------------------------------------------------------------------
1 | file: Malay.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.nb.yml:
--------------------------------------------------------------------------------
1 | file: Norwegian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ne.yml:
--------------------------------------------------------------------------------
1 | file: Nepali.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.nl.yml:
--------------------------------------------------------------------------------
1 | file: Dutch.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.nn.yml:
--------------------------------------------------------------------------------
1 | file: Norwegian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.pl.yml:
--------------------------------------------------------------------------------
1 | file: Polish.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ps.yml:
--------------------------------------------------------------------------------
1 | file: Pashto.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.pt.yml:
--------------------------------------------------------------------------------
1 | file: Portuguese.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ro.yml:
--------------------------------------------------------------------------------
1 | file: Romanian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ru.yml:
--------------------------------------------------------------------------------
1 | file: Russian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.si.yml:
--------------------------------------------------------------------------------
1 | file: Sinhala.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.sk.yml:
--------------------------------------------------------------------------------
1 | file: Slovak.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.sl.yml:
--------------------------------------------------------------------------------
1 | file: Slovenian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.sq.yml:
--------------------------------------------------------------------------------
1 | file: Albanian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.sr.yml:
--------------------------------------------------------------------------------
1 | file: Serbian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.sv.yml:
--------------------------------------------------------------------------------
1 | file: Swedish.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.sw.yml:
--------------------------------------------------------------------------------
1 | file: Swahili.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ta.yml:
--------------------------------------------------------------------------------
1 | file: Tamil.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.te.yml:
--------------------------------------------------------------------------------
1 | file: Telugu.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.th.yml:
--------------------------------------------------------------------------------
1 | file: Thai.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.tr.yml:
--------------------------------------------------------------------------------
1 | file: Turkish.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.uk.yml:
--------------------------------------------------------------------------------
1 | file: Ukranian.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.ur.yml:
--------------------------------------------------------------------------------
1 | file: Urdu.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.uz.yml:
--------------------------------------------------------------------------------
1 | file: Uzbek.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.vi.yml:
--------------------------------------------------------------------------------
1 | file: Vietnamese.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/DataTablesCDN.zh.yml:
--------------------------------------------------------------------------------
1 | file: Chinese.json
2 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.af.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Geen data beskikbaar in tabel'
6 | info: 'uitstalling _START_ to _END_ of _TOTAL_ inskrywings'
7 | infoEmpty: 'uitstalling 0 to 0 of 0 inskrywings'
8 | infoFiltered: '(gefiltreer uit _MAX_ totaal inskrywings)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'uitstal _MENU_ inskrywings'
12 | loadingRecords: laai...
13 | processing: verwerking...
14 | search: 'soektog:'
15 | zeroRecords: 'Geen treffers gevind'
16 | paginate:
17 | first: eerste
18 | last: laaste
19 | next: volgende
20 | previous: vorige
21 | aria:
22 | sortAscending: ': aktiveer kolom stygende te sorteer'
23 | sortDescending: ': aktiveer kolom orde te sorteer'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.am.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'ባዶ ሰንጠረዥ'
6 | info: 'ከጠቅላላው _TOTAL_ ዝርዝሮች ውስጥ ከ _START_ እስከ _END_ ያሉት ዝርዝር'
7 | infoEmpty: 'ከጠቅላላው 0 ዝርዝሮች ውስጥ ከ 0 እስከ 0 ያሉት ዝርዝር'
8 | infoFiltered: '(ከጠቅላላው _MAX_ የተመረጡ ዝርዝሮች)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'የዝርዝሮች ብዛት _MENU_'
12 | loadingRecords: 'በማቅረብ ላይ...'
13 | processing: 'በማቀናበር ላይ...'
14 | search: 'ፈልግ:'
15 | zeroRecords: 'ከሚፈለገው ጋር የሚሚሳሰል ዝርዝር አልተገኘም'
16 | paginate:
17 | first: መጀመሪያ
18 | last: መጨረሻ
19 | next: ቀጣዩ
20 | previous: የበፊቱ
21 | aria:
22 | sortAscending: ': ከመጀመሪያ ወደ መጨረሻ(ወጪ) አደራደር'
23 | sortDescending: ': ከመጨረሻ ወደ መጀመሪያ(ወራጅ) አደራደር'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ar.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: 'هل أنت متأكد ؟'
4 | you_need_to_select_at_least_one_element: 'تحتاج إلى تحديد عنصر واحد على الأقل.'
5 | search: بحث
6 | execute: تنفيذ
7 | ok: حسنا
8 | datatable:
9 | searchPlaceholder: ''
10 | processing: 'جارٍ التحميل...'
11 | lengthMenu: 'أظهر _MENU_ مدخلات'
12 | zeroRecords: 'لم يعثر على أية سجلات'
13 | info: 'إظهار _START_ إلى _END_ من أصل _TOTAL_ مدخل'
14 | infoEmpty: 'يعرض 0 إلى 0 من أصل 0 سجل'
15 | infoFiltered: '(منتقاة من مجموع _MAX_ مُدخل)'
16 | infoPostFix: ''
17 | search: 'ابحث:'
18 | paginate:
19 | first: الأول
20 | previous: السابق
21 | next: التالي
22 | last: الأخير
23 | aria:
24 | sortAscending: ': تفعيل لترتيب العمود تصاعدياً'
25 | sortDescending: ': تفعيل لترتيب العمود تنازلياً'
26 | emptyTable: 'ليست هناك بيانات متاحة في الجدول'
27 | loadingRecords: 'جارٍ التحميل...'
28 | url: ''
29 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.az.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Cədvəldə heç bir məlumat yoxdur'
6 | info: ' _TOTAL_ Nəticədən _START_ - _END_ Arası Nəticələr'
7 | infoEmpty: 'Nəticə Yoxdur'
8 | infoFiltered: '( _MAX_ Nəticə İçindən Tapılanlar)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'Səhifədə _MENU_ Nəticə Göstər'
12 | loadingRecords: Yüklənir...
13 | processing: Gözləyin...
14 | search: 'Axtarış:'
15 | zeroRecords: 'Nəticə Tapılmadı.'
16 | paginate:
17 | first: İlk
18 | last: Axırıncı
19 | next: Sonraki
20 | previous: Öncəki
21 | aria:
22 | sortAscending: ': sütunu artma sırası üzərə aktiv etmək'
23 | sortDescending: ': sütunu azalma sırası üzərə aktiv etmək'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.be.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: Пачакайце...
6 | lengthMenu: 'Паказваць _MENU_ запісаў'
7 | zeroRecords: 'Запісы адсутнічаюць.'
8 | info: 'Запісы з _START_ па _END_ з _TOTAL_ запісаў'
9 | infoEmpty: 'Запісы з 0 па 0 з 0 запісаў'
10 | infoFiltered: '(адфільтравана з _MAX_ запісаў)'
11 | infoPostFix: ''
12 | search: 'Пошук:'
13 | url: ''
14 | paginate:
15 | first: Першая
16 | previous: Папярэдняя
17 | next: Наступная
18 | last: Апошняя
19 | aria:
20 | sortAscending: ': актываваць для сартавання слупка па ўзрастанні'
21 | sortDescending: ': актываваць для сартавання слупка па змяншэнні'
22 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.bg.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: 'Обработка на резултатите...'
6 | lengthMenu: 'Показване на _MENU_ резултата'
7 | zeroRecords: 'Няма намерени резултати'
8 | info: 'Показване на резултати от _START_ до _END_ от общо _TOTAL_'
9 | infoEmpty: 'Показване на резултати от 0 до 0 от общо 0'
10 | infoFiltered: '(филтрирани от общо _MAX_ резултата)'
11 | infoPostFix: ''
12 | search: 'Търсене:'
13 | url: ''
14 | paginate:
15 | first: Първа
16 | previous: Предишна
17 | next: Следваща
18 | last: Последна
19 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.bn.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: 'প্রসেসিং হচ্ছে...'
6 | lengthMenu: '_MENU_ টা এন্ট্রি দেখাও'
7 | zeroRecords: 'আপনি যা অনুসন্ধান করেছেন তার সাথে মিলে যাওয়া কোন রেকর্ড খুঁজে পাওয়া যায় নাই'
8 | info: '_TOTAL_ টা এন্ট্রির মধ্যে _START_ থেকে _END_ পর্যন্ত দেখানো হচ্ছে'
9 | infoEmpty: 'কোন এন্ট্রি খুঁজে পাওয়া যায় নাই'
10 | infoFiltered: '(মোট _MAX_ টা এন্ট্রির মধ্যে থেকে বাছাইকৃত)'
11 | infoPostFix: ''
12 | search: 'অনুসন্ধান:'
13 | url: ''
14 | paginate:
15 | first: প্রথমটা
16 | previous: আগেরটা
17 | next: পরবর্তীটা
18 | last: শেষেরটা
19 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ca.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: Processant...
6 | lengthMenu: 'Mostra _MENU_ registres'
7 | zeroRecords: 'No s''han trobat registres.'
8 | info: 'Mostrant de _START_ a _END_ de _TOTAL_ registres'
9 | infoEmpty: 'Mostrant de 0 a 0 de 0 registres'
10 | infoFiltered: '(filtrat de _MAX_ total registres)'
11 | infoPostFix: ''
12 | search: 'Filtrar:'
13 | url: ''
14 | paginate:
15 | first: Primer
16 | previous: Anterior
17 | next: Següent
18 | last: Últim
19 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.cn.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: "你确定吗 ?"
4 | you_need_to_select_at_least_one_element: "您需要至少选择一个元素"
5 | search: "搜索"
6 | execute: "执"
7 | ok: "OK"
8 | datatable:
9 | searchPlaceholder: ""
10 | emptyTable: "表中数据为空"
11 | info: "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项"
12 | infoEmpty: "显示第 0 至 0 项结果,共 0 项"
13 | infoFiltered: "(由 _MAX_ 项结果过滤)"
14 | infoPostFix: ""
15 | infoThousands: ","
16 | lengthMenu: "显示 _MENU_ 项结果"
17 | loadingRecords: "载入中..."
18 | processing: "处理中..."
19 | search: "搜索:"
20 | zeroRecords: "没有匹配结果"
21 | paginate:
22 | first: "首页"
23 | last: "末页"
24 | next: "下页"
25 | previous: "上页"
26 | aria:
27 | sortAscending: ": 以升序排列此列"
28 | sortDescending: ": 以降序排列此列"
29 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.cs.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: 'Jste si jisti?'
4 | you_need_to_select_at_least_one_element: 'Musíte vybrat alespoň jeden prvek.'
5 | search: Hledat
6 | execute: Vykonat
7 | ok: OK
8 | datatable:
9 | searchPlaceholder: ''
10 | emptyTable: 'Tabulka neobsahuje žádná data'
11 | info: 'Zobrazuji _START_ až _END_ z celkem _TOTAL_ záznamů'
12 | infoEmpty: 'Zobrazuji 0 až 0 z 0 záznamů'
13 | infoFiltered: '(filtrováno z celkem _MAX_ záznamů)'
14 | infoPostFix: ''
15 | infoThousands: ' '
16 | lengthMenu: 'Zobraz záznamů _MENU_'
17 | loadingRecords: Načítám...
18 | processing: Provádím...
19 | search: 'Hledat:'
20 | zeroRecords: 'Žádné záznamy nebyly nalezeny'
21 | paginate:
22 | first: První
23 | last: Poslední
24 | next: Další
25 | previous: Předchozí
26 | aria:
27 | sortAscending: ': aktivujte pro řazení sloupce vzestupně'
28 | sortDescending: ': aktivujte pro řazení sloupce sestupně'
29 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.cy.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Dim data ar gael yn y tabl'
6 | info: 'Dangos _START_ i _END_ o _TOTAL_ cofnod'
7 | infoEmpty: 'Dangos 0 i 0 o 0 cofnod'
8 | infoFiltered: '(wedi hidlo o gyfanswm o _MAX_ cofnod)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'Dangos _MENU_ cofnod'
12 | loadingRecords: 'Wrthi''n llwytho...'
13 | processing: 'Wrthi''n prosesu...'
14 | search: 'Chwilio:'
15 | zeroRecords: 'Heb ddod o hyd i gofnodion sy''n cyfateb'
16 | paginate:
17 | first: Cyntaf
18 | last: Olaf
19 | next: Nesaf
20 | previous: Blaenorol
21 | aria:
22 | sortAscending: ': rhoi ar waith i drefnu colofnau o''r lleiaf i''r mwyaf'
23 | sortDescending: ': rhoi ar waith i drefnu colofnau o''r mwyaf i''r lleiaf'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.da.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: Henter...
6 | lengthMenu: 'Vis _MENU_ linjer'
7 | zeroRecords: 'Ingen linjer matcher søgningen'
8 | info: 'Viser _START_ til _END_ af _TOTAL_ linjer'
9 | infoEmpty: 'Viser 0 til 0 af 0 linjer'
10 | infoFiltered: '(filtreret fra _MAX_ linjer)'
11 | infoPostFix: ''
12 | search: 'Søg:'
13 | url: ''
14 | paginate:
15 | first: 'Første'
16 | previous: Forrige
17 | next: 'Næste'
18 | last: Sidste
19 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.de.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: "Bist du sicher?"
4 | you_need_to_select_at_least_one_element: "Sie müssen mindestens ein Element auswählen."
5 | search: Suchen
6 | execute: "Ausführen"
7 | ok: "OK"
8 | datatable:
9 | searchPlaceholder: ""
10 | emptyTable: "Keine Daten in der Tabelle vorhanden"
11 | info: "_START_ bis _END_ von _TOTAL_ Einträgen"
12 | infoEmpty: "0 bis 0 von 0 Einträgen"
13 | infoFiltered: " (gefiltert von _MAX_ Einträgen)"
14 | infoPostFix: ""
15 | infoThousands: "."
16 | lengthMenu: "_MENU_ Einträge anzeigen"
17 | loadingRecords: "Wird geladen..."
18 | processing: "Bitte warten..."
19 | search: "Suchen"
20 | zeroRecords: "Keine Einträge vorhanden."
21 | paginate:
22 | first: "Erste"
23 | last: "Letzte"
24 | next: "Nächste"
25 | previous: "Vorherige"
26 | aria:
27 | sortAscending: ": zu aktivieren, um Spalte aufsteigend zu sortieren"
28 | sortDescending: ": zu aktivieren, um Spalte absteigend sortieren"
29 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.el.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: Αναζήτηση
5 | decimal: ','
6 | emptyTable: 'Δεν υπάρχουν δεδομένα στον πίνακα'
7 | info: 'Εμφανίζονται _START_ έως _END_ από _TOTAL_ εγγραφές'
8 | infoEmpty: 'Εμφανίζονται 0 έως 0 από 0 εγγραφές'
9 | infoFiltered: '(φιλτραρισμένες από _MAX_ συνολικά εγγραφές)'
10 | infoPostFix: ''
11 | infoThousands: .
12 | lengthMenu: 'Δείξε _MENU_ εγγραφές'
13 | loadingRecords: Φόρτωση...
14 | processing: Επεξεργασία...
15 | search: 'Αναζήτηση:'
16 | thousands: .
17 | url: ''
18 | zeroRecords: 'Δεν βρέθηκαν εγγραφές που να ταιριάζουν'
19 | paginate:
20 | first: Πρώτη
21 | previous: Προηγούμενη
22 | next: Επόμενη
23 | last: Τελευταία
24 | aria:
25 | sortAscending: ': ενεργοποιήστε για αύξουσα ταξινόμηση της στήλης'
26 | sortDescending: ': ενεργοποιήστε για φθίνουσα ταξινόμηση της στήλης'
27 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.en.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: 'Are you sure ?'
4 | you_need_to_select_at_least_one_element: 'You need to select at least one element.'
5 | search: Search
6 | execute: Execute
7 | ok: OK
8 | datatable:
9 | searchPlaceholder: ''
10 | emptyTable: 'No data available in table'
11 | info: 'Showing _START_ to _END_ of _TOTAL_ entries'
12 | infoEmpty: 'Showing 0 to 0 of 0 entries'
13 | infoFiltered: '(filtered from _MAX_ total entries)'
14 | infoPostFix: ''
15 | infoThousands: ','
16 | lengthMenu: 'Show _MENU_ entries'
17 | loadingRecords: Loading...
18 | processing: Processing...
19 | search: 'Search:'
20 | zeroRecords: 'No matching records found'
21 | paginate:
22 | first: First
23 | last: Last
24 | next: Next
25 | previous: Previous
26 | aria:
27 | sortAscending: ': activate to sort column ascending'
28 | sortDescending: ': activate to sort column descending'
29 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.eo.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Neniuj datumoj en tabelo'
6 | info: 'Montras _START_ ĝis _END_ el _TOTAL_ vicoj'
7 | infoEmpty: 'Montras 0 ĝis 0 el 0 vicoj'
8 | infoFiltered: '(filtrita el entute _MAX_ vicoj)'
9 | infoPostFix: ''
10 | infoThousands: .
11 | lengthMenu: 'Montri _MENU_ vicojn'
12 | loadingRecords: 'Ŝarĝas ...'
13 | processing: 'Pretigas ...'
14 | search: 'Serĉi:'
15 | zeroRecords: 'Neniuj rezultoj trovitaj'
16 | paginate:
17 | first: Unua
18 | last: Lasta
19 | next: Venonta
20 | previous: Antaŭa
21 | aria:
22 | sortAscending: ': aktivigi por filtri kolumnon kreskante'
23 | sortDescending: ': aktivigi por filtri kolumnon malkreskante'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.es.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: 'Estas seguro ?'
4 | you_need_to_select_at_least_one_element: 'Debe seleccionar al menos un elemento.'
5 | search: Buscar
6 | execute: ''
7 | ok: OK
8 | datatable:
9 | searchPlaceholder: ''
10 | emptyTable: 'Ningún dato disponible en esta tabla'
11 | info: 'Mostrando registros del _START_ al _END_ de un total de _TOTAL_ registros'
12 | infoEmpty: 'Mostrando registros del 0 al 0 de un total de 0 registros'
13 | infoFiltered: '(filtrado de un total de _MAX_ registros)'
14 | infoPostFix: ''
15 | infoThousands: ','
16 | lengthMenu: 'Mostrar _MENU_ registros'
17 | loadingRecords: Cargando...
18 | processing: Procesando...
19 | search: 'Buscar:'
20 | zeroRecords: 'No se encontraron resultados'
21 | paginate:
22 | first: Primero
23 | last: Último
24 | next: Siguiente
25 | previous: Anterior
26 | aria:
27 | sortAscending: ': Activar para ordenar la columna de manera ascendente'
28 | sortDescending: ': Activar para ordenar la columna de manera descendente'
29 | url: ''
30 | buttons:
31 | copy: Copiar
32 | colvis: Visibilidad
33 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.et.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: 'Palun oodake, koostan kuvamiseks nimekirja!'
6 | lengthMenu: 'Näita kirjeid _MENU_ kaupa'
7 | zeroRecords: 'Otsitavat vastet ei leitud.'
8 | info: 'Kuvatud: _TOTAL_ kirjet (_START_-_END_)'
9 | infoEmpty: 'Otsinguvasteid ei leitud'
10 | infoFiltered: ' - filteeritud _MAX_ kirje seast.'
11 | infoPostFix: 'Kõik kuvatud kirjed põhinevad reaalsetel tulemustel.'
12 | search: 'Otsi kõikide tulemuste seast:'
13 | paginate:
14 | first: Algus
15 | previous: Eelmine
16 | next: 'Järgmine'
17 | last: Viimane
18 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.eu.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: Prozesatzen...
6 | lengthMenu: 'Erakutsi _MENU_ erregistro'
7 | zeroRecords: 'Ez da emaitzarik aurkitu'
8 | emptyTable: 'Taula hontan ez dago inongo datu erabilgarririk'
9 | info: '_START_ -etik _END_ -erako erregistroak erakusten, guztira _TOTAL_ erregistro'
10 | infoEmpty: '0tik 0rako erregistroak erakusten, guztira 0 erregistro'
11 | infoFiltered: '(guztira _MAX_ erregistro iragazten)'
12 | infoPostFix: ''
13 | search: 'Aurkitu:'
14 | url: ''
15 | infoThousands: ','
16 | loadingRecords: Abiarazten...
17 | paginate:
18 | first: Lehena
19 | last: Azkena
20 | next: Hurrengoa
21 | previous: Aurrekoa
22 | aria:
23 | sortAscending: ': Zutabea goranzko eran ordenatzeko aktibatu '
24 | sortDescending: ': Zutabea beheranzko eran ordenatzeko aktibatu'
25 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.fa.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'هیچ دادهای در جدول وجود ندارد'
6 | info: 'نمایش _START_ تا _END_ از _TOTAL_ ردیف'
7 | infoEmpty: 'نمایش 0 تا 0 از 0 ردیف'
8 | infoFiltered: '(فیلتر شده از _MAX_ ردیف)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'نمایش _MENU_ ردیف'
12 | loadingRecords: 'در حال بارگزاری...'
13 | processing: 'در حال پردازش...'
14 | search: 'جستجو:'
15 | zeroRecords: 'رکوردی با این مشخصات پیدا نشد'
16 | paginate:
17 | first: 'برگهی نخست'
18 | last: 'برگهی آخر'
19 | next: بعدی
20 | previous: قبلی
21 | aria:
22 | sortAscending: ': فعال سازی نمایش به صورت صعودی'
23 | sortDescending: ': فعال سازی نمایش به صورت نزولی'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.fr.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: Êtes-vous sûr ?
4 | you_need_to_select_at_least_one_element: Vous devez sélectionner au moins un élément.
5 | search: Rechercher
6 | execute: Exécuter
7 | ok: OK
8 | datatable:
9 | searchPlaceholder: ""
10 | processing: "Traitement en cours..."
11 | search: "Rechercher :"
12 | lengthMenu: "Afficher _MENU_ éléments"
13 | info: "Affichage de l'élément _START_ à _END_ sur _TOTAL_ éléments"
14 | infoEmpty: "Affichage de l'élément 0 à 0 sur 0 éléments"
15 | infoFiltered: "(filtré de _MAX_ éléments au total)"
16 | infoPostFix: ""
17 | infoThousands: "."
18 | loadingRecords: "Chargement en cours..."
19 | zeroRecords: "Aucun élément à afficher"
20 | emptyTable: "Aucune donnée disponible dans le tableau"
21 | paginate:
22 | first: "Premier"
23 | previous: "Précédent"
24 | next: "Suivant"
25 | last: "Dernier"
26 | aria:
27 | sortAscending: ": activer pour trier la colonne par ordre croissant"
28 | sortDescending: ": activer pour trier la colonne par ordre décroissant"
29 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ga.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: Próiseáil...
6 | lengthMenu: 'Taispeáin iontrálacha _MENU_'
7 | zeroRecords: 'Gan aon taifead meaitseáil aimsithe'
8 | info: '_START_ Showing a _END_ na n-iontrálacha _TOTAL_'
9 | infoEmpty: 'Showing 0-0 na n-iontrálacha 0'
10 | infoFiltered: '(scagtha ó _MAX_ iontrálacha iomlán)'
11 | infoPostFix: ''
12 | search: 'Cuardaigh:'
13 | url: ''
14 | paginate:
15 | first: 'An Chéad'
16 | previous: 'Roimhe Seo'
17 | next: 'Ar Aghaidh'
18 | last: Last
19 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.gl.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: Procesando...
6 | lengthMenu: 'Mostrar _MENU_ rexistros'
7 | zeroRecords: 'Non se atoparon resultados'
8 | emptyTable: 'Ningún dato dispoñible nesta táboa'
9 | info: 'Mostrando rexistros do _START_ ao _END_ dun total de _TOTAL_ rexistros'
10 | infoEmpty: 'Mostrando rexistros do 0 ao 0 dun total de 0 rexistros'
11 | infoFiltered: '(filtrado dun total de _MAX_ rexistros)'
12 | infoPostFix: ''
13 | search: 'Buscar:'
14 | url: ''
15 | infoThousands: ','
16 | loadingRecords: Cargando...
17 | paginate:
18 | first: Primeiro
19 | last: Último
20 | next: Seguinte
21 | previous: Anterior
22 | aria:
23 | sortAscending: ': Activar para ordenar a columna de maneira ascendente'
24 | sortDescending: ': Activar para ordenar a columna de maneira descendente'
25 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.gu.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'કોષ્ટકમાં કોઈ ડેટા ઉપલબ્ધ નથી'
6 | info: 'કુલ _TOTAL_ માંથી _START_ થી _END_ પ્રવેશો દર્શાવે છે'
7 | infoEmpty: 'કુલ 0 પ્રવેશ માંથી 0 થી 0 બતાવી રહ્યું છે'
8 | infoFiltered: '(_MAX_ કુલ પ્રવેશો માંથી ફિલ્ટર)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'બતાવો _MENU_ પ્રવેશો'
12 | loadingRecords: 'લોડ કરી રહ્યું છે ...'
13 | processing: 'પ્રક્રિયા ...'
14 | search: 'શોધો:'
15 | zeroRecords: 'કોઈ મેળ ખાતા રેકોર્ડ મળ્યા નથી '
16 | paginate:
17 | first: પ્રથમ
18 | last: અંતિમ
19 | next: આગામી
20 | previous: ગત
21 | aria:
22 | sortAscending: ': સ્તંભ ચડતા ક્રમમાં ગોઠવવા માટે સક્રિય'
23 | sortDescending: ': કૉલમ ઉતરતા ક્રમમાં ગોઠવવા માટે સક્રિય'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.he.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: מעבד...
6 | lengthMenu: 'הצג _MENU_ פריטים'
7 | zeroRecords: 'לא נמצאו רשומות מתאימות'
8 | emptyTable: 'לא נמצאו רשומות מתאימות'
9 | info: '_START_ עד _END_ מתוך _TOTAL_ רשומות'
10 | infoEmpty: '0 עד 0 מתוך 0 רשומות'
11 | infoFiltered: '(מסונן מסך _MAX_ רשומות)'
12 | infoPostFix: ''
13 | earch: 'חפש:'
14 | url: ''
15 | paginate:
16 | first: ראשון
17 | previous: קודם
18 | next: הבא
19 | last: אחרון
20 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.hi.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: 'प्रगति पे हैं ...'
6 | lengthMenu: ' _MENU_ प्रविष्टियां दिखाएं '
7 | zeroRecords: 'रिकॉर्ड्स का मेल नहीं मिला'
8 | info: '_START_ to _END_ of _TOTAL_ प्रविष्टियां दिखा रहे हैं'
9 | infoEmpty: '0 में से 0 से 0 प्रविष्टियां दिखा रहे हैं'
10 | infoFiltered: '(_MAX_ कुल प्रविष्टियों में से छठा हुआ)'
11 | infoPostFix: ''
12 | search: 'खोजें:'
13 | url: ''
14 | paginate:
15 | first: प्रथम
16 | previous: पिछला
17 | next: अगला
18 | last: अंतिम
19 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.hr.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Nema podataka u tablici'
6 | info: 'Prikazano _START_ do _END_ od _TOTAL_ rezultata'
7 | infoEmpty: 'Prikazano 0 do 0 od 0 rezultata'
8 | infoFiltered: '(filtrirano iz _MAX_ ukupnih rezultata)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'Prikaži _MENU_ rezultata po stranici'
12 | loadingRecords: Dohvaćam...
13 | processing: Obrađujem...
14 | search: 'Pretraži:'
15 | zeroRecords: 'Ništa nije pronađeno'
16 | paginate:
17 | first: Prva
18 | previous: Nazad
19 | next: Naprijed
20 | last: Zadnja
21 | aria:
22 | sortAscending: ': aktiviraj za rastući poredak'
23 | sortDescending: ': aktiviraj za padajući poredak'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.hy.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Տվյալները բացակայում են'
6 | processing: 'Կատարվում է...'
7 | infoThousands: ','
8 | lengthMenu: 'Ցուցադրել _MENU_ արդյունքներ մեկ էջում'
9 | loadingRecords: 'Բեռնվում է ...'
10 | zeroRecords: 'Հարցմանը համապատասխանող արդյունքներ չկան'
11 | info: 'Ցուցադրված են _START_-ից _END_ արդյունքները ընդհանուր _TOTAL_-ից'
12 | infoEmpty: 'Արդյունքներ գտնված չեն'
13 | infoFiltered: '(ֆիլտրվել է ընդհանուր _MAX_ արդյունքներից)'
14 | infoPostFix: ''
15 | search: Փնտրել
16 | paginate:
17 | first: 'Առաջին էջ'
18 | previous: 'Նախորդ էջ'
19 | next: 'Հաջորդ էջ'
20 | last: 'Վերջին էջ'
21 | aria:
22 | sortAscending: ': ակտիվացրեք աճման կարգով դասավորելու համար'
23 | sortDescending: ': ակտիվացրեք նվազման կարգով դասավորելու համար'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.id.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Tidak ada data yang tersedia pada tabel ini'
6 | processing: 'Sedang memproses...'
7 | lengthMenu: 'Tampilkan _MENU_ entri'
8 | zeroRecords: 'Tidak ditemukan data yang sesuai'
9 | info: 'Menampilkan _START_ sampai _END_ dari _TOTAL_ entri'
10 | infoEmpty: 'Menampilkan 0 sampai 0 dari 0 entri'
11 | infoFiltered: '(disaring dari _MAX_ entri keseluruhan)'
12 | infoPostFix: ''
13 | search: 'Cari:'
14 | url: ''
15 | paginate:
16 | first: Pertama
17 | previous: Sebelumnya
18 | next: Selanjutnya
19 | last: Terakhir
20 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.is.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Engin gögn eru í þessari töflu'
6 | info: 'Sýni _START_ til _END_ af _TOTAL_ færslum'
7 | infoEmpty: 'Sýni 0 til 0 af 0 færslum'
8 | infoFiltered: '(síað út frá _MAX_ færslum)'
9 | infoPostFix: ''
10 | infoThousands: .
11 | lengthMenu: 'Sýna _MENU_ færslur'
12 | loadingRecords: Hleð...
13 | processing: Úrvinnsla...
14 | search: 'Leita:'
15 | zeroRecords: 'Engar færslur fundust'
16 | paginate:
17 | first: Fyrsta
18 | last: Síðasta
19 | next: Næsta
20 | previous: Fyrri
21 | aria:
22 | sortAscending: ': virkja til að raða dálki í hækkandi röð'
23 | sortDescending: ': virkja til að raða dálki lækkandi í röð'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.it.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: 'Sei sicuro ?'
4 | you_need_to_select_at_least_one_element: 'È necessario selezionare almeno un elemento.'
5 | search: Cerca
6 | execute: Eseguire
7 | ok: OK
8 | datatable:
9 | searchPlaceholder: ''
10 | emptyTable: 'Nessun dato presente nella tabella'
11 | info: 'Vista da _START_ a _END_ di _TOTAL_ elementi'
12 | infoEmpty: 'Vista da 0 a 0 di 0 elementi'
13 | infoFiltered: '(filtrati da _MAX_ elementi totali)'
14 | infoPostFix: ''
15 | infoThousands: .
16 | lengthMenu: 'Visualizza _MENU_ elementi'
17 | loadingRecords: Caricamento...
18 | processing: Elaborazione...
19 | search: 'Cerca:'
20 | zeroRecords: 'La ricerca non ha portato alcun risultato.'
21 | paginate:
22 | first: Inizio
23 | last: Fine
24 | next: Successivo
25 | previous: Precedente
26 | aria:
27 | sortAscending: ': attiva per ordinare la colonna in ordine crescente'
28 | sortDescending: ': attiva per ordinare la colonna in ordine decrescente'
29 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ja.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: テーブルにデータがありません
6 | info: ' _TOTAL_ 件中 _START_ から _END_ まで表示'
7 | infoEmpty: ' 0 件中 0 から 0 まで表示'
8 | infoFiltered: '(全 _MAX_ 件より抽出)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: '_MENU_ 件表示'
12 | loadingRecords: 読み込み中...
13 | processing: 処理中...
14 | search: '検索:'
15 | zeroRecords: 一致するレコードがありません
16 | paginate:
17 | first: 先頭
18 | last: 最終
19 | next: 次
20 | previous: 前
21 | aria:
22 | sortAscending: ': 列を昇順に並べ替えるにはアクティブにする'
23 | sortDescending: ': 列を降順に並べ替えるにはアクティブにする'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ka.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'ცხრილში არ არის მონაცემები'
6 | info: 'ნაჩვენებია ჩანაწერები _START_–დან _END_–მდე, _TOTAL_ ჩანაწერიდან'
7 | infoEmpty: 'ნაჩვენებია ჩანაწერები 0–დან 0–მდე, 0 ჩანაწერიდან'
8 | infoFiltered: '(გაფილტრული შედეგი _MAX_ ჩანაწერიდან)'
9 | infoPostFix: ''
10 | infoThousands: .
11 | lengthMenu: 'აჩვენე _MENU_ ჩანაწერი'
12 | loadingRecords: იტვირთება...
13 | processing: მუშავდება...
14 | search: 'ძიება:'
15 | zeroRecords: 'არაფერი მოიძებნა'
16 | paginate:
17 | first: პირველი
18 | last: ბოლო
19 | next: შემდეგი
20 | previous: წინა
21 | aria:
22 | sortAscending: ': სვეტის დალაგება ზრდის მიხედვით'
23 | sortDescending: ': სვეტის დალაგება კლების მიხედვით'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.kk.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: 'Күте тұрыңыз...'
6 | earch: 'Іздеу:'
7 | lengthMenu: 'Жазбалар _MENU_ көрсету'
8 | info: '_TOTAL_ жазбалары бойынша _START_ бастап _END_ дейінгі жазбалар'
9 | infoEmpty: '0 жазбалары бойынша 0 бастап 0 дейінгі жазбалар'
10 | infoFiltered: '(_MAX_ жазбасынан сұрыпталды)'
11 | infoPostFix: ''
12 | loadingRecords: 'Жазбалар жүктемесі...'
13 | zeroRecords: 'Жазбалар жоқ'
14 | emptyTable: 'Кестеде деректер жоқ'
15 | paginate:
16 | first: Бірінші
17 | previous: Алдыңғысы
18 | next: Келесі
19 | last: Соңғы
20 | aria:
21 | ortAscending: ': өсімі бойынша бағанды сұрыптау үшін активациялау'
22 | ortDescending: ': кемуі бойынша бағанды сұрыптау үшін активациялау'
23 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.km.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: មិនមានទិន្នន័យក្នុងតារាងនេះទេ
6 | info: 'បង្ហាញជួរទី _START_ ដល់ទី _END_ ក្នុងចំណោម _TOTAL_ ជួរ'
7 | infoEmpty: 'បង្ហាញជួរទី 0 ដល់ទី 0 ក្នុងចំណោម 0 ជួរ'
8 | infoFiltered: '(បានចម្រាញ់ចេញពីទិន្នន័យសរុប _MAX_ ជួរ)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'បង្ហាញ _MENU_ ជួរ'
12 | loadingRecords: កំពុងផ្ទុក...
13 | processing: កំពុងដំណើរការ...
14 | search: 'ស្វែងរក:'
15 | zeroRecords: មិនមានទិន្នន័យត្រូវតាមលក្ខខណ្ឌស្វែងរកទេ
16 | paginate:
17 | first: ដំបូងគេ
18 | last: ចុងក្រោយ
19 | next: បន្ទាប់
20 | previous: ក្រោយ
21 | aria:
22 | sortAscending: ': ចុចដើម្បីរៀបជួរឈរនេះតាមលំដាប់ឡើង'
23 | sortDescending: ': ចុចដើម្បីរៀបជួរឈរនេះតាមលំដាប់ចុះ'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ko.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: '데이터가 없습니다'
6 | info: '_START_ - _END_ / _TOTAL_'
7 | infoEmpty: '0 - 0 / 0'
8 | infoFiltered: '(총 _MAX_ 개)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: '페이지당 줄수 _MENU_'
12 | loadingRecords: 읽는중...
13 | processing: 처리중...
14 | search: '검색:'
15 | zeroRecords: '검색 결과가 없습니다'
16 | paginate:
17 | first: 처음
18 | last: 마지막
19 | next: 다음
20 | previous: 이전
21 | aria:
22 | sortAscending: ': 오름차순 정렬'
23 | sortDescending: ': 내림차순 정렬'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ku.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'هیچ تۆمارێک نەدۆزرایەوە'
6 | loadingRecords: 'گەراندنەوەی تۆمارەکان...'
7 | processing: 'تکایە چاوەرێکە...'
8 | lengthMenu: 'نیشانبدە _MENU_ تۆمارەکان'
9 | zeroRecords: 'هیچ تۆمارێک نەدۆزرایەوە'
10 | info: 'نیشاندانی _START_ لە _END_ کۆی _TOTAL_ تۆمار'
11 | infoEmpty: 'نیشاندانی 0 لە 0 لە کۆی 0 تۆمار'
12 | infoFiltered: '(پاڵێوراوە لە کۆی _MAX_ تۆمار)'
13 | infoPostFix: ''
14 | search: 'گەران:'
15 | url: ''
16 | paginate:
17 | first: یەکەم
18 | previous: پێشوو
19 | next: داهاتوو
20 | last: کۆتایی
21 | aria:
22 | sortAscending: ': چاڵاککردن بۆ ریزکردنی سەر بەرەو ژوور'
23 | sortDescending: ': چاڵاککردن بۆ ریزکردنی سەر بەرەو خوار'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ky.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Таблицада эч кандай берилиш жок'
6 | info: 'Жалпы _TOTAL_ саптын ичинен _START_-саптан _END_-сапка чейинкилер'
7 | infoEmpty: 'Жалпы 0 саптын ичинен 0-саптан 0-сапка чейинкилер'
8 | infoFiltered: '(жалпы _MAX_ саптан фильтрленди)'
9 | infoPostFix: ''
10 | infoThousands: ' '
11 | lengthMenu: '_MENU_ саптан көрсөт'
12 | loadingRecords: Жүктөлүүдө...
13 | processing: 'Иштеп жатат...'
14 | search: 'Издөө:'
15 | zeroRecords: 'Туура келген бир да сап жок'
16 | paginate:
17 | first: Биринчи
18 | last: Акыркы
19 | next: Кийинки
20 | previous: Мурунку
21 | aria:
22 | sortAscending: ': иретте'
23 | sortDescending: ': тескери иретте'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.lo.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: ບໍ່ພົບຂໍ້ມູນໃນຕາຕະລາງ
6 | info: 'ສະແດງ _START_ ເຖິງ _END_ ຈາກ _TOTAL_ ແຖວ'
7 | infoEmpty: 'ສະແດງ 0 ເຖິງ 0 ຈາກ 0 ແຖວ'
8 | infoFiltered: '(ກັ່ນຕອງຂໍ້ມູນ _MAX_ ທຸກແຖວ)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'ສະແດງ _MENU_ ແຖວ'
12 | loadingRecords: ກຳລັງໂຫຼດຂໍ້ມູນ...
13 | processing: ກຳລັງດຳເນີນການ...
14 | search: 'ຄົ້ນຫາ: '
15 | zeroRecords: ບໍ່ພົບຂໍ້ມູນ
16 | paginate:
17 | first: ໜ້າທຳອິດ
18 | previous: ກ່ອນໜ້ານີ້
19 | next: ໜ້າຕໍ່ໄປ
20 | last: ໜ້າສຸດທ້າຍ
21 | aria:
22 | sortAscending: ': ເປີດໃຊ້ການຈັດລຽງຂໍ້ມູນແຕ່ນ້ອຍຫາໃຫຍ່'
23 | sortDescending: ': ເປີດໃຊ້ການຈັດລຽງຂໍ້ມູນແຕ່ໃຫຍ່ຫານ້ອຍ'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.lt.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Lentelėje nėra duomenų'
6 | info: 'Rodomi įrašai nuo _START_ iki _END_ iš _TOTAL_ įrašų'
7 | infoEmpty: 'Rodomi įrašai nuo 0 iki 0 iš 0'
8 | infoFiltered: '(atrinkta iš _MAX_ įrašų)'
9 | infoPostFix: ''
10 | infoThousands: ' '
11 | lengthMenu: 'Rodyti _MENU_ įrašus'
12 | loadingRecords: Įkeliama...
13 | processing: Apdorojama...
14 | search: 'Ieškoti:'
15 | thousands: ' '
16 | url: ''
17 | zeroRecords: 'Įrašų nerasta'
18 | paginate:
19 | first: Pirmas
20 | previous: Ankstesnis
21 | next: Tolimesnis
22 | last: Paskutinis
23 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.lv.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: 'Uzgaidiet ...'
6 | earch: 'Meklēt:'
7 | lengthMenu: 'Rādīt _MENU_ ierakstus'
8 | info: 'Parādīti _START_ līdz _END_ no _TOTAL_ ierakstiem'
9 | infoEmpty: 'Nav ierakstu'
10 | infoFiltered: '(atlasīts no pavisam _MAX_ ierakstiem)'
11 | infoPostFix: ''
12 | loadingRecords: 'Notiek ielāde ...'
13 | zeroRecords: 'Nav atrasti vaicājumam atbilstoši ieraksti'
14 | emptyTable: 'Tabulā nav datu'
15 | paginate:
16 | first: Pirmā
17 | previous: Iepriekšējā
18 | next: Nākošā
19 | last: Pēdējā
20 | aria:
21 | ortAscending: ': aktivizēt kolonnu, lai kārtotu augoši'
22 | ortDescending: ': aktivizēt kolonnu, lai kārtotu dilstoši'
23 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.mk.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: Процесирање...
6 | lengthMenu: 'Прикажи _MENU_ записи'
7 | zeroRecords: 'Не се пронајдени записи'
8 | emptyTable: 'Нема податоци во табелата'
9 | loadingRecords: Вчитување...
10 | info: 'Прикажани _START_ до _END_ од _TOTAL_ записи'
11 | infoEmpty: 'Прикажани 0 до 0 од 0 записи'
12 | infoFiltered: '(филтрирано од вкупно _MAX_ записи)'
13 | infoPostFix: ''
14 | search: Барај
15 | url: ''
16 | paginate:
17 | first: Почетна
18 | previous: Претходна
19 | next: Следна
20 | last: Последна
21 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.mn.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Хүснэгт хоосон байна'
6 | info: 'Нийт _TOTAL_ бичлэгээс _START_ - _END_ харуулж байна'
7 | infoEmpty: 'Тохирох үр дүн алга'
8 | infoFiltered: '(нийт _MAX_ бичлэгээс шүүв)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'Дэлгэцэд _MENU_ бичлэг харуулна'
12 | loadingRecords: 'Ачааллаж байна...'
13 | processing: 'Боловсруулж байна...'
14 | search: 'Хайлт:'
15 | zeroRecords: 'Тохирох бичлэг олдсонгүй'
16 | paginate:
17 | first: Эхнийх
18 | last: Сүүлийнх
19 | next: Өмнөх
20 | previous: Дараах
21 | aria:
22 | sortAscending: ': цагаан толгойн дарааллаар эрэмбэлэх'
23 | sortDescending: ': цагаан толгойн эсрэг дарааллаар эрэмбэлэх'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ms.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Tiada data'
6 | info: 'Paparan dari _START_ hingga _END_ dari _TOTAL_ rekod'
7 | infoEmpty: 'Paparan 0 hingga 0 dari 0 rekod'
8 | infoFiltered: '(Ditapis dari jumlah _MAX_ rekod)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'Papar _MENU_ rekod'
12 | loadingRecords: Diproses...
13 | processing: 'Sedang diproses...'
14 | search: 'Carian:'
15 | zeroRecords: 'Tiada padanan rekod yang dijumpai.'
16 | paginate:
17 | first: Pertama
18 | previous: Sebelum
19 | next: Seterusnya
20 | last: Akhir
21 | aria:
22 | sortAscending: ': diaktifkan kepada susunan lajur menaik'
23 | sortDescending: ': diaktifkan kepada susunan lajur menurun'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.nb.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Ingen data tilgjengelig i tabellen'
6 | info: 'Viser _START_ til _END_ av _TOTAL_ linjer'
7 | infoEmpty: 'Viser 0 til 0 av 0 linjer'
8 | infoFiltered: '(filtrert fra _MAX_ totalt antall linjer)'
9 | infoPostFix: ''
10 | infoThousands: ' '
11 | loadingRecords: Laster...
12 | lengthMenu: 'Vis _MENU_ linjer'
13 | processing: Laster...
14 | search: 'Søk:'
15 | url: ''
16 | zeroRecords: 'Ingen linjer matcher søket'
17 | paginate:
18 | first: 'Første'
19 | previous: Forrige
20 | next: Neste
21 | last: Siste
22 | aria:
23 | sortAscending: ': aktiver for å sortere kolonnen stigende'
24 | sortDescending: ': aktiver for å sortere kolonnen synkende'
25 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ne.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'टेबलमा डाटा उपलब्ध भएन'
6 | info: '_TOTAL_ रेकर्ड मध्य _START_ देखि _END_ रेकर्ड देखाउंदै'
7 | infoEmpty: '0 मध्य 0 देखि 0 रेकर्ड देखाउंदै'
8 | infoFiltered: '(_MAX_ कुल रेकर्डबाट छनौट गरिएको)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: ' _MENU_ रेकर्ड देखाउने '
12 | loadingRecords: 'लोड हुँदैछ...'
13 | processing: 'प्रगति हुदैंछ ...'
14 | search: 'खोजी:'
15 | url: ''
16 | zeroRecords: 'कुनै मिल्ने रेकर्ड फेला परेन'
17 | paginate:
18 | first: प्रथम
19 | previous: पछिल्लो
20 | next: अघिल्लो
21 | last: अन्तिम
22 | aria:
23 | sortAscending: ': अगाडिबाट अक्षरात्मक रूपमा क्रमबद्ध गराउने'
24 | sortDescending: ': पछाडिबाट अक्षरात्मक रूपमा क्रमबद्ध गराउने'
25 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.nl.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: Bezig...
6 | lengthMenu: '_MENU_ resultaten weergeven'
7 | zeroRecords: 'Geen resultaten gevonden'
8 | info: '_START_ tot _END_ van _TOTAL_ resultaten'
9 | infoEmpty: 'Geen resultaten om weer te geven'
10 | infoFiltered: ' (gefilterd uit _MAX_ resultaten)'
11 | infoPostFix: ''
12 | search: 'Zoeken:'
13 | emptyTable: 'Geen resultaten aanwezig in de tabel'
14 | infoThousands: .
15 | loadingRecords: 'Een moment geduld aub - bezig met laden...'
16 | paginate:
17 | first: Eerste
18 | last: Laatste
19 | next: Volgende
20 | previous: Vorige
21 | aria:
22 | sortAscending: ': activeer om kolom oplopend te sorteren'
23 | sortDescending: ': activeer om kolom aflopend te sorteren'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.nn.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Inga data tilgjengeleg i tabellen'
6 | info: 'Syner _START_ til _END_ av _TOTAL_ linjer'
7 | infoEmpty: 'Syner 0 til 0 av 0 linjer'
8 | infoFiltered: '(filtrert frå _MAX_ totalt antal linjer)'
9 | infoPostFix: ''
10 | infoThousands: ' '
11 | loadingRecords: Lastar...
12 | lengthMenu: 'Syn _MENU_ linjer'
13 | processing: Lastar...
14 | search: 'Søk:'
15 | url: ''
16 | zeroRecords: 'Inga linjer treff på søket'
17 | paginate:
18 | first: Fyrste
19 | previous: Forrige
20 | next: Neste
21 | last: Siste
22 | aria:
23 | sortAscending: ': aktiver for å sortere kolonna stigande'
24 | sortDescending: ': aktiver for å sortere kolonna synkande'
25 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.pl.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: 'Jesteś pewny ?'
4 | you_need_to_select_at_least_one_element: 'Musisz wybrać co najmniej jeden element.'
5 | search: Szukaj
6 | execute: Wykonać
7 | ok: OK
8 | datatable:
9 | searchPlaceholder: ''
10 | emptyTable: 'Brak danych'
11 | info: 'Pozycje od _START_ do _END_ z _TOTAL_ łącznie'
12 | infoEmpty: 'Pozycji 0 z 0 dostępnych'
13 | infoFiltered: '(filtrowanie spośród _MAX_ dostępnych pozycji)'
14 | infoPostFix: ''
15 | infoThousands: ' '
16 | lengthMenu: 'Pokaż _MENU_ pozycji'
17 | loadingRecords: Wczytywanie...
18 | processing: Przetwarzanie...
19 | search: 'Szukaj:'
20 | zeroRecords: 'Nie znaleziono pasujących pozycji'
21 | paginate:
22 | first: Pierwsza
23 | last: Ostatnia
24 | next: Następna
25 | previous: Poprzednia
26 | aria:
27 | sortAscending: ': aktywuj, by posortować kolumnę rosnąco'
28 | sortDescending: ': aktywuj, by posortować kolumnę malejąco'
29 | ortAscending: ': aktywuj, by posortować kolumnę rosnąco'
30 | ortDescending: ': aktywuj, by posortować kolumnę malejąco'
31 | earch: 'Szukaj:'
32 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ps.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'جدول خالي دی'
6 | info: 'د _START_ څخه تر _END_ پوري، له ټولو _TOTAL_ څخه'
7 | infoEmpty: 'د 0 څخه تر 0 پوري، له ټولو 0 څخه'
8 | infoFiltered: '(لټول سوي له ټولو _MAX_ څخه)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: '_MENU_ کتاره وښايه'
12 | loadingRecords: 'منتظر اوسئ...'
13 | processing: 'منتظر اوسئ...'
14 | search: 'لټون:'
15 | zeroRecords: 'د لټون مطابق معلومات و نه موندل سول'
16 | paginate:
17 | first: لومړۍ
18 | last: وروستۍ
19 | next: بله
20 | previous: شاته
21 | aria:
22 | sortAscending: ': په صعودي ډول مرتبول'
23 | sortDescending: ': په نزولي ډول مرتبول'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.pt.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Não foi encontrado nenhum registro'
6 | loadingRecords: 'A carregar...'
7 | processing: 'A processar...'
8 | lengthMenu: 'Mostrar _MENU_ registros'
9 | zeroRecords: 'Não foram encontrados resultados'
10 | info: 'Mostrando de _START_ até _END_ de _TOTAL_ registros'
11 | infoEmpty: 'Mostrando de 0 até 0 de 0 registros'
12 | infoFiltered: '(filtrado de _MAX_ registros no total)'
13 | infoPostFix: ''
14 | search: 'Procurar:'
15 | url: ''
16 | paginate:
17 | first: Primeiro
18 | previous: Anterior
19 | next: Seguinte
20 | last: Último
21 | aria:
22 | sortAscending: ': Ordenar colunas de forma ascendente'
23 | sortDescending: ': Ordenar colunas de forma descendente'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ro.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: Procesează...
6 | lengthMenu: 'Afișează _MENU_ înregistrări pe pagină'
7 | zeroRecords: 'Nu am găsit nimic - ne pare rău'
8 | info: 'Afișate de la _START_ la _END_ din _TOTAL_ înregistrări'
9 | infoEmpty: 'Afișate de la 0 la 0 din 0 înregistrări'
10 | infoFiltered: '(filtrate dintr-un total de _MAX_ înregistrări)'
11 | infoPostFix: ''
12 | search: 'Caută:'
13 | url: ''
14 | paginate:
15 | first: Prima
16 | previous: Precedenta
17 | next: Următoarea
18 | last: Ultima
19 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ru.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: Вы уверены ?
4 | you_need_to_select_at_least_one_element: Вы должны выбрать хотя бы один элемент.
5 | search: Поиск
6 | execute: "выполнять"
7 | ok: "OK"
8 | datatable:
9 | searchPlaceholder: ""
10 | emptyTable: "В таблице отсутствуют данные"
11 | info: "Записи с _START_ до _END_ из _TOTAL_ записей"
12 | infoEmpty: "Записи с 0 до 0 из 0 записей"
13 | infoFiltered: "(отфильтровано из _MAX_ записей)"
14 | infoPostFix: ""
15 | infoThousands: ","
16 | lengthMenu: "Показать _MENU_ записей"
17 | loadingRecords: "Загрузка записей..."
18 | processing: "Подождите..."
19 | search: "Поиск:"
20 | zeroRecords: "Записи отсутствуют."
21 | paginate:
22 | first: "Первая"
23 | last: "Последняя"
24 | next: "Следующая"
25 | previous: "Предыдущая"
26 | aria:
27 | sortAscending: ": активировать для сортировки столбца по возрастанию"
28 | sortDescending: ": активировать для сортировки столбца по убыванию"
29 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.si.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'වගුවේ දත්ත කිසිවක් නොමැත'
6 | info: '_TOTAL_ න් _START_ සිට _END_ දක්වා'
7 | infoEmpty: '0 න් 0 සිට 0 දක්වා'
8 | infoFiltered: '(_MAX_ න් තෝරාගත් )'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: '_MENU_ ක් පෙන්වන්න'
12 | loadingRecords: 'පූරණය වෙමින් පවතී...'
13 | processing: 'සැකසෙමින් පවතී...'
14 | search: 'සොයන්න :'
15 | zeroRecords: 'ගැලපෙන වාර්තා නොමැත.'
16 | paginate:
17 | first: පළමු
18 | last: අන්තිම
19 | next: ඊළග
20 | previous: පසුගිය
21 | aria:
22 | sortAscending: ': තීරුව ආරෝහනව තෝරන්න'
23 | sortDescending: ': තීරුව අවරෝහනව තෝරන්න'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.sk.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: 'Ste si istý?'
4 | you_need_to_select_at_least_one_element: 'Musíte vybrať aspoň jeden prvok.'
5 | search: Hľadať
6 | execute: Vykonať
7 | ok: OK
8 | datatable:
9 | searchPlaceholder: ''
10 | emptyTable: 'Nie sú k dispozícii žiadne dáta'
11 | info: 'Záznamy _START_ až _END_ z celkom _TOTAL_'
12 | infoEmpty: 'Záznamy 0 až 0 z celkom 0 '
13 | infoFiltered: '(vyfiltrované spomedzi _MAX_ záznamov)'
14 | infoPostFix: ''
15 | infoThousands: ','
16 | lengthMenu: 'Zobraz _MENU_ záznamov'
17 | loadingRecords: Načítavam...
18 | processing: Spracúvam...
19 | search: 'Hľadať:'
20 | zeroRecords: 'Nenašli sa žiadne vyhovujúce záznamy'
21 | paginate:
22 | first: Prvá
23 | last: Posledná
24 | next: Nasledujúca
25 | previous: Predchádzajúca
26 | aria:
27 | sortAscending: ': aktivujte na zoradenie stĺpca vzostupne'
28 | sortDescending: ': aktivujte na zoradenie stĺpca zostupne'
29 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.sl.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Nobenih podatkov ni na voljo'
6 | info: 'Prikazujem _START_ do _END_ od _TOTAL_ zapisov'
7 | infoEmpty: 'Prikazujem 0 do 0 od 0 zapisov'
8 | infoFiltered: '(filtrirano od _MAX_ vseh zapisov)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'Prikaži _MENU_ zapisov'
12 | loadingRecords: Nalagam...
13 | processing: Obdelujem...
14 | search: 'Išči:'
15 | zeroRecords: 'Nobeden zapis ne ustreza'
16 | paginate:
17 | first: Prvi
18 | last: Zadnji
19 | next: Nasl.
20 | previous: Pred.
21 | aria:
22 | sortAscending: ': vključite za naraščujoči sort'
23 | sortDescending: ': vključite za padajoči sort'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.sq.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Nuk ka asnjë të dhënë në tabele'
6 | info: 'Duke treguar _START_ deri _END_ prej _TOTAL_ reshtave'
7 | infoEmpty: 'Duke treguar 0 deri 0 prej 0 reshtave'
8 | infoFiltered: '(të filtruara nga gjithësej _MAX_ reshtave)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'Shiko _MENU_ reshta'
12 | loadingRecords: 'Duke punuar...'
13 | processing: 'Duke procesuar...'
14 | search: 'Kërkoni:'
15 | zeroRecords: 'Asnjë e dhënë nuk u gjet'
16 | paginate:
17 | first: 'E para'
18 | last: 'E Fundit'
19 | next: Tjetra
20 | previous: 'E Kaluara'
21 | aria:
22 | sortAscending: ': aktivizo për të sortuar kolumnin me vlera në ngritje'
23 | sortDescending: ': aktivizo për të sortuar kolumnin me vlera në zbritje'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.sr.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Нема података у табели'
6 | info: 'Приказ _START_ до _END_ од укупно _TOTAL_ записа'
7 | infoEmpty: 'Приказ 0 до 0 од укупно 0 записа'
8 | infoFiltered: '(филтрирано од укупно _MAX_ записа)'
9 | infoPostFix: ''
10 | infoThousands: .
11 | lengthMenu: 'Прикажи _MENU_ записа'
12 | loadingRecords: Учитавање...
13 | processing: Обрада...
14 | search: 'Претрага:'
15 | zeroRecords: 'Нису пронађени одговарајући записи'
16 | paginate:
17 | first: Почетна
18 | last: Последња
19 | next: Следећа
20 | previous: Предходна
21 | aria:
22 | sortAscending: ': активирајте да сортирате колону узлазно'
23 | sortDescending: ': активирајте да сортирате колону силазно'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.sr_Latn.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Nema podataka u tabeli'
6 | info: 'Prikaz _START_ do _END_ od ukupno _TOTAL_ zapisa'
7 | infoEmpty: 'Prikaz 0 do 0 od ukupno 0 zapisa'
8 | infoFiltered: '(filtrirano od ukupno _MAX_ zapisa)'
9 | infoPostFix: ''
10 | infoThousands: .
11 | lengthMenu: 'Prikaži _MENU_ zapisa'
12 | loadingRecords: Učitavanje...
13 | processing: Obrada...
14 | search: 'Pretraga:'
15 | zeroRecords: 'Nisu pronađeni odgovarajući zapisi'
16 | paginate:
17 | first: Početna
18 | last: Poslednja
19 | next: Sledeća
20 | previous: Predhodna
21 | aria:
22 | sortAscending: ': aktivirajte da sortirate kolonu uzlazno'
23 | sortDescending: ': aktivirajte da sortirate kolonu silazno'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.sv.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Tabellen innehåller ingen data'
6 | info: 'Visar _START_ till _END_ av totalt _TOTAL_ rader'
7 | infoEmpty: 'Visar 0 till 0 av totalt 0 rader'
8 | infoFiltered: '(filtrerade från totalt _MAX_ rader)'
9 | infoPostFix: ''
10 | infoThousands: ' '
11 | lengthMenu: 'Visa _MENU_ rader'
12 | loadingRecords: Laddar...
13 | processing: Bearbetar...
14 | search: 'Sök:'
15 | zeroRecords: 'Hittade inga matchande resultat'
16 | paginate:
17 | first: Första
18 | last: Sista
19 | next: Nästa
20 | previous: Föregående
21 | aria:
22 | sortAscending: ': aktivera för att sortera kolumnen i stigande ordning'
23 | sortDescending: ': aktivera för att sortera kolumnen i fallande ordning'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.sw.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Hakuna data iliyo patikana'
6 | info: 'Inaonyesha _START_ mpaka _END_ ya matokeo _TOTAL_'
7 | infoEmpty: 'Inaonyesha 0 hadi 0 ya matokeo 0'
8 | infoFiltered: '(uschujo kutoka matokeo idadi _MAX_)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'Onyesha _MENU_ matokeo'
12 | loadingRecords: Inapakia...
13 | processing: Processing...
14 | search: 'Tafuta:'
15 | zeroRecords: 'Rekodi vinavyolingana haziku patikana'
16 | paginate:
17 | first: Mwanzo
18 | last: Mwisho
19 | next: Ijayo
20 | previous: Kabla
21 | aria:
22 | sortAscending: ': seti kulainisha sanjari kwa mtindo wa upandaji'
23 | sortDescending: ': seti kulainisha sanjari kwa mtindo wa mteremko'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ta.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'அட்டவணையில் தரவு கிடைக்கவில்லை'
6 | info: 'உள்ளீடுகளை் _START_ முதல _END_ உள்ள _TOTAL_ காட்டும்'
7 | infoEmpty: '0 உள்ளீடுகளை 0 0 காட்டும்'
8 | infoFiltered: '(_MAX_ மொத்த உள்ளீடுகளை இருந்து வடிகட்டி)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: '_MENU_ காண்பி'
12 | loadingRecords: 'ஏற்றுகிறது ...'
13 | processing: 'செயலாக்க ...'
14 | search: 'தேடல்:'
15 | zeroRecords: 'பொருத்தமான பதிவுகள் இல்லை'
16 | paginate:
17 | first: முதல்
18 | last: இறுதி
19 | next: அடுத்து
20 | previous: முந்தைய
21 | aria:
22 | sortAscending: ': நிரலை ஏறுவரிசையில் வரிசைப்படுத்த செயல்படுத்த'
23 | sortDescending: ': நிரலை இறங்கு வரிசைப்படுத்த செயல்படுத்த'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.te.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'పట్టికలో డేటా లేదు.'
6 | info: 'మొత్తం _TOTAL_ ఎంట్రీలులో _START_ నుండి _END_ వరకు చూపిస్తున్నాం'
7 | infoEmpty: 'చూపిస్తున్నాం 0 నుండి 0 వరకు 0 ఎంట్రీలు లో'
8 | infoFiltered: '( _MAX_ ఎంట్రీలులో నుండి వడపోయాబడినవి)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: ' _MENU_ ఎంట్రీలు చూపించు'
12 | loadingRecords: 'లోడ్ అవుతుంది ...'
13 | processing: 'ప్రాసెస్ చేయబడుతుంది...'
14 | search: 'వెతుకు:'
15 | zeroRecords: 'మ్యాచింగ్ రికార్డులు లేవు'
16 | paginate:
17 | first: మొదటి
18 | last: చివరి
19 | next: తర్వాత
20 | previous: మునుపటి
21 | aria:
22 | sortAscending: ': నిలువరుసను ఆరోహణ క్రమం అమర్చండి'
23 | sortDescending: ': నిలువరుసను అవరోహణ క్రమం అమర్చండి'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.th.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: ไม่มีข้อมูลในตาราง
6 | info: 'แสดง _START_ ถึง _END_ จาก _TOTAL_ แถว'
7 | infoEmpty: 'แสดง 0 ถึง 0 จาก 0 แถว'
8 | infoFiltered: '(กรองข้อมูล _MAX_ ทุกแถว)'
9 | infoPostFix: ''
10 | infoThousands: ','
11 | lengthMenu: 'แสดง _MENU_ แถว'
12 | loadingRecords: กำลังโหลดข้อมูล...
13 | processing: กำลังดำเนินการ...
14 | search: 'ค้นหา: '
15 | zeroRecords: ไม่พบข้อมูล
16 | paginate:
17 | first: หน้าแรก
18 | previous: ก่อนหน้า
19 | next: ถัดไป
20 | last: หน้าสุดท้าย
21 | aria:
22 | sortAscending: ': เปิดใช้งานการเรียงข้อมูลจากน้อยไปมาก'
23 | sortDescending: ': เปิดใช้งานการเรียงข้อมูลจากมากไปน้อย'
24 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.tr.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: Emin misiniz
4 | you_need_to_select_at_least_one_element: En az bir eleman seçmeniz gerekir.
5 | search: Bul
6 | execute: "Yürütme"
7 | ok: "OK"
8 | datatable:
9 | searchPlaceholder: ""
10 | emptyTable: ""
11 | info: " _TOTAL_ Kayıttan _START_ - _END_ Arası Kayıtlar"
12 | infoEmpty: "Kayıt Yok"
13 | infoFiltered: "( _MAX_ Kayıt İçerisinden Bulunan)"
14 | infoPostFix: ""
15 | infoThousands: ","
16 | lengthMenu: "Sayfada _MENU_ Kayıt Göster"
17 | loadingRecords: ""
18 | processing: "İşleniyor..."
19 | search: "Bul:"
20 | zeroRecords: "Eşleşen Kayıt Bulunmadı"
21 | paginate:
22 | first: "İlk"
23 | last: "Son"
24 | next: "Sonraki"
25 | previous: "Önceki"
26 | aria:
27 | sortAscending: ": activate to sort column ascending"
28 | sortDescending: ": activate to sort column descending"
29 |
30 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ua.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common:
3 | are_you_sure: Ти впевнений ?
4 | you_need_to_select_at_least_one_element: Ви повинні вибрати хоча б один елемент.
5 | search: Пошук
6 | execute: "виконувати"
7 | ok: "OK"
8 | datatable:
9 | searchPlaceholder: ""
10 | emptyTable: ""
11 | info: "Записи з _START_ по _END_ із _TOTAL_ записів"
12 | infoEmpty: "Записи з 0 по 0 із 0 записів"
13 | infoFiltered: "(відфільтровано з _MAX_ записів)"
14 | infoPostFix: ""
15 | infoThousands: ","
16 | lengthMenu: "Показати _MENU_ записів"
17 | loadingRecords: ""
18 | processing: "Зачекайте..."
19 | search: "Пошук:"
20 | zeroRecords: "Записи відсутні."
21 | paginate:
22 | first: "Перша"
23 | last: "Остання"
24 | next: "Наступна"
25 | previous: "Попередня"
26 | aria:
27 | sortAscending: ": активувати для сортування стовпців за зростанням"
28 | sortDescending: ": активувати для сортування стовпців за спаданням"
29 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.uk.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: Зачекайте...
6 | lengthMenu: 'Показати _MENU_ записів'
7 | zeroRecords: 'Записи відсутні.'
8 | info: 'Записи з _START_ по _END_ із _TOTAL_ записів'
9 | infoEmpty: 'Записи з 0 по 0 із 0 записів'
10 | infoFiltered: '(відфільтровано з _MAX_ записів)'
11 | infoPostFix: ''
12 | search: 'Пошук:'
13 | url: ''
14 | paginate:
15 | first: Перша
16 | previous: Попередня
17 | next: Наступна
18 | last: Остання
19 | aria:
20 | sortAscending: ': активувати для сортування стовпців за зростанням'
21 | sortDescending: ': активувати для сортування стовпців за спаданням'
22 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.ur.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: 'ہے جاري عملدرامد...'
6 | lengthMenu: 'دکہائين شقيں کي (_MENU_) فہرست'
7 | zeroRecords: 'ملے نہيں مفروضات جلتے ملتے کوئ'
8 | info: 'فہرست کي تک _END_ سے _START_ سے ميں _TOTAL_ فہرست پوري ہے نظر پيش'
9 | infoEmpty: 'فہرست کي تک 0 سے 0 سے ميں 0 قل ہے نظر پيشّ'
10 | infoFiltered: '(فہرست ہوئ چھني سے ميں _MAX_ قل)'
11 | infoPostFix: ''
12 | search: 'کرو تلاش:'
13 | url: ''
14 | paginate:
15 | first: پہلا
16 | previous: پچہلا
17 | next: اگلا
18 | last: آخري
19 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.uz.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | emptyTable: 'Ma''lumot yo''q'
6 | info: 'Umumiy _TOTAL_ yozuvlarlardan _START_ dan _END_ gachasi ko''rsatilmoqda'
7 | infoEmpty: 'Umumiy 0 yozuvlardan 0 dan 0 gachasi ko''rsatilmoqda'
8 | infoFiltered: '(_MAX_ yozuvlardan filtrlandi)'
9 | infoPostFix: ''
10 | lengthMenu: '_MENU_ ta yozuvlarni ko''rsat'
11 | loadingRecords: 'Yozuvlar yuklanmoqda...'
12 | processing: Ishlayapman...
13 | search: 'Izlash:'
14 | zeroRecords: 'Ma''lumot yo''q.'
15 | paginate:
16 | first: Birinchi
17 | previous: Avvalgi
18 | next: Keyingi
19 | last: 'Son''ggi'
20 | aria:
21 | sortAscending: ': to''g''ri tartiblash'
22 | sortDescending: ': teskari tartiblash'
23 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.vi.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: 'Đang xử lý...'
6 | lengthMenu: 'Xem _MENU_ mục'
7 | zeroRecords: 'Không tìm thấy dòng nào phù hợp'
8 | info: 'Đang xem _START_ đến _END_ trong tổng số _TOTAL_ mục'
9 | infoEmpty: 'Đang xem 0 đến 0 trong tổng số 0 mục'
10 | infoFiltered: '(được lọc từ _MAX_ mục)'
11 | infoPostFix: ''
12 | search: 'Tìm:'
13 | url: ''
14 | paginate:
15 | first: Đầu
16 | previous: Trước
17 | next: Tiếp
18 | last: Cuối
19 |
--------------------------------------------------------------------------------
/src/Resources/translations/messages.zh.yml:
--------------------------------------------------------------------------------
1 | datatable:
2 | common: []
3 | datatable:
4 | searchPlaceholder: ''
5 | processing: 处理中...
6 | lengthMenu: '显示 _MENU_ 项结果'
7 | zeroRecords: 没有匹配结果
8 | info: '显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项'
9 | infoEmpty: '显示第 0 至 0 项结果,共 0 项'
10 | infoFiltered: '(由 _MAX_ 项结果过滤)'
11 | infoPostFix: ''
12 | search: '搜索:'
13 | url: ''
14 | emptyTable: 表中数据为空
15 | loadingRecords: 载入中...
16 | infoThousands: ','
17 | paginate:
18 | first: 首页
19 | previous: 上页
20 | next: 下页
21 | last: 末页
22 | aria:
23 | sortAscending: ': 以升序排列此列'
24 | sortDescending: ': 以降序排列此列'
25 |
--------------------------------------------------------------------------------
/src/Resources/views/Column/twig_string.html.twig:
--------------------------------------------------------------------------------
1 | {{- include(template_from_string(column_template)) -}}
2 |
--------------------------------------------------------------------------------
/src/Resources/views/Filter/select.html.twig:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/src/Resources/views/Filter/select.js.twig:
--------------------------------------------------------------------------------
1 | $('#{{ datatable.name }}').on('stateLoaded.dt', function (e, settings, data) {
2 | $('#{{ datatable.name }}-column-{{ column.index }}').val(data.columns[{{ column.index }}].search.search);
3 | });
4 |
--------------------------------------------------------------------------------
/src/Resources/views/Filter/text.html.twig:
--------------------------------------------------------------------------------
1 |
9 |
--------------------------------------------------------------------------------
/src/Resources/views/Filter/text.js.twig:
--------------------------------------------------------------------------------
1 | $('#{{ datatable.name }}').on('stateLoaded.dt', function (e, settings, data) {
2 | $('#{{ datatable.name }}-column-{{ column.index }}').val(data.columns[{{ column.index }}].search.search);
3 | });
4 |
--------------------------------------------------------------------------------
/src/Twig/TwigRenderer.php:
--------------------------------------------------------------------------------
1 |
24 | */
25 | class TwigRenderer implements DataTableRendererInterface
26 | {
27 | private readonly Environment $twig;
28 |
29 | public function __construct(?Environment $twig = null)
30 | {
31 | if (null === $twig) {
32 | throw new MissingDependencyException('You must have symfony/twig-bundle installed to use the default Twig based DataTables rendering');
33 | }
34 | $this->twig = $twig;
35 | }
36 |
37 | /**
38 | * @param array $parameters
39 | */
40 | public function renderDataTable(DataTable $dataTable, string $template, array $parameters): string
41 | {
42 | $parameters['datatable'] = $dataTable;
43 |
44 | return $this->twig->render($template, $parameters);
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/tests/Fixtures/.gitignore:
--------------------------------------------------------------------------------
1 | /data.sqlite
2 | /var
3 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/AppBundle.php:
--------------------------------------------------------------------------------
1 |
25 | */
26 | class CustomQueryController extends AbstractController
27 | {
28 | public function tableAction(Request $request, DataTableFactory $dataTableFactory)
29 | {
30 | $datatable = $dataTableFactory->createFromType(CustomQueryTableType::class)
31 | ->setMethod(Request::METHOD_GET);
32 | if ($datatable->handleRequest($request)->isCallback()) {
33 | return $datatable->getResponse();
34 | }
35 |
36 | throw new NotFoundHttpException('This exception must never be triggered');
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Controller/GroupedController.php:
--------------------------------------------------------------------------------
1 |
26 | */
27 | class GroupedController extends AbstractController
28 | {
29 | public function tableAction(Request $request, DataTableFactory $dataTableFactory): Response
30 | {
31 | $datatable = $dataTableFactory->createFromType(GroupedTableType::class)
32 | ->setName('companies')
33 | ->setMethod(Request::METHOD_GET)
34 | ;
35 |
36 | return $datatable->handleRequest($request)->getResponse();
37 | }
38 |
39 | public function table2Action(Request $request, DataTableFactory $dataTableFactory): Response
40 | {
41 | $datatable = $dataTableFactory->createFromType(Grouped2TableType::class)
42 | ->setName('companies2')
43 | ->setMethod(Request::METHOD_GET)
44 | ;
45 |
46 | return $datatable->handleRequest($request)->getResponse();
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Controller/HomeController.php:
--------------------------------------------------------------------------------
1 |
26 | */
27 | class HomeController extends AbstractController
28 | {
29 | public function showAction(Request $request, DataTableFactory $dataTableFactory): Response
30 | {
31 | $datatable1 = $dataTableFactory->create();
32 | $datatable1
33 | ->add('col1', TextColumn::class, ['label' => 'foo', 'field' => 'bar'])
34 | ->add('col2', TextColumn::class, ['label' => 'bar', 'field' => 'foo'])
35 | ;
36 |
37 | $datatable2 = $dataTableFactory->create();
38 | $datatable2
39 | ->setName('noCDN')
40 | ->setMethod(Request::METHOD_GET)
41 | ->setLanguageFromCDN(false)
42 | ->add('col3', TextColumn::class, ['label' => 'foo', 'field' => 'bar'])
43 | ->add('col4', TextColumn::class, ['label' => 'bar', 'field' => 'foo'])
44 | ->createAdapter(ArrayAdapter::class)
45 | ;
46 |
47 | if ($datatable2->handleRequest($request)->isCallback()) {
48 | return $datatable2->getResponse();
49 | }
50 |
51 | return $this->render('@App/home.html.twig', [
52 | 'datatable1' => $datatable1,
53 | 'datatable2' => $datatable2,
54 | ]);
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Controller/ORMAdapterEventsController.php:
--------------------------------------------------------------------------------
1 |
27 | */
28 | class ORMAdapterEventsController extends AbstractController
29 | {
30 | public const PRE_QUERY_RESULT_CACHE_ID = 'datatable_result_cache';
31 |
32 | public function preQueryAction(Request $request, DataTableFactory $dataTableFactory): Response
33 | {
34 | $datatable = $dataTableFactory->create()
35 | ->add('firstName', TextColumn::class)
36 | ->add('lastName', TextColumn::class)
37 | ->add('company', TextColumn::class, ['field' => 'company.name'])
38 | ->createAdapter(ORMAdapter::class, [
39 | 'entity' => Employee::class,
40 | ])
41 | ->addEventListener(ORMAdapterEvents::PRE_QUERY, function (ORMAdapterQueryEvent $event) {
42 | $event->getQuery()->useResultCache(true, 0, self::PRE_QUERY_RESULT_CACHE_ID);
43 | });
44 |
45 | return $datatable->handleRequest($request)->getResponse();
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Controller/ServiceController.php:
--------------------------------------------------------------------------------
1 |
25 | */
26 | class ServiceController extends AbstractController
27 | {
28 | public function tableAction(Request $request, DataTableFactory $dataTableFactory): Response
29 | {
30 | $datatable = $dataTableFactory->createFromType(ServicePersonTableType::class, [], ['order' => [[1, 'asc']]])
31 | ->setName('persons')
32 | ->setMethod(Request::METHOD_GET)
33 | ;
34 |
35 | return $datatable->handleRequest($request)->getResponse();
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Controller/TranslationController.php:
--------------------------------------------------------------------------------
1 | setFallbackLocales([$request->getLocale()]);
32 |
33 | $datatable = $dataTableFactory->create();
34 | $datatable
35 | ->setName($request->query->has('cdn') ? 'CDN' : 'noCDN')
36 | ->setMethod(Request::METHOD_GET)
37 | ->setLanguageFromCDN($request->query->has('cdn'))
38 | ->add('col3', TextColumn::class, ['label' => 'foo', 'field' => 'bar'])
39 | ->add('col4', TextColumn::class, ['label' => 'bar', 'field' => 'foo'])
40 | ->createAdapter(ArrayAdapter::class)
41 | ;
42 |
43 | if ($datatable->handleRequest($request)->isCallback()) {
44 | return $datatable->getResponse();
45 | }
46 |
47 | return $this->render('@App/table.html.twig', [
48 | 'datatable' => $datatable,
49 | ]);
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Controller/TypeController.php:
--------------------------------------------------------------------------------
1 |
26 | */
27 | class TypeController extends AbstractController
28 | {
29 | public function tableAction(Request $request, DataTableFactory $dataTableFactory): Response
30 | {
31 | $datatable = $dataTableFactory->createFromType(RegularPersonTableType::class)
32 | ->setName('persons')
33 | ->setMethod(Request::METHOD_GET)
34 | ->addOrderBy(1, DataTable::SORT_ASCENDING)
35 | ;
36 |
37 | return $datatable->handleRequest($request)->getResponse();
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/DataTable/Adapter/CustomORMAdapter.php:
--------------------------------------------------------------------------------
1 | setIdentifierPropertyPath(null);
28 | }
29 |
30 | protected function getResults(AdapterQuery $query): \Traversable
31 | {
32 | /** @var QueryBuilder $builder */
33 | $builder = $query->get('qb');
34 | $state = $query->getState();
35 |
36 | // Apply definitive view state for current 'page' of the table
37 | foreach ($state->getOrderBy() as list($column, $direction)) {
38 | /** @var AbstractColumn $column */
39 | if ($column->isOrderable()) {
40 | $builder->addOrderBy($column->getOrderField(), $direction);
41 | }
42 | }
43 | if (null !== $state->getLength()) {
44 | $builder
45 | ->setFirstResult($state->getStart())
46 | ->setMaxResults($state->getLength());
47 | }
48 |
49 | /*
50 | * Use foreach instead of iterate to prevent group by from crashing
51 | */
52 | foreach ($builder->getQuery()->getResult($this->hydrationMode) as $result) {
53 | /*
54 | * Return everything instead of first element
55 | */
56 | yield $result;
57 | }
58 | }
59 |
60 | protected function afterConfiguration(array $options): void
61 | {
62 | parent::afterConfiguration($options);
63 |
64 | $this->hydrationMode = $options['hydrate'];
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/DataTable/Exporter/TxtExporter.php:
--------------------------------------------------------------------------------
1 |
19 | */
20 | class TxtExporter extends AbstractDataTableExporter
21 | {
22 | #[\Override]
23 | public function export(array $columnNames, \Iterator $data, array $columnOptions): \SplFileInfo
24 | {
25 | $filename = sys_get_temp_dir() . '/dt.txt';
26 | $handle = fopen($filename, 'w');
27 |
28 | fwrite($handle, implode(' ', $columnNames) . "\n");
29 |
30 | foreach ($data as $datum) {
31 | fwrite($handle, implode(' ', $datum) . "\n");
32 | }
33 |
34 | fclose($handle);
35 |
36 | return new \SplFileInfo($filename);
37 | }
38 |
39 | public function getMimeType(): string
40 | {
41 | return 'text/plain';
42 | }
43 |
44 | public function getName(): string
45 | {
46 | return 'txt';
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/DataTable/Type/CustomQueryTableType.php:
--------------------------------------------------------------------------------
1 |
30 | */
31 | class CustomQueryTableType implements DataTableTypeInterface
32 | {
33 | public function configure(DataTable $dataTable, array $options): void
34 | {
35 | $dataTable
36 | ->add('firstName', TextColumn::class)
37 | ->add('lastName', TwigColumn::class, ['template' => '@App/lastname_cell.html.twig'])
38 | ->add('fullName', TextColumn::class)
39 | ->add('company', TextColumn::class, ['field' => 'c.name'])
40 | ->createAdapter(ORMAdapter::class, [
41 | 'entity' => Person::class,
42 | 'query' => function (QueryBuilder $builder) {
43 | $builder
44 | ->select('e')
45 | ->addSelect('c')
46 | ->from(Employee::class, 'e')
47 | ->leftJoin('e.company', 'c')
48 | ;
49 | },
50 | 'criteria' => function (QueryBuilder $builder) {
51 | $builder->andWhere($builder->expr()->like('c.name', ':test'))->setParameter('test', '%ny 2%');
52 | // $builder->addCriteria(Criteria::create()->andWhere(new Comparison('c.name', Comparison::CONTAINS, 'ny 2')));
53 | },
54 | ])
55 | ;
56 |
57 | /** @var ORMAdapter $adapter */
58 | $adapter = $dataTable->getAdapter();
59 | $adapter->addCriteriaProcessor(function () { return Criteria::create()->where(new Comparison('firstName', Comparison::CONTAINS, '3')); });
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/DataTable/Type/Grouped2TableType.php:
--------------------------------------------------------------------------------
1 |
27 | */
28 | class Grouped2TableType implements DataTableTypeInterface
29 | {
30 | public function configure(DataTable $dataTable, array $options): void
31 | {
32 | $dataTable
33 | ->add('company', TextColumn::class, ['propertyPath' => '[0][name]'])
34 | ->add('employeeCount', TextColumn::class, ['propertyPath' => '[employeeCount]'])
35 | ->createAdapter(CustomORMAdapter::class, [
36 | 'entity' => Company::class,
37 | 'hydrate' => Query::HYDRATE_ARRAY,
38 | 'query' => function (QueryBuilder $builder) {
39 | $builder
40 | ->select('c')
41 | ->addSelect('count(e) AS employeeCount')
42 | ->from(Company::class, 'c')
43 | ->leftJoin('c.employees', 'e')
44 | ->groupBy('c.id')
45 | ;
46 | },
47 | ])
48 | ;
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/DataTable/Type/GroupedTableType.php:
--------------------------------------------------------------------------------
1 |
27 | */
28 | class GroupedTableType implements DataTableTypeInterface
29 | {
30 | public function configure(DataTable $dataTable, array $options): void
31 | {
32 | $dataTable
33 | ->add('name', TextColumn::class, ['field' => 'c.name'])
34 | ->add('employeeCount', TextColumn::class)
35 | ->createAdapter(ORMAdapter::class, [
36 | 'entity' => Company::class,
37 | 'hydrate' => Query::HYDRATE_ARRAY,
38 | 'query' => function (QueryBuilder $builder) {
39 | $builder
40 | ->select('c')
41 | ->addSelect('count(e) AS employeeCount')
42 | ->from(Company::class, 'c')
43 | ->leftJoin('c.employees', 'e')
44 | ->groupBy('c.id')
45 | ;
46 | },
47 | ])
48 | ;
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/DataTable/Type/ServicePersonTableType.php:
--------------------------------------------------------------------------------
1 |
28 | */
29 | class ServicePersonTableType implements DataTableTypeInterface
30 | {
31 | /** @var RouterInterface */
32 | private $router;
33 |
34 | /**
35 | * ServicePersonTableType constructor.
36 | */
37 | public function __construct(RouterInterface $router)
38 | {
39 | $this->router = $router;
40 | }
41 |
42 | public function configure(DataTable $dataTable, array $options): void
43 | {
44 | $dataTable
45 | ->add('id', TextColumn::class, ['globalSearchable' => false])
46 | ->add('firstName', TextColumn::class, ['label' => 'name'])
47 | ->add('lastName', TextColumn::class)
48 | ->add('fullName', TextColumn::class, ['label' => 'fullName'])
49 | ->add('company', TextColumn::class, ['label' => 'employer', 'field' => 'company.name'])
50 | ->add('link', TextColumn::class, [
51 | 'data' => function (Person $person) {
52 | return sprintf('%s, %s', $this->router->generate('home'), $person->getLastName(), $person->getFirstName());
53 | },
54 | ])
55 | ->setTransformer(function ($row, Employee $employee) {
56 | $row['fullName'] = sprintf('%s (%s)', $employee->getLastName(), $employee->getCompany()->getName());
57 |
58 | return $row;
59 | })
60 | ->createAdapter(ORMAdapter::class, [
61 | 'entity' => Employee::class,
62 | 'criteria' => [
63 | new SearchCriteriaProvider(),
64 | ],
65 | ])
66 | ;
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Entity/Company.php:
--------------------------------------------------------------------------------
1 | */
33 | #[OneToMany(mappedBy: 'company', targetEntity: Employee::class)]
34 | private Collection $employees;
35 |
36 | public function __construct(string $name)
37 | {
38 | $this->name = $name;
39 | $this->employees = new ArrayCollection();
40 | }
41 |
42 | public function getId(): int
43 | {
44 | return $this->id;
45 | }
46 |
47 | public function getName(): string
48 | {
49 | return $this->name;
50 | }
51 |
52 | /**
53 | * @return Collection
54 | */
55 | public function getEmployees(): Collection
56 | {
57 | return $this->employees;
58 | }
59 |
60 | public function setName(string $name): static
61 | {
62 | $this->name = $name;
63 |
64 | return $this;
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Entity/Employee.php:
--------------------------------------------------------------------------------
1 | company = $company;
34 | $this->employedSince = $employedSince;
35 | }
36 |
37 | public function getEmployedSince(): \DateTime
38 | {
39 | return $this->employedSince;
40 | }
41 |
42 | public function getCompany(): Company
43 | {
44 | return $this->company;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Entity/Person.php:
--------------------------------------------------------------------------------
1 | firstName = $firstName;
36 | $this->lastName = $lastName;
37 | }
38 |
39 | public function getId(): int
40 | {
41 | return $this->id;
42 | }
43 |
44 | public function getFirstName(): string
45 | {
46 | return $this->firstName;
47 | }
48 |
49 | public function getLastName(): string
50 | {
51 | return $this->lastName;
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Resources/views/buttons.html.twig:
--------------------------------------------------------------------------------
1 | Edit
2 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Resources/views/exporter.html.twig:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Test server-side export
5 |
6 |
7 |
8 |
9 |
10 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Resources/views/home.html.twig:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Testpage
5 |
6 |
7 | Table 1
8 |
9 | Table 2
10 |
11 |
12 |
13 |
40 |
41 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Resources/views/lastname_cell.html.twig:
--------------------------------------------------------------------------------
1 | {{ value }}
2 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppBundle/Resources/views/table.html.twig:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Testpage
5 |
6 |
7 | Table
8 |
9 |
10 |
11 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/tests/Fixtures/AppKernel.php:
--------------------------------------------------------------------------------
1 |
22 | */
23 | class AppKernel extends Kernel
24 | {
25 | public function registerBundles(): array
26 | {
27 | return [
28 | new \Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
29 | new \Symfony\Bundle\TwigBundle\TwigBundle(),
30 | new \Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
31 | new \Omines\DataTablesBundle\DataTablesBundle(),
32 | new AppBundle\AppBundle(),
33 | ];
34 | }
35 |
36 | public function registerContainerConfiguration(LoaderInterface $loader): void
37 | {
38 | $loader->load(__DIR__ . '/config.yml');
39 | }
40 |
41 | public function getRootDir(): string
42 | {
43 | return __DIR__ . '/../../tmp';
44 | }
45 |
46 | public function getProjectDir(): string
47 | {
48 | return __DIR__;
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/tests/Fixtures/config.yml:
--------------------------------------------------------------------------------
1 | imports:
2 | - { resource: services.yml }
3 |
4 | framework:
5 | php_errors:
6 | log: true
7 | handle_all_throwables: true
8 |
9 | secret: '1234567890'
10 | router:
11 | utf8: true
12 | resource: '%kernel.project_dir%/routing.yml'
13 | strict_requirements: ~
14 | default_locale: 'en'
15 | fragments: ~
16 | translator: { fallbacks: [] }
17 | http_method_override: true
18 | test: ~
19 | profiler:
20 | collect: false
21 | cache:
22 | pools:
23 | doctrine.result_cache_pool:
24 | adapter: cache.app
25 | doctrine.system_cache_pool:
26 | adapter: cache.system
27 |
28 | doctrine:
29 | dbal:
30 | driver: pdo_sqlite
31 | path: '%kernel.project_dir%/data.sqlite'
32 |
33 | orm:
34 | auto_generate_proxy_classes: '%kernel.debug%'
35 | naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
36 | enable_lazy_ghost_objects: true
37 |
38 | auto_mapping: true
39 | report_fields_where_declared: true
40 | query_cache_driver:
41 | type: pool
42 | pool: doctrine.system_cache_pool
43 | result_cache_driver:
44 | type: pool
45 | pool: doctrine.result_cache_pool
46 |
47 | mappings:
48 | AppBundle:
49 | type: attribute
50 |
51 | controller_resolver:
52 | auto_mapping: true
53 |
54 | twig:
55 | debug: '%kernel.debug%'
56 | strict_variables: '%kernel.debug%'
57 | exception_controller: null
58 |
59 | datatables:
60 | options:
61 | pagingType: 'simple_numbers'
62 | lengthMenu : [10, 25, 50, 100, 250, 500, 1000, 2500, -1]
63 | pageLength: 50
64 | dom: "<'row' <'col-sm-12' tr>><'row' <'col-sm-6'l><'col-sm-6 text-right'pi>>"
65 |
66 | template_parameters:
67 | class_name: 'table table-striped data-table'
68 |
--------------------------------------------------------------------------------
/tests/Fixtures/routing.yml:
--------------------------------------------------------------------------------
1 | home:
2 | path: /
3 | controller: Tests\Fixtures\AppBundle\Controller\HomeController::showAction
4 |
5 | plain:
6 | path: /plain
7 | controller: Tests\Fixtures\AppBundle\Controller\PlainController::tableAction
8 |
9 | type:
10 | path: /type
11 | controller: Tests\Fixtures\AppBundle\Controller\TypeController::tableAction
12 |
13 | service:
14 | path: /service
15 | controller: Tests\Fixtures\AppBundle\Controller\ServiceController::tableAction
16 |
17 | custom:
18 | path: /custom
19 | controller: Tests\Fixtures\AppBundle\Controller\CustomQueryController::tableAction
20 |
21 | grouped:
22 | path: /grouped
23 | controller: Tests\Fixtures\AppBundle\Controller\GroupedController::tableAction
24 |
25 | grouped2:
26 | path: /grouped2
27 | controller: Tests\Fixtures\AppBundle\Controller\GroupedController::table2Action
28 |
29 | employee.edit:
30 | path: /employee/{id}
31 |
32 | translation:
33 | path: /{_locale}/translation
34 | controller: Tests\Fixtures\AppBundle\Controller\TranslationController::tableAction
35 |
36 | orm_adapter_events.pre_query:
37 | path: /orm-adapter-events/pre-query
38 | controller: Tests\Fixtures\AppBundle\Controller\ORMAdapterEventsController::preQueryAction
39 |
40 | exporter:
41 | path: /exporter
42 | controller: Tests\Fixtures\AppBundle\Controller\ExporterController::exportAction
43 |
44 | exporter_empty_datatable:
45 | path: /exporter-empty-datatable
46 | controller: Tests\Fixtures\AppBundle\Controller\ExporterController::exportEmptyDataTableAction
47 |
48 | exporter_long_text:
49 | path: /exporter-long-text
50 | controller: Tests\Fixtures\AppBundle\Controller\ExporterController::exportLongText
51 |
52 | exporter_special_chars:
53 | path: /exporter-special-chars
54 | controller: Tests\Fixtures\AppBundle\Controller\ExporterController::exportSpecialChars
55 |
56 | exporter_with_types:
57 | path: /exporter-with-types
58 | controller: Tests\Fixtures\AppBundle\Controller\ExporterController::exportWithTypes
59 |
--------------------------------------------------------------------------------
/tests/Fixtures/services.yml:
--------------------------------------------------------------------------------
1 | services:
2 | _defaults:
3 | autowire: true
4 | autoconfigure: true
5 | public: false
6 |
7 | Tests\Fixtures\AppBundle\:
8 | resource: 'AppBundle/{DataTable}'
9 |
10 | Tests\Fixtures\AppBundle\Controller\:
11 | resource: 'AppBundle/Controller'
12 | tags: ['controller.service_arguments']
13 |
14 | twig.extension.string_loader:
15 | class: Twig\Extension\StringLoaderExtension
16 | tags:
17 | - { name: twig.extension }
18 |
19 | test.Omines\DataTablesBundle\Exporter\DataTableExporterCollection: '@Omines\DataTablesBundle\Exporter\DataTableExporterCollection'
20 |
21 | Tests\Fixtures\AppBundle\DataTable\Exporter\TxtExporter:
22 | tags:
23 | - datatables.exporter
24 |
--------------------------------------------------------------------------------
/tests/Functional/Adapter/Doctrine/ORMAdapterEventsTest.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | class ORMAdapterEventsTest extends WebTestCase
25 | {
26 | public function testPreQueryEvent(): void
27 | {
28 | $this->markTestSkipped('This test appears broken, likely due to Doctrine configuration');
29 |
30 | $client = self::createClient();
31 |
32 | /** @var DoctrineProvider $doctrineProvider */
33 | $doctrineProvider = self::$kernel->getContainer()->get('doctrine')->getManager()->getConfiguration()->getResultCacheImpl();
34 | $doctrineProvider->delete(ORMAdapterEventsController::PRE_QUERY_RESULT_CACHE_ID);
35 |
36 | $client->request('POST', '/orm-adapter-events/pre-query', ['_dt' => 'dt', '_init' => true]);
37 |
38 | static::assertTrue($doctrineProvider->contains(ORMAdapterEventsController::PRE_QUERY_RESULT_CACHE_ID));
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/tests/Functional/Exporter/Csv/CsvExporterTest.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | class CsvExporterTest extends WebTestCase
25 | {
26 | private KernelBrowser $client;
27 |
28 | protected function setUp(): void
29 | {
30 | self::ensureKernelShutdown();
31 | $this->client = self::createClient();
32 | }
33 |
34 | public function testExport(): void
35 | {
36 | $this->client->request('POST', '/exporter', ['_dt' => 'dt', '_exporter' => 'csv']);
37 |
38 | /** @var BinaryFileResponse $response */
39 | $response = $this->client->getResponse();
40 |
41 | $csvFile = fopen($response->getFile()->getPathname(), 'r');
42 |
43 | self::assertEquals(['dt.columns.firstName', 'dt.columns.lastName'], fgetcsv($csvFile, escape: '\\'));
44 |
45 | $i = 0;
46 | while (false !== ($row = fgetcsv($csvFile, escape: '\\'))) {
47 | self::assertEquals(['FirstName' . $i, 'LastName' . $i], $row);
48 | ++$i;
49 | }
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/tests/Functional/Exporter/Event/DataTableExporterResponseEventTest.php:
--------------------------------------------------------------------------------
1 |
22 | */
23 | class DataTableExporterResponseEventTest extends WebTestCase
24 | {
25 | /** @var KernelBrowser */
26 | private $client;
27 |
28 | protected function setUp(): void
29 | {
30 | self::ensureKernelShutdown();
31 | $this->client = self::createClient();
32 | }
33 |
34 | #[DataProvider('exporterNameProvider')]
35 | public function testPreResponseEvent(string $exporterName, string $ext): void
36 | {
37 | $this->client->request('POST', '/exporter', ['_dt' => 'dt', '_exporter' => $exporterName]);
38 |
39 | /** @var BinaryFileResponse $response */
40 | $response = $this->client->getResponse();
41 |
42 | static::assertStringContainsString($response->headers->get('content-disposition'), sprintf('attachment; filename=custom_filename.%s', $ext));
43 | }
44 |
45 | public static function exporterNameProvider(): array
46 | {
47 | return [
48 | ['excel', 'xlsx'],
49 | ['txt', 'txt'],
50 | ];
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/tests/Unit/AdapterTest.php:
--------------------------------------------------------------------------------
1 |
24 | */
25 | class AdapterTest extends KernelTestCase
26 | {
27 | public function testInvalidEntity(): void
28 | {
29 | $this->expectException(InvalidConfigurationException::class);
30 | $this->expectExceptionMessage('Doctrine has no valid entity manager for entity "foobar"');
31 |
32 | /** @var Registry $registryMock */
33 | $registryMock = $this->createMock(Registry::class);
34 | $adapter = new ORMAdapter($registryMock);
35 | $adapter->configure([
36 | 'entity' => 'foobar',
37 | ]);
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/tests/Unit/DependencyInjectionTest.php:
--------------------------------------------------------------------------------
1 |
28 | */
29 | class DependencyInjectionTest extends TestCase
30 | {
31 | public function testConfiguration(): void
32 | {
33 | $config = new Configuration();
34 | $tree = $config->getConfigTreeBuilder()->buildTree();
35 |
36 | $this->assertInstanceOf(ArrayNode::class, $tree);
37 | }
38 |
39 | public function testExtension(): void
40 | {
41 | $bundle = new DataTablesBundle();
42 | $extension = $bundle->getContainerExtension();
43 | $this->assertSame('datatables', $extension->getAlias());
44 |
45 | $container = new ContainerBuilder();
46 | $extension->load([], $container);
47 |
48 | // Verify default config, options should be empty
49 | $config = $container->getParameter('datatables.config');
50 | $this->assertTrue($config['language_from_cdn']);
51 | $this->assertEmpty($config['options']);
52 | }
53 |
54 | public function testInstantiatorTypeChecks(): void
55 | {
56 | $this->expectException(InvalidArgumentException::class);
57 | $this->expectExceptionMessage('must implement/extend ' . AdapterInterface::class);
58 |
59 | $instantiator = new Instantiator();
60 | $instantiator->getAdapter(\DateTimeImmutable::class);
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/tests/Unit/Exporter/DataTableExporterCollectionTest.php:
--------------------------------------------------------------------------------
1 |
22 | */
23 | class DataTableExporterCollectionTest extends KernelTestCase
24 | {
25 | protected function setUp(): void
26 | {
27 | static::bootKernel();
28 | }
29 |
30 | public function testUnknownExporter(): void
31 | {
32 | $this->expectException(UnknownDataTableExporterException::class);
33 | $this->getContainer()
34 | ->get('Omines\DataTablesBundle\Exporter\DataTableExporterCollection')
35 | ->getByName('unknown-exporter')
36 | ;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/tests/Unit/Exporter/DataTableExporterManagerTest.php:
--------------------------------------------------------------------------------
1 |
26 | */
27 | class DataTableExporterManagerTest extends TestCase
28 | {
29 | public function testTranslatorInjection(): void
30 | {
31 | $exporterCollectionMock = $this->createMock(DataTableExporterCollection::class);
32 |
33 | static::expectException(\TypeError::class);
34 | new DataTableExporterManager($exporterCollectionMock, null);
35 |
36 | static::expectException(InvalidArgumentException::class);
37 | new DataTableExporterManager($exporterCollectionMock, $this->createMock(DataCollectorTranslator::class));
38 |
39 | static::assertInstanceOf(DataTableExporterManager::class, new DataTableExporterManager($exporterCollectionMock, $this->createMock(TranslatorInterface::class)));
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/tests/Unit/Exporter/ExcelExporterTest.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | class ExcelExporterTest extends KernelTestCase
25 | {
26 | /** @var DataTableExporterCollection */
27 | private $exporterCollection;
28 |
29 | protected function setUp(): void
30 | {
31 | $this->bootKernel();
32 |
33 | $this->exporterCollection = $this->getContainer()->get(DataTableExporterCollection::class);
34 | }
35 |
36 | public function testTag(): void
37 | {
38 | $this->assertInstanceOf(ExcelExporter::class, $this->exporterCollection->getByName('excel'));
39 | }
40 |
41 | public function testName(): void
42 | {
43 | $this->assertSame('excel', $this->exporterCollection->getByName('excel')->getName());
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/tests/Unit/Exporter/ExcelOpenSpoutExporterTest.php:
--------------------------------------------------------------------------------
1 | bootKernel();
27 |
28 | $this->exporterCollection = $this->getContainer()->get(DataTableExporterCollection::class);
29 | }
30 |
31 | public function testTag(): void
32 | {
33 | $this->assertInstanceOf(ExcelOpenSpoutExporter::class, $this->exporterCollection->getByName('excel-openspout'));
34 | }
35 |
36 | public function testName(): void
37 | {
38 | $this->assertSame('excel-openspout', $this->exporterCollection->getByName('excel-openspout')->getName());
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/tests/Unit/FilterTest.php:
--------------------------------------------------------------------------------
1 |
23 | */
24 | class FilterTest extends TestCase
25 | {
26 | public function testChoiceFilter(): void
27 | {
28 | $filter = new ChoiceFilter();
29 |
30 | // Test defaults
31 | $this->assertEmpty($filter->getChoices());
32 | $this->assertNull($filter->getPlaceholder());
33 |
34 | $filter->set([
35 | 'choices' => ['foo' => 'bar', 'bar' => 'baz'],
36 | 'placeholder' => 'foobar',
37 | 'template_html' => 'foobar.html',
38 | ]);
39 |
40 | $this->assertTrue($filter->isValidValue('foo'));
41 | $this->assertFalse($filter->isValidValue('baz'));
42 | $this->assertCount(2, $filter->getChoices());
43 | $this->assertSame('foobar', $filter->getPlaceholder());
44 | $this->assertSame('foobar.html', $filter->getTemplateHtml());
45 | $this->assertSame('@DataTables/Filter/select.js.twig', $filter->getTemplateJs());
46 | }
47 |
48 | public function testTextFilter(): void
49 | {
50 | $filter = new TextFilter();
51 |
52 | // Test defaults
53 | $this->assertNull($filter->getPlaceholder());
54 | $this->assertTrue($filter->isValidValue('foo'));
55 |
56 | $filter->set([
57 | 'template_js' => 'foobar.js',
58 | 'placeholder' => 'baz',
59 | ]);
60 | $this->assertSame('@DataTables/Filter/text.html.twig', $filter->getTemplateHtml());
61 | $this->assertSame('foobar.js', $filter->getTemplateJs());
62 | $this->assertSame('baz', $filter->getPlaceholder());
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/tests/Unit/Helper/InvalidEvent.php:
--------------------------------------------------------------------------------
1 |
21 | */
22 | class InvalidEvent extends AbstractEvent
23 | {
24 | }
25 |
--------------------------------------------------------------------------------
/tests/Unit/TwigTest.php:
--------------------------------------------------------------------------------
1 |
26 | */
27 | class TwigTest extends TestCase
28 | {
29 | public function testExtensionName(): void
30 | {
31 | /** @var TranslatorInterface $translator */
32 | $translator = $this->createMock(Translator::class);
33 |
34 | $twig = new DataTablesExtension($translator);
35 | $this->assertSame('DataTablesBundle', $twig->getName());
36 | }
37 |
38 | public function testMissingTwigBundleThrows(): void
39 | {
40 | $this->expectException(MissingDependencyException::class);
41 | $this->expectExceptionMessage('You must have symfony/twig-bundle installed');
42 |
43 | new TwigRenderer();
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/tests/known-deprecations:
--------------------------------------------------------------------------------
1 | # Internal deprecations
2 | %Passing a negative value to the.*setStart%
3 | %with a length less than 1 is deprecated%
4 |
--------------------------------------------------------------------------------
/tests/phpunit-bootstrap.php:
--------------------------------------------------------------------------------
1 | get('doctrine:schema:drop')->run(new StringInput('--force --quiet'), $output);
31 | $application->get('doctrine:schema:create')->run(new StringInput('--quiet'), $output);
32 |
33 | // Fill some basic fixtures
34 | $em = $kernel->getContainer()->get('doctrine')->getManager();
35 | $companies = [];
36 | for ($i = 0; 5 !== $i; ++$i) {
37 | $companies[] = $company = new Company('Company ' . $i);
38 | $em->persist($company);
39 | }
40 | $date = new DateTime('2017-05-03 12:34:56');
41 | for ($i = 0; 125 !== $i; ++$i) {
42 | $date->sub(new DateInterval('P3DT5H27M'));
43 | $em->persist(new Employee('FirstName' . $i, 'LastName' . $i, $i % 2 ? clone $date : null, $companies[$i % count($companies)]));
44 | }
45 | $em->flush();
46 |
--------------------------------------------------------------------------------