Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions Project/CMake/CLI/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,26 @@ else()
endif()

install(TARGETS mediainfo_cli DESTINATION bin)

option(MEDIAINFO_GUI_COUNT_TESTS "Build portable GUI count formatting tests" OFF)
if(MEDIAINFO_GUI_COUNT_TESTS)
if(NOT MEDIAINFO_CLI_STATIC)
message(FATAL_ERROR "GUI count tests require MEDIAINFO_CLI_STATIC=ON")
endif()
enable_testing()
add_executable(gui_count_format
../../../Source/Tests/CountFormat.cpp
../../../Source/Common/Core.cpp
../../../Source/GUI/Common/GUI_Main_Common_Core.cpp
../../../Source/GUI/Common/GUI_Main_Easy_Core.cpp
../../../Source/GUI/Common/GUI_Main_Easy_Box_Core.cpp)
target_include_directories(gui_count_format PRIVATE ../../../../ZenLib/Source)
target_compile_definitions(gui_count_format PRIVATE _UNICODE UNICODE)
set_target_properties(gui_count_format PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON)
if(MSVC)
target_compile_options(gui_count_format PRIVATE /utf-8)
endif()
target_link_libraries(gui_count_format PRIVATE mediainfo)
add_test(NAME gui_count_format COMMAND gui_count_format
"${CMAKE_CURRENT_SOURCE_DIR}/../../../Source/Resource/Plugin/Language")
endif()
44 changes: 44 additions & 0 deletions Source/Common/Core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
//---------------------------------------------------------------------------
#include "Core.h"
#include "ZenLib/Ztring.h"
#include "ZenLib/ZtringListList.h"
#include "ZenLib/File.h"
//---------------------------------------------------------------------------

Expand Down Expand Up @@ -508,6 +509,49 @@ String Core::StreamName (stream_t StreamKind) {
}
}

//---------------------------------------------------------------------------
// Use the public option interface so runtime-loaded libraries remain supported.
String Core::FormatCount(const String& Message, size_t Count, stream_t Kind, const String& Formats)
{
Ztring KindName;
switch (Kind)
{
case MediaInfoNameSpace::Stream_Video: KindName=__T("Video"); break;
case MediaInfoNameSpace::Stream_Audio: KindName=__T("Audio"); break;
case MediaInfoNameSpace::Stream_Text: KindName=__T("Text"); break;
case MediaInfoNameSpace::Stream_Image: KindName=__T("Image"); break;
case MediaInfoNameSpace::Stream_Menu: KindName=__T("Menu"); break;
default: KindName=__T("Other"); break;
}

Ztring Number=Ztring::ToZtring((int64u)Count);
if (MediaInfoNameSpace::MediaInfo::Option_Static(__T("Language_Format"))==__T("1"))
{
ZtringListList Request;
Request(__T("Message"))=Message;
Request(__T("Count"))=Number;
if (Message!=__T("FileCount"))
Request(__T("Kind"))=KindName;
if (Message==__T("StreamSummary"))
Request(__T("Formats"))=Formats;
// ZtringListList quotes separators and line breaks in literal metadata.
Ztring Result=MediaInfoNameSpace::MediaInfo::Option_Static(__T("Language_Format"), Request.Read());
if (!Result.empty())
return Result;
}

// Older libraries cannot select the catalog's plurals: use complete English.
if (Message==__T("FileCount"))
return Number+(Count==1?__T(" file"):__T(" files"));
KindName.MakeLowerCase();
Ztring Result=Number+__T(" ")+KindName+(Count==1?__T(" stream"):__T(" streams"));
if (Message==__T("StreamSummary"))
Result+=__T(": ")+Formats;
else if (Message==__T("StreamSummaryMore"))
Result+=__T(", see below");
return Result;
}

String Core::Parameters () {
return MediaInfoNameSpace::MediaInfo::Option_Static(__T("Info_Parameters_CSV"));
}
Expand Down
2 changes: 2 additions & 0 deletions Source/Common/Core.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ class Core
String Parameters();
String StreamName (stream_t StreamKind);
size_t State_Get();
static String FormatCount(const String& Message, size_t Count,
stream_t Kind=Stream_General, const String& Formats=String());

//Temp
void Data_Prepare();
Expand Down
12 changes: 4 additions & 8 deletions Source/GUI/Common/GUI_Main_Easy_Box_Core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,15 +129,11 @@ String GUI_Main_Easy_Box_Core::Text_Get()
{
if (C->MI->Count_Get(Parent_Core->FilesPos_Get(), (stream_t)KindOfStream)>0)
{
String Z1=String(C->MI->Get(Parent_Core->FilesPos_Get(), (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Measure))+__T("StreamCount");
String Z2=String(__T(" "))+C->MI->Get(Parent_Core->FilesPos_Get(), (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text);
if (C->MI->Count_Get(Parent_Core->FilesPos_Get(), (stream_t)KindOfStream)==1)
Z2+=__T(" stream");//__T(" stream1");
else
Z2+=__T(" streams");//__T(" stream2");
String Z3=String(C->MI->Get(Parent_Core->FilesPos_Get(), (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text)+__T("_Format_WithHint_List"));
String FormatsKey=C->MI->Get(Parent_Core->FilesPos_Get(), (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text)+__T("_Format_WithHint_List");
Temp+=EOL;
Temp+=(C->MI->Get(Parent_Core->FilesPos_Get(), (stream_t)KindOfStream, 0, Z1)+/*Prefs->Translate(*/Z2/*)*/+/*Prefs->Translate(*/__T(": ")/*)*/+C->MI->Get(Parent_Core->FilesPos_Get(), Stream_General, 0, Z3)).c_str();
Temp+=Core::FormatCount(__T("StreamSummary"),
C->MI->Count_Get(Parent_Core->FilesPos_Get(), (stream_t)KindOfStream), (stream_t)KindOfStream,
C->MI->Get(Parent_Core->FilesPos_Get(), Stream_General, 0, FormatsKey));
Lines++;
}

Expand Down
12 changes: 4 additions & 8 deletions Source/GUI/Qt/easyviewwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,15 +94,11 @@ QGroupBox* EasyViewWidget::createBox(stream_t StreamKind, int StreamPos) {
{
if (C->Count_Get(FilePos, (stream_t)KindOfStream)>0)
{
String Z1=String(C->Get(FilePos, (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Measure))+__T("StreamCount");
String Z2=String(__T(" "))+C->Get(FilePos, (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text);
if (C->Count_Get(FilePos, (stream_t)KindOfStream)==1)
Z2+=__T(" stream");//__T(" stream1");
else
Z2+=__T(" streams");//__T(" stream2");
String Z3=String(C->Get(FilePos, (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text)+__T("_Format_WithHint_List"));
String FormatsKey=C->Get(FilePos, (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text)+__T("_Format_WithHint_List");
Temp+="\n";
Temp+=wstring2QString((C->Get(FilePos, (stream_t)KindOfStream, 0, Z1)+Z2+__T(": ")+C->Get(FilePos, Stream_General, 0, Z3)));
Temp+=wstring2QString(Core::FormatCount(__T("StreamSummary"),
C->Count_Get(FilePos, (stream_t)KindOfStream), (stream_t)KindOfStream,
C->Get(FilePos, Stream_General, 0, FormatsKey)));
Lines++;
}

Expand Down
22 changes: 9 additions & 13 deletions Source/GUI/VCL/GUI_Main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ TMainF *MainF;

//---------------------------------------------------------------------------
#include "Common/Preferences.h"
#include "Common/Core.h"
#include "Common/Utils.h"
#ifdef MEDIAINFO_DLL_RUNTIME
#include "MediaInfoDLL/MediaInfoDLL.h"
Expand Down Expand Up @@ -1272,7 +1273,7 @@ void __fastcall TMainF::Refresh(TTabSheet *Page)
Caption=(Ztring(MEDIAINFO_TITLE)+__T(" - ")+I->Get(0, Stream_General, 0, __T("CompleteName"))).c_str();
else
//Plusieurs selections
Caption=(Ztring(MEDIAINFO_TITLE)+__T(" - ")+Ztring::ToZtring(FilesCount)+Prefs->Translate(__T(" file2"))).c_str();
Caption=(Ztring(MEDIAINFO_TITLE)+__T(" - ")+Core::FormatCount(__T("FileCount"), FilesCount)).c_str();

//Configure Default options
if (FilesCount>0)
Expand Down Expand Up @@ -1802,6 +1803,7 @@ void __fastcall TMainF::M_LanguageClick(TObject *Sender)
//Load
Prefs->Load(Prefs_Language, Title);
Translate();
Refresh();

//Refresh global
FormResize(NULL);
Expand Down Expand Up @@ -1863,15 +1865,10 @@ void __fastcall TMainF::Page_Easy_FileChange(TObject *Sender)
{
if (I->Get(Page_Position, (stream_t)KindOfStream, 0, __T("StreamKind")).size()>0)
{
Ztring Z1=Ztring(I->Get(Page_Position, (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text)+__T("Count"));
Ztring Z2=Ztring(__T(" "))+I->Get(Page_Position, (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text);
Z2.MakeLowerCase();
if (I->Count_Get(Page_Position, (stream_t)KindOfStream)>1)
Z2+=__T(" stream2");
else
Z2+=__T(" stream1");
Ztring Z3=Ztring(I->Get(Page_Position, (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text)+__T("_Format_WithHint_List"));
Page_Easy_X_List[KindOfStream]->Caption=(I->Get(Page_Position, Stream_General, 0, Z1)+Prefs->Translate(Z2)+Prefs->Translate(__T(": "))+I->Get(Page_Easy_File->ItemIndex, Stream_General, 0, Z3)).c_str();
Ztring FormatsKey=I->Get(Page_Position, (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text)+__T("_Format_WithHint_List");
Page_Easy_X_List[KindOfStream]->Caption=Core::FormatCount(__T("StreamSummary"),
I->Count_Get(Page_Position, (stream_t)KindOfStream), (stream_t)KindOfStream,
I->Get(Page_Position, Stream_General, 0, FormatsKey)).c_str();
}
else
Page_Easy_X_List[KindOfStream]->Caption=__T("");
Expand Down Expand Up @@ -1974,9 +1971,8 @@ void __fastcall TMainF::Page_Sheet_SheetSelectCell(TObject *Sender, System::Long
Page_Sheet_X[KindOfStream]->Style=Stdctrls::csDropDownList;
Page_Sheet_X[KindOfStream]->Items->Clear();
I->Option(__T("Inform"), __T("Summary"));
Ztring Z1=Ztring(I->Get(Page_Position, (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text)+__T("Count"));
Ztring Z2=Ztring(__T(" "))+I->Get(Page_Position, (stream_t)KindOfStream, 0, __T("StreamKind"), Info_Text)+__T(" streams"); Z2.MakeLowerCase();
Page_Sheet_X[KindOfStream]->Items->Add((I->Get(Page_Position, Stream_General, 0, Z1.c_str())+Prefs->Translate(Z2)+Prefs->Translate(__T(", "))+Prefs->Translate(__T("see below"))).c_str());
Page_Sheet_X[KindOfStream]->Items->Add(Core::FormatCount(__T("StreamSummaryMore"),
Stream_Count, (stream_t)KindOfStream).c_str());
for (int A=0; A<Stream_Count; A++)
Page_Sheet_X[KindOfStream]->Items->Add(I->Get(Page_Position, (stream_t)KindOfStream, A, __T("Inform")).c_str());
Page_Sheet_X[KindOfStream]->ItemIndex=0;
Expand Down
8 changes: 8 additions & 0 deletions Source/Resource/Language.csv
Original file line number Diff line number Diff line change
@@ -1 +1,9 @@
Language_ISO639;ar;be;bg;ca;cs;da;de;en;es;eu;fa;fr;gl;gr;hu;id;it;ja;ko;lt;nl;pl;pt;pt-BR;ro;ru;sk;sq;sv;th;tr;uk;zh-CN;zh-HK;zh-TW;hr;hy;ka
Config_Text_PluralRules;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
Config_Text_PluralRule.zero;f == 0 && i == 0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Config_Text_PluralRule.one;f == 0 && i == 1;f == 0 && i % 10 == 1 && i % 100 != 11;f == 0 && i == 1;v == 0 && i == 1;v == 0 && i == 1;(f == 0 && i == 1) || (f != 0 && i <= 1);v == 0 && i == 1;v == 0 && i == 1;f == 0 && i == 1;f == 0 && i == 1;i == 0 || (f == 0 && i == 1);i <= 1;v == 0 && i == 1;f == 0 && i == 1;f == 0 && i == 1;;v == 0 && i == 1;;;f == 0 && i % 10 == 1 && (i % 100 < 11 || i % 100 > 19);v == 0 && i == 1;v == 0 && i == 1;v == 0 && i == 1;i <= 1;v == 0 && i == 1;v == 0 && i % 10 == 1 && i % 100 != 11;v == 0 && i == 1;f == 0 && i == 1;v == 0 && i == 1;;f == 0 && i == 1;v == 0 && i % 10 == 1 && i % 100 != 11;;;;(v == 0 && i % 10 == 1 && i % 100 != 11) || (v != 0 && f % 10 == 1 && f % 100 != 11);i <= 1;f == 0 && i == 1
Config_Text_PluralRule.two;f == 0 && i == 2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Config_Text_PluralRule.few;f == 0 && i % 100 >= 3 && i % 100 <= 10;f == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14);;;v == 0 && i >= 2 && i <= 4;;;;;;;;;;;;;;;f == 0 && i % 10 >= 2 && (i % 100 < 11 || i % 100 > 19);;v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14);;;v != 0 || i == 0 || (i % 100 >= 1 && i % 100 <= 19);v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14);v == 0 && i >= 2 && i <= 4;;;;;v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14);;;;(v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) || (v != 0 && f % 10 >= 2 && f % 10 <= 4 && (f % 100 < 12 || f % 100 > 14));;
Config_Text_PluralRule.many;f == 0 && i % 100 >= 11;f == 0;;v == 0 && i != 0 && i % 1000000 == 0;v != 0;;;;v == 0 && i != 0 && i % 1000000 == 0;;;v == 0 && i != 0 && i % 1000000 == 0;;;;;v == 0 && i != 0 && i % 1000000 == 0;;;f != 0;;v == 0;v == 0 && i != 0 && i % 1000000 == 0;v == 0 && i != 0 && i % 1000000 == 0;;v == 0;v != 0;;;;;v == 0;;;;;;
Config_Text_PluralLegacy;one=1,other=2;one=1,few=2,other=3;one=1,other=2;one=1,other=2;one=1,few=2,other=3;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,few=2,other=3;one=1,other=2;one=1,few=2,other=3;one=1,other=2;one=1,other=2;one=1,few=2,other=3;one=1,few=2,other=3;one=1,few=2,other=3;one=1,other=2;one=1,other=2;one=1,other=2;one=1,other=2;one=1,few=2,other=3;one=1,other=2;one=1,other=2;one=1,other=2;one=1,few=2,other=3;one=1,other=2;one=1,other=2
Config_Text_PluralLegacyDecimals;1;0;1;1;0;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;1;1;0;0;1;1;1;1;0;1;1;1;0;1;1
68 changes: 68 additions & 0 deletions Source/Resource/Plugin/Language/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Count messages

Count messages use the selected catalog's plural-rule metadata, independently
of the operating system locale. Older catalogs use the library's compatibility
rules selected by ` Language_ISO639`.
They are optional additions to the existing semicolon-separated CSV catalog.

Supported key families:

- `FileCount.<category>`: file count in the window title.
- `StreamSummary.<kind>.<category>`: count and format list in Easy view.
- `StreamSummaryMore.<kind>.<category>`: count and navigation text in Sheet view.
- `StreamCount.<kind>.<category>`: count and stream noun only.

Kinds are `Video`, `Audio`, `Text`, `Image`, `Other`, and `Menu`.
Categories are `zero`, `one`, `two`, `few`, `many`, and `other`.
Always provide `other`; missing categories use that message.
Only add categories needed by the language. These GUI counts are integers.

Each pattern must contain `{count}` exactly once. `StreamSummary` also requires
`{formats}` exactly once; the other families do not accept this argument.
Translators control word order and punctuation. Write `{{` and `}}` for literal
braces. Other argument names and unmatched braces are rejected. Standard CSV
quoting applies to semicolons, quotes, and line breaks. Inserted metadata is
literal text and is never interpreted as another pattern.

```text
StreamSummary.Audio.one;{count} audio stream: {formats}
StreamSummary.Audio.other;{count} audio streams: {formats}
FileCount.other;{count} files
```

Existing `stream1/2/3` and `file1/2/3` entries remain supported through a
language-specific compatibility mapping. Do not remove them. Invalid or missing
messages fall back to usable legacy translations, then to English with English
rules. Older MediaInfoLib versions without `Language_Format` use complete
English count messages; the locale-aware behavior requires the matching library.

Catalog migrations are separate localization changes. The source fix uses
existing count forms; missing families use the complete English fallback.

## Plural-rule metadata

Rules and legacy-form mappings belong to the catalog. Keep metadata synchronized
between `Source/Resource/Language.csv` and the individual catalog files.
These entries are configuration data; do not translate their keys or expressions.

```text
Config_Text_PluralRules;1
Config_Text_PluralRule.one;v == 0 && i == 1
Config_Text_PluralLegacy;one=1,other=2
Config_Text_PluralLegacyDecimals;1
```

The example selects the English singular only for integer `1`. Operands are
`i` (integer part), `v` (number of visible fractional digits), and `f` (fractional
digits as an integer). Predicates may use `%`, comparisons, `&&`, `||` and
parentheses. Categories are tested in order: `zero`, `one`, `two`, `few`, `many`;
`other` is the default. Empty predicates disable a category.

The optional legacy mapping assigns categories to existing `1/2/3` entries;
`other` supplies unspecified categories and `0` disables a legacy form.
The decimal setting permits (`1`) or disables (`0`, the default) numbered forms
for fractional notation. It does not restrict named category messages.
See MediaInfoLib's `Source/Doc/CountLocalization.md` for the complete grammar,
validation limits and fallback behavior. Missing or invalid metadata preserves
the library's existing language rules; metadata never borrows English rules
from a merged catalog.
8 changes: 8 additions & 0 deletions Source/Resource/Plugin/Language/ar.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
Language_ISO639;ar
Config_Text_PluralRules;1
Config_Text_PluralRule.zero;f == 0 && i == 0
Config_Text_PluralRule.one;f == 0 && i == 1
Config_Text_PluralRule.two;f == 0 && i == 2
Config_Text_PluralRule.few;f == 0 && i % 100 >= 3 && i % 100 <= 10
Config_Text_PluralRule.many;f == 0 && i % 100 >= 11
Config_Text_PluralLegacy;one=1,other=2
Config_Text_PluralLegacyDecimals;1
Author_Email;Info@MediaArea.net
Author_Name;Zen
Author_OldNames;المترجم الأصلي
Expand Down
8 changes: 8 additions & 0 deletions Source/Resource/Plugin/Language/be.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
Language_ISO639;be
Config_Text_PluralRules;1
Config_Text_PluralRule.zero;
Config_Text_PluralRule.one;f == 0 && i % 10 == 1 && i % 100 != 11
Config_Text_PluralRule.two;
Config_Text_PluralRule.few;f == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)
Config_Text_PluralRule.many;f == 0
Config_Text_PluralLegacy;one=1,few=2,other=3
Config_Text_PluralLegacyDecimals;0
Author_Email;dzmitry.zubialevich@gmail.comt
Author_Name;Dzmitry Zubialevich
Author_OldNames;Micтэр mister-sh@users.sourceforge.net
Expand Down
8 changes: 8 additions & 0 deletions Source/Resource/Plugin/Language/bg.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
Language_ISO639;bg
Config_Text_PluralRules;1
Config_Text_PluralRule.zero;
Config_Text_PluralRule.one;f == 0 && i == 1
Config_Text_PluralRule.two;
Config_Text_PluralRule.few;
Config_Text_PluralRule.many;
Config_Text_PluralLegacy;one=1,other=2
Config_Text_PluralLegacyDecimals;1
Author_Email;ownfilmcollection@gmail.com
Author_Name;ERa
Author_OldNames;превод на Български
Expand Down
8 changes: 8 additions & 0 deletions Source/Resource/Plugin/Language/ca.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
Language_ISO639;ca
Config_Text_PluralRules;1
Config_Text_PluralRule.zero;
Config_Text_PluralRule.one;v == 0 && i == 1
Config_Text_PluralRule.two;
Config_Text_PluralRule.few;
Config_Text_PluralRule.many;v == 0 && i != 0 && i % 1000000 == 0
Config_Text_PluralLegacy;one=1,other=2
Config_Text_PluralLegacyDecimals;1
Author_Email;sergi@octovisuals.com
Author_Name;Sergi Medina
Author_OldNames;BennyBeat <bennybeat@gmail.com>
Expand Down
8 changes: 8 additions & 0 deletions Source/Resource/Plugin/Language/cs.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
Language_ISO639;cs
Config_Text_PluralRules;1
Config_Text_PluralRule.zero;
Config_Text_PluralRule.one;v == 0 && i == 1
Config_Text_PluralRule.two;
Config_Text_PluralRule.few;v == 0 && i >= 2 && i <= 4
Config_Text_PluralRule.many;v != 0
Config_Text_PluralLegacy;one=1,few=2,other=3
Config_Text_PluralLegacyDecimals;0
Author_Email;miko.vaji@gmail.com
Author_Name;Michal Várady
Author_OldNames;Heavy <heavy@keli.cz>
Expand Down
8 changes: 8 additions & 0 deletions Source/Resource/Plugin/Language/da.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
Language_ISO639;da
Config_Text_PluralRules;1
Config_Text_PluralRule.zero;
Config_Text_PluralRule.one;(f == 0 && i == 1) || (f != 0 && i <= 1)
Config_Text_PluralRule.two;
Config_Text_PluralRule.few;
Config_Text_PluralRule.many;
Config_Text_PluralLegacy;one=1,other=2
Config_Text_PluralLegacyDecimals;1
Author_Email;l10n@joergenr.dk
Author_Name;Joergen
Author_OldNames;Joergen
Expand Down
Loading
Loading